1#[macro_export]
17macro_rules! count {
18 ($type_:ty, $operation:path, $case:expr) => {
19 <$type_ as Metrics<dyn $operation>>::count($case)
20 };
21}
22
23#[macro_export]
24macro_rules! output_mode {
25 ($type_:ty, $operation:path, $case:expr) => {
26 <$type_ as OutputMode<dyn $operation>>::output_mode($case)
27 };
28}
29
30#[macro_export]
37macro_rules! assert_count {
38 ($type_:ty, $operation:path, $case:expr) => {{
39 $crate::print_scope!();
40
41 let Count(num_constants, num_public, num_private, num_constraints) = count!($type_, $operation, $case);
42 assert!(num_constants.matches(Circuit::num_constants_in_scope()), "(num_constants)");
43 assert!(num_public.matches(Circuit::num_public_in_scope()), "(num_public)");
44 assert!(num_private.matches(Circuit::num_private_in_scope()), "(num_private)");
45 assert!(num_constraints.matches(Circuit::num_constraints_in_scope()), "(num_constraints)");
46 assert!(Circuit::is_satisfied_in_scope(), "(is_satisfied_in_scope)");
47 }};
48
49 (FromBoolean($input:ident) => $output:ident, $case:expr) => {{
55 assert_count!($output<Circuit>, FromBoolean<Boolean = $input<Circuit>>, $case)
56 }};
57 ($operation:tt<$boolean:ident>() => $output:ident, $case:expr) => {{
59 assert_count!($output<Circuit>, $operation<Boolean = $boolean<Circuit>>, $case)
60 }};
61 ($operation:tt($input:ident) => $output:ident, $case:expr) => {{
63 assert_count!($input<Circuit>, $operation<Output = $output<Circuit>>, $case)
64 }};
65 ($operation:tt($input_a:ident, $input_b:ident) => $output:ident, $case:expr) => {{
67 assert_count!($input_a<Circuit>, $operation<$input_b<Circuit>, Output = $output<Circuit>>, $case)
68 }};
69 ($operation:tt($boolean:ident, $input_a:ident, $input_b:ident) => $output:ident, $case:expr) => {{
72 assert_count!($input_a<Circuit>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit>>, $case)
73 }};
74
75 ($operation:tt<$boolean:ident>() => $output:ident<$($parameter:ident),+>, $case:expr) => {{
81 assert_count!($output<Circuit, $($parameter),+>, $operation<Boolean = $boolean<Circuit>>, $case)
82 }};
83 ($operation:tt($input:ident<$($parameter_a:ident),+>) => $output:ident<$($parameter_b:ident),+>, $case:expr) => {{
85 assert_count!($input<Circuit, $($parameter_a),+>, $operation<Output = $output<Circuit, $($parameter_b),+>>, $case)
86 }};
87 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident, $case:expr) => {{
89 assert_count!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit>>, $case)
90 }};
91 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr) => {{
93 assert_count!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit, $($parameter_c),+>>, $case)
94 }};
95 ($operation:tt($boolean:ident, $input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr) => {{
98 assert_count!($input_a<Circuit, $($parameter_a),+>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit, $($parameter_c),+>>, $case)
99 }};
100}
101
102#[macro_export]
109macro_rules! assert_count_fails {
110 ($type_:ty, $operation:path, $case:expr) => {{
111 $crate::print_scope!();
112
113 let Count(num_constants, num_public, num_private, num_constraints) = count!($type_, $operation, $case);
114 assert!(num_constants.matches(Circuit::num_constants_in_scope()), "(num_constants)");
115 assert!(num_public.matches(Circuit::num_public_in_scope()), "(num_public)");
116 assert!(num_private.matches(Circuit::num_private_in_scope()), "(num_private)");
117 assert!(num_constraints.matches(Circuit::num_constraints_in_scope()), "(num_constraints)");
118 assert!(!Circuit::is_satisfied_in_scope(), "(!is_satisfied_in_scope)");
119 }};
120
121 (FromBoolean($input:ident) => $output:ident, $case:expr) => {{
127 assert_count_fails!($output<Circuit>, FromBoolean<Boolean = $input<Circuit>>, $case)
128 }};
129 ($operation:tt<$boolean:ident>() => $output:ident, $case:expr) => {{
131 assert_count_fails!($output<Circuit>, $operation<Boolean = $boolean<Circuit>>, $case)
132 }};
133 ($operation:tt($input:ident) => $output:ident, $case:expr) => {{
135 assert_count_fails!($input<Circuit>, $operation<Output = $output<Circuit>>, $case)
136 }};
137 ($operation:tt($input_a:ident, $input_b:ident) => $output:ident, $case:expr) => {{
139 assert_count_fails!($input_a<Circuit>, $operation<$input_b<Circuit>, Output = $output<Circuit>>, $case)
140 }};
141 ($operation:tt($boolean:ident, $input_a:ident, $input_b:ident) => $output:ident, $case:expr) => {{
144 assert_count_fails!($input_a<Circuit>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit>>, $case)
145 }};
146
147 ($operation:tt<$boolean:ident>() => $output:ident<$($parameter:ident),+>, $case:expr) => {{
153 assert_count_fails!($output<Circuit, $($parameter),+>, $operation<Boolean = $boolean<Circuit>>, $case)
154 }};
155 ($operation:tt($input:ident<$($parameter_a:ident),+>) => $output:ident<$($parameter_b:ident),+>, $case:expr) => {{
157 assert_count_fails!($input<Circuit, $($parameter_a),+>, $operation<Output = $output<Circuit, $($parameter_b),+>>, $case)
158 }};
159 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident, $case:expr) => {{
161 assert_count_fails!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit>>, $case)
162 }};
163 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr) => {{
165 assert_count_fails!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit, $($parameter_c),+>>, $case)
166 }};
167 ($operation:tt($boolean:ident, $input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr) => {{
170 assert_count_fails!($input_a<Circuit, $($parameter_a),+>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit, $($parameter_c),+>>, $case)
171 }};
172}
173
174#[macro_export]
181macro_rules! assert_output_mode {
182 ($type_:ty, $operation:path, $case:expr, $candidate:expr) => {{
183 let expected_mode = output_mode!($type_, $operation, $case);
184 assert_eq!(expected_mode, $candidate.eject_mode());
185 }};
186
187 (FromBoolean($input:ident) => $output:ident, $case:expr, $candidate:expr) => {{
193 assert_output_mode!($output<Circuit>, FromBoolean<Boolean = $input<Circuit>>, $case, $candidate)
194 }};
195 ($operation:tt<$boolean:ident>() => $output:ident, $case:expr, $candidate:expr) => {{
197 assert_output_mode!($output<Circuit>, $operation<Boolean = $boolean<Circuit>>, $case, $candidate)
198 }};
199 ($operation:tt($input:ident) => $output:ident, $case:expr, $candidate:expr) => {{
201 assert_output_mode!($input<Circuit>, $operation<Output = $output<Circuit>>, $case, $candidate)
202 }};
203 ($operation:tt($input_a:ident, $input_b:ident) => $output:ident, $case:expr, $candidate:expr) => {{
205 assert_output_mode!($input_a<Circuit>, $operation<$input_b<Circuit>, Output = $output<Circuit>>, $case, $candidate)
206 }};
207 ($operation:tt($boolean:ident, $input_a:ident, $input_b:ident) => $output:ident, $case:expr, $candidate:expr) => {{
210 assert_output_mode!($input_a<Circuit>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit>>, $case, $candidate)
211 }};
212
213 ($operation:tt<$boolean:ident>() => $output:ident<$($parameter:ident),+>, $case:expr, $candidate:expr) => {{
219 assert_output_mode!($output<Circuit, $($parameter),+>, $operation<Boolean = $boolean<Circuit>>, $case, $candidate)
220 }};
221 ($operation:tt($input:ident<$($parameter_a:ident),+>) => $output:ident<$($parameter_b:ident),+>, $case:expr, $candidate:expr) => {{
223 assert_output_mode!($input<Circuit, $($parameter_a),+>, $operation<Output = $output<Circuit, $($parameter_b),+>>, $case, $candidate)
224 }};
225 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident, $case:expr, $candidate:expr) => {{
227 assert_output_mode!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit>>, $case, $candidate)
228 }};
229 ($operation:tt($input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr, $candidate:expr) => {{
231 assert_output_mode!($input_a<Circuit, $($parameter_a),+>, $operation<$input_b<Circuit, $($parameter_b),+>, Output = $output<Circuit, $($parameter_c),+>>, $case, $candidate)
232 }};
233 ($operation:tt($boolean:ident, $input_a:ident<$($parameter_a:ident),+>, $input_b:ident<$($parameter_b:ident),+>) => $output:ident<$($parameter_c:ident),+>, $case:expr, $candidate:expr) => {{
236 assert_output_mode!($input_a<Circuit, $($parameter_a),+>, $operation<Boolean = $boolean<Circuit>, Output = $output<Circuit, $($parameter_c),+>>, $case, $candidate)
237 }};
238}