No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HeapStringTests.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #if !UNITY_DOTSRUNTIME
  2. #pragma warning disable 618
  3. using System;
  4. using NUnit.Framework;
  5. using Unity.Collections;
  6. using Unity.Collections.LowLevel.Unsafe;
  7. using System.Text;
  8. namespace FixedStringTests
  9. {
  10. internal class HeapStringTests
  11. {
  12. [Test]
  13. public void HeapStringFixedStringCtors()
  14. {
  15. using (NativeText aa = new NativeText(new FixedString32Bytes("test32"), Allocator.Temp))
  16. {
  17. Assert.True(aa != new FixedString32Bytes("test"));
  18. Assert.True(aa.Value == "test32");
  19. Assert.AreEqual("test32", aa);
  20. }
  21. using (NativeText aa = new NativeText(new FixedString64Bytes("test64"), Allocator.Temp))
  22. {
  23. Assert.True(aa != new FixedString64Bytes("test"));
  24. Assert.True(aa.Value == "test64");
  25. Assert.AreEqual("test64", aa);
  26. }
  27. using (NativeText aa = new NativeText(new FixedString128Bytes("test128"), Allocator.Temp))
  28. {
  29. Assert.True(aa != new FixedString128Bytes("test"));
  30. Assert.True(aa.Value == "test128");
  31. Assert.AreEqual("test128", aa);
  32. }
  33. using (NativeText aa = new NativeText(new FixedString512Bytes("test512"), Allocator.Temp))
  34. {
  35. Assert.True(aa != new FixedString512Bytes("test"));
  36. Assert.True(aa.Value == "test512");
  37. Assert.AreEqual("test512", aa);
  38. }
  39. using (NativeText aa = new NativeText(new FixedString4096Bytes("test4096"), Allocator.Temp))
  40. {
  41. Assert.True(aa != new FixedString4096Bytes("test"));
  42. Assert.True(aa.Value == "test4096");
  43. Assert.AreEqual("test4096", aa);
  44. }
  45. }
  46. [Test]
  47. public void HeapStringFormatExtension1Params()
  48. {
  49. NativeText aa = new NativeText(4, Allocator.Temp);
  50. Assert.True(aa.IsCreated);
  51. aa.Junk();
  52. FixedString32Bytes format = "{0}";
  53. FixedString32Bytes arg0 = "a";
  54. aa.AppendFormat(format, arg0);
  55. aa.Add(0x61);
  56. Assert.AreEqual("aa", aa);
  57. aa.AssertNullTerminated();
  58. aa.Dispose();
  59. }
  60. [Test]
  61. public void HeapStringCorrectLengthAfterClear()
  62. {
  63. NativeText aa = new NativeText(4, Allocator.Temp);
  64. Assert.True(aa.IsCreated);
  65. Assert.AreEqual(0, aa.Length, "Length after creation is not 0");
  66. aa.AssertNullTerminated();
  67. aa.Junk();
  68. aa.Clear();
  69. Assert.AreEqual(0, aa.Length, "Length after clear is not 0");
  70. aa.AssertNullTerminated();
  71. aa.Dispose();
  72. }
  73. [Test]
  74. public void HeapStringFormatExtension2Params()
  75. {
  76. NativeText aa = new NativeText(4, Allocator.Temp);
  77. aa.Junk();
  78. FixedString32Bytes format = "{0} {1}";
  79. FixedString32Bytes arg0 = "a";
  80. FixedString32Bytes arg1 = "b";
  81. aa.AppendFormat(format, arg0, arg1);
  82. Assert.AreEqual("a b", aa);
  83. aa.AssertNullTerminated();
  84. aa.Dispose();
  85. }
  86. [Test]
  87. public void HeapStringFormatExtension3Params()
  88. {
  89. NativeText aa = new NativeText(4, Allocator.Temp);
  90. aa.Junk();
  91. FixedString32Bytes format = "{0} {1} {2}";
  92. FixedString32Bytes arg0 = "a";
  93. FixedString32Bytes arg1 = "b";
  94. FixedString32Bytes arg2 = "c";
  95. aa.AppendFormat(format, arg0, arg1, arg2);
  96. Assert.AreEqual("a b c", aa);
  97. aa.AssertNullTerminated();
  98. aa.Dispose();
  99. }
  100. [Test]
  101. public void HeapStringFormatExtension4Params()
  102. {
  103. NativeText aa = new NativeText(Allocator.Temp);
  104. aa.Junk();
  105. FixedString32Bytes format = "{0} {1} {2} {3}";
  106. FixedString32Bytes arg0 = "a";
  107. FixedString32Bytes arg1 = "b";
  108. FixedString32Bytes arg2 = "c";
  109. FixedString32Bytes arg3 = "d";
  110. aa.AppendFormat(format, arg0, arg1, arg2, arg3);
  111. Assert.AreEqual("a b c d", aa);
  112. aa.AssertNullTerminated();
  113. aa.Dispose();
  114. }
  115. [Test]
  116. public void HeapStringFormatExtension5Params()
  117. {
  118. NativeText aa = new NativeText(4, Allocator.Temp);
  119. aa.Junk();
  120. FixedString32Bytes format = "{0} {1} {2} {3} {4}";
  121. FixedString32Bytes arg0 = "a";
  122. FixedString32Bytes arg1 = "b";
  123. FixedString32Bytes arg2 = "c";
  124. FixedString32Bytes arg3 = "d";
  125. FixedString32Bytes arg4 = "e";
  126. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4);
  127. Assert.AreEqual("a b c d e", aa);
  128. aa.AssertNullTerminated();
  129. aa.Dispose();
  130. }
  131. [Test]
  132. public void HeapStringFormatExtension6Params()
  133. {
  134. NativeText aa = new NativeText(4, Allocator.Temp);
  135. aa.Junk();
  136. FixedString32Bytes format = "{0} {1} {2} {3} {4} {5}";
  137. FixedString32Bytes arg0 = "a";
  138. FixedString32Bytes arg1 = "b";
  139. FixedString32Bytes arg2 = "c";
  140. FixedString32Bytes arg3 = "d";
  141. FixedString32Bytes arg4 = "e";
  142. FixedString32Bytes arg5 = "f";
  143. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4, arg5);
  144. Assert.AreEqual("a b c d e f", aa);
  145. aa.AssertNullTerminated();
  146. aa.Dispose();
  147. }
  148. [Test]
  149. public void HeapStringFormatExtension7Params()
  150. {
  151. NativeText aa = new NativeText(4, Allocator.Temp);
  152. aa.Junk();
  153. FixedString32Bytes format = "{0} {1} {2} {3} {4} {5} {6}";
  154. FixedString32Bytes arg0 = "a";
  155. FixedString32Bytes arg1 = "b";
  156. FixedString32Bytes arg2 = "c";
  157. FixedString32Bytes arg3 = "d";
  158. FixedString32Bytes arg4 = "e";
  159. FixedString32Bytes arg5 = "f";
  160. FixedString32Bytes arg6 = "g";
  161. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
  162. Assert.AreEqual("a b c d e f g", aa);
  163. aa.AssertNullTerminated();
  164. aa.Dispose();
  165. }
  166. [Test]
  167. public void HeapStringFormatExtension8Params()
  168. {
  169. NativeText aa = new NativeText(4, Allocator.Temp);
  170. aa.Junk();
  171. FixedString128Bytes format = "{0} {1} {2} {3} {4} {5} {6} {7}";
  172. FixedString32Bytes arg0 = "a";
  173. FixedString32Bytes arg1 = "b";
  174. FixedString32Bytes arg2 = "c";
  175. FixedString32Bytes arg3 = "d";
  176. FixedString32Bytes arg4 = "e";
  177. FixedString32Bytes arg5 = "f";
  178. FixedString32Bytes arg6 = "g";
  179. FixedString32Bytes arg7 = "h";
  180. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
  181. Assert.AreEqual("a b c d e f g h", aa);
  182. aa.AssertNullTerminated();
  183. aa.Dispose();
  184. }
  185. [Test]
  186. public void HeapStringFormatExtension9Params()
  187. {
  188. NativeText aa = new NativeText(4, Allocator.Temp);
  189. aa.Junk();
  190. FixedString128Bytes format = "{0} {1} {2} {3} {4} {5} {6} {7} {8}";
  191. FixedString32Bytes arg0 = "a";
  192. FixedString32Bytes arg1 = "b";
  193. FixedString32Bytes arg2 = "c";
  194. FixedString32Bytes arg3 = "d";
  195. FixedString32Bytes arg4 = "e";
  196. FixedString32Bytes arg5 = "f";
  197. FixedString32Bytes arg6 = "g";
  198. FixedString32Bytes arg7 = "h";
  199. FixedString32Bytes arg8 = "i";
  200. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
  201. Assert.AreEqual("a b c d e f g h i", aa);
  202. aa.AssertNullTerminated();
  203. aa.Dispose();
  204. }
  205. [Test]
  206. public void HeapStringFormatExtension10Params()
  207. {
  208. NativeText aa = new NativeText(4, Allocator.Temp);
  209. aa.Junk();
  210. FixedString128Bytes format = "{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}";
  211. FixedString32Bytes arg0 = "a";
  212. FixedString32Bytes arg1 = "b";
  213. FixedString32Bytes arg2 = "c";
  214. FixedString32Bytes arg3 = "d";
  215. FixedString32Bytes arg4 = "e";
  216. FixedString32Bytes arg5 = "f";
  217. FixedString32Bytes arg6 = "g";
  218. FixedString32Bytes arg7 = "h";
  219. FixedString32Bytes arg8 = "i";
  220. FixedString32Bytes arg9 = "j";
  221. aa.AppendFormat(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
  222. Assert.AreEqual("a b c d e f g h i j", aa);
  223. aa.AssertNullTerminated();
  224. aa.Dispose();
  225. }
  226. [Test]
  227. public void HeapStringAppendGrows()
  228. {
  229. NativeText aa = new NativeText(1, Allocator.Temp);
  230. var origCapacity = aa.Capacity;
  231. for (int i = 0; i < origCapacity; ++i)
  232. aa.Append('a');
  233. Assert.AreEqual(origCapacity, aa.Capacity);
  234. aa.Append('b');
  235. Assert.GreaterOrEqual(aa.Capacity, origCapacity);
  236. Assert.AreEqual(new String('a', origCapacity) + "b", aa.ToString());
  237. aa.Dispose();
  238. }
  239. [Test]
  240. public void HeapStringAppendString()
  241. {
  242. NativeText aa = new NativeText(4, Allocator.Temp);
  243. aa.Append("aa");
  244. Assert.AreEqual("aa", aa.ToString());
  245. aa.Append("bb");
  246. Assert.AreEqual("aabb", aa.ToString());
  247. aa.Dispose();
  248. }
  249. [TestCase("Antidisestablishmentarianism")]
  250. [TestCase("⁣🌹🌻🌷🌿🌵🌾⁣")]
  251. public void HeapStringCopyFromBytesWorks(String a)
  252. {
  253. NativeText aa = new NativeText(4, Allocator.Temp);
  254. aa.Junk();
  255. var utf8 = Encoding.UTF8.GetBytes(a);
  256. unsafe
  257. {
  258. fixed (byte* b = utf8)
  259. aa.Append(b, (ushort) utf8.Length);
  260. }
  261. Assert.AreEqual(a, aa.ToString());
  262. aa.AssertNullTerminated();
  263. aa.Append("tail");
  264. Assert.AreEqual(a + "tail", aa.ToString());
  265. aa.AssertNullTerminated();
  266. aa.Dispose();
  267. }
  268. [TestCase("red")]
  269. [TestCase("紅色", TestName = "{m}(Chinese-Red)")]
  270. [TestCase("George Washington")]
  271. [TestCase("村上春樹", TestName = "{m}(HarukiMurakami)")]
  272. public void HeapStringToStringWorks(String a)
  273. {
  274. NativeText aa = new NativeText(4, Allocator.Temp);
  275. aa.Append(new FixedString128Bytes(a));
  276. Assert.AreEqual(a, aa.ToString());
  277. aa.AssertNullTerminated();
  278. aa.Dispose();
  279. }
  280. [TestCase("monkey", "monkey")]
  281. [TestCase("yellow", "green")]
  282. [TestCase("violet", "紅色", TestName = "{m}(Violet-Chinese-Red")]
  283. [TestCase("绿色", "蓝色", TestName = "{m}(Chinese-Green-Blue")]
  284. [TestCase("靛蓝色", "紫罗兰色", TestName = "{m}(Chinese-Indigo-Violet")]
  285. [TestCase("James Monroe", "John Quincy Adams")]
  286. [TestCase("Andrew Jackson", "村上春樹", TestName = "{m}(AndrewJackson-HarukiMurakami")]
  287. [TestCase("三島 由紀夫", "吉本ばなな", TestName = "{m}(MishimaYukio-YoshimotoBanana")]
  288. public void HeapStringEqualsWorks(String a, String b)
  289. {
  290. NativeText aa = new NativeText(new FixedString128Bytes(a), Allocator.Temp);
  291. NativeText bb = new NativeText(new FixedString128Bytes(b), Allocator.Temp);
  292. Assert.AreEqual(aa.Equals(bb), a.Equals(b));
  293. aa.AssertNullTerminated();
  294. bb.AssertNullTerminated();
  295. aa.Dispose();
  296. bb.Dispose();
  297. }
  298. [Test]
  299. public void HeapStringForEach()
  300. {
  301. NativeText actual = new NativeText("A🌕Z🌑", Allocator.Temp);
  302. FixedList32Bytes<int> expected = default;
  303. expected.Add('A');
  304. expected.Add(0x1F315);
  305. expected.Add('Z');
  306. expected.Add(0x1F311);
  307. int index = 0;
  308. foreach (var rune in actual)
  309. {
  310. Assert.AreEqual(expected[index], rune.value);
  311. ++index;
  312. }
  313. actual.Dispose();
  314. }
  315. [Test]
  316. public void HeapStringIndexOf()
  317. {
  318. NativeText a = new NativeText("bookkeeper bookkeeper", Allocator.Temp);
  319. NativeText b = new NativeText("ookkee", Allocator.Temp);
  320. Assert.AreEqual(1, a.IndexOf(b));
  321. Assert.AreEqual(-1, b.IndexOf(a));
  322. a.Dispose();
  323. b.Dispose();
  324. }
  325. [Test]
  326. public void HeapStringLastIndexOf()
  327. {
  328. NativeText a = new NativeText("bookkeeper bookkeeper", Allocator.Temp);
  329. NativeText b = new NativeText("ookkee", Allocator.Temp);
  330. Assert.AreEqual(12, a.LastIndexOf(b));
  331. Assert.AreEqual(-1, b.LastIndexOf(a));
  332. a.Dispose();
  333. b.Dispose();
  334. }
  335. [Test]
  336. public void HeapStringContains()
  337. {
  338. NativeText a = new NativeText("bookkeeper", Allocator.Temp);
  339. NativeText b = new NativeText("ookkee", Allocator.Temp);
  340. Assert.AreEqual(true, a.Contains(b));
  341. a.Dispose();
  342. b.Dispose();
  343. }
  344. [Test]
  345. public void HeapStringComparisons()
  346. {
  347. NativeText a = new NativeText("apple", Allocator.Temp);
  348. NativeText b = new NativeText("banana", Allocator.Temp);
  349. Assert.AreEqual(false, a.Equals(b));
  350. Assert.AreEqual(true, !b.Equals(a));
  351. a.Dispose();
  352. b.Dispose();
  353. }
  354. }
  355. }
  356. #endif