暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

FixedListTests.tt 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. <#/*THIS IS A T4 FILE - see t4_text_templating.md for what it is and how to run codegen*/#>
  2. <#@ template debug="True" #>
  3. <#@ output extension=".gen.cs" encoding="utf-8" #>
  4. <#@ assembly name="System.Core" #>
  5. <#@ import namespace="System.Globalization" #>
  6. //------------------------------------------------------------------------------
  7. // <auto-generated>
  8. // This code was generated by a tool.
  9. //
  10. // TextTransform Samples/Packages/com.unity.collections/Unity.Collections.Tests/FixedListTests.tt
  11. //
  12. // Changes to this file may cause incorrect behavior and will be lost if
  13. // the code is regenerated.
  14. // </auto-generated>
  15. //------------------------------------------------------------------------------
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Globalization;
  19. using System.Threading;
  20. using NUnit.Framework;
  21. using Unity.Collections;
  22. using Unity.Collections.LowLevel.Unsafe;
  23. using Unity.Collections.Tests;
  24. #if !UNITY_DOTSRUNTIME // DOTS-Runtime doesn't support UnityEngine
  25. using UnityEngine;
  26. #endif
  27. internal class FixedListTests : CollectionsTestFixture
  28. {
  29. struct NonComparableStruct
  30. {
  31. public int a;
  32. }
  33. struct DescendingComparer<T> : IComparer<T> where T : IComparable<T>
  34. {
  35. public int Compare(T x, T y) => y.CompareTo(x);
  36. }
  37. <#
  38. {
  39. var SIZES = new int[] {32, 64, 128};
  40. for (var size = 0; size < 3; ++size)
  41. {
  42. var BYTES = SIZES[size];
  43. var TYPENAME = String.Format("FixedList{0}Bytes", BYTES);
  44. #>
  45. [Test]
  46. [IgnoreInPortableTests("Crashes in IL2CPP on unsupported feature.")]
  47. public void <#=TYPENAME #>DebugView()
  48. {
  49. var list = new <#=TYPENAME #><NonComparableStruct>();
  50. CollectionAssert.IsEmpty(new <#=TYPENAME #>DebugView<NonComparableStruct>(list).Items);
  51. var reference = new []
  52. {
  53. new NonComparableStruct{ a = 123 },
  54. new NonComparableStruct{ a = 234 },
  55. new NonComparableStruct{ a = 345 },
  56. };
  57. list.Add(reference[0]);
  58. list.Add(reference[1]);
  59. list.Add(reference[2]);
  60. CollectionAssert.AreEqual(reference, new <#=TYPENAME #>DebugView<NonComparableStruct>(list).Items);
  61. }
  62. <#
  63. }
  64. }
  65. {
  66. var TYPES = new string[] {"byte", "int", "float"};
  67. var TYPESIZES = new int[] {1, 4, 4};
  68. var SIZES = new int[] {32, 64, 128};
  69. for (var type = 0; type < 3; ++type)
  70. {
  71. for (var size = 0; size < 3; ++size)
  72. {
  73. var BYTES = SIZES[size];
  74. var TYPE = TYPES[type];
  75. var TYPESIZE = TYPESIZES[type];
  76. var MAXLENGTH = BYTES - 2;
  77. var TYPENAME = String.Format("FixedList{0}Bytes", BYTES);
  78. var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  79. var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
  80. var BUFFERTYPE = String.Format("FixedBytes{0}", MAXLENGTH);
  81. #>
  82. [Test]
  83. public void <#=TYPENAME_IDENTIFIER #><#=BUFFERTYPE#>ToNativeArrayWorksGeneric()
  84. {
  85. var list = new FixedList<<#=TYPE#>,<#=BUFFERTYPE#>>();
  86. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  87. list.Add((<#=TYPE#>)(i * 123 + 234));
  88. using(var array = list.ToNativeArray(Allocator.Temp))
  89. {
  90. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  91. Assert.AreEqual((<#=TYPE#>)(i * 123 + 234), array[i]);
  92. }
  93. }
  94. [Test]
  95. public void <#=TYPENAME_IDENTIFIER #>ToNativeArrayWorks()
  96. {
  97. var list = new <#=TYPENAME #><<#=TYPE#>>();
  98. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  99. list.Add((<#=TYPE#>)(i * 123 + 234));
  100. using(var array = list.ToNativeArray(Allocator.Temp))
  101. {
  102. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  103. Assert.AreEqual((<#=TYPE#>)(i * 123 + 234), array[i]);
  104. }
  105. }
  106. [Test]
  107. public void <#=TYPENAME_IDENTIFIER #>GenericHasExpectedLayout()
  108. {
  109. var actual = new <#=TYPENAME #><<#=TYPE#>>();
  110. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  111. actual.Add((<#=TYPE #>)i);
  112. unsafe
  113. {
  114. var e = stackalloc byte[<#=BYTES #>];
  115. e[0] = (byte)((<#=EXPECTEDCAPACITY #> >> 0) & 0xFF);
  116. e[1] = (byte)((<#=EXPECTEDCAPACITY #> >> 8) & 0xFF);
  117. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  118. {
  119. var s = (<#=TYPE #>)i;
  120. UnsafeUtility.MemCpy(e + 2 + FixedList.PaddingBytes<<#=TYPE#>>() + sizeof(<#=TYPE #>) * i, &s, sizeof(<#=TYPE #>));
  121. }
  122. Assert.AreEqual(0, UnsafeUtility.MemCmp(e, &actual.length, <#=BYTES #>));
  123. }
  124. }
  125. [Test]
  126. public void <#=TYPENAME_IDENTIFIER #>GenericHasExpectedCapacity()
  127. {
  128. var list = new <#=TYPENAME #><<#=TYPE#>>();
  129. var expectedCapacity = list.Capacity;
  130. for(int i = 0; i < expectedCapacity; ++i)
  131. list.Add((<#=TYPE #>)i);
  132. Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });
  133. }
  134. <#
  135. if (EXPECTEDCAPACITY >= 5)
  136. {
  137. #>
  138. [Test]
  139. public void <#=TYPENAME_IDENTIFIER #>GenericInsertRangeWithBeginEnd()
  140. {
  141. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 4 };
  142. list.InsertRangeWithBeginEnd(1,3);
  143. list[1] = 1;
  144. list[2] = 2;
  145. for(var i = 0; i < 5; ++i)
  146. Assert.AreEqual(i, list[i]);
  147. }
  148. [Test]
  149. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveRange()
  150. {
  151. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  152. list.RemoveRange(1, 2);
  153. for(var i = 0; i < 3; ++i)
  154. Assert.AreEqual(i, list[i]);
  155. }
  156. [Test]
  157. public void <#=TYPENAME_IDENTIFIER #>GenericInsert()
  158. {
  159. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 4 };
  160. list.Insert(1,1);
  161. list.Insert(2,2);
  162. for(var i = 0; i < 5; ++i)
  163. Assert.AreEqual(i, list[i]);
  164. }
  165. [Test]
  166. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveAt()
  167. {
  168. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  169. list.RemoveAt(1);
  170. list.RemoveAt(1);
  171. for(var i = 0; i < 3; ++i)
  172. Assert.AreEqual(i, list[i]);
  173. }
  174. [Test]
  175. public void <#=TYPENAME_IDENTIFIER #>GenericRemove()
  176. {
  177. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  178. Assert.True(list.Remove((<#=TYPE#>)3));
  179. Assert.True(list.Remove((<#=TYPE#>)3));
  180. for(var i = 0; i < 3; ++i)
  181. Assert.AreEqual(i, list[i]);
  182. }
  183. [Test]
  184. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveSwapBack()
  185. {
  186. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 2, 1 };
  187. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  188. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  189. for(var i = 0; i < 3; ++i)
  190. Assert.AreEqual(i, list[i]);
  191. }
  192. [Test]
  193. public void <#=TYPENAME_IDENTIFIER #>GenericSort()
  194. {
  195. var list = new <#=TYPENAME #><<#=TYPE#>>();
  196. for(var i = 0; i < 5; ++i)
  197. list.Add((<#=TYPE #>)(4-i));
  198. list.Sort();
  199. for(var i = 0; i < 5; ++i)
  200. Assert.AreEqual(i, list[i]);
  201. }
  202. [Test]
  203. public void <#=TYPENAME_IDENTIFIER #>GenericSortCustomComparer()
  204. {
  205. var list = new <#=TYPENAME #><<#=TYPE#>>();
  206. for(var i = 0; i < 5; ++i)
  207. list.Add((<#=TYPE #>)(i));
  208. list.Sort(new DescendingComparer<<#=TYPE#>>());
  209. for(var i = 0; i < 5; ++i)
  210. Assert.AreEqual(4-i, list[i]);
  211. }
  212. [Test]
  213. public unsafe void <#=TYPENAME_IDENTIFIER #>IndexOf()
  214. {
  215. var list = new <#=TYPENAME #><<#=TYPE#>>() { 123, 178 };
  216. bool r0 = false, r1 = false, r2 = false;
  217. GCAllocRecorder.ValidateNoGCAllocs(() =>
  218. {
  219. r0 = -1 != list.IndexOf((<#=TYPE#>)145);
  220. r1 = list.Contains((<#=TYPE#>)123);
  221. r2 = list.Contains((<#=TYPE#>)178);
  222. });
  223. Assert.False(r0);
  224. Assert.True(r1);
  225. Assert.True(r2);
  226. }
  227. <#
  228. }
  229. }
  230. for (var size = 0; size < 3; ++size)
  231. {
  232. var BYTES = SIZES[size];
  233. var TYPE = TYPES[type];
  234. var TYPESIZE = TYPESIZES[type];
  235. var MAXLENGTH = BYTES - 2;
  236. var TYPENAME = String.Format("FixedList{0}Bytes<{1}>", BYTES, TYPE);
  237. var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  238. var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
  239. #>
  240. [Test]
  241. public void <#=TYPENAME_IDENTIFIER #>HasExpectedLayout()
  242. {
  243. var actual = new <#=TYPENAME #>();
  244. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  245. actual.Add((<#=TYPE #>)i);
  246. unsafe
  247. {
  248. var e = stackalloc byte[<#=BYTES #>];
  249. e[0] = (byte)((<#=EXPECTEDCAPACITY #> >> 0) & 0xFF);
  250. e[1] = (byte)((<#=EXPECTEDCAPACITY #> >> 8) & 0xFF);
  251. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  252. {
  253. var s = (<#=TYPE #>)i;
  254. UnsafeUtility.MemCpy(e + 2 + FixedList.PaddingBytes<<#=TYPE#>>() + sizeof(<#=TYPE #>) * i, &s, sizeof(<#=TYPE #>));
  255. }
  256. Assert.AreEqual(0, UnsafeUtility.MemCmp(e, &actual.length, <#=BYTES #>));
  257. }
  258. }
  259. [Test]
  260. public void <#=TYPENAME_IDENTIFIER #>HasExpectedCapacity()
  261. {
  262. var list = new <#=TYPENAME #>();
  263. var expectedCapacity = list.Capacity;
  264. for(int i = 0; i < expectedCapacity; ++i)
  265. list.Add((<#=TYPE #>)i);
  266. Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });
  267. }
  268. #if !UNITY_DOTSRUNTIME // DOTS-Runtime doesn't support UnityEngine
  269. class ScriptableObject<#=TYPENAME_IDENTIFIER#> : UnityEngine.ScriptableObject
  270. {
  271. public <#=TYPENAME#> List;
  272. }
  273. [Test]
  274. public void <#=TYPENAME_IDENTIFIER #>Serializes()
  275. {
  276. var a = UnityEngine.ScriptableObject.CreateInstance<ScriptableObject<#=TYPENAME_IDENTIFIER#> >();
  277. for(int i = 0; i < a.List.Capacity; ++i)
  278. a.List.Add((<#=TYPE #>)i);
  279. var b = UnityEngine.Object.Instantiate(a);
  280. CollectionAssert.AreEqual(a.List, b.List);
  281. }
  282. #endif
  283. <#
  284. if (EXPECTEDCAPACITY >= 5)
  285. {
  286. #>
  287. [Test]
  288. public void <#=TYPENAME_IDENTIFIER #>InsertRangeWithBeginEnd()
  289. {
  290. var list = new <#=TYPENAME #>() { 0, 3, 4 };
  291. list.InsertRangeWithBeginEnd(1,3);
  292. list[1] = 1;
  293. list[2] = 2;
  294. for(var i = 0; i < 5; ++i)
  295. Assert.AreEqual(i, list[i]);
  296. }
  297. private static void Expected(ref <#=TYPENAME #> container, int expectedLength, int[] expected)
  298. {
  299. Assert.AreEqual(expectedLength == 0, container.IsEmpty);
  300. Assert.AreEqual(container.Length, expectedLength);
  301. for (var i = 0; i < container.Length; ++i)
  302. {
  303. Assert.AreEqual(expected[i], container[i]);
  304. }
  305. }
  306. [Test]
  307. public void <#=TYPENAME_IDENTIFIER #>RemoveAt()
  308. {
  309. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  310. list.RemoveAt(1);
  311. list.RemoveAt(1);
  312. Expected(ref list, 3, new int[] { 0, 1, 2 });
  313. }
  314. [Test]
  315. public void <#=TYPENAME_IDENTIFIER #>Remove()
  316. {
  317. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  318. Assert.True(list.Remove((<#=TYPE#>)3));
  319. Assert.True(list.Remove((<#=TYPE#>)3));
  320. Expected(ref list, 3, new int[] { 0, 1, 2 });
  321. }
  322. [Test]
  323. public void <#=TYPENAME_IDENTIFIER #>RemoveSwapBack()
  324. {
  325. var list = new <#=TYPENAME #>() { 0, 3, 3, 2, 1 };
  326. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  327. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  328. Expected(ref list, 3, new int[] { 0, 1, 2 });
  329. }
  330. [Test]
  331. public void <#=TYPENAME_IDENTIFIER #>RemoveRange()
  332. {
  333. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  334. list.RemoveRange(1, 2);
  335. Expected(ref list, 3, new int[] { 0, 1, 2 });
  336. }
  337. [Test]
  338. public void <#=TYPENAME_IDENTIFIER #>RemoveAtSwapBack()
  339. {
  340. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  341. list.RemoveAtSwapBack(1);
  342. list.RemoveAtSwapBack(1);
  343. Expected(ref list, 3, new int[] { 0, 1, 3 });
  344. }
  345. [Test]
  346. public void <#=TYPENAME_IDENTIFIER #>RemoveRangeSwapBack()
  347. {
  348. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  349. list.RemoveRangeSwapBack(1, 2);
  350. Expected(ref list, 3, new int[] { 0, 1, 2 });
  351. }
  352. [Test]
  353. public void <#=TYPENAME_IDENTIFIER #>Insert()
  354. {
  355. var list = new <#=TYPENAME #>() { 0, 3, 4 };
  356. list.Insert(1,1);
  357. list.Insert(2,2);
  358. for(var i = 0; i < 5; ++i)
  359. Assert.AreEqual(i, list[i]);
  360. }
  361. [Test]
  362. public void <#=TYPENAME_IDENTIFIER #>Sort()
  363. {
  364. var list = new <#=TYPENAME #>();
  365. for(var i = 0; i < 5; ++i)
  366. list.Add((<#=TYPE #>)(4-i));
  367. list.Sort();
  368. for(var i = 0; i < 5; ++i)
  369. Assert.AreEqual(i, list[i]);
  370. }
  371. <#
  372. }
  373. foreach (var OTHERBYTES in SIZES)
  374. {
  375. if (OTHERBYTES != BYTES)
  376. {
  377. var OTHERCAPACITY = (OTHERBYTES - 2) / TYPESIZE;
  378. var OTHERTYPENAME = String.Format("FixedList{0}Bytes<{1}>", OTHERBYTES, TYPE);
  379. var OTHERTYPENAME_IDENTIFIER = String.Format("_FixedList{0}{1}", OTHERBYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  380. #>
  381. [Test]
  382. public void <#=TYPENAME_IDENTIFIER #>To<#=OTHERTYPENAME_IDENTIFIER #>()
  383. {
  384. var a = new <#=TYPENAME #>();
  385. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  386. a.Add((<#=TYPE #>)i);
  387. <#
  388. if (EXPECTEDCAPACITY <= OTHERCAPACITY)
  389. {
  390. WriteLine(" var b = new {0}(a);", OTHERTYPENAME);
  391. WriteLine(" for(var i = 0; i < {0}; ++i)", EXPECTEDCAPACITY);
  392. WriteLine(" Assert.AreEqual(({0})i, b[i]);", TYPE);
  393. }
  394. else
  395. WriteLine(
  396. " Assert.Throws<IndexOutOfRangeException> (() => {{ var b = new {0}(a); }} );",
  397. OTHERTYPENAME);
  398. #>
  399. }
  400. <#
  401. }
  402. }
  403. }
  404. }
  405. }
  406. #>
  407. }