diff options
Diffstat (limited to '')
-rw-r--r-- | test/base-json.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/test/base-json.cpp b/test/base-json.cpp new file mode 100644 index 0000000..02bbebb --- /dev/null +++ b/test/base-json.cpp @@ -0,0 +1,110 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#include "base/dictionary.hpp" +#include "base/function.hpp" +#include "base/namespace.hpp" +#include "base/array.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 }, + { "fx", new Function("<test>", []() {}) }, + { "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, + "fx": "Object of type 'Function'", + "int": -42, + "null": null, + "string": "LF\nTAB\tAUml\u00e4Ill\ufffd", + "true": true, + "uint": 23 +} +)EOF"); + + BOOST_CHECK(JsonEncode(input, true) == output); + + boost::algorithm::replace_all(output, " ", ""); + boost::algorithm::replace_all(output, "Objectoftype'Function'", "Object of type 'Function'"); + 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, + "null": null, + "string": "LF\nTAB\tAUmlIll", + "true": true, + "uint": 23 +} +)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); + BOOST_CHECK_THROW(JsonDecode("{8: \"test\"}"), std::exception); + BOOST_CHECK_THROW(JsonDecode("{\"test\": \"test\""), std::exception); +} + +BOOST_AUTO_TEST_SUITE_END() |