diff options
Diffstat (limited to 'third_party/nix/src/tests/value-to-json.cc')
-rw-r--r-- | third_party/nix/src/tests/value-to-json.cc | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/third_party/nix/src/tests/value-to-json.cc b/third_party/nix/src/tests/value-to-json.cc new file mode 100644 index 000000000000..45427425306f --- /dev/null +++ b/third_party/nix/src/tests/value-to-json.cc @@ -0,0 +1,257 @@ +#include "libexpr/value-to-json.hh" + +#include <set> +#include <sstream> + +#include <gtest/gtest.h> + +#include "libexpr/value-to-xml.hh" +#include "libexpr/value.hh" +#include "libstore/store-api.hh" +#include "tests/dummy-store.hh" + +class ValueTest : public ::testing::Test { + protected: + static void SetUpTestCase() { nix::expr::InitGC(); } + + static void TearDownTestCase() {} +}; + +class JSONValueTest : public ValueTest {}; +class XMLValueTest : public ValueTest {}; + +namespace nix { + +using nix::tests::DummyStore; + +TEST_F(JSONValueTest, null) { + std::stringstream ss; + Value v; + PathSet ps; + std::shared_ptr<Store> store = std::make_shared<DummyStore>(); + EvalState s({}, ref<Store>(store)); + + mkNull(v); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "null"); +} + +TEST_F(JSONValueTest, BoolFalse) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkBool(v, false); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "false"); +} + +TEST_F(JSONValueTest, BoolTrue) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkBool(v, true); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "true"); +} + +TEST_F(JSONValueTest, IntPositive) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkInt(v, 100); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "100"); +} + +TEST_F(JSONValueTest, IntNegative) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkInt(v, -100); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "-100"); +} + +TEST_F(JSONValueTest, String) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkString(v, "test"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"test\""); +} + +TEST_F(JSONValueTest, StringQuotes) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkString(v, "test\""); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"test\\\"\""); +} + +TEST_F(JSONValueTest, Path) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkPathNoCopy(v, "/exists-for-tests"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x\""); +} + +TEST_F(JSONValueTest, PathNoCopy) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkPathNoCopy(v, "/exists-for-tests"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x\""); +} + +/* + * Value to XMl tests + */ + +#define XML(v) \ + ("<?xml version='1.0' encoding='utf-8'?>\n<expr>\n" v "\n</expr>\n") + +TEST_F(XMLValueTest, null) { + std::stringstream ss; + Value v; + PathSet ps; + auto store = std::make_shared<DummyStore>(); + EvalState s({}, ref<Store>(store)); + + mkNull(v); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <null />")); +} + +TEST_F(XMLValueTest, BoolFalse) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkBool(v, false); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <bool value=\"false\" />")); +} + +TEST_F(XMLValueTest, BoolTrue) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkBool(v, true); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <bool value=\"true\" />")); +} + +TEST_F(XMLValueTest, IntPositive) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkInt(v, 100); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <int value=\"100\" />")); +} + +TEST_F(XMLValueTest, IntNegative) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkInt(v, -100); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <int value=\"-100\" />")); +} + +TEST_F(XMLValueTest, String) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkString(v, "test-value"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <string value=\"test-value\" />")); +} + +TEST_F(XMLValueTest, StringQuotes) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkString(v, "test-value\""); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <string value=\"test-value"\" />")); +} + +/* + * FIXME: This function returns the original input path while the JSON version + * of the same actually touches the store to create a /nix/store path. + */ +TEST_F(XMLValueTest, Path) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkPath(v, "some-path"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <path value=\"some-path\" />")); +} + +/* + * FIXME: This function returns the original input path while the JSON version + * of the same actually touches the store to create a /nix/store path. + */ +TEST_F(XMLValueTest, PathNoCopy) { + std::stringstream ss; + auto store = std::make_shared<DummyStore>(); + EvalState s({"."}, ref<Store>(store)); + Value v; + PathSet ps; + + mkPathNoCopy(v, "some-other-path"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" <path value=\"some-other-path\" />")); +} +} // namespace nix |