String.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright (C) 2009-present, 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. DefaultMemoryPool::allocateSingleton(allocAligned, nullptr);
  11. // Copy
  12. {
  13. String a, b;
  14. a = "123";
  15. b = a;
  16. ANKI_TEST_EXPECT_EQ(a, b);
  17. ANKI_TEST_EXPECT_EQ(b, "123");
  18. b.destroy();
  19. a.destroy();
  20. b = "321";
  21. a = b;
  22. ANKI_TEST_EXPECT_EQ(a, b);
  23. ANKI_TEST_EXPECT_EQ(a, "321");
  24. b.destroy();
  25. a.destroy();
  26. }
  27. // Move
  28. {
  29. String a;
  30. a = "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();
  35. b = "321";
  36. a = std::move(b);
  37. ANKI_TEST_EXPECT_EQ(a, "321");
  38. ANKI_TEST_EXPECT_EQ(b.isEmpty(), true);
  39. a.destroy();
  40. }
  41. // Accessors
  42. {
  43. const char* s = "123";
  44. String a;
  45. a = 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. }
  60. // Append
  61. {
  62. String a, b;
  63. b = "123";
  64. a += b;
  65. ANKI_TEST_EXPECT_EQ(a, "123");
  66. a += "456789";
  67. a += String();
  68. a += "";
  69. a += "0";
  70. ANKI_TEST_EXPECT_EQ(a, "1234567890");
  71. }
  72. // Compare
  73. {
  74. #define COMPARE(x_, y_, op_) \
  75. a += x_; \
  76. b += y_; \
  77. ANKI_TEST_EXPECT_EQ(a op_ b, std::string(x_) op_ std::string(y_)) \
  78. a.destroy(); \
  79. b.destroy();
  80. String a, b;
  81. COMPARE("123", "1233", <);
  82. COMPARE("0123", "1233", <=);
  83. COMPARE("ASDFA", "asdf90f", >);
  84. COMPARE(" %^*^^&", "aslkdfjb", >=);
  85. #undef COMPARE
  86. }
  87. // sprintf
  88. {
  89. String a;
  90. // Simple
  91. a.sprintf("12%c %d", '3', 123);
  92. ANKI_TEST_EXPECT_EQ(a, "123 123");
  93. a.destroy();
  94. // Extreme
  95. const char* s = "1234567890ABCDEF!@#$%^&*()_+asfghjkl:,.;ljk\"><{}[]/";
  96. a.sprintf("%s%s%s%s%s%s%s%s%s%s%s %d", s, s, s, s, s, s, s, s, s, s, s, 88);
  97. String b;
  98. for(U i = 0; i < 11; i++)
  99. {
  100. b += s;
  101. }
  102. b += " 88";
  103. ANKI_TEST_EXPECT_EQ(a, b);
  104. ANKI_TEST_EXPECT_EQ(a.getLength(), b.getLength());
  105. }
  106. // sprintf #2: Smaller result (will trigger another path)
  107. {
  108. String a;
  109. // Simple
  110. a.sprintf("12%c %d", '3', 123);
  111. ANKI_TEST_EXPECT_EQ(a, "123 123");
  112. a.destroy();
  113. // Extreme
  114. const char* s = "12345";
  115. a.sprintf("%s%s %d", s, s, 88);
  116. String b;
  117. for(U i = 0; i < 2; i++)
  118. {
  119. b += s;
  120. }
  121. b += " 88";
  122. ANKI_TEST_EXPECT_EQ(a, b);
  123. ANKI_TEST_EXPECT_EQ(a.getLength(), b.getLength());
  124. }
  125. // Other create
  126. {
  127. String a;
  128. a = String('1', 3);
  129. ANKI_TEST_EXPECT_EQ(a, "111");
  130. ANKI_TEST_EXPECT_EQ(a.getLength(), 3);
  131. }
  132. // toString
  133. {
  134. String a;
  135. a.toString(123);
  136. ANKI_TEST_EXPECT_EQ(a, "123");
  137. a.toString(123.123);
  138. ANKI_TEST_EXPECT_EQ(a, "123.123000");
  139. }
  140. // To number
  141. {
  142. I64 i;
  143. String a;
  144. a = "123456789";
  145. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(i));
  146. ANKI_TEST_EXPECT_EQ(i, 123456789);
  147. a = "-9223372036854775807";
  148. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(i));
  149. ANKI_TEST_EXPECT_EQ(i, -9223372036854775807);
  150. F64 f;
  151. a = "123456789.145";
  152. ANKI_TEST_EXPECT_NO_ERR(a.toNumber(f));
  153. ANKI_TEST_EXPECT_EQ(f, 123456789.145);
  154. }
  155. // replaceAll
  156. {
  157. String a = "foo";
  158. a.replaceAll("foo", "bar");
  159. ANKI_TEST_EXPECT_EQ(a, "bar");
  160. a = "lafooha";
  161. a.replaceAll("foo", "bar");
  162. ANKI_TEST_EXPECT_EQ(a, "labarha");
  163. a = "jjhfalkakljla";
  164. a.replaceAll("a", "b");
  165. ANKI_TEST_EXPECT_EQ(a, "jjhfblkbkljlb");
  166. a = "a%foo%ajlkadsf%foo%b";
  167. a.replaceAll("%foo%", "");
  168. ANKI_TEST_EXPECT_EQ(a, "aajlkadsfb");
  169. }
  170. DefaultMemoryPool::freeSingleton();
  171. }