#include #include "dpf.hpp" #include "helpers/eval_common_data.hpp" #include namespace { template auto recon(const A & a, const B & b) { if constexpr (dpf::is_secret_share_v> && dpf::is_secret_share_v>) return dpf::reconstruct(a, b); else return a - b; } } // namespace template struct EvalFullTest : public testing::Test { public: using input_type = typename std::tuple_element_t<0, T>; using output_type = typename std::tuple_element_t<1, T>; using dpf_type = dpf::utils::dpf_type_t; protected: EvalFullTest() : params{std::get>(allParams)}, range{std::size_t(1) << dpf::utils::bitlength_of_v}, zero_output{from_integral_type_output(0)} { } void SetUp() override { } void TearDown() override { } template void assert_wrapper(const input_type & x, const output_type & y, const IterableT0 & iter0, const IterableT1 & iter1) { auto it0 = std::cbegin(iter0); auto it1 = std::cbegin(iter1); input_type cur = std::numeric_limits::min(); for (std::size_t i = 0; i < range; ++i, cur = next_domain_point(cur), ++it0, ++it1) { if (cur == x) { ASSERT_EQ(recon(*it0, *it1), y); } else { ASSERT_EQ(recon(*it0, *it1), zero_output); } } ASSERT_EQ(it0, std::end(iter0)); ASSERT_EQ(it1, std::end(iter1)); } static constexpr auto from_integral_type = dpf::utils::make_from_integral_value{}; static constexpr auto from_integral_type_output = dpf::utils::make_from_integral_value{}; std::vector params; std::size_t range; output_type zero_output; }; TYPED_TEST_SUITE_P(EvalFullTest); TYPED_TEST_P(EvalFullTest, Basic) { for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto [buf0, iter0] = dpf::eval_full(dpf0); auto [buf1, iter1] = dpf::eval_full(dpf1); this->assert_wrapper(x, y, iter0, iter1); } } TYPED_TEST_P(EvalFullTest, Outbuf) { for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto buf0 = dpf::make_output_buffer_for_full(dpf0), buf1 = dpf::make_output_buffer_for_full(dpf1); auto iter0 = dpf::eval_full(dpf0, buf0), iter1 = dpf::eval_full(dpf1, buf1); this->assert_wrapper(x, y, iter0, iter1); } } TYPED_TEST_P(EvalFullTest, BasicFullMemoizer) { using dpf_type = typename TestFixture::dpf_type; auto memo0 = dpf::make_basic_full_memoizer(), memo1 = dpf::make_basic_full_memoizer(); for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto [buf0, iter0] = dpf::eval_full(dpf0, memo0); auto [buf1, iter1] = dpf::eval_full(dpf1, memo1); this->assert_wrapper(x, y, iter0, iter1); } } TYPED_TEST_P(EvalFullTest, FullTreeFullMemoizer) { using dpf_type = typename TestFixture::dpf_type; auto memo0 = dpf::make_full_tree_full_memoizer(), memo1 = dpf::make_full_tree_full_memoizer(); for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto [buf0, iter0] = dpf::eval_full(dpf0, memo0); auto [buf1, iter1] = dpf::eval_full(dpf1, memo1); this->assert_wrapper(x, y, iter0, iter1); } } TYPED_TEST_P(EvalFullTest, BasicFullMemoizerOutbuf) { using dpf_type = typename TestFixture::dpf_type; auto buf0 = dpf::make_output_buffer_for_full(), buf1 = dpf::make_output_buffer_for_full(); auto memo0 = dpf::make_basic_full_memoizer(), memo1 = dpf::make_basic_full_memoizer(); for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto iter0 = dpf::eval_full(dpf0, buf0, memo0), iter1 = dpf::eval_full(dpf1, buf1, memo1); this->assert_wrapper(x, y, iter0, iter1); } } TYPED_TEST_P(EvalFullTest, FullTreeFullMemoizerOutbuf) { using dpf_type = typename TestFixture::dpf_type; auto buf0 = dpf::make_output_buffer_for_full(), buf1 = dpf::make_output_buffer_for_full(); auto memo0 = dpf::make_full_tree_full_memoizer(), memo1 = dpf::make_full_tree_full_memoizer(); for (auto [x, y] : this->params) { auto [dpf0, dpf1] = dpf::make_dpf(x, y); auto iter0 = dpf::eval_full(dpf0, buf0, memo0), iter1 = dpf::eval_full(dpf1, buf1, memo1); this->assert_wrapper(x, y, iter0, iter1); } } REGISTER_TYPED_TEST_SUITE_P(EvalFullTest, Basic, Outbuf, BasicFullMemoizer, FullTreeFullMemoizer, BasicFullMemoizerOutbuf, FullTreeFullMemoizerOutbuf); using Types = testing::Types < // base test test_type, // test input types test_type, test_type, test_type, uint64_t>, test_type, uint64_t>, test_type, uint64_t>, test_type, uint64_t>, test_type, uint64_t>, // test output types test_type, test_type, test_type, test_type, test_type, test_type>, test_type>, test_type>, test_type>, // custom types test_type, test_type, test_type, test_type >; INSTANTIATE_TYPED_TEST_SUITE_P(EvalFullTestInstantiation, EvalFullTest, Types);