6#include <gtest/gtest.h>
11#pragma GCC diagnostic ignored "-Wunused-const-variable"
17template <
class Builder_>
class BoolTest :
public ::testing::Test {
34 for (
bool is_const : {
false,
true }) {
35 for (
bool value : {
false,
true }) {
36 for (
bool is_inverted : {
false,
true }) {
52 const std::function<
bool(
bool,
bool)>& expected_op)
61 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
63 if (!
a.is_constant() && !
b.is_constant()) {
64 a.set_origin_tag(submitted_value_origin_tag);
65 b.set_origin_tag(challenge_origin_tag);
69 bool expected = expected_op(lhs.value ^ lhs.is_inverted, rhs.value ^ rhs.is_inverted);
72 <<
"Failed on " << op_name <<
" with inputs: lhs = {const=" << lhs.is_const <<
", val=" << lhs.value
73 <<
", inv=" << lhs.is_inverted <<
"}, rhs = {const=" << rhs.is_const <<
", val=" << rhs.value
74 <<
", inv=" << rhs.is_inverted <<
"}";
76 if (
a.is_constant() &&
b.is_constant()) {
80 if (!
a.is_constant() && !
b.is_constant()) {
87 size_t diff =
builder.get_estimated_num_finalized_gates() - num_gates_start;
89 EXPECT_EQ(diff,
static_cast<size_t>(!
a.is_constant() && !
b.is_constant()));
99 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
107 EXPECT_TRUE(num_gates_start ==
builder.get_estimated_num_finalized_gates());
113 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
122 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_start == 2);
129 if (random_value * random_value - random_value != 0) {
131 "((other.witness == bb::fr::one()) || (other.witness == bb::fr::zero()))");
169 [](
bool a,
bool b) {
return !
a ||
b; });
177 [](
bool a,
bool b) {
return !(
a ^
b); });
190 if (
a.is_constant() &&
b.is_constant() && !(!
a.get_value() ||
b.get_value())) {
193 bool result_is_constant = (!
a ||
b).is_constant();
195 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
197 if (!
a.is_constant() && !
b.is_constant()) {
198 a.set_origin_tag(submitted_value_origin_tag);
199 b.set_origin_tag(challenge_origin_tag);
204 bool expected = !(lhs.value ^ lhs.is_inverted) || rhs.value ^ rhs.is_inverted;
206 size_t diff =
builder.get_estimated_num_finalized_gates() - num_gates_start;
208 if (!
a.is_constant() && !
b.is_constant()) {
213 if (result_is_constant) {
217 if (!result_is_constant &&
a.is_constant() && !
b.is_constant()) {
220 EXPECT_EQ(diff,
static_cast<size_t>(!
b.witness_inverted));
223 if (!result_is_constant && !
a.is_constant() &&
b.is_constant()) {
226 EXPECT_EQ(diff,
static_cast<size_t>(
a.witness_inverted));
245 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
246 if (!
a.is_constant() && !
b.is_constant()) {
248 a.set_origin_tag(challenge_origin_tag);
249 b.set_origin_tag(next_challenge_tag);
253 size_t diff =
builder.get_estimated_num_finalized_gates() - num_gates_start;
254 if (!
a.is_constant() && !
b.is_constant()) {
255 EXPECT_EQ(result.
get_origin_tag(), first_second_third_merged_tag);
257 bool expected = (condition.
get_value()) ?
a.get_value() :
b.get_value();
277 size_t num_gates_start =
builder.get_estimated_num_finalized_gates();
278 if (!
a.is_constant()) {
279 a.set_origin_tag(submitted_value_origin_tag);
283 if (!
a.is_constant()) {
287 size_t diff =
builder.get_estimated_num_finalized_gates() - num_gates_start;
290 EXPECT_EQ(diff,
static_cast<size_t>(!
a.is_constant() && a_raw.is_inverted));
306 bool failed =
a.get_value() !=
b.get_value();
308 if (!
a.is_constant() && !
b.is_constant()) {
311 EXPECT_EQ(
builder.failed(), failed);
312 }
else if (!
a.is_constant() || !
b.is_constant()) {
328 auto gates_before =
builder.get_estimated_num_finalized_gates();
333 a.set_origin_tag(submitted_value_origin_tag);
334 b.set_origin_tag(challenge_origin_tag);
337 EXPECT_EQ(
a.get_value(), 1);
340 EXPECT_EQ(
a.get_origin_tag(), first_two_merged_tag);
343 EXPECT_EQ(
b.get_value(), 1);
346 EXPECT_EQ(
b.get_origin_tag(), challenge_origin_tag);
348 a.set_origin_tag(submitted_value_origin_tag);
377 EXPECT_EQ(result,
true);
379 auto gates_after =
builder.get_estimated_num_finalized_gates();
380 EXPECT_EQ(gates_after - gates_before, 6UL);
402 bool_ct rhs = ((
a &&
b) || (
a && c)) ^ (!d || f);
408 info(
"a: ",
a.get_value(),
" b: ",
b.get_value(),
" c: ", c.
get_value());
427 TestFixture::test_construct_from_const_bool();
432 TestFixture::test_construct_from_witness();
437 TestFixture::test_normalize();
441 TestFixture::test_xor();
446 TestFixture::test_AND();
451 TestFixture::test_OR();
456 TestFixture::test_EQ();
461 TestFixture::test_NEQ();
466 TestFixture::test_implies();
471 TestFixture::test_implies_both_ways();
476 TestFixture::test_must_imply();
481 TestFixture::test_conditional_assign();
486 TestFixture::test_basic_operations_tags();
491 TestFixture::test_simple_proof();
495 TestFixture::test_assert_equal();
#define EXPECT_THROW_OR_ABORT(statement, matcher)
void test_implies_both_ways()
void test_conditional_assign()
void test_binary_op(std::string const &op_name, const std::function< bool_ct(const bool_ct &, const bool_ct &)> &op, const std::function< bool(bool, bool)> &expected_op)
void test_basic_operations_tags()
void test_construct_from_const_bool()
std::array< BoolInput, 8 > all_inputs
stdlib::witness_t< Builder > witness_ct
void test_construct_from_witness()
static bool_ct create_bool_ct(const BoolInput &in, Builder *builder)
stdlib::bool_t< Builder > bool_ct
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
virtual uint256_t get_random_uint256()=0
Implements boolean logic in-circuit.
void set_origin_tag(const OriginTag &new_tag) const
bool_t implies(const bool_t &other) const
Implements implication operator in circuit.
bool_t normalize() const
A bool_t element is normalized if witness_inverted == false. For a given *this, output its normalized...
static bool_t conditional_assign(const bool_t< Builder > &predicate, const bool_t &lhs, const bool_t &rhs)
Implements the ternary operator - if predicate == true then return lhs, else return rhs.
bool_t implies_both_ways(const bool_t &other) const
Implements a "double-implication" (<=>), a.k.a "iff", a.k.a. "biconditional".
OriginTag get_origin_tag() const
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
testing::Types< bb::UltraCircuitBuilder > CircuitTypes
static constexpr field one()
static constexpr field zero()