StringAdapters.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2024, Benoit BLANCHON
  3. // MIT License
  4. #include <Arduino.h>
  5. #include <ArduinoJson/Strings/IsString.hpp>
  6. #include <ArduinoJson/Strings/StringAdapters.hpp>
  7. #include <catch.hpp>
  8. #include "custom_string.hpp"
  9. #include "weird_strcmp.hpp"
  10. using namespace ArduinoJson::detail;
  11. TEST_CASE("ZeroTerminatedRamString") {
  12. SECTION("null") {
  13. ZeroTerminatedRamString s = adaptString(static_cast<const char*>(0));
  14. CHECK(s.isNull() == true);
  15. CHECK(s.size() == 0);
  16. }
  17. SECTION("non-null") {
  18. ZeroTerminatedRamString s = adaptString("bravo");
  19. CHECK(s.isNull() == false);
  20. CHECK(s.size() == 5);
  21. }
  22. }
  23. TEST_CASE("SizedRamString") {
  24. SECTION("null") {
  25. SizedRamString s = adaptString(static_cast<const char*>(0), 10);
  26. CHECK(s.isNull() == true);
  27. }
  28. SECTION("non-null") {
  29. SizedRamString s = adaptString("bravo", 5);
  30. CHECK(s.isNull() == false);
  31. CHECK(s.size() == 5);
  32. }
  33. }
  34. TEST_CASE("FlashString") {
  35. SECTION("null") {
  36. FlashString s = adaptString(static_cast<const __FlashStringHelper*>(0));
  37. CHECK(s.isNull() == true);
  38. CHECK(s.size() == 0);
  39. }
  40. SECTION("non-null") {
  41. FlashString s = adaptString(F("bravo"));
  42. CHECK(s.isNull() == false);
  43. CHECK(s.size() == 5);
  44. }
  45. }
  46. TEST_CASE("std::string") {
  47. std::string orig("bravo");
  48. SizedRamString s = adaptString(orig);
  49. CHECK(s.isNull() == false);
  50. CHECK(s.size() == 5);
  51. }
  52. TEST_CASE("Arduino String") {
  53. ::String orig("bravo");
  54. SizedRamString s = adaptString(orig);
  55. CHECK(s.isNull() == false);
  56. CHECK(s.size() == 5);
  57. }
  58. TEST_CASE("custom_string") {
  59. custom_string orig("bravo");
  60. SizedRamString s = adaptString(orig);
  61. CHECK(s.isNull() == false);
  62. CHECK(s.size() == 5);
  63. }
  64. struct EmptyStruct {};
  65. TEST_CASE("IsString<T>") {
  66. CHECK(IsString<std::string>::value == true);
  67. CHECK(IsString<std::basic_string<wchar_t>>::value == false);
  68. CHECK(IsString<custom_string>::value == true);
  69. CHECK(IsString<const __FlashStringHelper*>::value == true);
  70. CHECK(IsString<const char*>::value == true);
  71. CHECK(IsString<const char[8]>::value == true);
  72. CHECK(IsString<::String>::value == true);
  73. CHECK(IsString<::StringSumHelper>::value == true);
  74. CHECK(IsString<const EmptyStruct*>::value == false);
  75. }
  76. TEST_CASE("stringCompare") {
  77. SECTION("ZeroTerminatedRamString vs ZeroTerminatedRamString") {
  78. CHECK(stringCompare(adaptString("bravo"), adaptString("alpha")) > 0);
  79. CHECK(stringCompare(adaptString("bravo"), adaptString("bravo")) == 0);
  80. CHECK(stringCompare(adaptString("bravo"), adaptString("charlie")) < 0);
  81. }
  82. SECTION("ZeroTerminatedRamString vs SizedRamString") {
  83. CHECK(stringCompare(adaptString("bravo"), adaptString("alpha?", 5)) > 0);
  84. CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 4)) > 0);
  85. CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 5)) == 0);
  86. CHECK(stringCompare(adaptString("bravo"), adaptString("bravo?", 6)) < 0);
  87. CHECK(stringCompare(adaptString("bravo"), adaptString("charlie?", 7)) < 0);
  88. }
  89. SECTION("SizedRamString vs SizedRamString") {
  90. // clang-format off
  91. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("alpha?", 5)) > 0);
  92. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("bravo?", 5)) == 0);
  93. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("charlie?", 7)) < 0);
  94. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("bravo!", 4)) > 0);
  95. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("bravo!", 5)) == 0);
  96. CHECK(stringCompare(adaptString("bravo!", 5), adaptString("bravo!", 6)) < 0);
  97. // clang-format on
  98. }
  99. SECTION("FlashString vs FlashString") {
  100. // clang-format off
  101. CHECK(stringCompare(adaptString(F("bravo")), adaptString(F("alpha"))) > 0);
  102. CHECK(stringCompare(adaptString(F("bravo")), adaptString(F("bravo"))) == 0);
  103. CHECK(stringCompare(adaptString(F("bravo")), adaptString(F("charlie"))) < 0);
  104. // clang-format on
  105. }
  106. SECTION("FlashString vs SizedRamString") {
  107. // clang-format off
  108. CHECK(stringCompare(adaptString(F("bravo")), adaptString("alpha?", 5)) > 0);
  109. CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo?", 5)) == 0);
  110. CHECK(stringCompare(adaptString(F("bravo")), adaptString("charlie?", 7)) < 0);
  111. CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo!", 4)) > 0);
  112. CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo!", 5)) == 0);
  113. CHECK(stringCompare(adaptString(F("bravo")), adaptString("bravo!", 6)) < 0);
  114. // clang-format on
  115. }
  116. SECTION("ZeroTerminatedRamString vs FlashString") {
  117. // clang-format off
  118. CHECK(stringCompare(adaptString("bravo"), adaptString(F("alpha?"), 5)) > 0);
  119. CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 4)) > 0);
  120. CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 5)) == 0);
  121. CHECK(stringCompare(adaptString("bravo"), adaptString(F("bravo?"), 6)) < 0);
  122. CHECK(stringCompare(adaptString("bravo"), adaptString(F("charlie?"), 7)) < 0);
  123. // clang-format on
  124. }
  125. }
  126. TEST_CASE("stringEquals()") {
  127. SECTION("ZeroTerminatedRamString vs ZeroTerminatedRamString") {
  128. CHECK(stringEquals(adaptString("bravo"), adaptString("brav")) == false);
  129. CHECK(stringEquals(adaptString("bravo"), adaptString("bravo")) == true);
  130. CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!")) == false);
  131. }
  132. SECTION("ZeroTerminatedRamString vs SizedRamString") {
  133. // clang-format off
  134. CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 4)) == false);
  135. CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 5)) == true);
  136. CHECK(stringEquals(adaptString("bravo"), adaptString("bravo!", 6)) == false);
  137. // clang-format on
  138. }
  139. SECTION("FlashString vs SizedRamString") {
  140. // clang-format off
  141. CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 4)) == false);
  142. CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 5)) == true);
  143. CHECK(stringEquals(adaptString(F("bravo")), adaptString("bravo!", 6)) == false);
  144. // clang-format on
  145. }
  146. SECTION("SizedRamString vs SizedRamString") {
  147. // clang-format off
  148. CHECK(stringEquals(adaptString("bravo?", 5), adaptString("bravo!", 4)) == false);
  149. CHECK(stringEquals(adaptString("bravo?", 5), adaptString("bravo!", 5)) == true);
  150. CHECK(stringEquals(adaptString("bravo?", 5), adaptString("bravo!", 6)) == false);
  151. // clang-format on
  152. }
  153. }