stl_containers.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2022, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <stdint.h>
  6. #include <catch.hpp>
  7. #include <array>
  8. #include <string>
  9. #include <vector>
  10. namespace ARDUINOJSON_NAMESPACE {
  11. template <typename T>
  12. struct Converter<std::vector<T> > {
  13. static void toJson(const std::vector<T>& src, JsonVariant dst) {
  14. JsonArray array = dst.to<JsonArray>();
  15. for (T item : src)
  16. array.add(item);
  17. }
  18. static std::vector<T> fromJson(JsonVariantConst src) {
  19. std::vector<T> dst;
  20. for (T item : src.as<JsonArrayConst>())
  21. dst.push_back(item);
  22. return dst;
  23. }
  24. static bool checkJson(JsonVariantConst src) {
  25. JsonArrayConst array = src;
  26. bool result = array;
  27. for (JsonVariantConst item : array)
  28. result &= item.is<T>();
  29. return result;
  30. }
  31. };
  32. template <typename T, size_t N>
  33. struct Converter<std::array<T, N> > {
  34. static void toJson(const std::array<T, N>& src, JsonVariant dst) {
  35. JsonArray array = dst.to<JsonArray>();
  36. for (T item : src)
  37. array.add(item);
  38. }
  39. static std::array<T, N> fromJson(JsonVariantConst src) {
  40. std::array<T, N> dst;
  41. dst.fill(0);
  42. size_t idx = 0;
  43. for (T item : src.as<JsonArrayConst>())
  44. dst[idx++] = item;
  45. return dst;
  46. }
  47. static bool checkJson(JsonVariantConst src) {
  48. JsonArrayConst array = src;
  49. bool result = array;
  50. size_t size = 0;
  51. for (JsonVariantConst item : array) {
  52. result &= item.is<T>();
  53. size++;
  54. }
  55. return result && size == N;
  56. }
  57. };
  58. } // namespace ARDUINOJSON_NAMESPACE
  59. TEST_CASE("vector<int>") {
  60. SECTION("toJson") {
  61. std::vector<int> v = {1, 2};
  62. StaticJsonDocument<128> doc;
  63. doc.set(v);
  64. REQUIRE(doc.as<std::string>() == "[1,2]");
  65. }
  66. SECTION("fromJson") {
  67. StaticJsonDocument<128> doc;
  68. doc.add(1);
  69. doc.add(2);
  70. auto v = doc.as<std::vector<int> >();
  71. REQUIRE(v.size() == 2);
  72. CHECK(v[0] == 1);
  73. CHECK(v[1] == 2);
  74. }
  75. SECTION("checkJson") {
  76. StaticJsonDocument<128> doc;
  77. CHECK(doc.is<std::vector<int> >() == false);
  78. doc.add(1);
  79. doc.add(2);
  80. CHECK(doc.is<std::vector<int> >() == true);
  81. doc.add("foo");
  82. CHECK(doc.is<std::vector<int> >() == false);
  83. }
  84. }
  85. TEST_CASE("array<int, 2>") {
  86. typedef std::array<int, 2> array_type;
  87. SECTION("toJson") {
  88. array_type v;
  89. v[0] = 1;
  90. v[1] = 2;
  91. StaticJsonDocument<128> doc;
  92. doc.set(v);
  93. REQUIRE(doc.as<std::string>() == "[1,2]");
  94. }
  95. SECTION("fromJson") {
  96. StaticJsonDocument<128> doc;
  97. doc.add(1);
  98. doc.add(2);
  99. auto v = doc.as<array_type>();
  100. REQUIRE(v.size() == 2);
  101. CHECK(v[0] == 1);
  102. CHECK(v[1] == 2);
  103. }
  104. SECTION("checkJson") {
  105. StaticJsonDocument<128> doc;
  106. CHECK(doc.is<array_type>() == false);
  107. doc.add(1);
  108. CHECK(doc.is<array_type>() == false);
  109. doc.add(2);
  110. CHECK(doc.is<array_type>() == true);
  111. doc[0] = "foo";
  112. CHECK(doc.is<array_type>() == false);
  113. }
  114. }