Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bitwise.test.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
6
8
9namespace bb::avm2::simulation {
10namespace {
11
12using simulation::Bitwise;
14
16// Bitwise Operation Test Cases
18const std::vector<BitwiseTestParams> test_cases_and = {
19 { MemoryValue::from<uint1_t>(1), MemoryValue::from<uint1_t>(1), MemoryValue::from<uint1_t>(1) },
20 { MemoryValue::from<uint8_t>(0xAB), MemoryValue::from<uint8_t>(0x5F), MemoryValue::from<uint8_t>(0x0B) },
21 { MemoryValue::from<uint16_t>(0xF0F0), MemoryValue::from<uint16_t>(0x3C3C), MemoryValue::from<uint16_t>(0x3030) },
22 {
23 MemoryValue::from<uint32_t>(0xDEADBEEF),
24 MemoryValue::from<uint32_t>(0x12345678),
25 MemoryValue::from<uint32_t>(0x12241668),
26 },
27 {
28 MemoryValue::from<uint64_t>(0xCAFEBABEDEADBEEF),
29 MemoryValue::from<uint64_t>(0x1234567890ABCDEF),
30 MemoryValue::from<uint64_t>(0x234123890A98CEF),
31 },
32 {
33 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0xFEDCBA9876543210ULL) << 64) | 0x0123456789ABCDEFULL),
34 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0x1111111111111111ULL) << 64) | 0x2222222222222222ULL),
35 MemoryValue::from<uint128_t>((static_cast<uint128_t>(1157442765409226768ULL) << 64) | 9570295239278626ULL),
36 }
37};
38
39const std::vector<BitwiseTestParams> test_cases_or = {
40 { MemoryValue::from<uint1_t>(0), MemoryValue::from<uint1_t>(0), MemoryValue::from<uint1_t>(0) },
41 { MemoryValue::from<uint8_t>(0xAB), MemoryValue::from<uint8_t>(0x5F), MemoryValue::from<uint8_t>(0xFF) },
42 { MemoryValue::from<uint16_t>(0xF0F0), MemoryValue::from<uint16_t>(0x3C3C), MemoryValue::from<uint16_t>(0xFCFC) },
43 {
44 MemoryValue::from<uint32_t>(0xDEADBEEF),
45 MemoryValue::from<uint32_t>(0x12345678),
46 MemoryValue::from<uint32_t>(0xDEBDFEFF),
47 },
48 {
49 MemoryValue::from<uint64_t>(0xCAFEBABEDEADBEEF),
50 MemoryValue::from<uint64_t>(0x1234567890ABCDEF),
51 MemoryValue::from<uint64_t>(0xDAFEFEFEDEAFFFEF),
52 },
53 {
54 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0xFEDCBA9876543210ULL) << 64) | 0x0123456789ABCDEFULL),
55 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0x1111111111111111ULL) << 64) | 0x2222222222222222ULL),
56 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0xFFDDBB9977553311ULL) << 64) | 0x23236767ABABEFEFULL),
57 }
58};
59
60const std::vector<BitwiseTestParams> tests_cases_xor = {
61 { MemoryValue::from<uint1_t>(0), MemoryValue::from<uint1_t>(0), MemoryValue::from<uint1_t>(0) },
62 { MemoryValue::from<uint8_t>(0xAB), MemoryValue::from<uint8_t>(0x5F), MemoryValue::from<uint8_t>(0xF4) },
63 { MemoryValue::from<uint16_t>(0xF0F0), MemoryValue::from<uint16_t>(0x3C3C), MemoryValue::from<uint16_t>(0xCCCC) },
64 {
65 MemoryValue::from<uint32_t>(0xDEADBEEF),
66 MemoryValue::from<uint32_t>(0x12345678),
67 MemoryValue::from<uint32_t>(0xCC99E897),
68 },
69 {
70 MemoryValue::from<uint64_t>(0xCAFEBABEDEADBEEF),
71 MemoryValue::from<uint64_t>(0x1234567890ABCDEF),
72 MemoryValue::from<uint64_t>(0xD8CAECC64E067300),
73 },
74 {
75 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0xFEDCBA9876543210ULL) << 64) | 0x0123456789ABCDEFULL),
76 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0x1111111111111111ULL) << 64) | 0x2222222222222222ULL),
77 MemoryValue::from<uint128_t>((static_cast<uint128_t>(0xEFCDAB8967452301ULL) << 64) | 0x23016745AB89EFCDULL),
78 }
79};
80
82// Test Classes + Fixtures
84class BitwiseSimulationTest : public testing::Test {
85 protected:
86 BitwiseSimulationTest() = default;
87
88 EventEmitter<simulation::BitwiseEvent> event_emitter;
89 Bitwise bitwise = Bitwise(event_emitter);
90};
91
92TEST_F(BitwiseSimulationTest, ErrorTagFF)
93{
95 MemoryValue b = MemoryValue::from_tag(ValueTag::U8, 1); // This can be any tag
96
97 EXPECT_THROW(bitwise.and_op(a, b), BitwiseException);
98 EXPECT_THROW(bitwise.or_op(a, b), BitwiseException);
99 EXPECT_THROW(bitwise.xor_op(a, b), BitwiseException);
100}
101
102TEST_F(BitwiseSimulationTest, ErrorTagMismatch)
103{
105 MemoryValue b = MemoryValue::from_tag(ValueTag::U16, 1); // Different tags
106
107 EXPECT_THROW(bitwise.and_op(a, b), BitwiseException);
108 EXPECT_THROW(bitwise.or_op(a, b), BitwiseException);
109 EXPECT_THROW(bitwise.xor_op(a, b), BitwiseException);
110}
111
112class BitwiseAndSimulationTest : public BitwiseSimulationTest, public testing::WithParamInterface<BitwiseTestParams> {};
113INSTANTIATE_TEST_SUITE_P(SimpleTestSuite, BitwiseAndSimulationTest, testing::ValuesIn(test_cases_and));
114class BitwiseOrSimulationTest : public BitwiseSimulationTest, public testing::WithParamInterface<BitwiseTestParams> {};
115INSTANTIATE_TEST_SUITE_P(SimpleTestSuite, BitwiseOrSimulationTest, testing::ValuesIn(test_cases_or));
116class BitwiseXorSimulationTest : public BitwiseSimulationTest, public testing::WithParamInterface<BitwiseTestParams> {};
117INSTANTIATE_TEST_SUITE_P(SimpleTestSuite, BitwiseXorSimulationTest, testing::ValuesIn(tests_cases_xor));
118
119TEST_P(BitwiseAndSimulationTest, SimpleAnd)
120{
121 EventEmitter<simulation::BitwiseEvent> event_emitter;
122 Bitwise bitwise(event_emitter);
123
124 auto [a, b, expected] = GetParam();
126 EXPECT_EQ(c, expected);
127}
128
129TEST_P(BitwiseOrSimulationTest, SimpleOr)
130{
131 EventEmitter<simulation::BitwiseEvent> event_emitter;
132 Bitwise bitwise(event_emitter);
133
134 auto [a, b, expected] = GetParam();
136 EXPECT_EQ(c, expected);
137}
138
139TEST_P(BitwiseXorSimulationTest, SimpleXor)
140{
141 EventEmitter<simulation::BitwiseEvent> event_emitter;
142 Bitwise bitwise(event_emitter);
143
144 auto [a, b, expected] = GetParam();
146 EXPECT_EQ(c, expected);
147}
148
149} // namespace
150} // namespace bb::avm2::simulation
INSTANTIATE_TEST_SUITE_P(AcirTests, AcirIntegrationSingleTest, testing::Values("a_1327_concrete_in_generic", "a_1_mul", "a_2_div", "a_3_add", "a_4_sub", "a_5_over", "a_6", "a_6_array", "a_7", "a_7_function", "aes128_encrypt", "arithmetic_binary_operations", "array_dynamic", "array_dynamic_blackbox_input", "array_dynamic_main_output", "array_dynamic_nested_blackbox_input", "array_eq", "array_if_cond_simple", "array_len", "array_neq", "array_sort", "array_to_slice", "array_to_slice_constant_length", "assert", "assert_statement", "assign_ex", "bigint", "bit_and", "bit_not", "bit_shifts_comptime", "bit_shifts_runtime", "blake3", "bool_not", "bool_or", "break_and_continue", "brillig_acir_as_brillig", "brillig_array_eq", "brillig_array_to_slice", "brillig_arrays", "brillig_assert", "brillig_bit_shifts_runtime", "brillig_blake2s", "brillig_blake3", "brillig_calls", "brillig_calls_array", "brillig_calls_conditionals", "brillig_conditional", "brillig_cow", "brillig_cow_assign", "brillig_cow_regression", "brillig_ecdsa_secp256k1", "brillig_ecdsa_secp256r1", "brillig_embedded_curve", "brillig_fns_as_values", "brillig_hash_to_field", "brillig_identity_function", "brillig_keccak", "brillig_loop", "brillig_nested_arrays", "brillig_not", "brillig_oracle", "brillig_pedersen", "brillig_recursion", "brillig_references", "brillig_schnorr", "brillig_sha256", "brillig_signed_cmp", "brillig_signed_div", "brillig_slices", "brillig_to_be_bytes", "brillig_to_bits", "brillig_to_bytes_integration", "brillig_to_le_bytes", "brillig_top_level", "brillig_uninitialized_arrays", "brillig_wrapping", "cast_bool", "closures_mut_ref", "conditional_1", "conditional_2", "conditional_regression_421", "conditional_regression_547", "conditional_regression_661", "conditional_regression_short_circuit", "conditional_regression_underflow", "custom_entry", "databus", "debug_logs", "diamond_deps_0", "double_verify_nested_proof", "double_verify_proof", "ecdsa_secp256k1", "ecdsa_secp256r1", "ecdsa_secp256r1_3x", "eddsa", "embedded_curve_ops", "field_attribute", "generics", "global_consts", "hash_to_field", "hashmap", "higher_order_functions", "if_else_chain", "import", "inline_never_basic", "integer_array_indexing", "keccak256", "main_bool_arg", "main_return", "merkle_insert", "missing_closure_env", "modules", "modules_more", "modulus", "nested_array_dynamic", "nested_array_dynamic_simple", "nested_array_in_slice", "nested_arrays_from_brillig", "no_predicates_basic", "no_predicates_brillig", "no_predicates_numeric_generic_poseidon", "operator_overloading", "pedersen_check", "pedersen_commitment", "pedersen_hash", "poseidon_bn254_hash", "poseidonsponge_x5_254", "pred_eq", "prelude", "references", "regression", "regression_2660", "regression_3051", "regression_3394", "regression_3607", "regression_3889", "regression_4088", "regression_4124", "regression_4202", "regression_4449", "regression_4709", "regression_5045", "regression_capacity_tracker", "regression_mem_op_predicate", "regression_method_cannot_be_found", "regression_struct_array_conditional", "schnorr", "sha256", "sha2_byte", "side_effects_constrain_array", "signed_arithmetic", "signed_comparison", "signed_division", "simple_2d_array", "simple_add_and_ret_arr", "simple_array_param", "simple_bitwise", "simple_comparison", "simple_mut", "simple_not", "simple_print", "simple_program_addition", "simple_radix", "simple_shield", "simple_shift_left_right", "slice_coercion", "slice_dynamic_index", "slice_loop", "slices", "strings", "struct", "struct_array_inputs", "struct_fields_ordering", "struct_inputs", "submodules", "to_be_bytes", "to_bytes_consistent", "to_bytes_integration", "to_le_bytes", "trait_as_return_type", "trait_impl_base_type", "traits_in_crates_1", "traits_in_crates_2", "tuple_inputs", "tuples", "type_aliases", "u128", "u16_support", "unconstrained_empty", "unit_value", "unsafe_range_constraint", "witness_compression", "xor"))
TEST_P(AcirIntegrationSingleTest, DISABLED_ProveAndVerifyProgram)
static TaggedValue from_tag(ValueTag tag, FF value)
MemoryValue and_op(const MemoryValue &a, const MemoryValue &b) override
Definition bitwise.cpp:11
MemoryValue or_op(const MemoryValue &a, const MemoryValue &b) override
Definition bitwise.cpp:24
MemoryValue xor_op(const MemoryValue &a, const MemoryValue &b) override
Definition bitwise.cpp:37
EventEmitter< DataCopyEvent > event_emitter
FF a
FF b
TaggedValue MemoryValue
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:123
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
unsigned __int128 uint128_t
Definition serialize.hpp:44
Bitwise bitwise