subscript.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2024, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include "Literals.hpp"
  7. TEST_CASE("JsonDocument::operator[]") {
  8. JsonDocument doc;
  9. const JsonDocument& cdoc = doc;
  10. SECTION("object") {
  11. doc["abc"_s] = "ABC";
  12. doc["abc\0d"_s] = "ABCD";
  13. SECTION("const char*") {
  14. REQUIRE(doc["abc"] == "ABC");
  15. REQUIRE(cdoc["abc"] == "ABC");
  16. }
  17. SECTION("std::string") {
  18. REQUIRE(doc["abc"_s] == "ABC");
  19. REQUIRE(cdoc["abc"_s] == "ABC");
  20. REQUIRE(doc["abc\0d"_s] == "ABCD");
  21. REQUIRE(cdoc["abc\0d"_s] == "ABCD");
  22. }
  23. SECTION("JsonVariant") {
  24. doc["key1"] = "abc";
  25. doc["key2"] = "abc\0d"_s;
  26. doc["key3"] = "foo";
  27. CHECK(doc[doc["key1"]] == "ABC");
  28. CHECK(doc[doc["key2"]] == "ABCD");
  29. CHECK(doc[doc["key3"]] == nullptr);
  30. CHECK(doc[doc["key4"]] == nullptr);
  31. CHECK(cdoc[cdoc["key1"]] == "ABC");
  32. CHECK(cdoc[cdoc["key2"]] == "ABCD");
  33. CHECK(cdoc[cdoc["key3"]] == nullptr);
  34. CHECK(cdoc[cdoc["key4"]] == nullptr);
  35. }
  36. SECTION("supports operator|") {
  37. REQUIRE((doc["abc"] | "nope") == "ABC"_s);
  38. REQUIRE((doc["def"] | "nope") == "nope"_s);
  39. }
  40. #if defined(HAS_VARIABLE_LENGTH_ARRAY) && \
  41. !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR)
  42. SECTION("supports VLAs") {
  43. size_t i = 16;
  44. char vla[i];
  45. strcpy(vla, "hello");
  46. doc[vla] = "world";
  47. REQUIRE(doc[vla] == "world");
  48. REQUIRE(cdoc[vla] == "world");
  49. }
  50. #endif
  51. }
  52. SECTION("array") {
  53. deserializeJson(doc, "[\"hello\",\"world\"]");
  54. SECTION("int") {
  55. REQUIRE(doc[1] == "world");
  56. REQUIRE(cdoc[1] == "world");
  57. }
  58. SECTION("JsonVariant") {
  59. doc[2] = 1;
  60. REQUIRE(doc[doc[2]] == "world");
  61. REQUIRE(cdoc[doc[2]] == "world");
  62. }
  63. }
  64. }
  65. TEST_CASE("JsonDocument automatically promotes to object") {
  66. JsonDocument doc;
  67. doc["one"]["two"]["three"] = 4;
  68. REQUIRE(doc["one"]["two"]["three"] == 4);
  69. }
  70. TEST_CASE("JsonDocument automatically promotes to array") {
  71. JsonDocument doc;
  72. doc[2] = 2;
  73. REQUIRE(doc.as<std::string>() == "[null,null,2]");
  74. }