A game about forced loneliness, made by TACStudios
at master 852 lines 29 kB view raw
1using NUnit.Framework; 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using Unity.Burst; 6using Unity.Collections; 7using Unity.Collections.Tests; 8using Unity.Collections.LowLevel.Unsafe; 9using Unity.Jobs; 10using Unity.Mathematics; 11 12//------------------------------------------------------------------------------ 13// <auto-generated> 14// This code was generated by a tool. 15// 16// TextTransform Packages/com.unity.collections/Unity.Collections.Tests/NativeSortTests.tt 17// 18// Changes to this file may cause incorrect behavior and will be lost if 19// the code is regenerated. 20// </auto-generated> 21//------------------------------------------------------------------------------ 22 23[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortExtension.DefaultComparer<int>>))] 24[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortExtension.DefaultComparer<int>>.SegmentSort))] 25[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortExtension.DefaultComparer<int>>.SegmentSortMerge))] 26[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.DescendingComparer<int>>))] 27[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.DescendingComparer<int>>.SegmentSort))] 28[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.DescendingComparer<int>>.SegmentSortMerge))] 29 30[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer0<int>>))] 31[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer0<int>>.SegmentSort))] 32[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer0<int>>.SegmentSortMerge))] 33[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer1<int>>))] 34[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer1<int>>.SegmentSort))] 35[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer1<int>>.SegmentSortMerge))] 36[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer2<int>>))] 37[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer2<int>>.SegmentSort))] 38[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer2<int>>.SegmentSortMerge))] 39[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer3<int>>))] 40[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer3<int>>.SegmentSort))] 41[assembly: RegisterGenericJobType(typeof(SortJob<int, NativeSortTests.BrokenComparer3<int>>.SegmentSortMerge))] 42 43internal class NativeSortTests : CollectionsTestCommonBase 44{ 45 internal struct DescendingComparer<T> : IComparer<T> where T : IComparable<T> 46 { 47 public int Compare(T x, T y) => y.CompareTo(x); 48 } 49 50 internal struct BrokenComparer0<T> : IComparer<T> where T : IComparable<T> 51 { 52 public int Compare(T x, T y) 53 { 54 int result = y.CompareTo(x); 55 return result < 0 ? -1 : 1; 56 } 57 } 58 59 internal struct BrokenComparer1<T> : IComparer<T> where T : IComparable<T> 60 { 61 public int Compare(T x, T y) 62 { 63 int result = y.CompareTo(x); 64 return result > 0 ? 1 : -1; 65 } 66 } 67 68 internal struct BrokenComparer2<T> : IComparer<T> where T : IComparable<T> 69 { 70 public int Compare(T x, T y) 71 { 72 int result = y.CompareTo(x); 73 return math.max(0, result); 74 } 75 } 76 77 internal struct BrokenComparer3<T> : IComparer<T> where T : IComparable<T> 78 { 79 public int Compare(T x, T y) 80 { 81 int result = y.CompareTo(x); 82 return math.min(0, result); 83 } 84 } 85 86 [Test] 87 public void NativeArraySlice_BinarySearch() 88 { 89 var init = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 }; 90 var container = new NativeArray<int>(16, Allocator.Persistent); 91 var slice = new NativeSlice<int>(container, 0, container.Length); 92 var arrayRo = container.AsReadOnly(); 93 container.CopyFrom(init); 94 95 for (int i = 0, num = container.Length; i < num; ++i) 96 { 97 Assert.AreEqual(i, container.BinarySearch(container[i])); 98 Assert.AreEqual(i, slice.BinarySearch(container[i])); 99 Assert.AreEqual(i, arrayRo.BinarySearch(container[i])); 100 } 101 102 container.Dispose(); 103 } 104 105 struct BinarySearch_Job : IJob 106 { 107 [ReadOnly] 108 public NativeArray<int> array; 109 110 [ReadOnly] 111 public NativeSlice<int> slice; 112 113 [ReadOnly] 114 public NativeArray<int>.ReadOnly arrayRo; 115 116 [ReadOnly] 117 public NativeList<int> nativeList; 118 119 public void Execute() 120 { 121 for (int i = 0, num = array.Length; i < num; ++i) 122 { 123 Assert.AreEqual(i, array.BinarySearch(array[i])); 124 Assert.AreEqual(i, slice.BinarySearch(array[i])); 125 Assert.AreEqual(i, arrayRo.BinarySearch(array[i])); 126 Assert.AreEqual(i, nativeList.BinarySearch(array[i])); 127 } 128 } 129 } 130 131 [Test] 132 public void BinarySearch_From_Job() 133 { 134 var init = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 }; 135 var container = new NativeArray<int>(16, Allocator.Persistent); 136 var slice = new NativeSlice<int>(container, 0, container.Length); 137 var arrayRo = container.AsReadOnly(); 138 container.CopyFrom(init); 139 140 var nativeList = new NativeList<int>(16, Allocator.Persistent); 141 nativeList.CopyFrom(container); 142 143 new BinarySearch_Job 144 { 145 array = container, 146 slice = slice, 147 arrayRo = arrayRo, 148 nativeList = nativeList, 149 150 }.Run(); 151 152 container.Dispose(); 153 nativeList.Dispose(); 154 } 155 156 [Test] 157 public void NativeArraySlice_BinarySearch_NotFound() 158 { 159 { 160 var container = new NativeArray<int>(1, Allocator.Temp); 161 var slice = new NativeSlice<int>(container, 0, container.Length); 162 var arrayRo = container.AsReadOnly(); 163 164 Assert.AreEqual(container.Length, 1); 165 Assert.AreEqual(-2, container.BinarySearch(1)); 166 Assert.AreEqual(-2, slice.BinarySearch(1)); 167 Assert.AreEqual(-2, arrayRo.BinarySearch(1)); 168 169 slice[0] = 1; 170 171 Assert.AreEqual(0, container.BinarySearch(1)); 172 Assert.AreEqual(0, slice.BinarySearch(1)); 173 Assert.AreEqual(0, arrayRo.BinarySearch(1)); 174 175 Assert.AreEqual(-1, container.BinarySearch(-2)); 176 Assert.AreEqual(-1, slice.BinarySearch(-2)); 177 Assert.AreEqual(-1, arrayRo.BinarySearch(-2)); 178 179 Assert.AreEqual(-2, container.BinarySearch(2)); 180 Assert.AreEqual(-2, slice.BinarySearch(2)); 181 Assert.AreEqual(-2, arrayRo.BinarySearch(2)); 182 183 container.Dispose(); 184 } 185 186 { 187 var init = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 188 var container = new NativeArray<int>(16, Allocator.Temp); 189 var slice = new NativeSlice<int>(container, 0, container.Length); 190 var arrayRo = container.AsReadOnly(); 191 192 container.CopyFrom(init); 193 194 for (int i = 0, num = container.Length; i < num; ++i) 195 { 196 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 197 Assert.AreEqual(~slice.Length, slice.BinarySearch(i + 16)); 198 Assert.AreEqual(~arrayRo.Length, arrayRo.BinarySearch(i + 16)); 199 } 200 201 container.Dispose(); 202 } 203 204 { 205 var init = new int[] { 0, 2, 4, 6, 8, 10, 12, 14 }; 206 var container = new NativeArray<int>(8, Allocator.Temp); 207 var slice = new NativeSlice<int>(container, 0, container.Length); 208 var arrayRo = container.AsReadOnly(); 209 210 container.CopyFrom(init); 211 212 for (int i = 0, num = container.Length; i < num; ++i) 213 { 214 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 215 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, slice.BinarySearch(i * 2 + 1)); 216 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, arrayRo.BinarySearch(i * 2 + 1)); 217 } 218 219 container.Dispose(); 220 } 221 } 222 223 [Test] 224 public void NativeArraySlice_BinarySearch_NotFound_Reference_ArrayList() 225 { 226 { 227 var reference = new ArrayList(); 228 reference.Add(0); 229 var container = new NativeArray<int>(1, Allocator.Temp); 230 var slice = new NativeSlice<int>(container, 0, container.Length); 231 var arrayRo = container.AsReadOnly(); 232 233 Assert.AreEqual(container.Length, 1); 234 Assert.AreEqual(-2, reference.BinarySearch(1)); 235 Assert.AreEqual(-2, container.BinarySearch(1)); 236 Assert.AreEqual(-2, slice.BinarySearch(1)); 237 Assert.AreEqual(-2, arrayRo.BinarySearch(1)); 238 239 reference[0] = 1; 240 slice[0] = 1; 241 242 Assert.AreEqual(0, reference.BinarySearch(1)); 243 Assert.AreEqual(0, container.BinarySearch(1)); 244 Assert.AreEqual(0, slice.BinarySearch(1)); 245 Assert.AreEqual(0, arrayRo.BinarySearch(1)); 246 247 Assert.AreEqual(-1, reference.BinarySearch(-2)); 248 Assert.AreEqual(-1, container.BinarySearch(-2)); 249 Assert.AreEqual(-1, slice.BinarySearch(-2)); 250 Assert.AreEqual(-1, arrayRo.BinarySearch(-2)); 251 252 Assert.AreEqual(-2, reference.BinarySearch(2)); 253 Assert.AreEqual(-2, container.BinarySearch(2)); 254 Assert.AreEqual(-2, slice.BinarySearch(2)); 255 Assert.AreEqual(-2, arrayRo.BinarySearch(2)); 256 } 257 258 { 259 var init = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 260 var container = new NativeArray<int>(16, Allocator.Temp); 261 var slice = new NativeSlice<int>(container, 0, container.Length); 262 var arrayRo = container.AsReadOnly(); 263 264 container.CopyFrom(init); 265 var reference = new ArrayList(init); 266 267 for (int i = 0, num = container.Length; i < num; ++i) 268 { 269 Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16)); 270 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 271 Assert.AreEqual(~slice.Length, slice.BinarySearch(i + 16)); 272 Assert.AreEqual(~arrayRo.Length, arrayRo.BinarySearch(i + 16)); 273 } 274 } 275 276 { 277 var init = new int[] { 0, 2, 4, 6, 8, 10, 12, 14 }; 278 var container = new NativeArray<int>(8, Allocator.Temp); 279 var slice = new NativeSlice<int>(container, 0, container.Length); 280 var arrayRo = container.AsReadOnly(); 281 282 container.CopyFrom(init); 283 var reference = new ArrayList(init); 284 285 for (int i = 0, num = container.Length; i < num; ++i) 286 { 287 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1)); 288 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 289 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, slice.BinarySearch(i * 2 + 1)); 290 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, arrayRo.BinarySearch(i * 2 + 1)); 291 } 292 } 293 } 294 295 296 297 [Test] 298 public void NativeList_BinarySearch() 299 { 300 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 }) 301 { 302 for (int i = 0, num = container.Length; i < num; ++i) 303 { 304 Assert.AreEqual(i, container.BinarySearch(container[i])); 305 } 306 } 307 } 308 309 [Test] 310 public void NativeList_BinarySearch_NotFound() 311 { 312 { 313 var container = new NativeList<int>(1, Allocator.Temp); 314 Assert.AreEqual(-1, container.BinarySearch(1)); 315 316 container.Add(1); 317 318 Assert.AreEqual(0, container.BinarySearch(1)); 319 Assert.AreEqual(-1, container.BinarySearch(-2)); 320 Assert.AreEqual(-2, container.BinarySearch(2)); 321 } 322 323 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 }) 324 { 325 for (int i = 0, num = container.Length; i < num; ++i) 326 { 327 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 328 } 329 } 330 331 using (var container = new NativeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 }) 332 { 333 for (int i = 0, num = container.Length; i < num; ++i) 334 { 335 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 336 } 337 } 338 } 339 340 [Test] 341 public void NativeList_BinarySearch_NotFound_Reference_ArrayList() 342 { 343 { 344 var reference = new ArrayList(); 345 var container = new NativeList<int>(1, Allocator.Temp); 346 Assert.AreEqual(-1, reference.BinarySearch(1)); 347 Assert.AreEqual(-1, container.BinarySearch(1)); 348 349 reference.Add(1); 350 container.Add(1); 351 352 Assert.AreEqual(0, reference.BinarySearch(1)); 353 Assert.AreEqual(0, container.BinarySearch(1)); 354 355 Assert.AreEqual(-1, reference.BinarySearch(-2)); 356 Assert.AreEqual(-1, container.BinarySearch(-2)); 357 358 Assert.AreEqual(-2, reference.BinarySearch(2)); 359 Assert.AreEqual(-2, container.BinarySearch(2)); 360 } 361 362 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 }) 363 { 364 var reference = new ArrayList() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 365 366 for (int i = 0, num = container.Length; i < num; ++i) 367 { 368 Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16)); 369 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 370 } 371 } 372 373 using (var container = new NativeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 }) 374 { 375 var reference = new ArrayList() { 0, 2, 4, 6, 8, 10, 12, 14 }; 376 377 for (int i = 0, num = container.Length; i < num; ++i) 378 { 379 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1)); 380 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 381 } 382 } 383 } 384 385 [Test] 386 public void NativeList_GenericSortJob_NoBurst() 387 { 388 NativeList_GenericSortJob(); 389 } 390 391 [BurstCompile] 392 public static void Bursted_NativeList_GenericSortJob() 393 { 394 NativeList_GenericSortJob(); 395 } 396 397 [Test] 398 public void NativeList_GenericSortJob_Burst() 399 { 400 Bursted_NativeList_GenericSortJob(); 401 } 402 403 public static void NativeList_GenericSortJob() 404 { 405 using (var container = new NativeList<int>(5, Allocator.Persistent)) 406 { 407 for (var i = 0; i < 5; ++i) 408 { 409 container.Add(4 - i); 410 } 411 412 container.Sort(); 413 414 for (var i = 0; i < 5; ++i) 415 { 416 Assert.AreEqual(i, container[i]); 417 } 418 } 419 420 using (var container = new NativeList<int>(5, Allocator.Persistent)) 421 { 422 for (var i = 0; i < 5; ++i) 423 { 424 container.Add(4 - i); 425 } 426 427 container.SortJob().Schedule().Complete(); 428 429 for (var i = 0; i < 5; ++i) 430 { 431 Assert.AreEqual(i, container[i]); 432 } 433 } 434 } 435 436 [Test] 437 [TestRequiresDotsDebugOrCollectionChecks] 438 public void NativeList_GenericSortJobCustomComparer_NoBurst() 439 { 440 NativeList_GenericSortJobCustomComparer(); 441 } 442 443 [BurstCompile] 444 public static void Bursted_NativeList_GenericSortJobCustomComparer() 445 { 446 NativeList_GenericSortJobCustomComparer(); 447 } 448 449 [Test] 450 [TestRequiresDotsDebugOrCollectionChecks] 451 public void NativeList_GenericSortJobCustomComparer_Burst() 452 { 453 Bursted_NativeList_GenericSortJobCustomComparer(); 454 } 455 456 public static void NativeList_GenericSortJobCustomComparer() 457 { 458 var num = 35; 459 using (var container = new NativeList<int>(num, Allocator.Persistent)) 460 { 461 for (var i = 0; i < num; ++i) 462 { 463 container.Add(i); 464 } 465 466 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer0<int>())); 467 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer1<int>())); 468 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer2<int>())); 469 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer3<int>())); 470 471 container.Sort(new DescendingComparer<int>()); 472 473 for (var i = 0; i < num; ++i) 474 { 475 Assert.AreEqual(num - 1 - i, container[i]); 476 } 477 } 478 479 using (var container = new NativeList<int>(num, Allocator.Persistent)) 480 { 481 for (var i = 0; i < num; ++i) 482 { 483 container.Add(i); 484 } 485 486 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer0<int>()).Schedule().Complete()); 487 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer1<int>()).Schedule().Complete()); 488 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer2<int>()).Schedule().Complete()); 489 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer3<int>()).Schedule().Complete()); 490 491 container.SortJob(new DescendingComparer<int>()).Schedule().Complete(); 492 493 for (var i = 0; i < num; ++i) 494 { 495 Assert.AreEqual(num - 1 - i, container[i]); 496 } 497 } 498 } 499 500 [Test] 501 public void UnsafeList_BinarySearch() 502 { 503 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 }) 504 { 505 for (int i = 0, num = container.Length; i < num; ++i) 506 { 507 Assert.AreEqual(i, container.BinarySearch(container[i])); 508 } 509 } 510 } 511 512 [Test] 513 public void UnsafeList_BinarySearch_NotFound() 514 { 515 { 516 var container = new UnsafeList<int>(1, Allocator.Temp); 517 Assert.AreEqual(-1, container.BinarySearch(1)); 518 519 container.Add(1); 520 521 Assert.AreEqual(0, container.BinarySearch(1)); 522 Assert.AreEqual(-1, container.BinarySearch(-2)); 523 Assert.AreEqual(-2, container.BinarySearch(2)); 524 } 525 526 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 }) 527 { 528 for (int i = 0, num = container.Length; i < num; ++i) 529 { 530 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 531 } 532 } 533 534 using (var container = new UnsafeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 }) 535 { 536 for (int i = 0, num = container.Length; i < num; ++i) 537 { 538 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 539 } 540 } 541 } 542 543 [Test] 544 public void UnsafeList_BinarySearch_NotFound_Reference_ArrayList() 545 { 546 { 547 var reference = new ArrayList(); 548 var container = new UnsafeList<int>(1, Allocator.Temp); 549 Assert.AreEqual(-1, reference.BinarySearch(1)); 550 Assert.AreEqual(-1, container.BinarySearch(1)); 551 552 reference.Add(1); 553 container.Add(1); 554 555 Assert.AreEqual(0, reference.BinarySearch(1)); 556 Assert.AreEqual(0, container.BinarySearch(1)); 557 558 Assert.AreEqual(-1, reference.BinarySearch(-2)); 559 Assert.AreEqual(-1, container.BinarySearch(-2)); 560 561 Assert.AreEqual(-2, reference.BinarySearch(2)); 562 Assert.AreEqual(-2, container.BinarySearch(2)); 563 } 564 565 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 }) 566 { 567 var reference = new ArrayList() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 568 569 for (int i = 0, num = container.Length; i < num; ++i) 570 { 571 Assert.AreEqual(~reference.Count, reference.BinarySearch(i + 16)); 572 Assert.AreEqual(~container.Length, container.BinarySearch(i + 16)); 573 } 574 } 575 576 using (var container = new UnsafeList<int>(8, Allocator.Temp) { 0, 2, 4, 6, 8, 10, 12, 14 }) 577 { 578 var reference = new ArrayList() { 0, 2, 4, 6, 8, 10, 12, 14 }; 579 580 for (int i = 0, num = container.Length; i < num; ++i) 581 { 582 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, reference.BinarySearch(i * 2 + 1)); 583 Assert.AreEqual(~(i + 1) /* ~index of first greatest value searched */, container.BinarySearch(i * 2 + 1)); 584 } 585 } 586 } 587 588 [Test] 589 public void UnsafeList_GenericSortJob_NoBurst() 590 { 591 UnsafeList_GenericSortJob(); 592 } 593 594 [BurstCompile] 595 public static void Bursted_UnsafeList_GenericSortJob() 596 { 597 UnsafeList_GenericSortJob(); 598 } 599 600 [Test] 601 public void UnsafeList_GenericSortJob_Burst() 602 { 603 Bursted_UnsafeList_GenericSortJob(); 604 } 605 606 public static void UnsafeList_GenericSortJob() 607 { 608 using (var container = new UnsafeList<int>(5, Allocator.Persistent)) 609 { 610 for (var i = 0; i < 5; ++i) 611 { 612 container.Add(4 - i); 613 } 614 615 container.Sort(); 616 617 for (var i = 0; i < 5; ++i) 618 { 619 Assert.AreEqual(i, container[i]); 620 } 621 } 622 623 using (var container = new UnsafeList<int>(5, Allocator.Persistent)) 624 { 625 for (var i = 0; i < 5; ++i) 626 { 627 container.Add(4 - i); 628 } 629 630 container.SortJob().Schedule().Complete(); 631 632 for (var i = 0; i < 5; ++i) 633 { 634 Assert.AreEqual(i, container[i]); 635 } 636 } 637 } 638 639 [Test] 640 [TestRequiresDotsDebugOrCollectionChecks] 641 public void UnsafeList_GenericSortJobCustomComparer_NoBurst() 642 { 643 UnsafeList_GenericSortJobCustomComparer(); 644 } 645 646 [BurstCompile] 647 public static void Bursted_UnsafeList_GenericSortJobCustomComparer() 648 { 649 UnsafeList_GenericSortJobCustomComparer(); 650 } 651 652 [Test] 653 [TestRequiresDotsDebugOrCollectionChecks] 654 public void UnsafeList_GenericSortJobCustomComparer_Burst() 655 { 656 Bursted_UnsafeList_GenericSortJobCustomComparer(); 657 } 658 659 public static void UnsafeList_GenericSortJobCustomComparer() 660 { 661 var num = 35; 662 using (var container = new UnsafeList<int>(num, Allocator.Persistent)) 663 { 664 for (var i = 0; i < num; ++i) 665 { 666 container.Add(i); 667 } 668 669 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer0<int>())); 670 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer1<int>())); 671 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer2<int>())); 672 Assert.Throws<InvalidOperationException>(() => container.Sort(new BrokenComparer3<int>())); 673 674 container.Sort(new DescendingComparer<int>()); 675 676 for (var i = 0; i < num; ++i) 677 { 678 Assert.AreEqual(num - 1 - i, container[i]); 679 } 680 } 681 682 using (var container = new UnsafeList<int>(num, Allocator.Persistent)) 683 { 684 for (var i = 0; i < num; ++i) 685 { 686 container.Add(i); 687 } 688 689 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer0<int>()).Schedule().Complete()); 690 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer1<int>()).Schedule().Complete()); 691 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer2<int>()).Schedule().Complete()); 692 Assert.Throws<InvalidOperationException>(() => container.SortJob(new BrokenComparer3<int>()).Schedule().Complete()); 693 694 container.SortJob(new DescendingComparer<int>()).Schedule().Complete(); 695 696 for (var i = 0; i < num; ++i) 697 { 698 Assert.AreEqual(num - 1 - i, container[i]); 699 } 700 } 701 } 702 703 704 [Test] 705 public void FixedList32Bytes_GenericSort() 706 { 707 var container = new FixedList32Bytes<int>(); 708 709 for (var i = 0; i < 5; ++i) 710 { 711 container.Add(i); 712 } 713 714 container.Sort(new DescendingComparer<int>()); 715 716 for (var i = 0; i < 5; ++i) 717 { 718 Assert.AreEqual(4 - i, container[i]); 719 } 720 } 721 722 723 [Test] 724 public void FixedList64Bytes_GenericSort() 725 { 726 var container = new FixedList64Bytes<int>(); 727 728 for (var i = 0; i < 5; ++i) 729 { 730 container.Add(i); 731 } 732 733 container.Sort(new DescendingComparer<int>()); 734 735 for (var i = 0; i < 5; ++i) 736 { 737 Assert.AreEqual(4 - i, container[i]); 738 } 739 } 740 741 742 [Test] 743 public void FixedList128Bytes_GenericSort() 744 { 745 var container = new FixedList128Bytes<int>(); 746 747 for (var i = 0; i < 5; ++i) 748 { 749 container.Add(i); 750 } 751 752 container.Sort(new DescendingComparer<int>()); 753 754 for (var i = 0; i < 5; ++i) 755 { 756 Assert.AreEqual(4 - i, container[i]); 757 } 758 } 759 760 761 [Test] 762 public void FixedList512Bytes_GenericSort() 763 { 764 var container = new FixedList512Bytes<int>(); 765 766 for (var i = 0; i < 5; ++i) 767 { 768 container.Add(i); 769 } 770 771 container.Sort(new DescendingComparer<int>()); 772 773 for (var i = 0; i < 5; ++i) 774 { 775 Assert.AreEqual(4 - i, container[i]); 776 } 777 } 778 779 780 [Test] 781 public void FixedList4096Bytes_GenericSort() 782 { 783 var container = new FixedList4096Bytes<int>(); 784 785 for (var i = 0; i < 5; ++i) 786 { 787 container.Add(i); 788 } 789 790 container.Sort(new DescendingComparer<int>()); 791 792 for (var i = 0; i < 5; ++i) 793 { 794 Assert.AreEqual(4 - i, container[i]); 795 } 796 } 797 798 unsafe static void IntroSortNoComparerCheck<T, U>(T* array, int length, U comp) 799 where T : unmanaged 800 where U : IComparer<T> 801 { 802 NativeSortExtension.IntroSort_R<T, U>(array, 0, length - 1, 2 * CollectionHelper.Log2Floor(length), comp); 803 } 804 805 [Test] 806 [TestRequiresDotsDebugOrCollectionChecks] 807 public unsafe void NativeList_BrokenCustomComparerDoesNotCrash() 808 { 809 var rng = new Unity.Mathematics.Random(1); 810 811 var num = 10000; 812 using (var container = new NativeList<int>(num, Allocator.Persistent)) 813 { 814 for (var i = 0; i < num; ++i) 815 { 816 container.Add(rng.NextInt()); 817 } 818 819 Assert.DoesNotThrow(() => IntroSortNoComparerCheck(container.GetUnsafePtr(), container.Length, new BrokenComparer0<int>())); 820 } 821 822 using (var container = new NativeList<int>(num, Allocator.Persistent)) 823 { 824 for (var i = 0; i < num; ++i) 825 { 826 container.Add(rng.NextInt()); 827 } 828 829 Assert.DoesNotThrow(() => IntroSortNoComparerCheck(container.GetUnsafePtr(), container.Length, new BrokenComparer1<int>())); 830 } 831 832 using (var container = new NativeList<int>(num, Allocator.Persistent)) 833 { 834 for (var i = 0; i < num; ++i) 835 { 836 container.Add(rng.NextInt()); 837 } 838 839 Assert.DoesNotThrow(() => IntroSortNoComparerCheck(container.GetUnsafePtr(), container.Length, new BrokenComparer2<int>())); 840 } 841 842 using (var container = new NativeList<int>(num, Allocator.Persistent)) 843 { 844 for (var i = 0; i < num; ++i) 845 { 846 container.Add(rng.NextInt()); 847 } 848 849 Assert.DoesNotThrow(() => IntroSortNoComparerCheck(container.GetUnsafePtr(), container.Length, new BrokenComparer3<int>())); 850 } 851 } 852}