is.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2021
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. enum MYENUM2 { ONE = 1, TWO = 2 };
  7. template <typename TVariant>
  8. void checkIsArray(TVariant var) {
  9. REQUIRE(var.template is<JsonArray>());
  10. REQUIRE_FALSE(var.template is<bool>());
  11. REQUIRE_FALSE(var.template is<double>());
  12. REQUIRE_FALSE(var.template is<float>());
  13. REQUIRE_FALSE(var.template is<int>());
  14. REQUIRE_FALSE(var.template is<long>());
  15. REQUIRE_FALSE(var.template is<const char *>());
  16. REQUIRE_FALSE(var.template is<JsonObject>());
  17. }
  18. void testArray(JsonArray value) {
  19. DynamicJsonDocument doc(4096);
  20. JsonVariant var = doc.to<JsonVariant>();
  21. var.set(value);
  22. checkIsArray(var);
  23. JsonVariantConst cvar = var;
  24. checkIsArray(cvar);
  25. }
  26. template <typename TVariant>
  27. void checkIsBool(TVariant var) {
  28. REQUIRE(var.template is<bool>());
  29. REQUIRE_FALSE(var.template is<double>());
  30. REQUIRE_FALSE(var.template is<float>());
  31. REQUIRE_FALSE(var.template is<int>());
  32. REQUIRE_FALSE(var.template is<long>());
  33. REQUIRE_FALSE(var.template is<const char *>());
  34. REQUIRE_FALSE(var.template is<JsonArray>());
  35. REQUIRE_FALSE(var.template is<JsonObject>());
  36. }
  37. void testBool(bool value) {
  38. DynamicJsonDocument doc(4096);
  39. JsonVariant var = doc.to<JsonVariant>();
  40. var.set(value);
  41. checkIsBool(var);
  42. checkIsBool(JsonVariantConst(var));
  43. }
  44. template <typename TVariant>
  45. void checkIsFloat(TVariant var) {
  46. REQUIRE(var.template is<double>());
  47. REQUIRE(var.template is<float>());
  48. REQUIRE_FALSE(var.template is<bool>());
  49. REQUIRE_FALSE(var.template is<int>());
  50. REQUIRE_FALSE(var.template is<long>());
  51. REQUIRE_FALSE(var.template is<const char *>());
  52. REQUIRE_FALSE(var.template is<JsonArray>());
  53. REQUIRE_FALSE(var.template is<JsonObject>());
  54. }
  55. void testFloat(double value) {
  56. DynamicJsonDocument doc(4096);
  57. JsonVariant var = doc.to<JsonVariant>();
  58. var.set(value);
  59. checkIsFloat(var);
  60. checkIsFloat(JsonVariantConst(var));
  61. }
  62. template <typename TVariant>
  63. void checkIsInteger(TVariant var) {
  64. REQUIRE(var.template is<long>());
  65. REQUIRE(var.template is<int>());
  66. REQUIRE(var.template is<float>());
  67. REQUIRE(var.template is<double>());
  68. REQUIRE(var.template is<MYENUM2>());
  69. REQUIRE_FALSE(var.template is<bool>());
  70. REQUIRE_FALSE(var.template is<const char *>());
  71. REQUIRE_FALSE(var.template is<JsonArray>());
  72. REQUIRE_FALSE(var.template is<JsonObject>());
  73. }
  74. template <typename T>
  75. void testInteger(T value) {
  76. DynamicJsonDocument doc(4096);
  77. JsonVariant var = doc.to<JsonVariant>();
  78. var.set(value);
  79. checkIsInteger(var);
  80. checkIsInteger(JsonVariantConst(var));
  81. }
  82. template <typename TVariant>
  83. void checkIsString(TVariant var) {
  84. REQUIRE(var.template is<const char *>());
  85. REQUIRE(var.template is<std::string>());
  86. REQUIRE_FALSE(var.template is<bool>());
  87. REQUIRE_FALSE(var.template is<int>());
  88. REQUIRE_FALSE(var.template is<double>());
  89. REQUIRE_FALSE(var.template is<float>());
  90. REQUIRE_FALSE(var.template is<long>());
  91. REQUIRE_FALSE(var.template is<MYENUM2>());
  92. REQUIRE_FALSE(var.template is<JsonArray>());
  93. REQUIRE_FALSE(var.template is<JsonObject>());
  94. }
  95. void testString(const char *value) {
  96. DynamicJsonDocument doc(4096);
  97. JsonVariant var = doc.to<JsonVariant>();
  98. var.set(value);
  99. checkIsString(var);
  100. checkIsString(JsonVariantConst(var));
  101. }
  102. TEST_CASE("JsonVariant::is()") {
  103. SECTION("JsonArray") {
  104. DynamicJsonDocument doc(4096);
  105. JsonArray array = doc.to<JsonArray>();
  106. testArray(array);
  107. }
  108. SECTION("bool") {
  109. testBool(true);
  110. testBool(false);
  111. }
  112. SECTION("double") {
  113. testFloat(4.2);
  114. }
  115. SECTION("int") {
  116. testInteger(42);
  117. }
  118. SECTION("long") {
  119. testInteger(42L);
  120. }
  121. SECTION("string") {
  122. testString("42");
  123. }
  124. SECTION("null") {
  125. DynamicJsonDocument doc(4096);
  126. deserializeJson(doc, "[null]");
  127. JsonVariant v = doc[0];
  128. REQUIRE(v.is<bool>() == false);
  129. REQUIRE(v.is<char *>() == false);
  130. REQUIRE(v.is<int>() == false);
  131. REQUIRE(v.is<std::string>() == false);
  132. REQUIRE(v.is<float>() == false);
  133. }
  134. }