parseObject.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2023
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. TEST_CASE("JsonBuffer::parseObject()") {
  7. DynamicJsonBuffer jb;
  8. SECTION("An empty object") {
  9. JsonObject& obj = jb.parseObject("{}");
  10. REQUIRE(obj.success());
  11. REQUIRE(obj.size() == 0);
  12. }
  13. SECTION("Quotes") {
  14. SECTION("Double quotes") {
  15. JsonObject& obj = jb.parseObject("{\"key\":\"value\"}");
  16. REQUIRE(obj.success());
  17. REQUIRE(obj.size() == 1);
  18. REQUIRE(obj["key"] == "value");
  19. }
  20. SECTION("Single quotes") {
  21. JsonObject& obj = jb.parseObject("{'key':'value'}");
  22. REQUIRE(obj.success());
  23. REQUIRE(obj.size() == 1);
  24. REQUIRE(obj["key"] == "value");
  25. }
  26. SECTION("No quotes") {
  27. JsonObject& obj = jb.parseObject("{key:value}");
  28. REQUIRE(obj.success());
  29. REQUIRE(obj.size() == 1);
  30. REQUIRE(obj["key"] == "value");
  31. }
  32. SECTION("No quotes, allow underscore in key") {
  33. JsonObject& obj = jb.parseObject("{_k_e_y_:42}");
  34. REQUIRE(obj.success());
  35. REQUIRE(obj.size() == 1);
  36. REQUIRE(obj["_k_e_y_"] == 42);
  37. }
  38. }
  39. SECTION("Spaces") {
  40. SECTION("Before the key") {
  41. JsonObject& obj = jb.parseObject("{ \"key\":\"value\"}");
  42. REQUIRE(obj.success());
  43. REQUIRE(obj.size() == 1);
  44. REQUIRE(obj["key"] == "value");
  45. }
  46. SECTION("After the key") {
  47. JsonObject& obj = jb.parseObject("{\"key\" :\"value\"}");
  48. REQUIRE(obj.success());
  49. REQUIRE(obj.size() == 1);
  50. REQUIRE(obj["key"] == "value");
  51. }
  52. SECTION("Before the value") {
  53. JsonObject& obj = jb.parseObject("{\"key\": \"value\"}");
  54. REQUIRE(obj.success());
  55. REQUIRE(obj.size() == 1);
  56. REQUIRE(obj["key"] == "value");
  57. }
  58. SECTION("After the value") {
  59. JsonObject& obj = jb.parseObject("{\"key\":\"value\" }");
  60. REQUIRE(obj.success());
  61. REQUIRE(obj.size() == 1);
  62. REQUIRE(obj["key"] == "value");
  63. }
  64. SECTION("Before the colon") {
  65. JsonObject& obj =
  66. jb.parseObject("{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
  67. REQUIRE(obj.success());
  68. REQUIRE(obj.size() == 2);
  69. REQUIRE(obj["key1"] == "value1");
  70. REQUIRE(obj["key2"] == "value2");
  71. }
  72. SECTION("After the colon") {
  73. JsonObject& obj =
  74. jb.parseObject("{\"key1\":\"value1\" ,\"key2\":\"value2\"}");
  75. REQUIRE(obj.success());
  76. REQUIRE(obj.size() == 2);
  77. REQUIRE(obj["key1"] == "value1");
  78. REQUIRE(obj["key2"] == "value2");
  79. }
  80. }
  81. SECTION("Values types") {
  82. SECTION("String") {
  83. JsonObject& obj =
  84. jb.parseObject("{\"key1\":\"value1\",\"key2\":\"value2\"}");
  85. REQUIRE(obj.success());
  86. REQUIRE(obj.size() == 2);
  87. REQUIRE(obj["key1"] == "value1");
  88. REQUIRE(obj["key2"] == "value2");
  89. }
  90. SECTION("Integer") {
  91. JsonObject& obj = jb.parseObject("{\"key1\":42,\"key2\":-42}");
  92. REQUIRE(obj.success());
  93. REQUIRE(obj.size() == 2);
  94. REQUIRE(obj["key1"] == 42);
  95. REQUIRE(obj["key2"] == -42);
  96. }
  97. SECTION("Double") {
  98. JsonObject& obj = jb.parseObject("{\"key1\":12.345,\"key2\":-7E89}");
  99. REQUIRE(obj.success());
  100. REQUIRE(obj.size() == 2);
  101. REQUIRE(obj["key1"] == 12.345);
  102. REQUIRE(obj["key2"] == -7E89);
  103. }
  104. SECTION("Booleans") {
  105. JsonObject& obj = jb.parseObject("{\"key1\":true,\"key2\":false}");
  106. REQUIRE(obj.success());
  107. REQUIRE(obj.size() == 2);
  108. REQUIRE(obj["key1"] == true);
  109. REQUIRE(obj["key2"] == false);
  110. }
  111. SECTION("Null") {
  112. JsonObject& obj = jb.parseObject("{\"key1\":null,\"key2\":null}");
  113. REQUIRE(obj.success());
  114. REQUIRE(obj.size() == 2);
  115. REQUIRE(obj["key1"].as<char*>() == 0);
  116. REQUIRE(obj["key2"].as<char*>() == 0);
  117. }
  118. }
  119. SECTION("Misc") {
  120. SECTION("The opening brace is missing") {
  121. JsonObject& obj = jb.parseObject("}");
  122. REQUIRE_FALSE(obj.success());
  123. }
  124. SECTION("The closing brace is missing") {
  125. JsonObject& obj = jb.parseObject("{");
  126. REQUIRE_FALSE(obj.success());
  127. }
  128. SECTION("A quoted key without value") {
  129. JsonObject& obj = jb.parseObject("{\"key\"}");
  130. REQUIRE_FALSE(obj.success());
  131. }
  132. SECTION("A non-quoted key without value") {
  133. JsonObject& obj = jb.parseObject("{key}");
  134. REQUIRE_FALSE(obj.success());
  135. }
  136. SECTION("A dangling comma") {
  137. JsonObject& obj = jb.parseObject("{\"key1\":\"value1\",}");
  138. REQUIRE_FALSE(obj.success());
  139. REQUIRE(obj.size() == 0);
  140. }
  141. SECTION("null as a key") {
  142. JsonObject& obj = jb.parseObject("null:\"value\"}");
  143. REQUIRE_FALSE(obj.success());
  144. }
  145. }
  146. }