33#include < gtest/gtest.h>
44#include < rapidcheck/gtest.h>
55
6- #include " nix/util/tests/characterization.hh"
6+ #include " nix/util/tests/json- characterization.hh"
77#include " nix/store/tests/derived-path.hh"
88#include " nix/store/tests/libstore.hh"
99
1010namespace nix {
1111
12- class DerivedPathTest : public CharacterizationTest , public LibStoreTest
12+ class DerivedPathTest : public virtual CharacterizationTest, public LibStoreTest
1313{
1414 std::filesystem::path unitTestData = getUnitTestData() / " derived-path" ;
1515
@@ -123,25 +123,51 @@ RC_GTEST_FIXTURE_PROP(DerivedPathTest, prop_round_rip, (const DerivedPath & o))
123123
124124using nlohmann::json;
125125
126- #define TEST_JSON (TYPE, NAME, VAL ) \
127- static const TYPE NAME = VAL; \
128- \
129- TEST_F (DerivedPathTest, NAME##_from_json) \
130- { \
131- readTest (#NAME " .json" , [&](const auto & encoded_) { \
132- auto encoded = json::parse (encoded_); \
133- TYPE got = static_cast <TYPE>(encoded); \
134- ASSERT_EQ (got, NAME); \
135- }); \
136- } \
137- \
138- TEST_F (DerivedPathTest, NAME##_to_json) \
139- { \
140- writeTest ( \
141- #NAME " .json" , \
142- [&]() -> json { return static_cast <json>(NAME); }, \
143- [](const auto & file) { return json::parse (readFile (file)); }, \
144- [](const auto & file, const auto & got) { return writeFile (file, got.dump (2 ) + " \n " ); }); \
126+ struct SingleDerivedPathJsonTest : DerivedPathTest,
127+ JsonCharacterizationTest<SingleDerivedPath>,
128+ ::testing::WithParamInterface<SingleDerivedPath>
129+ {};
130+
131+ struct DerivedPathJsonTest : DerivedPathTest,
132+ JsonCharacterizationTest<DerivedPath>,
133+ ::testing::WithParamInterface<DerivedPath>
134+ {};
135+
136+ #define TEST_JSON (TYPE, NAME, VAL ) \
137+ static const TYPE NAME = VAL; \
138+ \
139+ TEST_F (TYPE##JsonTest, NAME##_from_json) \
140+ { \
141+ readJsonTest (#NAME, NAME); \
142+ } \
143+ \
144+ TEST_F (TYPE##JsonTest, NAME##_to_json) \
145+ { \
146+ writeJsonTest (#NAME, NAME); \
147+ }
148+
149+ #define TEST_JSON_XP_DYN (TYPE, NAME, VAL ) \
150+ static const TYPE NAME = VAL; \
151+ \
152+ TEST_F (TYPE##JsonTest, NAME##_from_json_throws_without_xp) \
153+ { \
154+ std::optional<json> ret; \
155+ readTest (#NAME " .json" , [&](const auto & encoded_) { ret = json::parse (encoded_); }); \
156+ if (ret) { \
157+ EXPECT_THROW (nlohmann::adl_serializer<TYPE>::from_json (*ret), MissingExperimentalFeature); \
158+ } \
159+ } \
160+ \
161+ TEST_F (TYPE##JsonTest, NAME##_from_json) \
162+ { \
163+ ExperimentalFeatureSettings xpSettings; \
164+ xpSettings.set (" experimental-features" , " dynamic-derivations" ); \
165+ readJsonTest (#NAME, NAME, xpSettings); \
166+ } \
167+ \
168+ TEST_F (TYPE##JsonTest, NAME##_to_json) \
169+ { \
170+ writeJsonTest (#NAME, NAME); \
145171 }
146172
147173TEST_JSON (
@@ -156,7 +182,7 @@ TEST_JSON(
156182 .output = " bar" ,
157183 }));
158184
159- TEST_JSON (
185+ TEST_JSON_XP_DYN (
160186 SingleDerivedPath,
161187 single_built_built,
162188 (SingleDerivedPath::Built{
@@ -179,7 +205,7 @@ TEST_JSON(
179205 .outputs = OutputsSpec::Names{" bar" , " baz" },
180206 }));
181207
182- TEST_JSON (
208+ TEST_JSON_XP_DYN (
183209 DerivedPath,
184210 multi_built_built,
185211 (DerivedPath::Built{
@@ -191,7 +217,7 @@ TEST_JSON(
191217 .outputs = OutputsSpec::Names{" baz" , " quux" },
192218 }));
193219
194- TEST_JSON (
220+ TEST_JSON_XP_DYN (
195221 DerivedPath,
196222 multi_built_built_wildcard,
197223 (DerivedPath::Built{
0 commit comments