deserializeJsonValue.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. using namespace Catch::Matchers;
  7. namespace my {
  8. using ARDUINOJSON_NAMESPACE::isinf;
  9. using ARDUINOJSON_NAMESPACE::isnan;
  10. } // namespace my
  11. TEST_CASE("deserializeJson(DynamicJsonDocument&)") {
  12. DynamicJsonDocument doc(4096);
  13. SECTION("null char*") {
  14. DeserializationError err = deserializeJson(doc, static_cast<char*>(0));
  15. REQUIRE(err != DeserializationError::Ok);
  16. }
  17. SECTION("null const char*") {
  18. DeserializationError err =
  19. deserializeJson(doc, static_cast<const char*>(0));
  20. REQUIRE(err != DeserializationError::Ok);
  21. }
  22. SECTION("Integer") {
  23. DeserializationError err = deserializeJson(doc, "-42");
  24. REQUIRE(err == DeserializationError::Ok);
  25. REQUIRE(doc.is<int>());
  26. REQUIRE_FALSE(doc.is<bool>());
  27. REQUIRE(doc.as<int>() == -42);
  28. }
  29. SECTION("Double") {
  30. DeserializationError err = deserializeJson(doc, "-1.23e+4");
  31. REQUIRE(err == DeserializationError::Ok);
  32. REQUIRE_FALSE(doc.is<int>());
  33. REQUIRE(doc.is<double>());
  34. REQUIRE(doc.as<double>() == Approx(-1.23e+4));
  35. }
  36. SECTION("Double quoted string") {
  37. DeserializationError err = deserializeJson(doc, "\"hello world\"");
  38. REQUIRE(err == DeserializationError::Ok);
  39. REQUIRE(doc.is<char*>());
  40. REQUIRE_THAT(doc.as<char*>(), Equals("hello world"));
  41. }
  42. SECTION("Single quoted string") {
  43. DeserializationError err = deserializeJson(doc, "\'hello world\'");
  44. REQUIRE(err == DeserializationError::Ok);
  45. REQUIRE(doc.is<char*>());
  46. REQUIRE_THAT(doc.as<char*>(), Equals("hello world"));
  47. }
  48. SECTION("Escape sequences") {
  49. DeserializationError err =
  50. deserializeJson(doc, "\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"");
  51. REQUIRE(err == DeserializationError::Ok);
  52. REQUIRE(doc.as<std::string>() == "1\"2\\3/4\b5\f6\n7\r8\t9");
  53. }
  54. SECTION("UTF-16 surrogate") {
  55. DeserializationError err = deserializeJson(doc, "\"\\uD834\\uDD1E\"");
  56. REQUIRE(err == DeserializationError::NotSupported);
  57. }
  58. SECTION("True") {
  59. DeserializationError err = deserializeJson(doc, "true");
  60. REQUIRE(err == DeserializationError::Ok);
  61. REQUIRE(doc.is<bool>());
  62. REQUIRE(doc.as<bool>() == true);
  63. }
  64. SECTION("False") {
  65. DeserializationError err = deserializeJson(doc, "false");
  66. REQUIRE(err == DeserializationError::Ok);
  67. REQUIRE(doc.is<bool>());
  68. REQUIRE(doc.as<bool>() == false);
  69. }
  70. SECTION("0") {
  71. DeserializationError err = deserializeJson(doc, "0");
  72. REQUIRE(err == DeserializationError::Ok);
  73. REQUIRE(doc.is<int>() == true);
  74. REQUIRE(doc.as<int>() == 0);
  75. REQUIRE(doc.as<std::string>() == "0"); // issue #808
  76. }
  77. SECTION("NaN") {
  78. DeserializationError err = deserializeJson(doc, "NaN");
  79. REQUIRE(err == DeserializationError::Ok);
  80. REQUIRE(doc.is<float>() == true);
  81. REQUIRE(my::isnan(doc.as<float>()));
  82. }
  83. SECTION("Infinity") {
  84. DeserializationError err = deserializeJson(doc, "Infinity");
  85. REQUIRE(err == DeserializationError::Ok);
  86. REQUIRE(doc.is<float>() == true);
  87. REQUIRE(my::isinf(doc.as<float>()));
  88. }
  89. SECTION("+Infinity") {
  90. DeserializationError err = deserializeJson(doc, "+Infinity");
  91. REQUIRE(err == DeserializationError::Ok);
  92. REQUIRE(doc.is<float>() == true);
  93. REQUIRE(my::isinf(doc.as<float>()));
  94. }
  95. SECTION("-Infinity") {
  96. DeserializationError err = deserializeJson(doc, "-Infinity");
  97. REQUIRE(err == DeserializationError::Ok);
  98. REQUIRE(doc.is<float>() == true);
  99. REQUIRE(my::isinf(doc.as<float>()));
  100. }
  101. SECTION("issue #628") {
  102. DeserializationError err = deserializeJson(doc, "null");
  103. REQUIRE(err == DeserializationError::Ok);
  104. REQUIRE(doc.is<float>() == false);
  105. }
  106. SECTION("Should clear the JsonVariant") {
  107. deserializeJson(doc, "[1,2,3]");
  108. deserializeJson(doc, "{}");
  109. REQUIRE(doc.is<JsonObject>());
  110. REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0));
  111. }
  112. SECTION("Empty input") {
  113. DeserializationError err = deserializeJson(doc, "");
  114. REQUIRE(err == DeserializationError::IncompleteInput);
  115. }
  116. SECTION("Just a trailing comment") {
  117. DeserializationError err = deserializeJson(doc, "// comment");
  118. REQUIRE(err == DeserializationError::IncompleteInput);
  119. }
  120. SECTION("Just a block comment") {
  121. DeserializationError err = deserializeJson(doc, "/*comment*/");
  122. REQUIRE(err == DeserializationError::IncompleteInput);
  123. }
  124. SECTION("Just a slash") {
  125. DeserializationError err = deserializeJson(doc, "/");
  126. REQUIRE(err == DeserializationError::InvalidInput);
  127. }
  128. SECTION("Garbage") {
  129. DeserializationError err = deserializeJson(doc, "%*$£¤");
  130. REQUIRE(err == DeserializationError::InvalidInput);
  131. }
  132. SECTION("Premature null-terminator") {
  133. SECTION("In escape sequence") {
  134. DeserializationError err = deserializeJson(doc, "\"\\");
  135. REQUIRE(err == DeserializationError::IncompleteInput);
  136. }
  137. SECTION("In block comment") {
  138. DeserializationError err = deserializeJson(doc, "/* comment");
  139. REQUIRE(err == DeserializationError::IncompleteInput);
  140. }
  141. SECTION("In double quoted string") {
  142. DeserializationError err = deserializeJson(doc, "\"hello");
  143. REQUIRE(err == DeserializationError::IncompleteInput);
  144. }
  145. SECTION("In single quoted string") {
  146. DeserializationError err = deserializeJson(doc, "'hello");
  147. REQUIRE(err == DeserializationError::IncompleteInput);
  148. }
  149. }
  150. SECTION("Premature end of input") {
  151. SECTION("In escape sequence") {
  152. DeserializationError err = deserializeJson(doc, "\"\\n\"", 2);
  153. REQUIRE(err == DeserializationError::IncompleteInput);
  154. }
  155. SECTION("In block comment") {
  156. DeserializationError err = deserializeJson(doc, "/* comment */", 10);
  157. REQUIRE(err == DeserializationError::IncompleteInput);
  158. }
  159. SECTION("In double quoted string") {
  160. DeserializationError err = deserializeJson(doc, "\"hello\"", 6);
  161. REQUIRE(err == DeserializationError::IncompleteInput);
  162. }
  163. SECTION("In single quoted string") {
  164. DeserializationError err = deserializeJson(doc, "'hello'", 6);
  165. REQUIRE(err == DeserializationError::IncompleteInput);
  166. }
  167. }
  168. SECTION("Repeated object key") {
  169. DeserializationError err = deserializeJson(doc, "{a:{b:{c:1}},a:2}");
  170. REQUIRE(err == DeserializationError::Ok);
  171. }
  172. }