compare.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. // Copyright Benoit Blanchon 2014-2017
  2. // MIT License
  3. //
  4. // Arduino JSON library
  5. // https://bblanchon.github.io/ArduinoJson/
  6. // If you like this project, please add a star!
  7. #include <ArduinoJson.h>
  8. #include <catch.hpp>
  9. template <typename T>
  10. void checkEquals(JsonVariant a, T b) {
  11. REQUIRE(b == a);
  12. REQUIRE(a == b);
  13. REQUIRE(b <= a);
  14. REQUIRE(a <= b);
  15. REQUIRE(b >= a);
  16. REQUIRE(a >= b);
  17. REQUIRE_FALSE(b != a);
  18. REQUIRE_FALSE(a != b);
  19. REQUIRE_FALSE(b > a);
  20. REQUIRE_FALSE(a > b);
  21. REQUIRE_FALSE(b < a);
  22. REQUIRE_FALSE(a < b);
  23. }
  24. template <typename T>
  25. void checkGreater(JsonVariant a, T b) {
  26. REQUIRE(a > b);
  27. REQUIRE(b < a);
  28. REQUIRE(a != b);
  29. REQUIRE(b != a);
  30. REQUIRE_FALSE(a < b);
  31. REQUIRE_FALSE(b > a);
  32. REQUIRE_FALSE(a == b);
  33. REQUIRE_FALSE(b == a);
  34. }
  35. template <typename T>
  36. void checkLower(JsonVariant a, T b) {
  37. REQUIRE(a < b);
  38. REQUIRE(b > a);
  39. REQUIRE(a != b);
  40. REQUIRE(b != a);
  41. REQUIRE_FALSE(a > b);
  42. REQUIRE_FALSE(b < a);
  43. REQUIRE_FALSE(a == b);
  44. REQUIRE_FALSE(b == a);
  45. }
  46. template <typename T>
  47. void checkComparisons(T low, T mid, T high) {
  48. checkEquals(mid, mid);
  49. checkGreater(mid, low);
  50. checkLower(mid, high);
  51. }
  52. TEST_CASE("JsonVariant comparisons") {
  53. SECTION("Double") {
  54. checkComparisons<double>(123.44, 123.45, 123.46);
  55. }
  56. SECTION("Float") {
  57. checkComparisons<float>(123.44f, 123.45f, 123.46f);
  58. }
  59. SECTION("SChar") {
  60. checkComparisons<signed char>(122, 123, 124);
  61. }
  62. SECTION("SInt") {
  63. checkComparisons<signed int>(122, 123, 124);
  64. }
  65. SECTION("SLong") {
  66. checkComparisons<signed long>(122L, 123L, 124L);
  67. }
  68. SECTION("SShort") {
  69. checkComparisons<signed short>(122, 123, 124);
  70. }
  71. SECTION("UChar") {
  72. checkComparisons<unsigned char>(122, 123, 124);
  73. }
  74. SECTION("UInt") {
  75. checkComparisons<unsigned int>(122, 123, 124);
  76. }
  77. SECTION("ULong") {
  78. checkComparisons<unsigned long>(122L, 123L, 124L);
  79. }
  80. SECTION("UShort") {
  81. checkComparisons<unsigned short>(122, 123, 124);
  82. }
  83. SECTION("StringLiteral") {
  84. DynamicJsonBuffer jsonBuffer;
  85. JsonVariant variant = jsonBuffer.parse("\"hello\"");
  86. REQUIRE(variant == "hello");
  87. REQUIRE_FALSE(variant != "hello");
  88. REQUIRE(variant != "world");
  89. REQUIRE_FALSE(variant == "world");
  90. REQUIRE("hello" == variant);
  91. REQUIRE_FALSE("hello" != variant);
  92. REQUIRE("world" != variant);
  93. REQUIRE_FALSE("world" == variant);
  94. }
  95. SECTION("String") {
  96. DynamicJsonBuffer jsonBuffer;
  97. JsonVariant variant = jsonBuffer.parse("\"hello\"");
  98. REQUIRE(variant == std::string("hello"));
  99. REQUIRE_FALSE(variant != std::string("hello"));
  100. REQUIRE(variant != std::string("world"));
  101. REQUIRE_FALSE(variant == std::string("world"));
  102. REQUIRE(std::string("hello") == variant);
  103. REQUIRE_FALSE(std::string("hello") != variant);
  104. REQUIRE(std::string("world") != variant);
  105. REQUIRE_FALSE(std::string("world") == variant);
  106. }
  107. SECTION("IntegerInVariant") {
  108. JsonVariant variant1 = 42;
  109. JsonVariant variant2 = 42;
  110. JsonVariant variant3 = 666;
  111. REQUIRE(variant1 == variant2);
  112. REQUIRE_FALSE(variant1 != variant2);
  113. REQUIRE(variant1 != variant3);
  114. REQUIRE_FALSE(variant1 == variant3);
  115. }
  116. SECTION("StringInVariant") {
  117. JsonVariant variant1 = "0hello" + 1; // make sure they have
  118. JsonVariant variant2 = "1hello" + 1; // different addresses
  119. JsonVariant variant3 = "world";
  120. REQUIRE(variant1 == variant2);
  121. REQUIRE_FALSE(variant1 != variant2);
  122. REQUIRE(variant1 != variant3);
  123. REQUIRE_FALSE(variant1 == variant3);
  124. }
  125. SECTION("DoubleInVariant") {
  126. JsonVariant variant1 = 42.0;
  127. JsonVariant variant2 = 42.0;
  128. JsonVariant variant3 = 666.0;
  129. REQUIRE(variant1 == variant2);
  130. REQUIRE_FALSE(variant1 != variant2);
  131. REQUIRE(variant1 != variant3);
  132. REQUIRE_FALSE(variant1 == variant3);
  133. }
  134. SECTION("BoolInVariant") {
  135. JsonVariant variant1 = true;
  136. JsonVariant variant2 = true;
  137. JsonVariant variant3 = false;
  138. REQUIRE(variant1 == variant2);
  139. REQUIRE_FALSE(variant1 != variant2);
  140. REQUIRE(variant1 != variant3);
  141. REQUIRE_FALSE(variant1 == variant3);
  142. }
  143. SECTION("ArrayInVariant") {
  144. DynamicJsonBuffer jsonBuffer;
  145. JsonArray& array1 = jsonBuffer.createArray();
  146. JsonArray& array2 = jsonBuffer.createArray();
  147. JsonVariant variant1 = array1;
  148. JsonVariant variant2 = array1;
  149. JsonVariant variant3 = array2;
  150. REQUIRE(variant1 == variant2);
  151. REQUIRE_FALSE(variant1 != variant2);
  152. REQUIRE(variant1 != variant3);
  153. REQUIRE_FALSE(variant1 == variant3);
  154. }
  155. SECTION("ObjectInVariant") {
  156. DynamicJsonBuffer jsonBuffer;
  157. JsonObject& obj1 = jsonBuffer.createObject();
  158. JsonObject& obj2 = jsonBuffer.createObject();
  159. JsonVariant variant1 = obj1;
  160. JsonVariant variant2 = obj1;
  161. JsonVariant variant3 = obj2;
  162. REQUIRE(variant1 == variant2);
  163. REQUIRE_FALSE(variant1 != variant2);
  164. REQUIRE(variant1 != variant3);
  165. REQUIRE_FALSE(variant1 == variant3);
  166. }
  167. SECTION("VariantsOfDifferentTypes") {
  168. DynamicJsonBuffer jsonBuffer;
  169. JsonVariant variants[] = {
  170. true,
  171. 42,
  172. 666.667,
  173. "hello",
  174. jsonBuffer.createArray(),
  175. jsonBuffer.createObject(),
  176. };
  177. size_t n = sizeof(variants) / sizeof(variants[0]);
  178. for (size_t i = 0; i < n; i++) {
  179. for (size_t j = i + 1; j < n; j++) {
  180. REQUIRE(variants[i] != variants[j]);
  181. REQUIRE_FALSE(variants[i] == variants[j]);
  182. }
  183. }
  184. }
  185. }