Explorar o código

Fix comparisons operators with `const JsonDocument&`

Benoit Blanchon %!s(int64=3) %!d(string=hai) anos
pai
achega
8d9504239b

+ 1 - 0
CHANGELOG.md

@@ -7,6 +7,7 @@ HEAD
 * Add `ElementProxy::memoryUsage()`
 * Add `ElementProxy::memoryUsage()`
 * Add `MemberProxy::memoryUsage()` (issue #1730)
 * Add `MemberProxy::memoryUsage()` (issue #1730)
 * Add implicit conversion from `JsonDocument` to `JsonVariant`
 * Add implicit conversion from `JsonDocument` to `JsonVariant`
+* Fix comparisons operators with `const JsonDocument&`
 
 
 v6.19.3 (2022-03-08)
 v6.19.3 (2022-03-08)
 -------
 -------

+ 26 - 0
extras/tests/JsonDocument/compare.cpp

@@ -75,3 +75,29 @@ TEST_CASE("StaticJsonDocument::operator==(const DynamicJsonDocument&)") {
     REQUIRE(doc1 != doc2);
     REQUIRE(doc1 != doc2);
   }
   }
 }
 }
+
+TEST_CASE("JsonDocument::operator==(const JsonDocument&)") {
+  StaticJsonDocument<256> doc1;
+  StaticJsonDocument<256> doc2;
+  const JsonDocument& ref1 = doc1;
+  const JsonDocument& ref2 = doc2;
+
+  SECTION("Empty") {
+    REQUIRE(ref1 == ref2);
+    REQUIRE_FALSE(ref1 != ref2);
+  }
+
+  SECTION("With same object") {
+    doc1["hello"] = "world";
+    doc2["hello"] = "world";
+    REQUIRE(ref1 == ref2);
+    REQUIRE_FALSE(ref1 != ref2);
+  }
+
+  SECTION("With different object") {
+    doc1["hello"] = "world";
+    doc2["world"] = "hello";
+    REQUIRE_FALSE(ref1 == ref2);
+    REQUIRE(ref1 != ref2);
+  }
+}

+ 3 - 3
src/ArduinoJson/Variant/VariantCompare.hpp

@@ -131,9 +131,9 @@ struct RawComparer : ComparerBase {
 template <typename T>
 template <typename T>
 struct Comparer<T, typename enable_if<IsVisitable<T>::value>::type>
 struct Comparer<T, typename enable_if<IsVisitable<T>::value>::type>
     : ComparerBase {
     : ComparerBase {
-  T rhs;
+  const T *rhs;  // TODO: should be a VariantConstRef
 
 
-  explicit Comparer(T value) : rhs(value) {}
+  explicit Comparer(const T &value) : rhs(&value) {}
 
 
   CompareResult visitArray(const CollectionData &lhs) {
   CompareResult visitArray(const CollectionData &lhs) {
     ArrayComparer comparer(lhs);
     ArrayComparer comparer(lhs);
@@ -183,7 +183,7 @@ struct Comparer<T, typename enable_if<IsVisitable<T>::value>::type>
  private:
  private:
   template <typename TComparer>
   template <typename TComparer>
   CompareResult accept(TComparer &comparer) {
   CompareResult accept(TComparer &comparer) {
-    CompareResult reversedResult = rhs.accept(comparer);
+    CompareResult reversedResult = rhs->accept(comparer);
     switch (reversedResult) {
     switch (reversedResult) {
       case COMPARE_RESULT_GREATER:
       case COMPARE_RESULT_GREATER:
         return COMPARE_RESULT_LESS;
         return COMPARE_RESULT_LESS;