#include "libexpr/attr-set.hh" #include <cstdio> #include <optional> #include <string> #include <vector> #include <absl/container/btree_map.h> #include <bits/stdint-intn.h> #include <gtest/gtest.h> #include <rapidcheck.h> #include <rapidcheck/Assertions.h> #include <rapidcheck/gen/Arbitrary.h> #include <rapidcheck/gen/Build.h> #include <rapidcheck/gen/Create.h> #include <rapidcheck/gen/Transform.h> #include <rapidcheck/gtest.h> #include "libexpr/eval.hh" #include "libexpr/nixexpr.hh" #include "libexpr/symbol-table.hh" #include "libexpr/value.hh" #include "tests/arbitrary.hh" #include "tests/dummy-store.hh" namespace nix { using nix::tests::DummyStore; class AttrSetTest : public ::testing::Test { protected: EvalState* eval_state_; void SetUp() override { nix::expr::InitGC(); auto store = std::make_shared<DummyStore>(); eval_state_ = new EvalState({"."}, ref<Store>(store)); tests::symbol_table = &eval_state_->symbols; } void assert_bindings_equal(nix::Bindings* lhs, nix::Bindings* rhs) { RC_ASSERT(lhs->Equal(rhs, *eval_state_)); } }; class AttrSetMonoidTest : public AttrSetTest {}; RC_GTEST_FIXTURE_PROP(AttrSetMonoidTest, mergeLeftIdentity, (nix::Bindings && bindings)) { auto empty_bindings = nix::Bindings::New(); auto result = Bindings::Merge(*empty_bindings, bindings); assert_bindings_equal(result.get(), &bindings); } RC_GTEST_FIXTURE_PROP(AttrSetMonoidTest, mergeRightIdentity, (nix::Bindings && bindings)) { auto empty_bindings = nix::Bindings::New(); auto result = Bindings::Merge(bindings, *empty_bindings); assert_bindings_equal(result.get(), &bindings); } RC_GTEST_FIXTURE_PROP(AttrSetMonoidTest, mergeAssociative, (nix::Bindings && bindings_1, nix::Bindings&& bindings_2, nix::Bindings&& bindings_3)) { auto b231 = Bindings::Merge(bindings_1, *Bindings::Merge(bindings_2, bindings_3)); auto b123 = Bindings::Merge(*Bindings::Merge(bindings_1, bindings_2), bindings_3); assert_bindings_equal(b231.get(), b123.get()); } } // namespace nix