snarkvm_circuit_environment/macros/
scope.rs

1// Copyright 2024 Aleo Network Foundation
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#[macro_export]
17macro_rules! scope {
18    ($scope_name:expr, $block:block) => {
19        E::scope($scope_name, || $block)
20    };
21}
22
23#[macro_export]
24macro_rules! print_scope {
25    () => {{
26        println!(
27            "Circuit::scope(Constants: {:?}, Public: {:?}, Private: {:?}, Constraints: {:?})\n",
28            Circuit::num_constants_in_scope(),
29            Circuit::num_public_in_scope(),
30            Circuit::num_private_in_scope(),
31            Circuit::num_constraints_in_scope()
32        );
33    }};
34}
35
36#[macro_export]
37macro_rules! assert_scope {
38    () => {{
39        $crate::print_scope!();
40
41        assert!(Circuit::is_satisfied_in_scope(), "(is_satisfied_in_scope)");
42    }};
43    ($num_constants:expr, $num_public:expr, $num_private:expr, $num_constraints:expr) => {{
44        $crate::print_scope!();
45
46        assert_eq!($num_constants, Circuit::num_constants_in_scope(), "(num_constants)");
47        assert_eq!($num_public, Circuit::num_public_in_scope(), "(num_public)");
48        assert_eq!($num_private, Circuit::num_private_in_scope(), "(num_private)");
49        assert_eq!($num_constraints, Circuit::num_constraints_in_scope(), "(num_constraints)");
50        assert!(Circuit::is_satisfied_in_scope(), "(is_satisfied_in_scope)");
51    }};
52    (<=$num_constants:expr, $num_public:expr, $num_private:expr, $num_constraints:expr) => {{
53        $crate::print_scope!();
54
55        assert!(Circuit::num_constants_in_scope() <= $num_constants, "(num_constants)");
56        assert_eq!($num_public, Circuit::num_public_in_scope(), "(num_public)");
57        assert_eq!($num_private, Circuit::num_private_in_scope(), "(num_private)");
58        assert_eq!($num_constraints, Circuit::num_constraints_in_scope(), "(num_constraints)");
59        assert!(Circuit::is_satisfied_in_scope(), "(is_satisfied_in_scope)");
60    }};
61    (<=$num_constants:expr, <=$num_public:expr, <=$num_private:expr, <=$num_constraints:expr) => {{
62        $crate::print_scope!();
63
64        assert!(Circuit::num_constants_in_scope() <= $num_constants, "(num_constants)");
65        assert!(Circuit::num_public_in_scope() <= $num_public, "(num_public)");
66        assert!(Circuit::num_private_in_scope() <= $num_private, "(num_private)");
67        assert!(Circuit::num_constraints_in_scope() <= $num_constraints, "(num_constraints)");
68        assert!(Circuit::is_satisfied_in_scope(), "(is_satisfied_in_scope)");
69    }};
70    ($case:expr, $num_constants:expr, $num_public:expr, $num_private:expr, $num_constraints:expr) => {{
71        $crate::print_scope!();
72
73        assert_eq!($num_constants, Circuit::num_constants_in_scope(), "{} (num_constants)", $case);
74        assert_eq!($num_public, Circuit::num_public_in_scope(), "{} (num_public)", $case);
75        assert_eq!($num_private, Circuit::num_private_in_scope(), "{} (num_private)", $case);
76        assert_eq!($num_constraints, Circuit::num_constraints_in_scope(), "{} (num_constraints)", $case);
77        assert!(Circuit::is_satisfied_in_scope(), "{} (is_satisfied_in_scope)", $case);
78    }};
79}
80
81#[macro_export]
82macro_rules! assert_scope_fails {
83    () => {{
84        $crate::print_scope!();
85
86        assert!(!Circuit::is_satisfied_in_scope(), "(!is_satisfied_in_scope)");
87    }};
88    ($num_constants:expr, $num_public:expr, $num_private:expr, $num_constraints:expr) => {{
89        $crate::print_scope!();
90
91        assert_eq!($num_constants, Circuit::num_constants_in_scope(), "(num_constants)");
92        assert_eq!($num_public, Circuit::num_public_in_scope(), "(num_public)");
93        assert_eq!($num_private, Circuit::num_private_in_scope(), "(num_private)");
94        assert_eq!($num_constraints, Circuit::num_constraints_in_scope(), "(num_constraints)");
95        assert!(!Circuit::is_satisfied_in_scope(), "(!is_satisfied_in_scope)");
96    }};
97    ($case:expr, $num_constants:expr, $num_public:expr, $num_private:expr, $num_constraints:expr) => {{
98        $crate::print_scope!();
99
100        assert_eq!($num_constants, Circuit::num_constants_in_scope(), "{} (num_constants)", $case);
101        assert_eq!($num_public, Circuit::num_public_in_scope(), "{} (num_public)", $case);
102        assert_eq!($num_private, Circuit::num_private_in_scope(), "{} (num_private)", $case);
103        assert_eq!($num_constraints, Circuit::num_constraints_in_scope(), "{} (num_constraints)", $case);
104        assert!(!Circuit::is_satisfied_in_scope(), "{} (!is_satisfied_in_scope)", $case);
105    }};
106}