From 315cc722e9910d09de668905592a59ea793eeb2e Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 8 Jan 2024 19:31:29 +0100 Subject: [PATCH] Add more tests for `JsonVariantConst` --- extras/tests/CMakeLists.txt | 1 + extras/tests/JsonVariant/as.cpp | 11 -- extras/tests/JsonVariant/containsKey.cpp | 16 -- extras/tests/JsonVariant/is.cpp | 155 ----------------- extras/tests/JsonVariant/isnull.cpp | 8 - extras/tests/JsonVariant/subscript.cpp | 72 -------- extras/tests/JsonVariantConst/CMakeLists.txt | 20 +++ extras/tests/JsonVariantConst/as.cpp | 19 ++ extras/tests/JsonVariantConst/containsKey.cpp | 33 ++++ extras/tests/JsonVariantConst/is.cpp | 162 ++++++++++++++++++ extras/tests/JsonVariantConst/isnull.cpp | 21 +++ extras/tests/JsonVariantConst/nesting.cpp | 31 ++++ extras/tests/JsonVariantConst/size.cpp | 36 ++++ extras/tests/JsonVariantConst/subscript.cpp | 68 ++++++++ 14 files changed, 391 insertions(+), 262 deletions(-) create mode 100644 extras/tests/JsonVariantConst/CMakeLists.txt create mode 100644 extras/tests/JsonVariantConst/as.cpp create mode 100644 extras/tests/JsonVariantConst/containsKey.cpp create mode 100644 extras/tests/JsonVariantConst/is.cpp create mode 100644 extras/tests/JsonVariantConst/isnull.cpp create mode 100644 extras/tests/JsonVariantConst/nesting.cpp create mode 100644 extras/tests/JsonVariantConst/size.cpp create mode 100644 extras/tests/JsonVariantConst/subscript.cpp diff --git a/extras/tests/CMakeLists.txt b/extras/tests/CMakeLists.txt index 03485640..f79a3c92 100644 --- a/extras/tests/CMakeLists.txt +++ b/extras/tests/CMakeLists.txt @@ -23,6 +23,7 @@ add_subdirectory(JsonObject) add_subdirectory(JsonObjectConst) add_subdirectory(JsonSerializer) add_subdirectory(JsonVariant) +add_subdirectory(JsonVariantConst) add_subdirectory(ResourceManager) add_subdirectory(Misc) add_subdirectory(MixedConfiguration) diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index f17106ef..cacf895a 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -251,17 +251,6 @@ TEST_CASE("JsonVariant::as()") { } #endif - SECTION("should work on JsonVariantConst") { - variant.set("hello"); - - JsonVariantConst cvar = variant; - - REQUIRE(cvar.as() == true); - REQUIRE(cvar.as() == 0L); - REQUIRE(cvar.as() == std::string("hello")); - REQUIRE(cvar.as() == std::string("hello")); - } - SECTION("as()") { variant.set(1); diff --git a/extras/tests/JsonVariant/containsKey.cpp b/extras/tests/JsonVariant/containsKey.cpp index 2e0bb62e..45af06d3 100644 --- a/extras/tests/JsonVariant/containsKey.cpp +++ b/extras/tests/JsonVariant/containsKey.cpp @@ -24,19 +24,3 @@ TEST_CASE("JsonVariant::containsKey()") { REQUIRE(var.containsKey(std::string("world")) == false); } } - -TEST_CASE("JsonVariantConst::containsKey()") { - JsonDocument doc; - doc["hello"] = "world"; - JsonVariantConst cvar = doc.as(); - - SECTION("containsKey(const char*) returns true") { - REQUIRE(cvar.containsKey("hello") == true); - REQUIRE(cvar.containsKey("world") == false); - } - - SECTION("containsKey(std::string) returns true") { - REQUIRE(cvar.containsKey(std::string("hello")) == true); - REQUIRE(cvar.containsKey(std::string("world")) == false); - } -} diff --git a/extras/tests/JsonVariant/is.cpp b/extras/tests/JsonVariant/is.cpp index 72f3cd9f..4d070346 100644 --- a/extras/tests/JsonVariant/is.cpp +++ b/extras/tests/JsonVariant/is.cpp @@ -162,158 +162,3 @@ TEST_CASE("JsonVariant::is()") { CHECK(variant.is() == true); } } - -TEST_CASE("JsonVariantConst::is()") { - JsonDocument doc; - JsonVariant variant = doc.to(); - JsonVariantConst cvariant = variant; - - SECTION("unbound") { - cvariant = JsonVariantConst(); - - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("null") { - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("true") { - variant.set(true); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("false") { - variant.set(false); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("int") { - variant.set(42); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("double") { - variant.set(4.2); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("const char*") { - variant.set("4.2"); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("JsonArray") { - variant.to(); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } - - SECTION("JsonObject") { - variant.to(); - - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - CHECK(cvariant.is() == false); - } -} diff --git a/extras/tests/JsonVariant/isnull.cpp b/extras/tests/JsonVariant/isnull.cpp index c0d114a1..75617e97 100644 --- a/extras/tests/JsonVariant/isnull.cpp +++ b/extras/tests/JsonVariant/isnull.cpp @@ -69,12 +69,4 @@ TEST_CASE("JsonVariant::isNull()") { variant.set(serialized(static_cast(0))); REQUIRE(variant.isNull() == true); } - - SECTION("works with JsonVariantConst") { - variant.set(42); - - JsonVariantConst cvar = variant; - - REQUIRE(cvar.isNull() == false); - } } diff --git a/extras/tests/JsonVariant/subscript.cpp b/extras/tests/JsonVariant/subscript.cpp index ad172c76..9f2e9129 100644 --- a/extras/tests/JsonVariant/subscript.cpp +++ b/extras/tests/JsonVariant/subscript.cpp @@ -130,75 +130,3 @@ TEST_CASE("JsonVariant::operator[]") { } #endif } - -TEST_CASE("JsonVariantConst::operator[]") { - JsonDocument doc; - JsonVariant var = doc.to(); - JsonVariantConst cvar = var; - - SECTION("The JsonVariant is null") { - REQUIRE(0 == cvar.size()); - REQUIRE(cvar["0"].isNull()); - REQUIRE(cvar[0].isNull()); - } - - SECTION("The JsonVariant is a string") { - var.set("hello world"); - REQUIRE(0 == cvar.size()); - REQUIRE(cvar["0"].isNull()); - REQUIRE(cvar[0].isNull()); - } - - SECTION("The JsonVariant is a JsonArray") { - JsonArray array = var.to(); - - SECTION("get value") { - array.add("element at index 0"); - array.add("element at index 1"); - - REQUIRE(2 == cvar.size()); - REQUIRE(std::string("element at index 0") == cvar[0]); - REQUIRE(std::string("element at index 1") == cvar[1]); - REQUIRE(std::string("element at index 0") == - var[static_cast(0)]); // issue #381 - REQUIRE(cvar[666].isNull()); - REQUIRE(cvar[3].isNull()); - REQUIRE(cvar["0"].isNull()); - } - } - - SECTION("The JsonVariant is a JsonObject") { - JsonObject object = var.to(); - - SECTION("get value") { - object["a"] = "element at key \"a\""; - object["b"] = "element at key \"b\""; - - REQUIRE(2 == cvar.size()); - REQUIRE(std::string("element at key \"a\"") == cvar["a"]); - REQUIRE(std::string("element at key \"b\"") == cvar["b"]); - REQUIRE(cvar["c"].isNull()); - REQUIRE(cvar[0].isNull()); - } - } - - SECTION("Auto promote null JsonVariant to JsonObject") { - var["hello"] = "world"; - - REQUIRE(var.is() == true); - } - - SECTION("Don't auto promote non-null JsonVariant to JsonObject") { - var.set(42); - var["hello"] = "world"; - - REQUIRE(var.is() == false); - } - - SECTION("Don't auto promote null JsonVariant to JsonObject when reading") { - const char* value = var["hello"]; - - REQUIRE(var.is() == false); - REQUIRE(value == 0); - } -} diff --git a/extras/tests/JsonVariantConst/CMakeLists.txt b/extras/tests/JsonVariantConst/CMakeLists.txt new file mode 100644 index 00000000..d0dc65e9 --- /dev/null +++ b/extras/tests/JsonVariantConst/CMakeLists.txt @@ -0,0 +1,20 @@ +# ArduinoJson - https://arduinojson.org +# Copyright © 2014-2024, Benoit BLANCHON +# MIT License + +add_executable(JsonVariantConstTests + as.cpp + containsKey.cpp + is.cpp + isnull.cpp + nesting.cpp + size.cpp + subscript.cpp +) + +add_test(JsonVariantConst JsonVariantConstTests) + +set_tests_properties(JsonVariantConst + PROPERTIES + LABELS "Catch" +) diff --git a/extras/tests/JsonVariantConst/as.cpp b/extras/tests/JsonVariantConst/as.cpp new file mode 100644 index 00000000..6b86f156 --- /dev/null +++ b/extras/tests/JsonVariantConst/as.cpp @@ -0,0 +1,19 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include +#include + +TEST_CASE("JsonVariantConst::as()") { + JsonDocument doc; + JsonVariantConst var = doc.to(); + + doc.set("hello"); + + REQUIRE(var.as() == true); + REQUIRE(var.as() == 0L); + REQUIRE(var.as() == std::string("hello")); + REQUIRE(var.as() == std::string("hello")); +} diff --git a/extras/tests/JsonVariantConst/containsKey.cpp b/extras/tests/JsonVariantConst/containsKey.cpp new file mode 100644 index 00000000..7ab96300 --- /dev/null +++ b/extras/tests/JsonVariantConst/containsKey.cpp @@ -0,0 +1,33 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include +#include + +TEST_CASE("JsonVariantConst::containsKey()") { + JsonDocument doc; + doc["hello"] = "world"; + JsonVariantConst var = doc.as(); + + SECTION("support const char*") { + REQUIRE(var.containsKey("hello") == true); + REQUIRE(var.containsKey("world") == false); + } + + SECTION("support std::string") { + REQUIRE(var.containsKey(std::string("hello")) == true); + REQUIRE(var.containsKey(std::string("world")) == false); + } + +#ifdef HAS_VARIABLE_LENGTH_ARRAY + SECTION("supports VLA") { + size_t i = 16; + char vla[i]; + strcpy(vla, "hello"); + + REQUIRE(true == var.containsKey(vla)); + } +#endif +} diff --git a/extras/tests/JsonVariantConst/is.cpp b/extras/tests/JsonVariantConst/is.cpp new file mode 100644 index 00000000..24f93261 --- /dev/null +++ b/extras/tests/JsonVariantConst/is.cpp @@ -0,0 +1,162 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +enum MYENUM2 { ONE = 1, TWO = 2 }; + +TEST_CASE("JsonVariantConst::is()") { + JsonDocument doc; + JsonVariantConst var = doc.to(); + + SECTION("unbound") { + var = JsonVariantConst(); + + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("null") { + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("true") { + doc.set(true); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("false") { + doc.set(false); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("int") { + doc.set(42); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("double") { + doc.set(4.2); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("const char*") { + doc.set("4.2"); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("JsonArray") { + doc.to(); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } + + SECTION("JsonObject") { + doc.to(); + + CHECK(var.is() == true); + CHECK(var.is() == true); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + CHECK(var.is() == false); + } +} diff --git a/extras/tests/JsonVariantConst/isnull.cpp b/extras/tests/JsonVariantConst/isnull.cpp new file mode 100644 index 00000000..14572c7a --- /dev/null +++ b/extras/tests/JsonVariantConst/isnull.cpp @@ -0,0 +1,21 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonVariantConst::isNull()") { + JsonDocument doc; + JsonVariantConst variant = doc.to(); + + SECTION("returns true when undefined") { + REQUIRE(variant.isNull() == true); + } + + SECTION("returns false if value is integer") { + doc.set(42); + + REQUIRE(variant.isNull() == false); + } +} diff --git a/extras/tests/JsonVariantConst/nesting.cpp b/extras/tests/JsonVariantConst/nesting.cpp new file mode 100644 index 00000000..827f766b --- /dev/null +++ b/extras/tests/JsonVariantConst/nesting.cpp @@ -0,0 +1,31 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonVariantConst::nesting()") { + JsonDocument doc; + JsonVariantConst var = doc.to(); + + SECTION("return 0 if unbound") { + JsonVariantConst unbound; + REQUIRE(unbound.nesting() == 0); + } + + SECTION("returns 0 for string") { + doc.set("hello"); + REQUIRE(var.nesting() == 0); + } + + SECTION("returns 1 for empty object") { + doc.to(); + REQUIRE(var.nesting() == 1); + } + + SECTION("returns 1 for empty array") { + doc.to(); + REQUIRE(var.nesting() == 1); + } +} diff --git a/extras/tests/JsonVariantConst/size.cpp b/extras/tests/JsonVariantConst/size.cpp new file mode 100644 index 00000000..c047951b --- /dev/null +++ b/extras/tests/JsonVariantConst/size.cpp @@ -0,0 +1,36 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonVariantConst::size()") { + JsonDocument doc; + JsonVariantConst variant = doc.to(); + + SECTION("unbound reference") { + JsonVariantConst unbound; + + CHECK(unbound.size() == 0); + } + + SECTION("int") { + doc.set(42); + + CHECK(variant.size() == 0); + } + + SECTION("string") { + doc.set("hello"); + + CHECK(variant.size() == 0); + } + + SECTION("object") { + doc["a"] = 1; + doc["b"] = 2; + + CHECK(variant.size() == 2); + } +} diff --git a/extras/tests/JsonVariantConst/subscript.cpp b/extras/tests/JsonVariantConst/subscript.cpp new file mode 100644 index 00000000..70a733b2 --- /dev/null +++ b/extras/tests/JsonVariantConst/subscript.cpp @@ -0,0 +1,68 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonVariantConst::operator[]") { + JsonDocument doc; + JsonVariantConst var = doc.to(); + + SECTION("null") { + REQUIRE(0 == var.size()); + REQUIRE(var["0"].isNull()); + REQUIRE(var[0].isNull()); + } + + SECTION("string") { + doc.set("hello world"); + REQUIRE(0 == var.size()); + REQUIRE(var["0"].isNull()); + REQUIRE(var[0].isNull()); + } + + SECTION("array") { + JsonArray array = doc.to(); + array.add("A"); + array.add("B"); + + REQUIRE(std::string("A") == var[0]); + REQUIRE(std::string("B") == var[1]); + REQUIRE(std::string("A") == + var[static_cast(0)]); // issue #381 + REQUIRE(var[666].isNull()); + REQUIRE(var[3].isNull()); + REQUIRE(var["0"].isNull()); + } + + SECTION("object") { + JsonObject object = doc.to(); + object["a"] = "A"; + object["b"] = "B"; + + SECTION("supports const char*") { + REQUIRE(std::string("A") == var["a"]); + REQUIRE(std::string("B") == var["b"]); + REQUIRE(var["c"].isNull()); + REQUIRE(var[0].isNull()); + } + + SECTION("supports std::string") { + REQUIRE(std::string("A") == var[std::string("a")]); + REQUIRE(std::string("B") == var[std::string("b")]); + REQUIRE(var[std::string("c")].isNull()); + } + +#if defined(HAS_VARIABLE_LENGTH_ARRAY) && \ + !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR) + SECTION("supports VLA") { + size_t i = 16; + char vla[i]; + strcpy(vla, "a"); + + REQUIRE(std::string("A") == var[vla]); + } +#endif + } +}