8#include <gtest/gtest.h>
46 static std::vector<std::string>
get_labels() {
return {
"None",
"Input1",
"Input2",
"Result" }; }
60 auto construct_point = [&](
const GrumpkinPoint& point,
bool as_constant) -> std::vector<WitnessOrConstant<FF>> {
63 return { WitnessOrConstant<FF>::from_constant(point.
x), WitnessOrConstant<FF>::from_constant(point.
y) };
66 std::vector<uint32_t> point_indices = add_to_witness_and_track_indices(witness_values, point);
67 return { WitnessOrConstant<FF>::from_index(point_indices[0]),
68 WitnessOrConstant<FF>::from_index(point_indices[1]) };
76 auto input1_fields = construct_point(input1, input1_is_constant);
77 auto input2_fields = construct_point(input2, input2_is_constant);
80 std::vector<uint32_t> result_indices = add_to_witness_and_track_indices(witness_values, result);
81 uint32_t predicate_index = add_to_witness_and_track_indices(witness_values,
FF(1));
84 ec_add_constraint = EcAdd{
85 .input1_x = input1_fields[0],
86 .input1_y = input1_fields[1],
87 .input2_x = input2_fields[0],
88 .input2_y = input2_fields[1],
89 .predicate = WitnessOrConstant<FF>::from_index(predicate_index),
90 .result_x = result_indices[0],
91 .result_y = result_indices[1],
98 switch (invalid_witness_target) {
102 witness_values[constraint.input1_x.index] +=
bb::fr(1);
104 constraint.input1_x = WitnessOrConstant<FF>::from_constant(constraint.input1_x.value +
bb::fr(1));
111 witness_values[constraint.input2_x.index] +=
bb::fr(1);
113 constraint.input2_x = WitnessOrConstant<FF>::from_constant(constraint.input2_x.value +
bb::fr(1));
128 return { constraint, witness_values };
132template <
typename Builder>
134 :
public ::testing::Test,
135 public TestClassWithPredicate<EcOperationsTestingFunctions<Builder, InputConstancy::None>> {
140template <
typename Builder>
142 :
public ::testing::Test,
143 public TestClassWithPredicate<EcOperationsTestingFunctions<Builder, InputConstancy::Input1>> {
148template <
typename Builder>
150 :
public ::testing::Test,
151 public TestClassWithPredicate<EcOperationsTestingFunctions<Builder, InputConstancy::Input2>> {
156template <
typename Builder>
158 :
public ::testing::Test,
159 public TestClassWithPredicate<EcOperationsTestingFunctions<Builder, InputConstancy::Both>> {
164using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
174 TestFixture::template test_vk_independence<Flavor>();
180 TestFixture::test_constant_true(TestFixture::InvalidWitnessTarget::Result);
186 TestFixture::test_witness_true(TestFixture::InvalidWitnessTarget::Result);
192 TestFixture::test_witness_false_slow();
198 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_invalid_witnesses();
204 TestFixture::template test_vk_independence<Flavor>();
210 TestFixture::test_constant_true(TestFixture::InvalidWitnessTarget::Result);
216 TestFixture::test_witness_true(TestFixture::InvalidWitnessTarget::Result);
222 TestFixture::test_witness_false_slow();
228 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_invalid_witnesses();
234 TestFixture::template test_vk_independence<Flavor>();
240 TestFixture::test_constant_true(TestFixture::InvalidWitnessTarget::Result);
246 TestFixture::test_witness_true(TestFixture::InvalidWitnessTarget::Result);
252 TestFixture::test_witness_false_slow();
258 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_invalid_witnesses();
264 TestFixture::template test_vk_independence<Flavor>();
270 TestFixture::test_constant_true(TestFixture::InvalidWitnessTarget::Result);
276 TestFixture::test_witness_true(TestFixture::InvalidWitnessTarget::Result);
282 TestFixture::test_witness_false_slow();
288 [[maybe_unused]] std::vector<std::string> _ = TestFixture::test_invalid_witnesses();
310 uint32_t xi =
static_cast<uint32_t
>(witness.size());
311 witness.emplace_back(pt.
x);
312 uint32_t yi =
static_cast<uint32_t
>(witness.size());
313 witness.emplace_back(pt.
y);
321 WitnessVector witness;
325 uint32_t pred_idx =
static_cast<uint32_t
>(witness.size());
326 witness.emplace_back(
FF(1));
329 .input1_x = WitnessOrConstant<FF>::from_index(i1[0]),
330 .input1_y = WitnessOrConstant<FF>::from_index(i1[1]),
331 .input2_x = WitnessOrConstant<FF>::from_index(i2[0]),
332 .input2_y = WitnessOrConstant<FF>::from_index(i2[1]),
333 .predicate = WitnessOrConstant<FF>::from_index(pred_idx),
337 return { c, witness };
343 AcirFormat cs = constraint_to_acir_format(constraint);
344 AcirProgram program{ cs, witness };
345 auto builder = create_circuit<Builder>(program, ProgramMetadata{});
358 auto [constraint, witness] =
360 auto [ok, err] = TestFixture::run_circuit(constraint, witness);
361 EXPECT_TRUE(ok) <<
"P + (-P) = infinity should produce a valid circuit";
369 auto [constraint, witness] =
372 auto [ok, err] = TestFixture::run_circuit(constraint, witness);
373 EXPECT_TRUE(ok) <<
"infinity + P = P should produce a valid circuit";
#define BB_ASSERT(expression,...)
#define BB_DISABLE_ASSERTS()
static void SetUpTestSuite()
static std::array< uint32_t, 2 > push_point(WitnessVector &witness, const AcirPoint &pt)
static std::pair< bool, std::string > run_circuit(EcAdd constraint, WitnessVector witness)
static std::pair< EcAdd, WitnessVector > make_ec_add(AcirPoint p1, AcirPoint p2, AcirPoint result)
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
Testing functions to generate the EcOperationTest test suite. Constancy specifies which inputs to the...
static ProgramMetadata generate_metadata()
static void generate_constraints(AcirConstraint &ec_add_constraint, WitnessVector &witness_values)
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void SetUpTestSuite()
static void SetUpTestSuite()
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static affine_element random_element(numeric::RNG *engine=nullptr) noexcept
Samples a random point on the curve.
static constexpr affine_element one() noexcept
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
group_elements::affine_element< Fq, Fr, Params > affine_element
TYPED_TEST_SUITE(EcOperationsTestsNoneConstant, BuilderTypes)
TYPED_TEST(EcOperationsTestsNoneConstant, GenerateVKFromConstraints)
bb::group< bb::fr, bb::fq, G1Params > g1
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static AcirPoint from_native(const GrumpkinPoint &p)
static AcirPoint infinity()