]> granicus.if.org Git - icinga2/commitdiff
Test Json{En,De}code()
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Fri, 15 Mar 2019 10:26:51 +0000 (11:26 +0100)
committerAlexander A. Klimov <alexander.klimov@icinga.com>
Mon, 18 Mar 2019 14:07:57 +0000 (15:07 +0100)
test/CMakeLists.txt
test/base-json.cpp

index 8dc05b64557a00b0883b23a2fb8e688870af12b4..6d9767da895e31085d3108f50acb889555b08d35 100644 (file)
@@ -69,6 +69,8 @@ add_boost_test(base
     base_dictionary/json
     base_fifo/construct
     base_fifo/io
+    base_json/encode
+    base_json/decode
     base_json/invalid1
     base_object_packer/pack_null
     base_object_packer/pack_false
index 7cb799af01d577300943020ec76cfb146c287981..6e848a2cc6eadc402cdb25b671536e5c9a22cb0b 100644 (file)
@@ -1,14 +1,98 @@
 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 
 #include "base/dictionary.hpp"
+#include "base/namespace.hpp"
 #include "base/objectlock.hpp"
 #include "base/json.hpp"
+#include <boost/algorithm/string/replace.hpp>
 #include <BoostTestTargetConfig.h>
 
 using namespace icinga;
 
 BOOST_AUTO_TEST_SUITE(base_json)
 
+BOOST_AUTO_TEST_CASE(encode)
+{
+       Dictionary::Ptr input (new Dictionary({
+               { "array", new Array({ new Namespace() }) },
+               { "false", false },
+               { "float", -1.25 },
+               { "int", -42 },
+               { "null", Value() },
+               { "string", "LF\nTAB\tAUml\xC3\xA4Ill\xC3" },
+               { "true", true },
+               { "uint", 23u }
+       }));
+
+       String output (R"EOF({
+    "array": [
+        {}
+    ],
+    "false": false,
+    "float": -1.25,
+    "int": -42.0,
+    "null": null,
+    "string": "LF\nTAB\tAUml\u00e4Ill\ufffd",
+    "true": true,
+    "uint": 23.0
+})EOF");
+
+       BOOST_CHECK(JsonEncode(input, true) == output);
+
+       boost::algorithm::replace_all(output, " ", "");
+       boost::algorithm::replace_all(output, "\n", "");
+
+       BOOST_CHECK(JsonEncode(input, false) == output);
+}
+
+BOOST_AUTO_TEST_CASE(decode)
+{
+       String input (R"EOF({
+    "array": [
+        {}
+    ],
+    "false": false,
+    "float": -1.25,
+    "int": -42.0,
+    "null": null,
+    "string": "LF\nTAB\tAUmlIll",
+    "true": true,
+    "uint": 23.0
+})EOF");
+
+       boost::algorithm::replace_all(input, "AUml", "AUml\xC3\xA4");
+       boost::algorithm::replace_all(input, "Ill", "Ill\xC3");
+
+       auto output ((Dictionary::Ptr)JsonDecode(input));
+       BOOST_CHECK(output->GetKeys() == std::vector<String>({"array", "false", "float", "int", "null", "string", "true", "uint"}));
+
+       auto array ((Array::Ptr)output->Get("array"));
+       BOOST_CHECK(array->GetLength() == 1u);
+
+       auto array0 ((Dictionary::Ptr)array->Get(0));
+       BOOST_CHECK(array0->GetKeys() == std::vector<String>());
+
+       auto fAlse (output->Get("false"));
+       BOOST_CHECK(fAlse.IsBoolean() && !fAlse.ToBool());
+
+       auto fLoat (output->Get("float"));
+       BOOST_CHECK(fLoat.IsNumber() && fLoat.Get<double>() == -1.25);
+
+       auto iNt (output->Get("int"));
+       BOOST_CHECK(iNt.IsNumber() && iNt.Get<double>() == -42.0);
+
+       BOOST_CHECK(output->Get("null").IsEmpty());
+
+       auto string (output->Get("string"));
+       BOOST_CHECK(string.IsString() && string.Get<String>() == "LF\nTAB\tAUml\xC3\xA4Ill\xEF\xBF\xBD");
+
+       auto tRue (output->Get("true"));
+       BOOST_CHECK(tRue.IsBoolean() && tRue.ToBool());
+
+       auto uint (output->Get("uint"));
+       BOOST_CHECK(uint.IsNumber() && uint.Get<double>() == 23.0);
+}
+
 BOOST_AUTO_TEST_CASE(invalid1)
 {
        BOOST_CHECK_THROW(JsonDecode("\"1.7"), std::exception);