libdpf/test/tests/constrained_cmp_test.cpp

65 lines
1.9 KiB
C++
Raw Permalink Normal View History

#include <gtest/gtest.h>
#include "dpf.hpp"
#include <cstdint>
#include <limits>
#include <random>
TEST(ConstrainedCmp, LemmaAdjacentPairs)
{
// |x0 − x1| = 1 ⇒ local_ccmp = 1{x0 < x1}.
EXPECT_EQ(dpf::local_ccmp(0, 1), 1u);
EXPECT_EQ(dpf::local_ccmp(1, 0), 0u);
EXPECT_EQ(dpf::local_ccmp(2, 3), 1u);
EXPECT_EQ(dpf::local_ccmp(3, 2), 0u);
EXPECT_EQ(dpf::local_ccmp(100, 101), 1u);
EXPECT_EQ(dpf::local_ccmp(101, 100), 0u);
// Control-bit pairs used by arith leaf open (t0 ⊕ t1 = 1).
EXPECT_EQ(dpf::local_ccmp(0, 1), 1u); // g = t1
EXPECT_EQ(dpf::local_ccmp(1, 0), 0u); // g = t1
}
TEST(ConstrainedCmp, RandomAdjacentBatch)
{
std::mt19937_64 rng{0xC0FFEEULL};
std::uniform_int_distribution<std::uint64_t> dist(0, (1ull << 40) - 2);
for (int i = 0; i < 256; ++i)
{
const std::uint64_t a = dist(rng);
const std::uint64_t b = a + 1;
EXPECT_EQ(dpf::local_ccmp(a, b), 1u) << a << " < " << b;
EXPECT_EQ(dpf::local_ccmp(b, a), 0u) << b << " > " << a;
EXPECT_EQ(dpf::local_ccmp_int(a, b), 1u);
EXPECT_EQ(dpf::local_ccmp_int(b, a), 0u);
}
}
TEST(ConstrainedCmp, PartyTermsMatchTheAndInputs)
{
uint8_t z0 = 9, z1 = 9, l = 9;
dpf::detail::ccmp_party_terms(0b10, 0, z0, z1, l);
EXPECT_EQ(l, 0u);
EXPECT_EQ(z0, 1u);
EXPECT_EQ(z1, 1u);
dpf::detail::ccmp_party_terms(0b11, 1, z0, z1, l);
EXPECT_EQ(l, 1u);
EXPECT_EQ(z0, 1u);
EXPECT_EQ(z1, static_cast<uint8_t>(1u ^ 1u ^ 1u));
}
TEST(ConstrainedCmp, AdjacentAtTheTopOfUint64)
{
const std::uint64_t top = std::numeric_limits<std::uint64_t>::max();
EXPECT_EQ(dpf::local_ccmp(top - 1, top), 1u);
EXPECT_EQ(dpf::local_ccmp(top, top - 1), 0u);
}
TEST(ConstrainedCmp, ProtocolHook)
{
dpf::detail::urandom_pad_rng pads{};
dpf::local_cw_protocol<dpf::detail::urandom_pad_rng> proto{pads};
EXPECT_EQ(proto.open_ccmp(0, 1), 1u);
EXPECT_EQ(proto.open_ccmp(1, 0), 0u);
}