copy.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. using ArduinoJson::detail::sizeofString;
  7. TEST_CASE("JsonVariant::set(JsonVariant)") {
  8. JsonDocument doc1(4096);
  9. JsonDocument doc2(4096);
  10. JsonVariant var1 = doc1.to<JsonVariant>();
  11. JsonVariant var2 = doc2.to<JsonVariant>();
  12. SECTION("stores JsonArray by copy") {
  13. JsonArray arr = doc2.to<JsonArray>();
  14. JsonObject obj = arr.createNestedObject();
  15. obj["hello"] = "world";
  16. var1.set(arr);
  17. arr[0] = 666;
  18. REQUIRE(var1.as<std::string>() == "[{\"hello\":\"world\"}]");
  19. }
  20. SECTION("stores JsonObject by copy") {
  21. JsonObject obj = doc2.to<JsonObject>();
  22. JsonArray arr = obj.createNestedArray("value");
  23. arr.add(42);
  24. var1.set(obj);
  25. obj["value"] = 666;
  26. REQUIRE(var1.as<std::string>() == "{\"value\":[42]}");
  27. }
  28. SECTION("stores const char* by reference") {
  29. var1.set("hello!!");
  30. var2.set(var1);
  31. REQUIRE(doc1.memoryUsage() == 0);
  32. REQUIRE(doc2.memoryUsage() == 0);
  33. }
  34. SECTION("stores char* by copy") {
  35. char str[] = "hello!!";
  36. var1.set(str);
  37. var2.set(var1);
  38. REQUIRE(doc1.memoryUsage() == sizeofString(7));
  39. REQUIRE(doc2.memoryUsage() == sizeofString(7));
  40. }
  41. SECTION("stores std::string by copy") {
  42. var1.set(std::string("hello!!"));
  43. var2.set(var1);
  44. REQUIRE(doc1.memoryUsage() == sizeofString(7));
  45. REQUIRE(doc2.memoryUsage() == sizeofString(7));
  46. }
  47. SECTION("stores Serialized<const char*> by reference") {
  48. var1.set(serialized("hello!!", 8));
  49. var2.set(var1);
  50. REQUIRE(doc1.memoryUsage() == 0);
  51. REQUIRE(doc2.memoryUsage() == 0);
  52. }
  53. SECTION("stores Serialized<char*> by copy") {
  54. char str[] = "hello!!";
  55. var1.set(serialized(str, 7));
  56. var2.set(var1);
  57. REQUIRE(doc1.memoryUsage() == sizeofString(7));
  58. REQUIRE(doc2.memoryUsage() == sizeofString(7));
  59. }
  60. SECTION("stores Serialized<std::string> by copy") {
  61. var1.set(serialized(std::string("hello!!")));
  62. var2.set(var1);
  63. REQUIRE(doc1.memoryUsage() == sizeofString(7));
  64. REQUIRE(doc2.memoryUsage() == sizeofString(7));
  65. }
  66. SECTION("destination is unbound") {
  67. JsonVariant unboundVariant;
  68. unboundVariant.set(var1);
  69. REQUIRE(unboundVariant.isUnbound());
  70. REQUIRE(unboundVariant.isNull());
  71. }
  72. }