as.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <stdint.h>
  6. #include <catch.hpp>
  7. static const char* null = 0;
  8. TEST_CASE("JsonVariant::as()") {
  9. DynamicJsonDocument doc;
  10. JsonVariant variant = doc.to<JsonVariant>();
  11. SECTION("DoubleAsBool") {
  12. variant.set(4.2);
  13. REQUIRE(variant.as<bool>());
  14. }
  15. SECTION("DoubleAsCstr") {
  16. variant.set(4.2);
  17. REQUIRE_FALSE(variant.as<const char*>());
  18. }
  19. SECTION("DoubleAsString") {
  20. variant.set(4.2);
  21. REQUIRE(std::string("4.2") == variant.as<std::string>());
  22. }
  23. SECTION("DoubleAsLong") {
  24. variant.set(4.2);
  25. REQUIRE(4L == variant.as<long>());
  26. }
  27. SECTION("DoubleAsUnsigned") {
  28. variant.set(4.2);
  29. REQUIRE(4U == variant.as<unsigned>());
  30. }
  31. SECTION("DoubleZeroAsBool") {
  32. variant.set(0.0);
  33. REQUIRE_FALSE(variant.as<bool>());
  34. }
  35. SECTION("DoubleZeroAsLong") {
  36. variant.set(0.0);
  37. REQUIRE(0L == variant.as<long>());
  38. }
  39. SECTION("FalseAsBool") {
  40. variant.set(false);
  41. REQUIRE_FALSE(variant.as<bool>());
  42. }
  43. SECTION("FalseAsDouble") {
  44. variant.set(false);
  45. REQUIRE(0.0 == variant.as<double>());
  46. }
  47. SECTION("FalseAsLong") {
  48. variant.set(false);
  49. REQUIRE(0L == variant.as<long>());
  50. }
  51. SECTION("FalseAsString") {
  52. variant.set(false);
  53. REQUIRE(std::string("false") == variant.as<std::string>());
  54. }
  55. SECTION("TrueAsBool") {
  56. variant.set(true);
  57. REQUIRE(variant.as<bool>());
  58. }
  59. SECTION("TrueAsDouble") {
  60. variant.set(true);
  61. REQUIRE(1.0 == variant.as<double>());
  62. }
  63. SECTION("TrueAsLong") {
  64. variant.set(true);
  65. REQUIRE(1L == variant.as<long>());
  66. }
  67. SECTION("TrueAsString") {
  68. variant.set(true);
  69. REQUIRE(std::string("true") == variant.as<std::string>());
  70. }
  71. SECTION("LongAsBool") {
  72. variant.set(42L);
  73. REQUIRE(variant.as<bool>());
  74. }
  75. SECTION("LongZeroAsBool") {
  76. variant.set(0L);
  77. REQUIRE_FALSE(variant.as<bool>());
  78. }
  79. SECTION("PositiveLongAsDouble") {
  80. variant.set(42L);
  81. REQUIRE(42.0 == variant.as<double>());
  82. }
  83. SECTION("NegativeLongAsDouble") {
  84. variant.set(-42L);
  85. REQUIRE(-42.0 == variant.as<double>());
  86. }
  87. SECTION("LongAsString") {
  88. variant.set(42L);
  89. REQUIRE(std::string("42") == variant.as<std::string>());
  90. }
  91. SECTION("LongZeroAsDouble") {
  92. variant.set(0L);
  93. REQUIRE(0.0 == variant.as<double>());
  94. }
  95. SECTION("NullAsBool") {
  96. variant.set(null);
  97. REQUIRE_FALSE(variant.as<bool>());
  98. }
  99. SECTION("NullAsDouble") {
  100. variant.set(null);
  101. REQUIRE(0.0 == variant.as<double>());
  102. }
  103. SECTION("NullAsLong") {
  104. variant.set(null);
  105. REQUIRE(0L == variant.as<long>());
  106. }
  107. SECTION("NullAsString") {
  108. variant.set(null);
  109. REQUIRE(std::string("null") == variant.as<std::string>());
  110. }
  111. SECTION("NumberStringAsBool") {
  112. variant.set("42");
  113. REQUIRE(variant.as<bool>());
  114. }
  115. SECTION("NumberStringAsLong") {
  116. variant.set("42");
  117. REQUIRE(42L == variant.as<long>());
  118. }
  119. #if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64
  120. SECTION("NumberStringAsInt64Negative") {
  121. variant.set("-9223372036854775808");
  122. REQUIRE(-9223372036854775807 - 1 == variant.as<long long>());
  123. }
  124. SECTION("NumberStringAsInt64Positive") {
  125. variant.set("9223372036854775807");
  126. REQUIRE(9223372036854775807 == variant.as<long long>());
  127. }
  128. #endif
  129. SECTION("RandomStringAsBool") {
  130. variant.set("hello");
  131. REQUIRE_FALSE(variant.as<bool>());
  132. }
  133. SECTION("RandomStringAsLong") {
  134. variant.set("hello");
  135. REQUIRE(0L == variant.as<long>());
  136. }
  137. SECTION("RandomStringAsConstCharPtr") {
  138. variant.set("hello");
  139. REQUIRE(std::string("hello") == variant.as<const char*>());
  140. }
  141. SECTION("RandomStringAsCharPtr") {
  142. variant.set("hello");
  143. REQUIRE(std::string("hello") == variant.as<char*>());
  144. }
  145. SECTION("RandomStringAsString") {
  146. variant.set("hello");
  147. REQUIRE(std::string("hello") == variant.as<std::string>());
  148. }
  149. SECTION("TrueStringAsBool") {
  150. variant.set("true");
  151. REQUIRE(variant.as<bool>());
  152. }
  153. SECTION("TrueStringAsLong") {
  154. variant.set("true");
  155. REQUIRE(1L == variant.as<long>());
  156. }
  157. SECTION("ObjectAsString") {
  158. DynamicJsonDocument doc2;
  159. JsonObject obj = doc2.to<JsonObject>();
  160. obj["key"] = "value";
  161. variant.set(obj);
  162. REQUIRE(std::string("{\"key\":\"value\"}") == variant.as<std::string>());
  163. }
  164. SECTION("ArrayAsString") {
  165. DynamicJsonDocument doc2;
  166. JsonArray arr = doc2.to<JsonArray>();
  167. arr.add(4);
  168. arr.add(2);
  169. variant.set(arr);
  170. REQUIRE(std::string("[4,2]") == variant.as<std::string>());
  171. }
  172. SECTION("ArrayAsJsonArray") {
  173. DynamicJsonDocument doc2;
  174. JsonArray arr = doc2.to<JsonArray>();
  175. variant.set(arr);
  176. REQUIRE(arr == variant.as<JsonArray>());
  177. REQUIRE(arr == variant.as<JsonArray>()); // <- shorthand
  178. }
  179. SECTION("ObjectAsJsonObject") {
  180. DynamicJsonDocument doc2;
  181. JsonObject obj = doc2.to<JsonObject>();
  182. variant.set(obj);
  183. REQUIRE(obj == variant.as<JsonObject>());
  184. REQUIRE(obj == variant.as<JsonObject>()); // <- shorthand
  185. }
  186. }