String.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <Tests/Framework/Framework.h>
  6. #include <AnKi/Util/String.h>
  7. #include <string>
  8. ANKI_TEST(Util, String)
  9. {
  10. HeapAllocator<U8> alloc(allocAligned, nullptr);
  11. // Copy
  12. {
  13. String a, b;
  14. a.create(alloc, "123");
  15. b.create(alloc, a);
  16. ANKI_TEST_EXPECT_EQ(a, b);
  17. ANKI_TEST_EXPECT_EQ(b, "123");
  18. b.destroy(alloc);
  19. a.destroy(alloc);
  20. b.create(alloc, "321");
  21. a.create(alloc, b);
  22. ANKI_TEST_EXPECT_EQ(a, b);
  23. ANKI_TEST_EXPECT_EQ(a, "321");
  24. b.destroy(alloc);
  25. a.destroy(alloc);
  26. }
  27. // Move
  28. {
  29. String a;
  30. a.create(alloc, "123");
  31. String b(std::move(a));
  32. ANKI_TEST_EXPECT_EQ(a.isEmpty(), true);
  33. ANKI_TEST_EXPECT_EQ(b, "123");
  34. b.destroy(alloc);
  35. b.create(alloc, "321");
  36. a = std::move(b);
  37. ANKI_TEST_EXPECT_EQ(a, "321");
  38. ANKI_TEST_EXPECT_EQ(b.isEmpty(), true);
  39. a.destroy(alloc);
  40. }
  41. // Accessors
  42. {
  43. const char* s = "123";
  44. String a;
  45. a.create(alloc, s);
  46. ANKI_TEST_EXPECT_EQ(a[0], '1');
  47. ANKI_TEST_EXPECT_EQ(a[1], '2');
  48. ANKI_TEST_EXPECT_EQ(a[2], '3');
  49. U count = 0;
  50. for(char& c : a)
  51. {
  52. ++c;
  53. ++count;
  54. }
  55. ANKI_TEST_EXPECT_EQ(a, "234");
  56. ANKI_TEST_EXPECT_EQ(count, 3);
  57. ANKI_TEST_EXPECT_EQ(a.begin(), &a[0]);
  58. ANKI_TEST_EXPECT_EQ(a.end(), &a[0] + 3);
  59. a.destroy(alloc);
  60. }
  61. // Append
  62. {
  63. String a, b;
  64. b.create(alloc, "123");
  65. a.append(alloc, b);
  66. ANKI_TEST_EXPECT_EQ(a, "123");
  67. a.append(alloc, "456789");
  68. a.append(alloc, String());
  69. a.append(alloc, "");
  70. a.append(alloc, "0");
  71. ANKI_TEST_EXPECT_EQ(a, "1234567890");
  72. a.destroy(alloc);
  73. b.destroy(alloc);
  74. }
  75. // Compare
  76. {
  77. #define COMPARE(x_, y_, op_) \
  78. a.append(alloc, x_); \
  79. b.append(alloc, y_); \
  80. ANKI_TEST_EXPECT_EQ(a op_ b, std::string(x_) op_ std::string(y_)) \
  81. a.destroy(alloc); \
  82. b.destroy(alloc);
  83. String a, b;
  84. COMPARE("123", "1233", <);
  85. COMPARE("0123", "1233", <=);
  86. COMPARE("ASDFA", "asdf90f", >);
  87. COMPARE(" %^*^^&", "aslkdfjb", >=);
  88. #undef COMPARE
  89. }
  90. // sprintf
  91. {
  92. String a;
  93. // Simple
  94. a.sprintf(alloc, "12%c %d", '3', 123);
  95. ANKI_TEST_EXPECT_EQ(a, "123 123");
  96. a.destroy(alloc);
  97. // Extreme
  98. const char* s = "1234567890ABCDEF!@#$%^&*()_+asfghjkl:,.;ljk\"><{}[]/";
  99. a.sprintf(alloc, "%s%s%s%s%s%s%s%s%s%s%s %d", s, s, s, s, s, s, s, s, s, s, s, 88);
  100. String b;
  101. for(U i = 0; i < 11; i++)
  102. {
  103. b.append(alloc, s);
  104. }
  105. b.append(alloc, " 88");
  106. ANKI_TEST_EXPECT_EQ(a, b);
  107. ANKI_TEST_EXPECT_EQ(a.getLength(), b.getLength());
  108. a.destroy(alloc);
  109. b.destroy(alloc);
  110. }
  111. // sprintf #2: Smaller result (will trigger another path)
  112. {
  113. String a;
  114. // Simple
  115. a.sprintf(alloc, "12%c %d", '3', 123);
  116. ANKI_TEST_EXPECT_EQ(a, "123 123");
  117. a.destroy(alloc);
  118. // Extreme
  119. const char* s = "12345";
  120. a.sprintf(alloc, "%s%s %d", s, s, 88);
  121. String b;
  122. for(U i = 0; i < 2; i++)
  123. {
  124. b.append(alloc, s);
  125. }
  126. b.append(alloc, " 88");
  127. ANKI_TEST_EXPECT_EQ(a, b);
  128. ANKI_TEST_EXPECT_EQ(a.getLength(), b.getLength());
  129. a.destroy(alloc);
  130. b.destroy(alloc);
  131. }
  132. // Other create
  133. {
  134. String a;
  135. a.create(alloc, '1', 3);
  136. ANKI_TEST_EXPECT_EQ(a, "111");
  137. ANKI_TEST_EXPECT_EQ(a.getLength(), 3);
  138. a.destroy(alloc);
  139. }
  140. // toString
  141. {
  142. String a;
  143. a.toString(alloc, 123);
  144. ANKI_TEST_EXPECT_EQ(a, "123");
  145. a.destroy(alloc);
  146. a.toString(alloc, 123.123);
  147. ANKI_TEST_EXPECT_EQ(a, "123.123000");
  148. a.destroy(alloc);
  149. }
  150. // To number
  151. {
  152. I64 i;
  153. String a;
  154. a.create(alloc, "123456789");
  155. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(i));
  156. ANKI_TEST_EXPECT_EQ(i, 123456789);
  157. a.destroy(alloc);
  158. a.create(alloc, "-9223372036854775807");
  159. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(i));
  160. ANKI_TEST_EXPECT_EQ(i, -9223372036854775807);
  161. a.destroy(alloc);
  162. F64 f;
  163. a.create(alloc, "123456789.145");
  164. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(f));
  165. ANKI_TEST_EXPECT_EQ(f, 123456789.145);
  166. a.destroy(alloc);
  167. }
  168. // replaceAll
  169. {
  170. String a = {alloc, "foo"};
  171. a.replaceAll(alloc, "foo", "bar");
  172. ANKI_TEST_EXPECT_EQ(a, "bar");
  173. a.destroy(alloc);
  174. a.create(alloc, "lafooha");
  175. a.replaceAll(alloc, "foo", "bar");
  176. ANKI_TEST_EXPECT_EQ(a, "labarha");
  177. a.destroy(alloc);
  178. a.create(alloc, "jjhfalkakljla");
  179. a.replaceAll(alloc, "a", "b");
  180. ANKI_TEST_EXPECT_EQ(a, "jjhfblkbkljlb");
  181. a.destroy(alloc);
  182. a.create(alloc, "%foo%ajlkadsf%foo%");
  183. a.replaceAll(alloc, "%foo%", "");
  184. ANKI_TEST_EXPECT_EQ(a, "ajlkadsf");
  185. a.destroy(alloc);
  186. }
  187. }