diff --git a/CHANGELOG.md b/CHANGELOG.md index b8a63c992..f7f4fc3ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ HEAD ---- * Added operators `==` and `!=` for `JsonDocument`, `ElementProxy`, and `MemberProxy` +* Fixed comparison of `JsonVariant` when one contains a linked string and the other contains an owned string (issue #1051) v6.11.2 (2019-07-08) ------- diff --git a/src/ArduinoJson/Variant/VariantContent.hpp b/src/ArduinoJson/Variant/VariantContent.hpp index 105e06b98..71fcc5ebe 100644 --- a/src/ArduinoJson/Variant/VariantContent.hpp +++ b/src/ArduinoJson/Variant/VariantContent.hpp @@ -16,15 +16,18 @@ namespace ARDUINOJSON_NAMESPACE { enum { VALUE_MASK = 0x7F, + OWNERSHIP_BIT = 0x01, VALUE_IS_NULL = 0, - VALUE_IS_LINKED_RAW = 0x01, - VALUE_IS_OWNED_RAW = 0x02, - VALUE_IS_LINKED_STRING = 0x03, - VALUE_IS_OWNED_STRING = 0x04, - VALUE_IS_BOOLEAN = 0x05, - VALUE_IS_POSITIVE_INTEGER = 0x06, - VALUE_IS_NEGATIVE_INTEGER = 0x07, - VALUE_IS_FLOAT = 0x08, + VALUE_IS_LINKED_RAW = 0x02, + VALUE_IS_OWNED_RAW = 0x03, + VALUE_IS_LINKED_STRING = 0x04, + VALUE_IS_OWNED_STRING = 0x05, + + // CAUTION: no OWNERSHIP_BIT below + VALUE_IS_BOOLEAN = 0x06, + VALUE_IS_POSITIVE_INTEGER = 0x08, + VALUE_IS_NEGATIVE_INTEGER = 0x0A, + VALUE_IS_FLOAT = 0x0C, COLLECTION_MASK = 0x60, VALUE_IS_OBJECT = 0x20, diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index e369e6e87..28c0fea0d 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -101,7 +101,9 @@ class VariantData { } bool equals(const VariantData &other) const { - if (type() != other.type()) return false; + // Check that variant have the same type, but ignore string ownership + if ((type() | OWNERSHIP_BIT) != (other.type() | OWNERSHIP_BIT)) + return false; switch (type()) { case VALUE_IS_LINKED_STRING: diff --git a/test/JsonVariant/compare.cpp b/test/JsonVariant/compare.cpp index c53c64f21..1ecbd5e55 100644 --- a/test/JsonVariant/compare.cpp +++ b/test/JsonVariant/compare.cpp @@ -286,6 +286,17 @@ TEST_CASE("JsonVariant comparisons") { REQUIRE_FALSE(variant1 == variant3); } + SECTION("Variants containing mixed strings (issue #1051)") { + variant1.set("hello"); + variant2.set(std::string("hello")); + + REQUIRE(variant1 == variant2); + REQUIRE_FALSE(variant1 != variant2); + + REQUIRE(variant2 == variant1); + REQUIRE_FALSE(variant2 != variant1); + } + SECTION("Variants containing double") { variant1.set(42.0); variant2.set(42.0);