Ver Fonte

Test custom converter for `std::array` (issue #1840)

Benoit Blanchon há 3 anos atrás
pai
commit
c49adfd6da
1 ficheiros alterados com 70 adições e 4 exclusões
  1. 70 4
      extras/tests/Cpp11/stl_containers.cpp

+ 70 - 4
extras/tests/Cpp11/stl_containers.cpp

@@ -6,6 +6,7 @@
 #include <stdint.h>
 #include <catch.hpp>
 
+#include <array>
 #include <string>
 #include <vector>
 
@@ -28,12 +29,38 @@ struct Converter<std::vector<T> > {
   static bool checkJson(JsonVariantConst src) {
     JsonArrayConst array = src;
     bool result = array;
+    for (JsonVariantConst item : array)
+      result &= item.is<T>();
+    return result;
+  }
+};
+
+template <typename T, size_t N>
+struct Converter<std::array<T, N> > {
+  static void toJson(const std::array<T, N>& src, JsonVariant dst) {
+    JsonArray array = dst.to<JsonArray>();
+    for (T item : src)
+      array.add(item);
+  }
+
+  static std::array<T, N> fromJson(JsonVariantConst src) {
+    std::array<T, N> dst;
+    dst.fill(0);
+    size_t idx = 0;
+    for (T item : src.as<JsonArrayConst>())
+      dst[idx++] = item;
+    return dst;
+  }
+
+  static bool checkJson(JsonVariantConst src) {
+    JsonArrayConst array = src;
+    bool result = array;
+    size_t size = 0;
     for (JsonVariantConst item : array) {
-      if (!result)
-        break;
-      result = item.is<T>();
+      result &= item.is<T>();
+      size++;
     }
-    return result;
+    return result && size == N;
   }
 };
 }  // namespace ARDUINOJSON_NAMESPACE
@@ -70,3 +97,42 @@ TEST_CASE("vector<int>") {
     CHECK(doc.is<std::vector<int> >() == false);
   }
 }
+
+TEST_CASE("array<int, 2>") {
+  typedef std::array<int, 2> array_type;
+
+  SECTION("toJson") {
+    array_type v;
+    v[0] = 1;
+    v[1] = 2;
+
+    StaticJsonDocument<128> doc;
+    doc.set(v);
+    REQUIRE(doc.as<std::string>() == "[1,2]");
+  }
+
+  SECTION("fromJson") {
+    StaticJsonDocument<128> doc;
+    doc.add(1);
+    doc.add(2);
+
+    auto v = doc.as<array_type>();
+    REQUIRE(v.size() == 2);
+    CHECK(v[0] == 1);
+    CHECK(v[1] == 2);
+  }
+
+  SECTION("checkJson") {
+    StaticJsonDocument<128> doc;
+    CHECK(doc.is<array_type>() == false);
+
+    doc.add(1);
+    CHECK(doc.is<array_type>() == false);
+
+    doc.add(2);
+    CHECK(doc.is<array_type>() == true);
+
+    doc[0] = "foo";
+    CHECK(doc.is<array_type>() == false);
+  }
+}