test_string.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include <irrString.h>
  2. #include <cstring>
  3. #include <clocale>
  4. #include <vector>
  5. #include "test_helper.h"
  6. using namespace irr;
  7. using namespace irr::core;
  8. #define CMPSTR(a, b) (!strcmp(a, b))
  9. #define UASSERTSTR(actual, expected) UASSERTCMP(CMPSTR, actual.c_str(), expected)
  10. static void test_basics()
  11. {
  12. // ctor
  13. stringc s;
  14. UASSERTEQ(s.c_str()[0], '\0');
  15. s = stringc(0.1234567);
  16. UASSERTSTR(s, "0.123457");
  17. s = stringc(0x1p+53);
  18. UASSERTSTR(s, "9007199254740992.000000");
  19. s = stringc(static_cast<int>(-102400));
  20. UASSERTSTR(s, "-102400");
  21. s = stringc(static_cast<unsigned int>(102400));
  22. UASSERTSTR(s, "102400");
  23. s = stringc(static_cast<long>(-1024000));
  24. UASSERTSTR(s, "-1024000");
  25. s = stringc(static_cast<unsigned long>(1024000));
  26. UASSERTSTR(s, "1024000");
  27. s = stringc("YESno", 3);
  28. UASSERTSTR(s, "YES");
  29. s = stringc(L"test", 4);
  30. UASSERTSTR(s, "test");
  31. s = stringc("Hello World!");
  32. UASSERTSTR(s, "Hello World!");
  33. // operator=
  34. s = stringw(L"abcdef");
  35. UASSERTSTR(s, "abcdef");
  36. s = L"abcdef";
  37. UASSERTSTR(s, "abcdef");
  38. s = static_cast<const char *>(nullptr);
  39. UASSERTSTR(s, "");
  40. // operator+
  41. s = s + stringc("foo");
  42. UASSERTSTR(s, "foo");
  43. s = s + L"bar";
  44. UASSERTSTR(s, "foobar");
  45. // the rest
  46. s = "f";
  47. UASSERTEQ(s[0], 'f');
  48. const auto &sref = s;
  49. UASSERTEQ(sref[0], 'f');
  50. UASSERT(sref == "f");
  51. UASSERT(sref == stringc("f"));
  52. s = "a";
  53. UASSERT(sref < stringc("aa"));
  54. UASSERT(sref < stringc("b"));
  55. UASSERT(stringc("Z") < sref);
  56. UASSERT(!(sref < stringc("a")));
  57. UASSERT(sref.lower_ignore_case("AA"));
  58. UASSERT(sref.lower_ignore_case("B"));
  59. UASSERT(!sref.lower_ignore_case("A"));
  60. s = "dog";
  61. UASSERT(sref != "cat");
  62. UASSERT(sref != stringc("cat"));
  63. }
  64. static void test_methods()
  65. {
  66. stringc s;
  67. const auto &sref = s;
  68. s = "irrlicht";
  69. UASSERTEQ(sref.size(), 8);
  70. UASSERT(!sref.empty());
  71. s.clear();
  72. UASSERTEQ(sref.size(), 0);
  73. UASSERT(sref.empty());
  74. UASSERT(sref[0] == 0);
  75. s = "\tAz#`";
  76. s.make_lower();
  77. UASSERTSTR(s, "\taz#`");
  78. s.make_upper();
  79. UASSERTSTR(s, "\tAZ#`");
  80. UASSERT(sref.equals_ignore_case("\taz#`"));
  81. UASSERT(sref.equals_substring_ignore_case("Z#`", 2));
  82. s = "irrlicht";
  83. UASSERT(sref.equalsn(stringc("irr"), 3));
  84. UASSERT(sref.equalsn("irr", 3));
  85. s = "fo";
  86. s.append('o');
  87. UASSERTSTR(s, "foo");
  88. s.append("bar", 1);
  89. UASSERTSTR(s, "foob");
  90. s.append("ar", 999999);
  91. UASSERTSTR(s, "foobar");
  92. s = "nyan";
  93. s.append(stringc("cat"));
  94. UASSERTSTR(s, "nyancat");
  95. s.append(stringc("sam"), 1);
  96. UASSERTSTR(s, "nyancats");
  97. s = "fbar";
  98. s.insert(1, "ooXX", 2);
  99. UASSERTSTR(s, "foobar");
  100. UASSERTEQ(sref.findFirst('o'), 1);
  101. UASSERTEQ(sref.findFirst('X'), -1);
  102. UASSERTEQ(sref.findFirstChar("abff", 2), 3);
  103. UASSERTEQ(sref.findFirstCharNotInList("fobb", 2), 3);
  104. UASSERTEQ(sref.findLast('o'), 2);
  105. UASSERTEQ(sref.findLast('X'), -1);
  106. UASSERTEQ(sref.findLastChar("abrr", 2), 4);
  107. UASSERTEQ(sref.findLastCharNotInList("rabb", 2), 3);
  108. UASSERTEQ(sref.findNext('o', 2), 2);
  109. UASSERTEQ(sref.findLast('o', 1), 1);
  110. s = "ob-oob";
  111. UASSERTEQ(sref.find("ob", 1), 4);
  112. UASSERTEQ(sref.find("ob"), 0);
  113. UASSERTEQ(sref.find("?"), -1);
  114. s = "HOMEOWNER";
  115. stringc s2 = sref.subString(2, 4);
  116. UASSERTSTR(s2, "MEOW");
  117. s2 = sref.subString(2, 4, true);
  118. UASSERTSTR(s2, "meow");
  119. s = "land";
  120. s.replace('l', 's');
  121. UASSERTSTR(s, "sand");
  122. s = ">dog<";
  123. s.replace("dog", "cat");
  124. UASSERTSTR(s, ">cat<");
  125. s.replace("cat", "horse");
  126. UASSERTSTR(s, ">horse<");
  127. s.replace("horse", "gnu");
  128. UASSERTSTR(s, ">gnu<");
  129. s = " h e l p ";
  130. s.remove(' ');
  131. UASSERTSTR(s, "help");
  132. s.remove("el");
  133. UASSERTSTR(s, "hp");
  134. s = "irrlicht";
  135. s.removeChars("it");
  136. UASSERTSTR(s, "rrlch");
  137. s = "\r\nfoo bar ";
  138. s.trim();
  139. UASSERTSTR(s, "foo bar");
  140. s = "foxo";
  141. s.erase(2);
  142. UASSERTSTR(s, "foo");
  143. s = "a";
  144. s.append('\0');
  145. s.append('b');
  146. UASSERTEQ(s.size(), 3);
  147. s.validate();
  148. UASSERTEQ(s.size(), 1);
  149. UASSERTEQ(s.lastChar(), 'a');
  150. std::vector<stringc> res;
  151. s = "a,,b,c";
  152. s.split(res, ",aa", 1, true, false);
  153. UASSERTEQ(res.size(), 3);
  154. UASSERTSTR(res[0], "a");
  155. UASSERTSTR(res[2], "c");
  156. res.clear();
  157. s.split(res, ",", 1, false, true);
  158. UASSERTEQ(res.size(), 7);
  159. UASSERTSTR(res[0], "a");
  160. UASSERTSTR(res[2], "");
  161. for (int i = 0; i < 3; i++)
  162. UASSERTSTR(res[2 * i + 1], ",");
  163. }
  164. static void test_conv()
  165. {
  166. // locale-independent
  167. stringw out;
  168. utf8ToWString(out, "†††");
  169. UASSERTEQ(out.size(), 3);
  170. for (int i = 0; i < 3; i++)
  171. UASSERTEQ(static_cast<u16>(out[i]), 0x2020);
  172. stringc out2;
  173. wStringToUTF8(out2, L"†††");
  174. UASSERTEQ(out2.size(), 9);
  175. for (int i = 0; i < 3; i++) {
  176. UASSERTEQ(static_cast<u8>(out2[3 * i]), 0xe2);
  177. UASSERTEQ(static_cast<u8>(out2[3 * i + 1]), 0x80);
  178. UASSERTEQ(static_cast<u8>(out2[3 * i + 2]), 0xa0);
  179. }
  180. // locale-dependent
  181. if (!setlocale(LC_CTYPE, "C.UTF-8"))
  182. setlocale(LC_CTYPE, "UTF-8"); // macOS
  183. stringw out3;
  184. multibyteToWString(out3, "†††");
  185. UASSERTEQ(out3.size(), 3);
  186. for (int i = 0; i < 3; i++)
  187. UASSERTEQ(static_cast<u16>(out3[i]), 0x2020);
  188. }
  189. void test_irr_string()
  190. {
  191. test_basics();
  192. test_methods();
  193. test_conv();
  194. std::cout << " test_irr_string PASSED" << std::endl;
  195. }