Fixed comparison of JsonVariant with mixed strings (closes #1051)

This commit is contained in:
Benoit Blanchon
2019-07-19 12:15:16 +02:00
parent 795e37278f
commit b54de58e6b
4 changed files with 26 additions and 9 deletions

View File

@ -5,6 +5,7 @@ HEAD
---- ----
* Added operators `==` and `!=` for `JsonDocument`, `ElementProxy`, and `MemberProxy` * 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) v6.11.2 (2019-07-08)
------- -------

View File

@ -16,15 +16,18 @@ namespace ARDUINOJSON_NAMESPACE {
enum { enum {
VALUE_MASK = 0x7F, VALUE_MASK = 0x7F,
OWNERSHIP_BIT = 0x01,
VALUE_IS_NULL = 0, VALUE_IS_NULL = 0,
VALUE_IS_LINKED_RAW = 0x01, VALUE_IS_LINKED_RAW = 0x02,
VALUE_IS_OWNED_RAW = 0x02, VALUE_IS_OWNED_RAW = 0x03,
VALUE_IS_LINKED_STRING = 0x03, VALUE_IS_LINKED_STRING = 0x04,
VALUE_IS_OWNED_STRING = 0x04, VALUE_IS_OWNED_STRING = 0x05,
VALUE_IS_BOOLEAN = 0x05,
VALUE_IS_POSITIVE_INTEGER = 0x06, // CAUTION: no OWNERSHIP_BIT below
VALUE_IS_NEGATIVE_INTEGER = 0x07, VALUE_IS_BOOLEAN = 0x06,
VALUE_IS_FLOAT = 0x08, VALUE_IS_POSITIVE_INTEGER = 0x08,
VALUE_IS_NEGATIVE_INTEGER = 0x0A,
VALUE_IS_FLOAT = 0x0C,
COLLECTION_MASK = 0x60, COLLECTION_MASK = 0x60,
VALUE_IS_OBJECT = 0x20, VALUE_IS_OBJECT = 0x20,

View File

@ -101,7 +101,9 @@ class VariantData {
} }
bool equals(const VariantData &other) const { 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()) { switch (type()) {
case VALUE_IS_LINKED_STRING: case VALUE_IS_LINKED_STRING:

View File

@ -286,6 +286,17 @@ TEST_CASE("JsonVariant comparisons") {
REQUIRE_FALSE(variant1 == variant3); 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") { SECTION("Variants containing double") {
variant1.set(42.0); variant1.set(42.0);
variant2.set(42.0); variant2.set(42.0);