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