暫無描述
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.

NativeSortTests.gen.cs 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. using NUnit.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using Unity.Collections;
  5. using Unity.Collections.Tests;
  6. using Unity.Collections.LowLevel.Unsafe;
  7. using System.Collections;
  8. internal class NativeSortTests : CollectionsTestCommonBase
  9. {
  10. struct DescendingComparer<T> : IComparer<T> where T : IComparable<T>
  11. {
  12. public int Compare(T x, T y) => y.CompareTo(x);
  13. }
  14. [Test]
  15. public void NativeArraySlice_BinarySearch()
  16. {
  17. var init = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 };
  18. var container = new NativeArray<int>(16, Allocator.Persistent);
  19. var slice = new NativeSlice<int>(container, 0, container.Length);
  20. container.CopyFrom(init);
  21. for (int i = 0, num = container.Length; i < num; ++i)
  22. {
  23. Assert.AreEqual(i, container.BinarySearch(container[i]));
  24. Assert.AreEqual(i, slice.BinarySearch(container[i]));
  25. }
  26. container.Dispose();
  27. }
  28. [Test]
  29. public void NativeArraySlice_BinarySearch_NotFound()
  30. {
  31. {
  32. var container = new NativeArray<int>(1, Allocator.Temp);
  33. var slice = new NativeSlice<int>(container, 0, container.Length);
  34. Assert.AreEqual(container.Length, 1);
  35. Assert.AreEqual(-2, container.BinarySearch(1));
  36. Assert.AreEqual(-2, slice.BinarySearch(1));
  37. slice[0] = 1;
  38. Assert.AreEqual(0, container.BinarySearch(1));
  39. Assert.AreEqual(0, slice.BinarySearch(1));
  40. Assert.AreEqual(-1, container.BinarySearch(-2));
  41. Assert.AreEqual(-1, slice.BinarySearch(-2));
  42. Assert.AreEqual(-2, container.BinarySearch(2));
  43. Assert.AreEqual(-2, slice.BinarySearch(2));
  44. container.Dispose();
  45. }
  46. {
  47. var init = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  48. var container = new NativeArray<int>(16, Allocator.Temp);
  49. var slice = new NativeSlice<int>(container, 0, container.Length);
  50. container.CopyFrom(init);
  51. for (int i = 0, num = container.Length; i < num; ++i)
  52. {
  53. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  54. Assert.AreEqual(~slice.Length, slice.BinarySearch(i + 16));
  55. }
  56. container.Dispose();
  57. }
  58. {
  59. var init = new int[] { 0, 2, 4, 6, 8, 10, 12, 14 };
  60. var container = new NativeArray<int>(8, Allocator.Temp);
  61. var slice = new NativeSlice<int>(container, 0, container.Length);
  62. container.CopyFrom(init);
  63. for (int i = 0, num = container.Length; i < num; ++i)
  64. {
  65. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  66. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, slice.BinarySearch(i * 2 + 1));
  67. }
  68. container.Dispose();
  69. }
  70. }
  71. #if !UNITY_DOTSRUNTIME
  72. [Test]
  73. public void NativeArraySlice_BinarySearch_NotFound_Reference_ArrayList()
  74. {
  75. {
  76. var reference = new ArrayList();
  77. reference.Add(0);
  78. var container = new NativeArray<int>(1, Allocator.Temp);
  79. var slice = new NativeSlice<int>(container, 0, container.Length);
  80. Assert.AreEqual(container.Length, 1);
  81. Assert.AreEqual(-2, reference.BinarySearch(1));
  82. Assert.AreEqual(-2, container.BinarySearch(1));
  83. Assert.AreEqual(-2, slice.BinarySearch(1));
  84. reference[0] = 1;
  85. slice[0] = 1;
  86. Assert.AreEqual(0, reference.BinarySearch(1));
  87. Assert.AreEqual(0, container.BinarySearch(1));
  88. Assert.AreEqual(0, slice.BinarySearch(1));
  89. Assert.AreEqual(-1, reference.BinarySearch(-2));
  90. Assert.AreEqual(-1, container.BinarySearch(-2));
  91. Assert.AreEqual(-1, slice.BinarySearch(-2));
  92. Assert.AreEqual(-2, reference.BinarySearch(2));
  93. Assert.AreEqual(-2, container.BinarySearch(2));
  94. Assert.AreEqual(-2, slice.BinarySearch(2));
  95. }
  96. {
  97. var init = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  98. var container = new NativeArray<int>(16, Allocator.Temp);
  99. var slice = new NativeSlice<int>(container, 0, container.Length);
  100. container.CopyFrom(init);
  101. var reference = new ArrayList(init);
  102. for (int i = 0, num = container.Length; i < num; ++i)
  103. {
  104. Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16));
  105. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  106. Assert.AreEqual(~slice.Length, slice.BinarySearch(i + 16));
  107. }
  108. }
  109. {
  110. var init = new int[] { 0, 2, 4, 6, 8, 10, 12, 14 };
  111. var container = new NativeArray<int>(8, Allocator.Temp);
  112. var slice = new NativeSlice<int>(container, 0, container.Length);
  113. container.CopyFrom(init);
  114. var reference = new ArrayList(init);
  115. for (int i = 0, num = container.Length; i < num; ++i)
  116. {
  117. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1));
  118. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  119. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, slice.BinarySearch(i * 2 + 1));
  120. }
  121. }
  122. }
  123. #endif
  124. [Test]
  125. public void NativeList_BinarySearch()
  126. {
  127. using (var container = new NativeList<int>(16, Allocator.Persistent) { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 })
  128. {
  129. for (int i = 0, num = container.Length; i < num; ++i)
  130. {
  131. Assert.AreEqual(i, container.BinarySearch(container[i]));
  132. }
  133. }
  134. }
  135. [Test]
  136. public void NativeList_BinarySearch_NotFound()
  137. {
  138. {
  139. var container = new NativeList<int>(1, Allocator.Temp);
  140. Assert.AreEqual(-1, container.BinarySearch(1));
  141. container.Add(1);
  142. Assert.AreEqual(0, container.BinarySearch(1));
  143. Assert.AreEqual(-1, container.BinarySearch(-2));
  144. Assert.AreEqual(-2, container.BinarySearch(2));
  145. }
  146. using (var container = new NativeList<int>(16, Allocator.Temp) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 })
  147. {
  148. for (int i = 0, num = container.Length; i < num; ++i)
  149. {
  150. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  151. }
  152. }
  153. using (var container = new NativeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 })
  154. {
  155. for (int i = 0, num = container.Length; i < num; ++i)
  156. {
  157. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  158. }
  159. }
  160. }
  161. #if !UNITY_DOTSRUNTIME
  162. [Test]
  163. public void NativeList_BinarySearch_NotFound_Reference_ArrayList()
  164. {
  165. {
  166. var reference = new ArrayList();
  167. var container = new NativeList<int>(1, Allocator.Temp);
  168. Assert.AreEqual(-1, reference.BinarySearch(1));
  169. Assert.AreEqual(-1, container.BinarySearch(1));
  170. reference.Add(1);
  171. container.Add(1);
  172. Assert.AreEqual(0, reference.BinarySearch(1));
  173. Assert.AreEqual(0, container.BinarySearch(1));
  174. Assert.AreEqual(-1, reference.BinarySearch(-2));
  175. Assert.AreEqual(-1, container.BinarySearch(-2));
  176. Assert.AreEqual(-2, reference.BinarySearch(2));
  177. Assert.AreEqual(-2, container.BinarySearch(2));
  178. }
  179. using (var container = new NativeList<int>(16, Allocator.Temp) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 })
  180. {
  181. var reference = new ArrayList() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  182. for (int i = 0, num = container.Length; i < num; ++i)
  183. {
  184. Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16));
  185. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  186. }
  187. }
  188. using (var container = new NativeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 })
  189. {
  190. var reference = new ArrayList() { 0, 2, 4, 6, 8, 10, 12, 14 };
  191. for (int i = 0, num = container.Length; i < num; ++i)
  192. {
  193. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1));
  194. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  195. }
  196. }
  197. }
  198. #endif
  199. [Test]
  200. public void NativeList_GenericSortJob()
  201. {
  202. using (var container = new NativeList<int>(5, Allocator.Persistent))
  203. {
  204. for (var i = 0; i < 5; ++i)
  205. {
  206. container.Add(4 - i);
  207. }
  208. container.Sort();
  209. for (var i = 0; i < 5; ++i)
  210. {
  211. Assert.AreEqual(i, container[i]);
  212. }
  213. }
  214. using (var container = new NativeList<int>(5, Allocator.Persistent))
  215. {
  216. for (var i = 0; i < 5; ++i)
  217. {
  218. container.Add(4 - i);
  219. }
  220. container.SortJob().Schedule().Complete();
  221. for (var i = 0; i < 5; ++i)
  222. {
  223. Assert.AreEqual(i, container[i]);
  224. }
  225. }
  226. }
  227. [Test]
  228. public void NativeList_GenericSortJobCustomComparer()
  229. {
  230. using (var container = new NativeList<int>(5, Allocator.Persistent))
  231. {
  232. for (var i = 0; i < 5; ++i)
  233. {
  234. container.Add(i);
  235. }
  236. container.Sort(new DescendingComparer<int>());
  237. for (var i = 0; i < 5; ++i)
  238. {
  239. Assert.AreEqual(4 - i, container[i]);
  240. }
  241. }
  242. using (var container = new NativeList<int>(5, Allocator.Persistent))
  243. {
  244. for (var i = 0; i < 5; ++i)
  245. {
  246. container.Add(i);
  247. }
  248. container.SortJob(new DescendingComparer<int>()).Schedule().Complete();
  249. for (var i = 0; i < 5; ++i)
  250. {
  251. Assert.AreEqual(4 - i, container[i]);
  252. }
  253. }
  254. }
  255. [Test]
  256. public void UnsafeList_BinarySearch()
  257. {
  258. using (var container = new UnsafeList<int>(16, Allocator.Persistent) { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 })
  259. {
  260. for (int i = 0, num = container.Length; i < num; ++i)
  261. {
  262. Assert.AreEqual(i, container.BinarySearch(container[i]));
  263. }
  264. }
  265. }
  266. [Test]
  267. public void UnsafeList_BinarySearch_NotFound()
  268. {
  269. {
  270. var container = new UnsafeList<int>(1, Allocator.Temp);
  271. Assert.AreEqual(-1, container.BinarySearch(1));
  272. container.Add(1);
  273. Assert.AreEqual(0, container.BinarySearch(1));
  274. Assert.AreEqual(-1, container.BinarySearch(-2));
  275. Assert.AreEqual(-2, container.BinarySearch(2));
  276. }
  277. using (var container = new UnsafeList<int>(16, Allocator.Temp) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 })
  278. {
  279. for (int i = 0, num = container.Length; i < num; ++i)
  280. {
  281. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  282. }
  283. }
  284. using (var container = new UnsafeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 })
  285. {
  286. for (int i = 0, num = container.Length; i < num; ++i)
  287. {
  288. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  289. }
  290. }
  291. }
  292. #if !UNITY_DOTSRUNTIME
  293. [Test]
  294. public void UnsafeList_BinarySearch_NotFound_Reference_ArrayList()
  295. {
  296. {
  297. var reference = new ArrayList();
  298. var container = new UnsafeList<int>(1, Allocator.Temp);
  299. Assert.AreEqual(-1, reference.BinarySearch(1));
  300. Assert.AreEqual(-1, container.BinarySearch(1));
  301. reference.Add(1);
  302. container.Add(1);
  303. Assert.AreEqual(0, reference.BinarySearch(1));
  304. Assert.AreEqual(0, container.BinarySearch(1));
  305. Assert.AreEqual(-1, reference.BinarySearch(-2));
  306. Assert.AreEqual(-1, container.BinarySearch(-2));
  307. Assert.AreEqual(-2, reference.BinarySearch(2));
  308. Assert.AreEqual(-2, container.BinarySearch(2));
  309. }
  310. using (var container = new UnsafeList<int>(16, Allocator.Temp) { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 })
  311. {
  312. var reference = new ArrayList() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  313. for (int i = 0, num = container.Length; i < num; ++i)
  314. {
  315. Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16));
  316. Assert.AreEqual(~container.Length, container.BinarySearch(i + 16));
  317. }
  318. }
  319. using (var container = new UnsafeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 })
  320. {
  321. var reference = new ArrayList() { 0, 2, 4, 6, 8, 10, 12, 14 };
  322. for (int i = 0, num = container.Length; i < num; ++i)
  323. {
  324. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1));
  325. Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1));
  326. }
  327. }
  328. }
  329. #endif
  330. [Test]
  331. public void UnsafeList_GenericSortJob()
  332. {
  333. using (var container = new UnsafeList<int>(5, Allocator.Persistent))
  334. {
  335. for (var i = 0; i < 5; ++i)
  336. {
  337. container.Add(4 - i);
  338. }
  339. container.Sort();
  340. for (var i = 0; i < 5; ++i)
  341. {
  342. Assert.AreEqual(i, container[i]);
  343. }
  344. }
  345. using (var container = new UnsafeList<int>(5, Allocator.Persistent))
  346. {
  347. for (var i = 0; i < 5; ++i)
  348. {
  349. container.Add(4 - i);
  350. }
  351. container.SortJob().Schedule().Complete();
  352. for (var i = 0; i < 5; ++i)
  353. {
  354. Assert.AreEqual(i, container[i]);
  355. }
  356. }
  357. }
  358. [Test]
  359. public void UnsafeList_GenericSortJobCustomComparer()
  360. {
  361. using (var container = new UnsafeList<int>(5, Allocator.Persistent))
  362. {
  363. for (var i = 0; i < 5; ++i)
  364. {
  365. container.Add(i);
  366. }
  367. container.Sort(new DescendingComparer<int>());
  368. for (var i = 0; i < 5; ++i)
  369. {
  370. Assert.AreEqual(4 - i, container[i]);
  371. }
  372. }
  373. using (var container = new UnsafeList<int>(5, Allocator.Persistent))
  374. {
  375. for (var i = 0; i < 5; ++i)
  376. {
  377. container.Add(i);
  378. }
  379. container.SortJob(new DescendingComparer<int>()).Schedule().Complete();
  380. for (var i = 0; i < 5; ++i)
  381. {
  382. Assert.AreEqual(4 - i, container[i]);
  383. }
  384. }
  385. }
  386. [Test]
  387. public void FixedList32_GenericSort()
  388. {
  389. var container = new FixedList32Bytes<int>();
  390. for (var i = 0; i < 5; ++i)
  391. {
  392. container.Add(i);
  393. }
  394. container.Sort(new DescendingComparer<int>());
  395. for (var i = 0; i < 5; ++i)
  396. {
  397. Assert.AreEqual(4 - i, container[i]);
  398. }
  399. }
  400. [Test]
  401. public void FixedList64_GenericSort()
  402. {
  403. var container = new FixedList64Bytes<int>();
  404. for (var i = 0; i < 5; ++i)
  405. {
  406. container.Add(i);
  407. }
  408. container.Sort(new DescendingComparer<int>());
  409. for (var i = 0; i < 5; ++i)
  410. {
  411. Assert.AreEqual(4 - i, container[i]);
  412. }
  413. }
  414. [Test]
  415. public void FixedList128_GenericSort()
  416. {
  417. var container = new FixedList128Bytes<int>();
  418. for (var i = 0; i < 5; ++i)
  419. {
  420. container.Add(i);
  421. }
  422. container.Sort(new DescendingComparer<int>());
  423. for (var i = 0; i < 5; ++i)
  424. {
  425. Assert.AreEqual(4 - i, container[i]);
  426. }
  427. }
  428. [Test]
  429. public void FixedList512_GenericSort()
  430. {
  431. var container = new FixedList512Bytes<int>();
  432. for (var i = 0; i < 5; ++i)
  433. {
  434. container.Add(i);
  435. }
  436. container.Sort(new DescendingComparer<int>());
  437. for (var i = 0; i < 5; ++i)
  438. {
  439. Assert.AreEqual(4 - i, container[i]);
  440. }
  441. }
  442. [Test]
  443. public void FixedList4096_GenericSort()
  444. {
  445. var container = new FixedList4096Bytes<int>();
  446. for (var i = 0; i < 5; ++i)
  447. {
  448. container.Add(i);
  449. }
  450. container.Sort(new DescendingComparer<int>());
  451. for (var i = 0; i < 5; ++i)
  452. {
  453. Assert.AreEqual(4 - i, container[i]);
  454. }
  455. }
  456. }