diff --git a/extras/tests/CMakeLists.txt b/extras/tests/CMakeLists.txt index 678b8bfe..ba8777e5 100644 --- a/extras/tests/CMakeLists.txt +++ b/extras/tests/CMakeLists.txt @@ -15,7 +15,6 @@ add_subdirectory(JsonDocument) add_subdirectory(JsonObject) add_subdirectory(JsonSerializer) add_subdirectory(JsonVariant) -add_subdirectory(MemberProxy) add_subdirectory(MemoryPool) add_subdirectory(Misc) add_subdirectory(MixedConfiguration) diff --git a/extras/tests/JsonDocument/CMakeLists.txt b/extras/tests/JsonDocument/CMakeLists.txt index 55d187e0..5f779c60 100644 --- a/extras/tests/JsonDocument/CMakeLists.txt +++ b/extras/tests/JsonDocument/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(JsonDocumentTests DynamicJsonDocument.cpp ElementProxy.cpp isNull.cpp + MemberProxy.cpp nesting.cpp overflowed.cpp remove.cpp diff --git a/extras/tests/JsonDocument/MemberProxy.cpp b/extras/tests/JsonDocument/MemberProxy.cpp new file mode 100644 index 00000000..ded18157 --- /dev/null +++ b/extras/tests/JsonDocument/MemberProxy.cpp @@ -0,0 +1,236 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2020 +// MIT License + +#include +#include + +using namespace ARDUINOJSON_NAMESPACE; + +TEST_CASE("MemberProxy::add()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("add(int)") { + mp.add(42); + + REQUIRE(doc.as() == "{\"hello\":[42]}"); + } + + SECTION("add(const char*)") { + mp.add("world"); + + REQUIRE(doc.as() == "{\"hello\":[\"world\"]}"); + } +} + +TEST_CASE("MemberProxy::clear()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("size goes back to zero") { + mp.add(42); + mp.clear(); + + REQUIRE(mp.size() == 0); + } + + SECTION("isNull() return true") { + mp.add("hello"); + mp.clear(); + + REQUIRE(mp.isNull() == true); + } +} + +TEST_CASE("MemberProxy::operator==()") { + DynamicJsonDocument doc(4096); + + SECTION("1 vs 1") { + doc["a"] = 1; + doc["b"] = 1; + + REQUIRE(doc["a"] <= doc["b"]); + REQUIRE(doc["a"] == doc["b"]); + REQUIRE(doc["a"] >= doc["b"]); + REQUIRE_FALSE(doc["a"] != doc["b"]); + REQUIRE_FALSE(doc["a"] < doc["b"]); + REQUIRE_FALSE(doc["a"] > doc["b"]); + } + + SECTION("1 vs 2") { + doc["a"] = 1; + doc["b"] = 2; + + REQUIRE(doc["a"] != doc["b"]); + REQUIRE(doc["a"] < doc["b"]); + REQUIRE(doc["a"] <= doc["b"]); + REQUIRE_FALSE(doc["a"] == doc["b"]); + REQUIRE_FALSE(doc["a"] > doc["b"]); + REQUIRE_FALSE(doc["a"] >= doc["b"]); + } + + SECTION("'abc' vs 'bcd'") { + doc["a"] = "abc"; + doc["b"] = "bcd"; + + REQUIRE(doc["a"] != doc["b"]); + REQUIRE(doc["a"] < doc["b"]); + REQUIRE(doc["a"] <= doc["b"]); + REQUIRE_FALSE(doc["a"] == doc["b"]); + REQUIRE_FALSE(doc["a"] > doc["b"]); + REQUIRE_FALSE(doc["a"] >= doc["b"]); + } +} + +TEST_CASE("MemberProxy::containsKey()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("containsKey(const char*)") { + mp["key"] = "value"; + + REQUIRE(mp.containsKey("key") == true); + REQUIRE(mp.containsKey("key") == true); + } + + SECTION("containsKey(std::string)") { + mp["key"] = "value"; + + REQUIRE(mp.containsKey(std::string("key")) == true); + REQUIRE(mp.containsKey(std::string("key")) == true); + } +} + +TEST_CASE("MemberProxy::operator|()") { + DynamicJsonDocument doc(4096); + + SECTION("const char*") { + doc["a"] = "hello"; + + REQUIRE((doc["a"] | "world") == std::string("hello")); + REQUIRE((doc["b"] | "world") == std::string("world")); + } + + SECTION("Issue #1411") { + doc["sensor"] = "gps"; + + const char *test = "test"; // <- the literal must be captured in a variable + // to trigger the bug + const char *sensor = doc["sensor"] | test; // "gps" + + REQUIRE(sensor == std::string("gps")); + } +} + +TEST_CASE("MemberProxy::remove()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("remove(int)") { + mp.add(1); + mp.add(2); + mp.add(3); + + mp.remove(1); + + REQUIRE(mp.as() == "[1,3]"); + } + + SECTION("remove(const char *)") { + mp["a"] = 1; + mp["b"] = 2; + + mp.remove("a"); + + REQUIRE(mp.as() == "{\"b\":2}"); + } + + SECTION("remove(std::string)") { + mp["a"] = 1; + mp["b"] = 2; + + mp.remove(std::string("b")); + + REQUIRE(mp.as() == "{\"a\":1}"); + } + +#ifdef HAS_VARIABLE_LENGTH_ARRAY + SECTION("remove(vla)") { + mp["a"] = 1; + mp["b"] = 2; + + int i = 4; + char vla[i]; + strcpy(vla, "b"); + mp.remove(vla); + + REQUIRE(mp.as() == "{\"a\":1}"); + } +#endif +} + +TEST_CASE("MemberProxy::set()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("set(int)") { + mp.set(42); + + REQUIRE(doc.as() == "{\"hello\":42}"); + } + + SECTION("set(const char*)") { + mp.set("world"); + + REQUIRE(doc.as() == "{\"hello\":\"world\"}"); + } + + SECTION("set(char[])") { // issue #1191 + char s[] = "world"; + mp.set(s); + strcpy(s, "!!!!!"); + + REQUIRE(doc.as() == "{\"hello\":\"world\"}"); + } +} + +TEST_CASE("MemberProxy::size()") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("returns 0") { + REQUIRE(mp.size() == 0); + } + + SECTION("as an array, return 2") { + mp.add(1); + mp.add(2); + + REQUIRE(mp.size() == 2); + } + + SECTION("as an object, return 2") { + mp["a"] = 1; + mp["b"] = 2; + + REQUIRE(mp.size() == 2); + } +} + +TEST_CASE("MemberProxy::operator[]") { + DynamicJsonDocument doc(4096); + MemberProxy mp = doc["hello"]; + + SECTION("set member") { + mp["world"] = 42; + + REQUIRE(doc.as() == "{\"hello\":{\"world\":42}}"); + } + + SECTION("set element") { + mp[2] = 42; + + REQUIRE(doc.as() == "{\"hello\":[null,null,42]}"); + } +} diff --git a/extras/tests/MemberProxy/CMakeLists.txt b/extras/tests/MemberProxy/CMakeLists.txt deleted file mode 100644 index 9c401ea9..00000000 --- a/extras/tests/MemberProxy/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# ArduinoJson - arduinojson.org -# Copyright Benoit Blanchon 2014-2020 -# MIT License - -add_executable(MemberProxyTests - add.cpp - clear.cpp - compare.cpp - containsKey.cpp - or.cpp - remove.cpp - set.cpp - size.cpp - subscript.cpp -) - -add_test(MemberProxy MemberProxyTests) diff --git a/extras/tests/MemberProxy/add.cpp b/extras/tests/MemberProxy/add.cpp deleted file mode 100644 index 6b734746..00000000 --- a/extras/tests/MemberProxy/add.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::add()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("add(int)") { - mp.add(42); - - REQUIRE(doc.as() == "{\"hello\":[42]}"); - } - - SECTION("add(const char*)") { - mp.add("world"); - - REQUIRE(doc.as() == "{\"hello\":[\"world\"]}"); - } -} diff --git a/extras/tests/MemberProxy/clear.cpp b/extras/tests/MemberProxy/clear.cpp deleted file mode 100644 index f644df21..00000000 --- a/extras/tests/MemberProxy/clear.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::clear()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("size goes back to zero") { - mp.add(42); - mp.clear(); - - REQUIRE(mp.size() == 0); - } - - SECTION("isNull() return true") { - mp.add("hello"); - mp.clear(); - - REQUIRE(mp.isNull() == true); - } -} diff --git a/extras/tests/MemberProxy/compare.cpp b/extras/tests/MemberProxy/compare.cpp deleted file mode 100644 index 2c3c3ef2..00000000 --- a/extras/tests/MemberProxy/compare.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::operator==()") { - DynamicJsonDocument doc(4096); - - SECTION("1 vs 1") { - doc["a"] = 1; - doc["b"] = 1; - - REQUIRE(doc["a"] <= doc["b"]); - REQUIRE(doc["a"] == doc["b"]); - REQUIRE(doc["a"] >= doc["b"]); - REQUIRE_FALSE(doc["a"] != doc["b"]); - REQUIRE_FALSE(doc["a"] < doc["b"]); - REQUIRE_FALSE(doc["a"] > doc["b"]); - } - - SECTION("1 vs 2") { - doc["a"] = 1; - doc["b"] = 2; - - REQUIRE(doc["a"] != doc["b"]); - REQUIRE(doc["a"] < doc["b"]); - REQUIRE(doc["a"] <= doc["b"]); - REQUIRE_FALSE(doc["a"] == doc["b"]); - REQUIRE_FALSE(doc["a"] > doc["b"]); - REQUIRE_FALSE(doc["a"] >= doc["b"]); - } - - SECTION("'abc' vs 'bcd'") { - doc["a"] = "abc"; - doc["b"] = "bcd"; - - REQUIRE(doc["a"] != doc["b"]); - REQUIRE(doc["a"] < doc["b"]); - REQUIRE(doc["a"] <= doc["b"]); - REQUIRE_FALSE(doc["a"] == doc["b"]); - REQUIRE_FALSE(doc["a"] > doc["b"]); - REQUIRE_FALSE(doc["a"] >= doc["b"]); - } -} diff --git a/extras/tests/MemberProxy/containsKey.cpp b/extras/tests/MemberProxy/containsKey.cpp deleted file mode 100644 index b07431ea..00000000 --- a/extras/tests/MemberProxy/containsKey.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::containsKey()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("containsKey(const char*)") { - mp["key"] = "value"; - - REQUIRE(mp.containsKey("key") == true); - REQUIRE(mp.containsKey("key") == true); - } - - SECTION("containsKey(std::string)") { - mp["key"] = "value"; - - REQUIRE(mp.containsKey(std::string("key")) == true); - REQUIRE(mp.containsKey(std::string("key")) == true); - } -} diff --git a/extras/tests/MemberProxy/or.cpp b/extras/tests/MemberProxy/or.cpp deleted file mode 100644 index ec49bdd7..00000000 --- a/extras/tests/MemberProxy/or.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::operator|()") { - DynamicJsonDocument doc(4096); - - SECTION("const char*") { - doc["a"] = "hello"; - - REQUIRE((doc["a"] | "world") == std::string("hello")); - REQUIRE((doc["b"] | "world") == std::string("world")); - } - - SECTION("Issue #1411") { - doc["sensor"] = "gps"; - - const char *test = "test"; // <- the literal must be captured in a variable - // to trigger the bug - const char *sensor = doc["sensor"] | test; // "gps" - - REQUIRE(sensor == std::string("gps")); - } -} diff --git a/extras/tests/MemberProxy/remove.cpp b/extras/tests/MemberProxy/remove.cpp deleted file mode 100644 index a790d295..00000000 --- a/extras/tests/MemberProxy/remove.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::remove()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("remove(int)") { - mp.add(1); - mp.add(2); - mp.add(3); - - mp.remove(1); - - REQUIRE(mp.as() == "[1,3]"); - } - - SECTION("remove(const char *)") { - mp["a"] = 1; - mp["b"] = 2; - - mp.remove("a"); - - REQUIRE(mp.as() == "{\"b\":2}"); - } - - SECTION("remove(std::string)") { - mp["a"] = 1; - mp["b"] = 2; - - mp.remove(std::string("b")); - - REQUIRE(mp.as() == "{\"a\":1}"); - } - -#ifdef HAS_VARIABLE_LENGTH_ARRAY - SECTION("remove(vla)") { - mp["a"] = 1; - mp["b"] = 2; - - int i = 4; - char vla[i]; - strcpy(vla, "b"); - mp.remove(vla); - - REQUIRE(mp.as() == "{\"a\":1}"); - } -#endif -} diff --git a/extras/tests/MemberProxy/set.cpp b/extras/tests/MemberProxy/set.cpp deleted file mode 100644 index 467361e4..00000000 --- a/extras/tests/MemberProxy/set.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::set()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("set(int)") { - mp.set(42); - - REQUIRE(doc.as() == "{\"hello\":42}"); - } - - SECTION("set(const char*)") { - mp.set("world"); - - REQUIRE(doc.as() == "{\"hello\":\"world\"}"); - } - - SECTION("set(char[])") { // issue #1191 - char s[] = "world"; - mp.set(s); - strcpy(s, "!!!!!"); - - REQUIRE(doc.as() == "{\"hello\":\"world\"}"); - } -} diff --git a/extras/tests/MemberProxy/size.cpp b/extras/tests/MemberProxy/size.cpp deleted file mode 100644 index 8018b5c3..00000000 --- a/extras/tests/MemberProxy/size.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::size()") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("returns 0") { - REQUIRE(mp.size() == 0); - } - - SECTION("as an array, return 2") { - mp.add(1); - mp.add(2); - - REQUIRE(mp.size() == 2); - } - - SECTION("as an object, return 2") { - mp["a"] = 1; - mp["b"] = 2; - - REQUIRE(mp.size() == 2); - } -} diff --git a/extras/tests/MemberProxy/subscript.cpp b/extras/tests/MemberProxy/subscript.cpp deleted file mode 100644 index 876a28e8..00000000 --- a/extras/tests/MemberProxy/subscript.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#include -#include - -using namespace ARDUINOJSON_NAMESPACE; - -TEST_CASE("MemberProxy::operator[]") { - DynamicJsonDocument doc(4096); - MemberProxy mp = doc["hello"]; - - SECTION("set member") { - mp["world"] = 42; - - REQUIRE(doc.as() == "{\"hello\":{\"world\":42}}"); - } - - SECTION("set element") { - mp[2] = 42; - - REQUIRE(doc.as() == "{\"hello\":[null,null,42]}"); - } -}