Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

UnsafeParallelMultiHashMapTests.cs 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using NUnit.Framework;
  2. using Unity.Burst;
  3. using Unity.Collections;
  4. using Unity.Collections.NotBurstCompatible;
  5. using Unity.Collections.Tests;
  6. using Unity.Collections.LowLevel.Unsafe;
  7. using Unity.Jobs;
  8. internal class UnsafeParallelMultiHashMapTests : CollectionsTestCommonBase
  9. {
  10. [BurstCompile(CompileSynchronously = true)]
  11. public struct UnsafeParallelMultiHashMapAddJob : IJobParallelFor
  12. {
  13. public UnsafeParallelMultiHashMap<int, int>.ParallelWriter Writer;
  14. public void Execute(int index)
  15. {
  16. Writer.Add(123, index);
  17. }
  18. }
  19. [Test]
  20. public void UnsafeParallelMultiHashMap_AddJob()
  21. {
  22. var container = new UnsafeParallelMultiHashMap<int, int>(32, CommonRwdAllocator.Handle);
  23. var job = new UnsafeParallelMultiHashMapAddJob()
  24. {
  25. Writer = container.AsParallelWriter(),
  26. };
  27. job.Schedule(3, 1).Complete();
  28. Assert.True(container.ContainsKey(123));
  29. Assert.AreEqual(container.CountValuesForKey(123), 3);
  30. container.Dispose();
  31. }
  32. [Test]
  33. public void UnsafeParallelHashMap_RemoveOnEmptyMap_DoesNotThrow()
  34. {
  35. var container = new UnsafeParallelHashMap<int, int>(0, Allocator.Temp);
  36. Assert.DoesNotThrow(() => container.Remove(0));
  37. Assert.DoesNotThrow(() => container.Remove(-425196));
  38. container.Dispose();
  39. }
  40. [Test]
  41. public void UnsafeParallelMultiHashMap_RemoveOnEmptyMap_DoesNotThrow()
  42. {
  43. var container = new UnsafeParallelMultiHashMap<int, int>(0, Allocator.Temp);
  44. Assert.DoesNotThrow(() => container.Remove(0));
  45. Assert.DoesNotThrow(() => container.Remove(-425196));
  46. Assert.DoesNotThrow(() => container.Remove(0, 0));
  47. Assert.DoesNotThrow(() => container.Remove(-425196, 0));
  48. container.Dispose();
  49. }
  50. [Test]
  51. public void UnsafeParallelMultiHashMap_ForEach_FixedStringInHashMap()
  52. {
  53. using (var stringList = new NativeList<FixedString32Bytes>(10, Allocator.Persistent) { "Hello", ",", "World", "!" })
  54. {
  55. var container = new UnsafeParallelMultiHashMap<FixedString128Bytes, float>(50, Allocator.Temp);
  56. var seen = new NativeArray<int>(stringList.Length, Allocator.Temp);
  57. foreach (var str in stringList)
  58. {
  59. container.Add(str, 0);
  60. }
  61. foreach (var pair in container)
  62. {
  63. int index = stringList.IndexOf(pair.Key);
  64. Assert.AreEqual(stringList[index], pair.Key.ToString());
  65. seen[index] = seen[index] + 1;
  66. }
  67. for (int i = 0; i < stringList.Length; i++)
  68. {
  69. Assert.AreEqual(1, seen[i], $"Incorrect value count {stringList[i]}");
  70. }
  71. }
  72. }
  73. [Test]
  74. public void UnsafeParallelMultiHashMap_ForEach([Values(10, 1000)]int n)
  75. {
  76. var seenKeys = new NativeArray<int>(n, Allocator.Temp);
  77. var seenValues = new NativeArray<int>(n * 2, Allocator.Temp);
  78. using (var container = new UnsafeParallelMultiHashMap<int, int>(1, Allocator.Temp))
  79. {
  80. for (int i = 0; i < n; ++i)
  81. {
  82. container.Add(i, i);
  83. container.Add(i, i + n);
  84. }
  85. var count = 0;
  86. foreach (var kv in container)
  87. {
  88. if (kv.Value < n)
  89. {
  90. Assert.AreEqual(kv.Key, kv.Value);
  91. }
  92. else
  93. {
  94. Assert.AreEqual(kv.Key + n, kv.Value);
  95. }
  96. seenKeys[kv.Key] = seenKeys[kv.Key] + 1;
  97. seenValues[kv.Value] = seenValues[kv.Value] + 1;
  98. ++count;
  99. }
  100. Assert.AreEqual(container.Count(), count);
  101. for (int i = 0; i < n; i++)
  102. {
  103. Assert.AreEqual(2, seenKeys[i], $"Incorrect key count {i}");
  104. Assert.AreEqual(1, seenValues[i], $"Incorrect value count {i}");
  105. Assert.AreEqual(1, seenValues[i + n], $"Incorrect value count {i + n}");
  106. }
  107. }
  108. }
  109. [Test]
  110. public void UnsafeParallelMultiHashMap_GetKeys()
  111. {
  112. var container = new UnsafeParallelMultiHashMap<int, int>(1, Allocator.Temp);
  113. for (int i = 0; i < 30; ++i)
  114. {
  115. container.Add(i, 2 * i);
  116. container.Add(i, 3 * i);
  117. }
  118. var keys = container.GetKeyArray(Allocator.Temp);
  119. var (unique, uniqueLength) = container.GetUniqueKeyArray(Allocator.Temp);
  120. Assert.AreEqual(30, uniqueLength);
  121. Assert.AreEqual(60, keys.Length);
  122. keys.Sort();
  123. for (int i = 0; i < 30; ++i)
  124. {
  125. Assert.AreEqual(i, keys[i * 2 + 0]);
  126. Assert.AreEqual(i, keys[i * 2 + 1]);
  127. Assert.AreEqual(i, unique[i]);
  128. }
  129. }
  130. [Test]
  131. public void UnsafeParallelMultiHashMap_CustomAllocatorTest()
  132. {
  133. AllocatorManager.Initialize();
  134. var allocatorHelper = new AllocatorHelper<CustomAllocatorTests.CountingAllocator>(AllocatorManager.Persistent);
  135. ref var allocator = ref allocatorHelper.Allocator;
  136. allocator.Initialize();
  137. using (var container = new UnsafeParallelMultiHashMap<int, int>(1, allocator.Handle))
  138. {
  139. }
  140. Assert.IsTrue(allocator.WasUsed);
  141. allocator.Dispose();
  142. allocatorHelper.Dispose();
  143. AllocatorManager.Shutdown();
  144. }
  145. [BurstCompile]
  146. struct BurstedCustomAllocatorJob : IJob
  147. {
  148. [NativeDisableUnsafePtrRestriction]
  149. public unsafe CustomAllocatorTests.CountingAllocator* Allocator;
  150. public void Execute()
  151. {
  152. unsafe
  153. {
  154. using (var container = new UnsafeParallelMultiHashMap<int, int>(1, Allocator->Handle))
  155. {
  156. }
  157. }
  158. }
  159. }
  160. [Test]
  161. public unsafe void UnsafeParallelMultiHashMap_BurstedCustomAllocatorTest()
  162. {
  163. AllocatorManager.Initialize();
  164. var allocatorHelper = new AllocatorHelper<CustomAllocatorTests.CountingAllocator>(AllocatorManager.Persistent);
  165. ref var allocator = ref allocatorHelper.Allocator;
  166. allocator.Initialize();
  167. var allocatorPtr = (CustomAllocatorTests.CountingAllocator*)UnsafeUtility.AddressOf<CustomAllocatorTests.CountingAllocator>(ref allocator);
  168. unsafe
  169. {
  170. var handle = new BurstedCustomAllocatorJob {Allocator = allocatorPtr}.Schedule();
  171. handle.Complete();
  172. }
  173. Assert.IsTrue(allocator.WasUsed);
  174. allocator.Dispose();
  175. allocatorHelper.Dispose();
  176. AllocatorManager.Shutdown();
  177. }
  178. }