Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

FixedListTests.tt 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  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. using UnityEngine;
  25. internal class FixedListTests : CollectionsTestFixture
  26. {
  27. struct NonComparableStruct
  28. {
  29. public int a;
  30. }
  31. struct DescendingComparer<T> : IComparer<T> where T : IComparable<T>
  32. {
  33. public int Compare(T x, T y) => y.CompareTo(x);
  34. }
  35. <#
  36. {
  37. var SIZES = new int[] {32, 64, 128};
  38. for (var size = 0; size < 3; ++size)
  39. {
  40. var BYTES = SIZES[size];
  41. var TYPENAME = String.Format("FixedList{0}Bytes", BYTES);
  42. #>
  43. [Test]
  44. public void <#=TYPENAME #>DebugView()
  45. {
  46. var list = new <#=TYPENAME #><NonComparableStruct>();
  47. CollectionAssert.IsEmpty(new <#=TYPENAME #>DebugView<NonComparableStruct>(list).Items);
  48. var reference = new []
  49. {
  50. new NonComparableStruct{ a = 123 },
  51. new NonComparableStruct{ a = 234 },
  52. new NonComparableStruct{ a = 345 },
  53. };
  54. list.Add(reference[0]);
  55. list.Add(reference[1]);
  56. list.Add(reference[2]);
  57. CollectionAssert.AreEqual(reference, new <#=TYPENAME #>DebugView<NonComparableStruct>(list).Items);
  58. }
  59. <#
  60. }
  61. }
  62. {
  63. var TYPES = new string[] {"byte", "int", "float"};
  64. var TYPESIZES = new int[] {1, 4, 4};
  65. var SIZES = new int[] {32, 64, 128};
  66. for (var type = 0; type < 3; ++type)
  67. {
  68. for (var size = 0; size < 3; ++size)
  69. {
  70. var BYTES = SIZES[size];
  71. var TYPE = TYPES[type];
  72. var TYPESIZE = TYPESIZES[type];
  73. var MAXLENGTH = BYTES - 2;
  74. var TYPENAME = String.Format("FixedList{0}Bytes", BYTES);
  75. var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  76. var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
  77. var BUFFERTYPE = String.Format("FixedBytes{0}Align8", BYTES);
  78. #>
  79. public readonly unsafe struct <#=TYPENAME_IDENTIFIER #>Wrapper
  80. {
  81. readonly <#=TYPENAME #><<#=TYPE #>> _values;
  82. internal <#=TYPE #>* Values => (<#=TYPE #>*)_values.Buffer;
  83. public <#=TYPENAME_IDENTIFIER #>Wrapper(<#=TYPE #> x, <#=TYPE #> y)
  84. {
  85. _values = new <#=TYPENAME #><<#=TYPE #>>();
  86. _values.Add(x);
  87. _values.Add(y);
  88. _values.Sort();
  89. }
  90. }
  91. unsafe void <#=TYPENAME_IDENTIFIER #>ReadonlyWorksFunc1(in <#=TYPENAME_IDENTIFIER #>Wrapper list, <#=TYPE #>* originalValues)
  92. {
  93. <#=TYPE #>* values = list.Values;
  94. Assert.AreEqual(originalValues[0], values[0], "Values[0] mismatch in func1");
  95. Assert.AreEqual(originalValues[1], values[1], "Values[1] mismatch in func1");
  96. Assert.AreEqual((ulong)originalValues, (ulong)values, "Buffer pointer mismatch in func1");
  97. }
  98. [Test]
  99. public unsafe void <#=TYPENAME_IDENTIFIER #>ReadonlyWorks()
  100. {
  101. var list = new <#=TYPENAME_IDENTIFIER #>Wrapper(17, 23);
  102. <#=TYPE #>* values = list.Values;
  103. <#=TYPENAME_IDENTIFIER #>ReadonlyWorksFunc1(list, values);
  104. }
  105. [Test]
  106. public unsafe void <#=TYPENAME_IDENTIFIER #><#=BUFFERTYPE#>IsAlignedGeneric()
  107. {
  108. var list = new FixedList<<#=TYPE#>,<#=BUFFERTYPE#>>();
  109. Assert.IsTrue((((ulong)list.Buffer) & (sizeof(<#=TYPE#>) - 1)) == 0);
  110. }
  111. [Test]
  112. public void <#=TYPENAME_IDENTIFIER #><#=BUFFERTYPE#>ToNativeArrayWorksGeneric()
  113. {
  114. var list = new FixedList<<#=TYPE#>,<#=BUFFERTYPE#>>();
  115. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  116. list.Add((<#=TYPE#>)(i * 123 + 234));
  117. using(var array = list.ToNativeArray(Allocator.Temp))
  118. {
  119. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  120. Assert.AreEqual((<#=TYPE#>)(i * 123 + 234), array[i]);
  121. }
  122. }
  123. [Test]
  124. public void <#=TYPENAME_IDENTIFIER #>ToNativeArrayWorks()
  125. {
  126. var list = new <#=TYPENAME #><<#=TYPE#>>();
  127. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  128. list.Add((<#=TYPE#>)(i * 123 + 234));
  129. using(var array = list.ToNativeArray(Allocator.Temp))
  130. {
  131. for(var i = 0; i < <#=EXPECTEDCAPACITY#>; ++i)
  132. Assert.AreEqual((<#=TYPE#>)(i * 123 + 234), array[i]);
  133. }
  134. }
  135. [Test]
  136. public void <#=TYPENAME_IDENTIFIER #>GenericHasExpectedLayout()
  137. {
  138. var actual = new <#=TYPENAME #><<#=TYPE#>>();
  139. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  140. actual.Add((<#=TYPE #>)i);
  141. unsafe
  142. {
  143. var e = stackalloc byte[<#=BYTES #>];
  144. e[0] = (byte)((<#=EXPECTEDCAPACITY #> >> 0) & 0xFF);
  145. e[1] = (byte)((<#=EXPECTEDCAPACITY #> >> 8) & 0xFF);
  146. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  147. {
  148. var s = (<#=TYPE #>)i;
  149. UnsafeUtility.MemCpy(e + 2 + FixedList.PaddingBytes<<#=TYPE#>>() + sizeof(<#=TYPE #>) * i, &s, sizeof(<#=TYPE #>));
  150. }
  151. Assert.AreEqual(0, UnsafeUtility.MemCmp(e, &actual.data, <#=BYTES #>));
  152. }
  153. }
  154. [Test]
  155. [TestRequiresDotsDebugOrCollectionChecks]
  156. public void <#=TYPENAME_IDENTIFIER #>GenericHasExpectedCapacity()
  157. {
  158. var list = new <#=TYPENAME #><<#=TYPE#>>();
  159. var expectedCapacity = list.Capacity;
  160. for(int i = 0; i < expectedCapacity; ++i)
  161. list.Add((<#=TYPE #>)i);
  162. Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });
  163. }
  164. <#
  165. if (EXPECTEDCAPACITY >= 5)
  166. {
  167. #>
  168. [Test]
  169. public unsafe void <#=TYPENAME_IDENTIFIER #>GenericAdd()
  170. {
  171. var list = new <#=TYPENAME #><<#=TYPE#>>();
  172. var capacity = list.Capacity;
  173. for (var i = 0; i < capacity; ++i)
  174. {
  175. list.Add((<#=TYPE#>)i);
  176. Assert.AreEqual(i + 1, list.Length);
  177. Assert.AreEqual(i, list[i]);
  178. }
  179. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  180. Assert.Throws<IndexOutOfRangeException>(() => { list.Add(0); });
  181. #endif
  182. Assert.AreEqual(capacity, list.Length); // Verify length didn't change
  183. }
  184. [Test]
  185. public unsafe void <#=TYPENAME_IDENTIFIER #>GenericAddRange()
  186. {
  187. var list = new <#=TYPENAME #><<#=TYPE#>>();
  188. var capacity = list.Capacity;
  189. var items = stackalloc <#=TYPE#>[capacity];
  190. for (var i = 0; i < capacity; ++i)
  191. items[i] = (<#=TYPE#>)i;
  192. var half = capacity / 2;
  193. list.AddRange(items, half);
  194. Assert.AreEqual(half, list.Length);
  195. for (var i = 0; i < half; ++i)
  196. Assert.AreEqual(i, list[i]);
  197. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  198. Assert.Throws<IndexOutOfRangeException>(() => { list.AddRange(items, capacity); });
  199. #endif
  200. Assert.AreEqual(half, list.Length); // Verify length didn't change
  201. }
  202. [Test]
  203. public unsafe void <#=TYPENAME_IDENTIFIER #>GenericAddNoResize()
  204. {
  205. var list = new <#=TYPENAME #><<#=TYPE#>>();
  206. var capacity = list.Capacity;
  207. for (var i = 0; i < capacity; ++i)
  208. {
  209. list.AddNoResize((<#=TYPE#>)i);
  210. Assert.AreEqual(i + 1, list.Length);
  211. Assert.AreEqual(i, list[i]);
  212. }
  213. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  214. Assert.Throws<IndexOutOfRangeException>(() => { list.AddNoResize(0); });
  215. #endif
  216. Assert.AreEqual(capacity, list.Length); // Verify length didn't change
  217. }
  218. [Test]
  219. public unsafe void <#=TYPENAME_IDENTIFIER #>GenericAddRangeNoResize()
  220. {
  221. var list = new <#=TYPENAME #><<#=TYPE#>>();
  222. var capacity = list.Capacity;
  223. var items = stackalloc <#=TYPE#>[capacity];
  224. for (var i = 0; i < capacity; ++i)
  225. items[i] = (<#=TYPE#>)i;
  226. var half = capacity / 2;
  227. list.AddRangeNoResize(items, half);
  228. Assert.AreEqual(half, list.Length);
  229. for (var i = 0; i < half; ++i)
  230. Assert.AreEqual(i, list[i]);
  231. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  232. Assert.Throws<IndexOutOfRangeException>(() => { list.AddRangeNoResize(items, capacity); });
  233. #endif
  234. Assert.AreEqual(half, list.Length); // Verify length didn't change
  235. }
  236. [Test]
  237. public void <#=TYPENAME_IDENTIFIER #>GenericAddReplicate()
  238. {
  239. var list = new <#=TYPENAME #><<#=TYPE#>>();
  240. list.AddReplicate(42, 2);
  241. Assert.AreEqual(2, list.Length);
  242. foreach (var item in list)
  243. Assert.AreEqual(42, item);
  244. list.AddReplicate(42, 3);
  245. Assert.AreEqual(5, list.Length);
  246. foreach (var item in list)
  247. Assert.AreEqual(42, item);
  248. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  249. Assert.Throws<IndexOutOfRangeException>(() => { list.AddReplicate(42, 1000); });
  250. #endif
  251. Assert.AreEqual(5, list.Length); // Verify length didn't change
  252. }
  253. [Test]
  254. public void <#=TYPENAME_IDENTIFIER #>GenericInsertRangeWithBeginEnd()
  255. {
  256. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 4 };
  257. list.InsertRangeWithBeginEnd(1,3);
  258. list[1] = 1;
  259. list[2] = 2;
  260. for(var i = 0; i < 5; ++i)
  261. Assert.AreEqual(i, list[i]);
  262. }
  263. [Test]
  264. public void <#=TYPENAME_IDENTIFIER #>GenericInsertRange()
  265. {
  266. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 4 };
  267. Assert.AreEqual(3, list.Length);
  268. list.InsertRange(1, 2);
  269. Assert.AreEqual(5, list.Length);
  270. list[1] = 1;
  271. list[2] = 2;
  272. Assert.DoesNotThrow(() => list.InsertRange(1, 0));
  273. Assert.AreEqual(5, list.Length);
  274. for(var i = 0; i < 5; ++i)
  275. Assert.AreEqual(i, list[i]);
  276. }
  277. [Test]
  278. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveRange()
  279. {
  280. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  281. list.RemoveRange(1, 2);
  282. for(var i = 0; i < 3; ++i)
  283. Assert.AreEqual(i, list[i]);
  284. }
  285. [Test]
  286. public void <#=TYPENAME_IDENTIFIER #>GenericInsert()
  287. {
  288. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 4 };
  289. list.Insert(1,1);
  290. list.Insert(2,2);
  291. for(var i = 0; i < 5; ++i)
  292. Assert.AreEqual(i, list[i]);
  293. }
  294. [Test]
  295. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveAt()
  296. {
  297. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  298. list.RemoveAt(1);
  299. list.RemoveAt(1);
  300. for(var i = 0; i < 3; ++i)
  301. Assert.AreEqual(i, list[i]);
  302. }
  303. [Test]
  304. public void <#=TYPENAME_IDENTIFIER #>GenericRemove()
  305. {
  306. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 1, 2 };
  307. Assert.True(list.Remove((<#=TYPE#>)3));
  308. Assert.True(list.Remove((<#=TYPE#>)3));
  309. for(var i = 0; i < 3; ++i)
  310. Assert.AreEqual(i, list[i]);
  311. }
  312. [Test]
  313. public void <#=TYPENAME_IDENTIFIER #>GenericRemoveSwapBack()
  314. {
  315. var list = new <#=TYPENAME #><<#=TYPE#>>() { 0, 3, 3, 2, 1 };
  316. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  317. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  318. for(var i = 0; i < 3; ++i)
  319. Assert.AreEqual(i, list[i]);
  320. }
  321. [Test]
  322. public void <#=TYPENAME_IDENTIFIER #>GenericSort()
  323. {
  324. var list = new <#=TYPENAME #><<#=TYPE#>>();
  325. for(var i = 0; i < 5; ++i)
  326. list.Add((<#=TYPE #>)(4-i));
  327. list.Sort();
  328. for(var i = 0; i < 5; ++i)
  329. Assert.AreEqual(i, list[i]);
  330. }
  331. [Test]
  332. public void <#=TYPENAME_IDENTIFIER #>GenericSortCustomComparer()
  333. {
  334. var list = new <#=TYPENAME #><<#=TYPE#>>();
  335. for(var i = 0; i < 5; ++i)
  336. list.Add((<#=TYPE #>)(i));
  337. list.Sort(new DescendingComparer<<#=TYPE#>>());
  338. for(var i = 0; i < 5; ++i)
  339. Assert.AreEqual(4-i, list[i]);
  340. }
  341. [Test]
  342. public unsafe void <#=TYPENAME_IDENTIFIER #>IndexOf()
  343. {
  344. var list = new <#=TYPENAME #><<#=TYPE#>>() { 123, 178 };
  345. bool r0 = false, r1 = false, r2 = false;
  346. GCAllocRecorder.ValidateNoGCAllocs(() =>
  347. {
  348. r0 = -1 != list.IndexOf((<#=TYPE#>)145);
  349. r1 = list.Contains((<#=TYPE#>)123);
  350. r2 = list.Contains((<#=TYPE#>)178);
  351. });
  352. Assert.False(r0);
  353. Assert.True(r1);
  354. Assert.True(r2);
  355. }
  356. <#
  357. }
  358. }
  359. for (var size = 0; size < 3; ++size)
  360. {
  361. var BYTES = SIZES[size];
  362. var TYPE = TYPES[type];
  363. var TYPESIZE = TYPESIZES[type];
  364. var MAXLENGTH = BYTES - 2;
  365. var TYPENAME = String.Format("FixedList{0}Bytes<{1}>", BYTES, TYPE);
  366. var TYPENAME_IDENTIFIER = String.Format("FixedList{0}{1}_", BYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  367. var EXPECTEDCAPACITY = (BYTES - 2) / TYPESIZE;
  368. #>
  369. [Test]
  370. public void <#=TYPENAME_IDENTIFIER #>HasExpectedLayout()
  371. {
  372. var actual = new <#=TYPENAME #>();
  373. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  374. actual.Add((<#=TYPE #>)i);
  375. unsafe
  376. {
  377. var e = stackalloc byte[<#=BYTES #>];
  378. e[0] = (byte)((<#=EXPECTEDCAPACITY #> >> 0) & 0xFF);
  379. e[1] = (byte)((<#=EXPECTEDCAPACITY #> >> 8) & 0xFF);
  380. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  381. {
  382. var s = (<#=TYPE #>)i;
  383. UnsafeUtility.MemCpy(e + 2 + FixedList.PaddingBytes<<#=TYPE#>>() + sizeof(<#=TYPE #>) * i, &s, sizeof(<#=TYPE #>));
  384. }
  385. Assert.AreEqual(0, UnsafeUtility.MemCmp(e, &actual.data, <#=BYTES #>));
  386. }
  387. }
  388. [Test]
  389. [TestRequiresDotsDebugOrCollectionChecks]
  390. public void <#=TYPENAME_IDENTIFIER #>HasExpectedCapacity()
  391. {
  392. var list = new <#=TYPENAME #>();
  393. var expectedCapacity = list.Capacity;
  394. for(int i = 0; i < expectedCapacity; ++i)
  395. list.Add((<#=TYPE #>)i);
  396. Assert.Throws<IndexOutOfRangeException> (() => { list.Add((<#=TYPE #>)expectedCapacity); });
  397. }
  398. class ScriptableObject<#=TYPENAME_IDENTIFIER#> : UnityEngine.ScriptableObject
  399. {
  400. public <#=TYPENAME#> List;
  401. }
  402. [Test]
  403. public void <#=TYPENAME_IDENTIFIER #>Serializes()
  404. {
  405. var a = UnityEngine.ScriptableObject.CreateInstance<ScriptableObject<#=TYPENAME_IDENTIFIER#> >();
  406. for(int i = 0; i < a.List.Capacity; ++i)
  407. a.List.Add((<#=TYPE #>)i);
  408. var b = UnityEngine.Object.Instantiate(a);
  409. CollectionAssert.AreEqual(a.List, b.List);
  410. }
  411. <#
  412. if (EXPECTEDCAPACITY >= 5)
  413. {
  414. #>
  415. [Test]
  416. public unsafe void <#=TYPENAME_IDENTIFIER #>Add()
  417. {
  418. var list = new <#=TYPENAME #>();
  419. var capacity = list.Capacity;
  420. for (var i = 0; i < capacity; ++i)
  421. {
  422. list.Add((<#=TYPE#>)i);
  423. Assert.AreEqual(i + 1, list.Length);
  424. Assert.AreEqual(i, list[i]);
  425. }
  426. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  427. Assert.Throws<IndexOutOfRangeException>(() => { list.Add(0); });
  428. #endif
  429. Assert.AreEqual(capacity, list.Length); // Verify length didn't change
  430. }
  431. [Test]
  432. public unsafe void <#=TYPENAME_IDENTIFIER #>AddRange()
  433. {
  434. var list = new <#=TYPENAME #>();
  435. var capacity = list.Capacity;
  436. var items = stackalloc <#=TYPE#>[capacity];
  437. for (var i = 0; i < capacity; ++i)
  438. items[i] = (<#=TYPE#>)i;
  439. var half = capacity / 2;
  440. list.AddRange(items, half);
  441. Assert.AreEqual(half, list.Length);
  442. for (var i = 0; i < half; ++i)
  443. Assert.AreEqual(i, list[i]);
  444. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  445. Assert.Throws<IndexOutOfRangeException>(() => { list.AddRange(items, capacity); });
  446. #endif
  447. Assert.AreEqual(half, list.Length); // Verify length didn't change
  448. }
  449. [Test]
  450. public unsafe void <#=TYPENAME_IDENTIFIER #>AddNoResize()
  451. {
  452. var list = new <#=TYPENAME #>();
  453. var capacity = list.Capacity;
  454. for (var i = 0; i < capacity; ++i)
  455. {
  456. list.AddNoResize((<#=TYPE#>)i);
  457. Assert.AreEqual(i + 1, list.Length);
  458. Assert.AreEqual(i, list[i]);
  459. }
  460. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  461. Assert.Throws<IndexOutOfRangeException>(() => { list.AddNoResize(0); });
  462. #endif
  463. Assert.AreEqual(capacity, list.Length); // Verify length didn't change
  464. }
  465. [Test]
  466. public unsafe void <#=TYPENAME_IDENTIFIER #>AddRangeNoResize()
  467. {
  468. var list = new <#=TYPENAME #>();
  469. var capacity = list.Capacity;
  470. var items = stackalloc <#=TYPE#>[capacity];
  471. for (var i = 0; i < capacity; ++i)
  472. items[i] = (<#=TYPE#>)i;
  473. var half = capacity / 2;
  474. list.AddRangeNoResize(items, half);
  475. Assert.AreEqual(half, list.Length);
  476. for (var i = 0; i < half; ++i)
  477. Assert.AreEqual(i, list[i]);
  478. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  479. Assert.Throws<IndexOutOfRangeException>(() => { list.AddRangeNoResize(items, capacity); });
  480. #endif
  481. Assert.AreEqual(half, list.Length); // Verify length didn't change
  482. }
  483. [Test]
  484. public void <#=TYPENAME_IDENTIFIER #>AddReplicate()
  485. {
  486. var list = new <#=TYPENAME #>();
  487. list.AddReplicate(42, 2);
  488. Assert.AreEqual(2, list.Length);
  489. foreach (var item in list)
  490. Assert.AreEqual(42, item);
  491. list.AddReplicate(42, 3);
  492. Assert.AreEqual(5, list.Length);
  493. foreach (var item in list)
  494. Assert.AreEqual(42, item);
  495. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  496. Assert.Throws<IndexOutOfRangeException>(() => { list.AddReplicate(42, 1000); });
  497. #endif
  498. Assert.AreEqual(5, list.Length); // Verify length didn't change
  499. }
  500. [Test]
  501. public void <#=TYPENAME_IDENTIFIER #>InsertRangeWithBeginEnd()
  502. {
  503. var list = new <#=TYPENAME #>() { 0, 3, 4 };
  504. list.InsertRangeWithBeginEnd(1,3);
  505. list[1] = 1;
  506. list[2] = 2;
  507. for(var i = 0; i < 5; ++i)
  508. Assert.AreEqual(i, list[i]);
  509. }
  510. [Test]
  511. public void <#=TYPENAME_IDENTIFIER #>InsertRange()
  512. {
  513. var list = new <#=TYPENAME #>() { 0, 3, 4 };
  514. Assert.AreEqual(3, list.Length);
  515. list.InsertRange(1, 2);
  516. Assert.AreEqual(5, list.Length);
  517. list[1] = 1;
  518. list[2] = 2;
  519. Assert.DoesNotThrow(() => list.InsertRange(1, 0));
  520. Assert.AreEqual(5, list.Length);
  521. for(var i = 0; i < 5; ++i)
  522. Assert.AreEqual(i, list[i]);
  523. }
  524. private static void Expected(ref <#=TYPENAME #> container, int expectedLength, int[] expected)
  525. {
  526. Assert.AreEqual(expectedLength == 0, container.IsEmpty);
  527. Assert.AreEqual(container.Length, expectedLength);
  528. for (var i = 0; i < container.Length; ++i)
  529. {
  530. Assert.AreEqual(expected[i], container[i]);
  531. }
  532. }
  533. [Test]
  534. public void <#=TYPENAME_IDENTIFIER #>RemoveAt()
  535. {
  536. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  537. list.RemoveAt(1);
  538. list.RemoveAt(1);
  539. Expected(ref list, 3, new int[] { 0, 1, 2 });
  540. }
  541. [Test]
  542. public void <#=TYPENAME_IDENTIFIER #>Remove()
  543. {
  544. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  545. Assert.True(list.Remove((<#=TYPE#>)3));
  546. Assert.True(list.Remove((<#=TYPE#>)3));
  547. Expected(ref list, 3, new int[] { 0, 1, 2 });
  548. }
  549. [Test]
  550. public void <#=TYPENAME_IDENTIFIER #>RemoveSwapBack()
  551. {
  552. var list = new <#=TYPENAME #>() { 0, 3, 3, 2, 1 };
  553. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  554. Assert.True(list.RemoveSwapBack((<#=TYPE#>)3));
  555. Expected(ref list, 3, new int[] { 0, 1, 2 });
  556. }
  557. [Test]
  558. public void <#=TYPENAME_IDENTIFIER #>RemoveRange()
  559. {
  560. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  561. list.RemoveRange(1, 2);
  562. Expected(ref list, 3, new int[] { 0, 1, 2 });
  563. }
  564. [Test]
  565. public void <#=TYPENAME_IDENTIFIER #>RemoveAtSwapBack()
  566. {
  567. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  568. list.RemoveAtSwapBack(1);
  569. list.RemoveAtSwapBack(1);
  570. Expected(ref list, 3, new int[] { 0, 1, 3 });
  571. }
  572. [Test]
  573. public void <#=TYPENAME_IDENTIFIER #>RemoveRangeSwapBack()
  574. {
  575. var list = new <#=TYPENAME #>() { 0, 3, 3, 1, 2 };
  576. list.RemoveRangeSwapBack(1, 2);
  577. Expected(ref list, 3, new int[] { 0, 1, 2 });
  578. }
  579. [Test]
  580. public void <#=TYPENAME_IDENTIFIER #>Insert()
  581. {
  582. var list = new <#=TYPENAME #>() { 0, 3, 4 };
  583. list.Insert(1,1);
  584. list.Insert(2,2);
  585. for(var i = 0; i < 5; ++i)
  586. Assert.AreEqual(i, list[i]);
  587. }
  588. [Test]
  589. public void <#=TYPENAME_IDENTIFIER #>Sort()
  590. {
  591. var list = new <#=TYPENAME #>();
  592. for(var i = 0; i < 5; ++i)
  593. list.Add((<#=TYPE #>)(4-i));
  594. list.Sort();
  595. for(var i = 0; i < 5; ++i)
  596. Assert.AreEqual(i, list[i]);
  597. }
  598. <#
  599. }
  600. foreach (var OTHERBYTES in SIZES)
  601. {
  602. if (OTHERBYTES != BYTES)
  603. {
  604. var OTHERCAPACITY = (OTHERBYTES - 2) / TYPESIZE;
  605. var OTHERTYPENAME = String.Format("FixedList{0}Bytes<{1}>", OTHERBYTES, TYPE);
  606. var OTHERTYPENAME_IDENTIFIER = String.Format("_FixedList{0}{1}", OTHERBYTES, new CultureInfo("en-US").TextInfo.ToTitleCase(TYPE));
  607. #>
  608. [Test]
  609. public void <#=TYPENAME_IDENTIFIER #>To<#=OTHERTYPENAME_IDENTIFIER #>()
  610. {
  611. var a = new <#=TYPENAME #>();
  612. for(var i = 0; i < <#=EXPECTEDCAPACITY #>; ++i)
  613. a.Add((<#=TYPE #>)i);
  614. <#
  615. if (EXPECTEDCAPACITY <= OTHERCAPACITY)
  616. {
  617. WriteLine(" var b = new {0}(a);", OTHERTYPENAME);
  618. WriteLine(" for(var i = 0; i < {0}; ++i)", EXPECTEDCAPACITY);
  619. WriteLine(" Assert.AreEqual(({0})i, b[i]);", TYPE);
  620. }
  621. else
  622. WriteLine(
  623. "#if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG\n Assert.Throws<IndexOutOfRangeException> (() => {{ var b = new {0}(a); }} );\n#endif",
  624. OTHERTYPENAME);
  625. #>
  626. }
  627. <#
  628. }
  629. }
  630. }
  631. }
  632. }
  633. #>
  634. }