set.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include "Allocators.hpp"
  7. using ArduinoJson::detail::sizeofObject;
  8. using ArduinoJson::detail::sizeofString;
  9. enum ErrorCode { ERROR_01 = 1, ERROR_10 = 10 };
  10. TEST_CASE("JsonVariant::set() when there is enough memory") {
  11. JsonDocument doc(4096);
  12. JsonVariant variant = doc.to<JsonVariant>();
  13. SECTION("const char*") {
  14. char str[16];
  15. strcpy(str, "hello");
  16. bool result = variant.set(static_cast<const char*>(str));
  17. strcpy(str, "world");
  18. REQUIRE(result == true);
  19. REQUIRE(variant == "world"); // stores by pointer
  20. }
  21. SECTION("(const char*)0") {
  22. bool result = variant.set(static_cast<const char*>(0));
  23. REQUIRE(result == true);
  24. REQUIRE(variant.isNull());
  25. }
  26. SECTION("char*") {
  27. char str[16];
  28. strcpy(str, "hello");
  29. bool result = variant.set(str);
  30. strcpy(str, "world");
  31. REQUIRE(result == true);
  32. REQUIRE(variant == "hello"); // stores by copy
  33. }
  34. SECTION("(char*)0") {
  35. bool result = variant.set(static_cast<char*>(0));
  36. REQUIRE(result == true);
  37. REQUIRE(variant.isNull());
  38. }
  39. SECTION("unsigned char*") {
  40. char str[16];
  41. strcpy(str, "hello");
  42. bool result = variant.set(reinterpret_cast<unsigned char*>(str));
  43. strcpy(str, "world");
  44. REQUIRE(result == true);
  45. REQUIRE(variant == "hello"); // stores by copy
  46. }
  47. SECTION("signed char*") {
  48. char str[16];
  49. strcpy(str, "hello");
  50. bool result = variant.set(reinterpret_cast<signed char*>(str));
  51. strcpy(str, "world");
  52. REQUIRE(result == true);
  53. REQUIRE(variant == "hello"); // stores by copy
  54. }
  55. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  56. SECTION("VLA") {
  57. size_t n = 16;
  58. char str[n];
  59. strcpy(str, "hello");
  60. bool result = variant.set(str);
  61. strcpy(str, "world");
  62. REQUIRE(result == true);
  63. REQUIRE(variant == "hello"); // stores by copy
  64. }
  65. #endif
  66. SECTION("std::string") {
  67. std::string str;
  68. str = "hello";
  69. bool result = variant.set(str);
  70. str.replace(0, 5, "world");
  71. REQUIRE(result == true);
  72. REQUIRE(variant == "hello"); // stores by copy
  73. }
  74. SECTION("static JsonString") {
  75. char str[16];
  76. strcpy(str, "hello");
  77. bool result = variant.set(JsonString(str, JsonString::Linked));
  78. strcpy(str, "world");
  79. REQUIRE(result == true);
  80. REQUIRE(variant == "world"); // stores by pointer
  81. }
  82. SECTION("non-static JsonString") {
  83. char str[16];
  84. strcpy(str, "hello");
  85. bool result = variant.set(JsonString(str, JsonString::Copied));
  86. strcpy(str, "world");
  87. REQUIRE(result == true);
  88. REQUIRE(variant == "hello"); // stores by copy
  89. }
  90. SECTION("enum") {
  91. ErrorCode code = ERROR_10;
  92. bool result = variant.set(code);
  93. REQUIRE(result == true);
  94. REQUIRE(variant.is<int>() == true);
  95. REQUIRE(variant.as<int>() == 10);
  96. }
  97. }
  98. TEST_CASE("JsonVariant::set() with not enough memory") {
  99. JsonDocument doc(1, FailingAllocator::instance());
  100. JsonVariant v = doc.to<JsonVariant>();
  101. SECTION("std::string") {
  102. bool result = v.set(std::string("hello world!!"));
  103. REQUIRE(result == false);
  104. REQUIRE(v.isNull());
  105. }
  106. SECTION("Serialized<std::string>") {
  107. bool result = v.set(serialized(std::string("hello world!!")));
  108. REQUIRE(result == false);
  109. REQUIRE(v.isNull());
  110. }
  111. SECTION("char*") {
  112. char s[] = "hello world!!";
  113. bool result = v.set(s);
  114. REQUIRE(result == false);
  115. REQUIRE(v.isNull());
  116. }
  117. }
  118. TEST_CASE("JsonVariant::set(JsonDocument)") {
  119. JsonDocument doc1(1024);
  120. doc1["hello"] = "world";
  121. JsonDocument doc2(1024);
  122. JsonVariant v = doc2.to<JsonVariant>();
  123. // Should copy the doc
  124. v.set(doc1);
  125. doc1.clear();
  126. std::string json;
  127. serializeJson(doc2, json);
  128. REQUIRE(json == "{\"hello\":\"world\"}");
  129. }
  130. TEST_CASE("JsonVariant::set() releases the previous value") {
  131. JsonDocument doc(1024);
  132. doc["hello"] = std::string("world");
  133. REQUIRE(doc.memoryUsage() == sizeofObject(1) + sizeofString(5));
  134. JsonVariant v = doc["hello"];
  135. SECTION("int") {
  136. v.set(42);
  137. REQUIRE(doc.memoryUsage() == sizeofObject(1));
  138. }
  139. SECTION("bool") {
  140. v.set(false);
  141. REQUIRE(doc.memoryUsage() == sizeofObject(1));
  142. }
  143. SECTION("const char*") {
  144. v.set("hello");
  145. REQUIRE(doc.memoryUsage() == sizeofObject(1));
  146. }
  147. SECTION("float") {
  148. v.set(1.2);
  149. REQUIRE(doc.memoryUsage() == sizeofObject(1));
  150. }
  151. SECTION("Serialized<const char*>") {
  152. v.set(serialized("[]"));
  153. REQUIRE(doc.memoryUsage() == sizeofObject(1));
  154. }
  155. }