ArrayStringTests.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. #include "../Tests.hpp"
  2. #include "core/data/HashMap.hpp"
  3. #include "core/utils/ArrayString.hpp"
  4. #include "core/utils/Error.hpp"
  5. template class Core::ArrayString<128>;
  6. using String = Core::ArrayString<128>;
  7. static String build(const char* cs) {
  8. String s;
  9. s.append(cs);
  10. return s;
  11. }
  12. static void testEquality() {
  13. String s = build("test");
  14. CORE_TEST_TRUE(s == "test");
  15. CORE_TEST_TRUE(s == build("test"));
  16. CORE_TEST_TRUE("test" == s);
  17. CORE_TEST_TRUE(build("test") == s);
  18. CORE_TEST_FALSE(build("tes2") == s);
  19. CORE_TEST_TRUE(s == s);
  20. }
  21. static void testUnicodeEquality() {
  22. const char* cs = "\u0040\u0400\u8000\U00100000";
  23. String s = build(cs);
  24. CORE_TEST_TRUE(s == cs);
  25. CORE_TEST_TRUE(s == build(cs));
  26. CORE_TEST_TRUE(cs == s);
  27. CORE_TEST_TRUE(build(cs) == s);
  28. CORE_TEST_TRUE(s == s);
  29. }
  30. static void testInequality() {
  31. String s = build("test");
  32. CORE_TEST_FALSE(s != "test");
  33. CORE_TEST_FALSE(s != build("test"));
  34. CORE_TEST_FALSE("test" != s);
  35. CORE_TEST_FALSE(build("test") != s);
  36. CORE_TEST_FALSE(s != s);
  37. }
  38. static void testStringAppend() {
  39. String s = build("test");
  40. s.append("22").append("333").append("4444");
  41. CORE_TEST_EQUAL(build("test223334444"), s);
  42. }
  43. static void testStringAppendOverflow() {
  44. Core::ArrayString<6> s;
  45. s.append("te").append("23334444");
  46. CORE_TEST_TRUE(build("te23334444") != s);
  47. }
  48. static void testCharacters() {
  49. String s = build("test");
  50. CORE_TEST_EQUAL('t', s[0]);
  51. CORE_TEST_EQUAL('e', s[1]);
  52. CORE_TEST_EQUAL('s', s[2]);
  53. CORE_TEST_EQUAL('t', s[3]);
  54. }
  55. static void testLength() {
  56. String s = build("test");
  57. CORE_TEST_EQUAL(4, s.getLength());
  58. s.append("aaa");
  59. CORE_TEST_EQUAL(7, s.getLength());
  60. }
  61. static void testChar() {
  62. String s = build("test");
  63. for(char i = 'a'; i < 'd'; i++) {
  64. s.append(i);
  65. }
  66. CORE_TEST_EQUAL(build("testabc"), s);
  67. }
  68. static void testSignedChar() {
  69. String s = build("test");
  70. for(signed char i = 'b'; i < 'e'; i++) {
  71. s.append(i);
  72. }
  73. CORE_TEST_EQUAL(build("testbcd"), s);
  74. }
  75. static void testUnsignedChar() {
  76. String s = build("test");
  77. for(unsigned char i = 'c'; i < 'f'; i++) {
  78. s.append(i);
  79. }
  80. CORE_TEST_EQUAL(build("testcde"), s);
  81. }
  82. static void testSignedShort() {
  83. String s = build("test");
  84. for(signed short i = 100; i < 103; i++) {
  85. s.append(i);
  86. }
  87. CORE_TEST_EQUAL(build("test100101102"), s);
  88. }
  89. static void testUnsignedShort() {
  90. String s = build("test");
  91. for(unsigned short i = 101; i < 104; i++) {
  92. s.append(i);
  93. }
  94. CORE_TEST_EQUAL(build("test101102103"), s);
  95. }
  96. static void testSignedInt() {
  97. String s = build("test");
  98. for(signed int i = 102; i < 105; i++) {
  99. s.append(i);
  100. }
  101. CORE_TEST_EQUAL(build("test102103104"), s);
  102. }
  103. static void testUnsignedInt() {
  104. String s = build("test");
  105. for(unsigned int i = 103; i < 106; i++) {
  106. s.append(i);
  107. }
  108. CORE_TEST_EQUAL(build("test103104105"), s);
  109. }
  110. static void testSignedLong() {
  111. String s = build("test");
  112. for(signed long i = 104; i < 107; i++) {
  113. s.append(i);
  114. }
  115. CORE_TEST_EQUAL(build("test104105106"), s);
  116. }
  117. static void testUnsignedLong() {
  118. String s = build("test");
  119. for(unsigned long i = 105; i < 108; i++) {
  120. s.append(i);
  121. }
  122. CORE_TEST_EQUAL(build("test105106107"), s);
  123. }
  124. static void testSignedLongLong() {
  125. String s = build("test");
  126. for(signed long long i = 106; i < 109; i++) {
  127. s.append(i);
  128. }
  129. CORE_TEST_EQUAL(build("test106107108"), s);
  130. }
  131. static void testUnsignedLongLong() {
  132. String s = build("test");
  133. for(unsigned long long i = 107; i < 110; i++) {
  134. s.append(i);
  135. }
  136. CORE_TEST_EQUAL(build("test107108109"), s);
  137. }
  138. static void testFloat() {
  139. String s = build("test");
  140. for(float i = 108; i < 111; i++) {
  141. s.append(i);
  142. }
  143. CORE_TEST_EQUAL(build("test108.00109.00110.00"), s);
  144. }
  145. static void testDouble() {
  146. String s = build("test");
  147. for(double i = 109; i < 112; i++) {
  148. s.append(i);
  149. }
  150. CORE_TEST_EQUAL(build("test109.00110.00111.00"), s);
  151. }
  152. static void testLongDouble() {
  153. String s = build("test");
  154. for(long double i = 110; i < 113; i++) {
  155. s.append(i);
  156. }
  157. CORE_TEST_EQUAL(build("test110.00111.00112.00"), s);
  158. }
  159. static void testBool() {
  160. String s = build("test");
  161. s.append(true).append(false).append(true);
  162. CORE_TEST_EQUAL(build("testtruefalsetrue"), s);
  163. }
  164. static void testIntOverflow() {
  165. Core::ArrayString<4> s;
  166. s.append(123456);
  167. String o;
  168. for(size_t i = 0; i < s.getCapacity(); i++) {
  169. o.append(i + 1);
  170. }
  171. CORE_TEST_TRUE(o == s);
  172. }
  173. static void testUnicode() {
  174. String s;
  175. s.append('\u0040');
  176. s.append(L'\u0400');
  177. s.append(L'\u8000');
  178. s.append(U'\U00100000');
  179. CORE_TEST_EQUAL(build("\u0040\u0400\u8000\U00100000"), s);
  180. }
  181. static void testClear() {
  182. String s = build("test");
  183. s.append(1234);
  184. s.clear();
  185. s.append("wusi");
  186. s.append("1234");
  187. CORE_TEST_EQUAL(build("wusi1234"), s);
  188. }
  189. static void testAddSelf() {
  190. String s;
  191. s.append("test1").append(s).append(s);
  192. CORE_TEST_EQUAL(build("test1test1test1test1"), s);
  193. }
  194. static void testStartsWith() {
  195. String s;
  196. s.append("0123456789");
  197. String s2;
  198. s2.append("123");
  199. String s3;
  200. s3.append("234");
  201. String s4;
  202. s4.append("789");
  203. String s5;
  204. s5.append("124");
  205. String s6;
  206. String s7;
  207. s7.append("7891");
  208. CORE_TEST_FALSE(s.startsWith(s2));
  209. CORE_TEST_TRUE(s.startsWith(s2, 1));
  210. CORE_TEST_FALSE(s.startsWith(s3));
  211. CORE_TEST_TRUE(s.startsWith(s3, 2));
  212. CORE_TEST_FALSE(s.startsWith(s4));
  213. CORE_TEST_TRUE(s.startsWith(s4, 7));
  214. CORE_TEST_FALSE(s.startsWith(s5));
  215. CORE_TEST_FALSE(s.startsWith(s5, 3));
  216. CORE_TEST_TRUE(s.startsWith(s6));
  217. CORE_TEST_TRUE(s.startsWith(s6, 3));
  218. CORE_TEST_FALSE(s.startsWith(s7));
  219. CORE_TEST_FALSE(s.startsWith(s7, 7));
  220. }
  221. static void testSearch() {
  222. String s;
  223. s.append("0123456789");
  224. String s2;
  225. s2.append("123");
  226. String s3;
  227. s3.append("234");
  228. String s4;
  229. s4.append("789");
  230. String s5;
  231. s5.append("124");
  232. String s6;
  233. String s7;
  234. s7.append("7891");
  235. CORE_TEST_EQUAL(1, s.search(s2));
  236. CORE_TEST_EQUAL(2, s.search(s3));
  237. CORE_TEST_EQUAL(7, s.search(s4));
  238. CORE_TEST_EQUAL(SIZE_MAX, s.search(s5));
  239. CORE_TEST_EQUAL(0, s.search(s6));
  240. CORE_TEST_EQUAL(SIZE_MAX, s.search(s7));
  241. CORE_TEST_EQUAL(SIZE_MAX, s.search(s2, 3));
  242. CORE_TEST_EQUAL(SIZE_MAX, s.search(s3, 3));
  243. CORE_TEST_EQUAL(7, s.search(s4, 3));
  244. CORE_TEST_EQUAL(SIZE_MAX, s.search(s5, 3));
  245. CORE_TEST_EQUAL(3, s.search(s6, 3));
  246. CORE_TEST_EQUAL(SIZE_MAX, s.search(s7, 3));
  247. }
  248. static void testContains() {
  249. String s;
  250. s.append("0123456789");
  251. String s2;
  252. s2.append("123");
  253. String s3;
  254. s3.append("234");
  255. String s4;
  256. s4.append("789");
  257. String s5;
  258. s5.append("124");
  259. String s6;
  260. String s7;
  261. s7.append("7891");
  262. CORE_TEST_TRUE(s.contains(s2));
  263. CORE_TEST_TRUE(s.contains(s3));
  264. CORE_TEST_TRUE(s.contains(s4));
  265. CORE_TEST_FALSE(s.contains(s5));
  266. CORE_TEST_TRUE(s.contains(s6));
  267. CORE_TEST_FALSE(s.contains(s7));
  268. }
  269. static void testSearchChar() {
  270. String s;
  271. s.append("01üää3ä");
  272. CORE_TEST_EQUAL(0, s.search('0'));
  273. CORE_TEST_EQUAL(1, s.search('1'));
  274. CORE_TEST_EQUAL(8, s.search('3'));
  275. }
  276. static void testContainsChar() {
  277. String s;
  278. s.append("01üää3ä");
  279. CORE_TEST_TRUE(s.contains('0'));
  280. CORE_TEST_TRUE(s.contains('1'));
  281. CORE_TEST_TRUE(s.contains('3'));
  282. CORE_TEST_FALSE(s.contains('a'));
  283. }
  284. static void testSubString() {
  285. String s;
  286. s.append("01üää3ä");
  287. String sub;
  288. s.substring(sub, 0);
  289. CORE_TEST_STRING("01üää3ä", sub);
  290. s.substring(sub, 2);
  291. CORE_TEST_STRING("üää3ä", sub);
  292. s.substring(sub, 4);
  293. CORE_TEST_STRING("ää3ä", sub);
  294. s.substring(sub, 6);
  295. CORE_TEST_STRING("ä3ä", sub);
  296. s.substring(sub, 0, 10);
  297. CORE_TEST_STRING("01üää3ä", sub);
  298. s.substring(sub, 1, 8);
  299. CORE_TEST_STRING("1üää3", sub);
  300. s.substring(sub, 2, 7);
  301. CORE_TEST_STRING("üää", sub);
  302. s.substring(sub, 4, 5);
  303. CORE_TEST_STRING("ä", sub);
  304. s.substring(sub, 4, 2);
  305. CORE_TEST_STRING("", sub);
  306. s.substring(sub, 6, 23);
  307. CORE_TEST_STRING("ä3ä", sub);
  308. }
  309. static void testReplace() {
  310. String s;
  311. s.append("0äääää1üää3ä");
  312. String search;
  313. search.append("ää");
  314. String replace;
  315. replace.append("ABCD");
  316. s.replace(search, replace);
  317. CORE_TEST_STRING("0ABCDABCDä1üABCD3ä", s);
  318. }
  319. static void testReplaceChar() {
  320. String s;
  321. s.append("01YXX3X");
  322. s.replace('0', 'A');
  323. CORE_TEST_STRING("A1YXX3X", s);
  324. s.replace('1', 'B');
  325. CORE_TEST_STRING("ABYXX3X", s);
  326. s.replace('Y', 'C');
  327. CORE_TEST_STRING("ABCXX3X", s);
  328. s.replace('X', 'D');
  329. CORE_TEST_STRING("ABCDD3D", s);
  330. s.replace('3', 'E');
  331. CORE_TEST_STRING("ABCDDED", s);
  332. }
  333. static void testCastAppendSelf() {
  334. String s;
  335. s.append("abc");
  336. s.append(s);
  337. s.append(static_cast<const char*>(s));
  338. CORE_TEST_STRING("abcabcabcabc", s);
  339. }
  340. static void testCompareWithShorter() {
  341. String s;
  342. s.append("abc");
  343. CORE_TEST_FALSE(s == "ab");
  344. }
  345. static void testAppendSignedChar() {
  346. const signed char buffer[] = {'a', 'b', 'c', '\0'};
  347. String s;
  348. s.append(buffer);
  349. CORE_TEST_TRUE(s == "abc");
  350. }
  351. static void testAppendUnsignedChar() {
  352. const unsigned char buffer[] = {'a', 'b', 'c', '\0'};
  353. String s;
  354. s.append(buffer);
  355. CORE_TEST_TRUE(s == "abc");
  356. }
  357. static void testAppendError() {
  358. String s;
  359. s.append(Core::ErrorCode::NONE);
  360. CORE_TEST_STRING("0", s);
  361. }
  362. static void testPrint() {
  363. String s;
  364. s.append('\u0040');
  365. s.append(L'\u0400');
  366. s.append(L'\u8000');
  367. s.append(U'\U00100000');
  368. CORE_TEST_EQUAL(build("\u0040\u0400\u8000\U00100000"), s);
  369. s.append('\n');
  370. s.print();
  371. }
  372. static void testKeepHash() {
  373. String s;
  374. s.append("a ## test #### #####");
  375. s.format(1, 2, 3, 4, 5, 6, 7, 8, 9);
  376. CORE_TEST_STRING("a # test ## ##123456789", s);
  377. }
  378. static void testFormatWithoutArguments() {
  379. String s;
  380. s.append("wusi");
  381. s.format();
  382. CORE_TEST_STRING("wusi", s);
  383. }
  384. static void testUnicodeString() {
  385. String s;
  386. s.append(U"_üö§äab");
  387. CORE_TEST_STRING("_üö§äab", s);
  388. }
  389. static void testInvalidUnicodeString() {
  390. String s;
  391. s.append(static_cast<c32>(0xFFFFFFFF));
  392. CORE_TEST_STRING("?", s);
  393. }
  394. static void testConversion() {
  395. const c32* a = U"öüewfde_§$§%$ädsf";
  396. const char* b = "öüewfde_§$§%$ädsf";
  397. String s;
  398. s.append(a);
  399. String s2;
  400. s2.append(b);
  401. CORE_TEST_STRING(s, s2);
  402. }
  403. void Core::testArrayString() {
  404. testEquality();
  405. testUnicodeEquality();
  406. testInequality();
  407. testStringAppend();
  408. testStringAppendOverflow();
  409. testCharacters();
  410. testLength();
  411. testChar();
  412. testSignedChar();
  413. testUnsignedChar();
  414. testSignedShort();
  415. testUnsignedShort();
  416. testSignedInt();
  417. testUnsignedInt();
  418. testSignedLong();
  419. testUnsignedLong();
  420. testSignedLongLong();
  421. testUnsignedLongLong();
  422. testFloat();
  423. testDouble();
  424. testLongDouble();
  425. testBool();
  426. testIntOverflow();
  427. testUnicode();
  428. testClear();
  429. testAddSelf();
  430. testStartsWith();
  431. testSearch();
  432. testContains();
  433. testSearchChar();
  434. testContainsChar();
  435. testSubString();
  436. testReplace();
  437. testReplaceChar();
  438. testCastAppendSelf();
  439. testCompareWithShorter();
  440. testAppendSignedChar();
  441. testAppendUnsignedChar();
  442. testAppendError();
  443. testPrint();
  444. testKeepHash();
  445. testFormatWithoutArguments();
  446. testUnicodeString();
  447. testInvalidUnicodeString();
  448. testConversion();
  449. }