201 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using NUnit.Framework; | ||
|  | using Unity.Collections; | ||
|  | using Unity.Collections.LowLevel.Unsafe; | ||
|  | using Unity.Jobs; | ||
|  | using Unity.Jobs.LowLevel.Unsafe; | ||
|  | using Unity.Jobs.Tests.ManagedJobs; | ||
|  | 
 | ||
|  | internal class NativeListDeferredArrayTests : JobTestsFixtureBasic | ||
|  | { | ||
|  |     private bool JobsDebuggerWasEnabled; | ||
|  |     struct AliasJob : IJob | ||
|  |     { | ||
|  |         public NativeArray<int> array; | ||
|  |         public NativeList<int> list; | ||
|  | 
 | ||
|  |         public void Execute() | ||
|  |         { | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     struct SetListLengthJob : IJob | ||
|  |     { | ||
|  |         public int ResizeLength; | ||
|  |         public NativeList<int> list; | ||
|  | 
 | ||
|  |         public void Execute() | ||
|  |         { | ||
|  |             list.Resize(ResizeLength, NativeArrayOptions.UninitializedMemory); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     struct SetArrayValuesJobParallel : IJobParallelForDefer | ||
|  |     { | ||
|  |         public NativeArray<int> array; | ||
|  | 
 | ||
|  |         public void Execute(int index) | ||
|  |         { | ||
|  |             array[index] = array.Length; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     struct GetArrayValuesJobParallel : IJobParallelForDefer | ||
|  |     { | ||
|  |         [ReadOnly] | ||
|  |         public NativeArray<int> array; | ||
|  | 
 | ||
|  |         public void Execute(int index) | ||
|  |         { | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     struct ParallelForWithoutList : IJobParallelForDefer | ||
|  |     { | ||
|  |         public void Execute(int index) | ||
|  |         { | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [SetUp] | ||
|  |     public void NativeListDeferredArrayTestsSetup() | ||
|  |     { | ||
|  |         // Many ECS tests will only pass if the Jobs Debugger enabled; | ||
|  |         // force it enabled for all tests, and restore the original value at teardown. | ||
|  |         JobsDebuggerWasEnabled = JobsUtility.JobDebuggerEnabled; | ||
|  | #if ENABLE_UNITY_COLLECTIONS_CHECKS | ||
|  |         JobsUtility.JobDebuggerEnabled = true; | ||
|  | #endif | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void ResizedListToDeferredJobArray([Values(0, 1, 2, 3, 4, 5, 6, 42, 97, 1023)] int length) | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  | 
 | ||
|  |         var setLengthJob = new SetListLengthJob { list = list, ResizeLength = length }; | ||
|  |         var jobHandle = setLengthJob.Schedule(); | ||
|  | 
 | ||
|  |         var setValuesJob = new SetArrayValuesJobParallel { array = list.AsDeferredJobArray() }; | ||
|  |         setValuesJob.Schedule(list, 3, jobHandle).Complete(); | ||
|  | 
 | ||
|  |         Assert.AreEqual(length, list.Length); | ||
|  |         for (int i = 0; i != list.Length; i++) | ||
|  |             Assert.AreEqual(length, list[i]); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public unsafe void DeferredParallelForFromIntPtr() | ||
|  |     { | ||
|  |         int length = 10; | ||
|  | 
 | ||
|  |         var lengthValue = CollectionHelper.CreateNativeArray<int>(1, RwdAllocator.ToAllocator); | ||
|  |         lengthValue[0] = length; | ||
|  |         var array = CollectionHelper.CreateNativeArray<int>(length, RwdAllocator.ToAllocator); | ||
|  | 
 | ||
|  |         var setValuesJob = new SetArrayValuesJobParallel { array = array }; | ||
|  |         setValuesJob.Schedule((int*)lengthValue.GetUnsafePtr(), 3).Complete(); | ||
|  | 
 | ||
|  |         for (int i = 0; i != array.Length; i++) | ||
|  |             Assert.AreEqual(length, array[i]); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void ResizeListBeforeSchedule([Values(5)] int length) | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  | 
 | ||
|  |         var setLengthJob = new SetListLengthJob { list = list, ResizeLength = length }.Schedule(); | ||
|  |         var setValuesJob = new SetArrayValuesJobParallel { array = list.AsDeferredJobArray() }; | ||
|  |         setLengthJob.Complete(); | ||
|  | 
 | ||
|  |         setValuesJob.Schedule(list, 3).Complete(); | ||
|  | 
 | ||
|  |         Assert.AreEqual(length, list.Length); | ||
|  |         for (int i = 0; i != list.Length; i++) | ||
|  |             Assert.AreEqual(length, list[i]); | ||
|  |     } | ||
|  | 
 | ||
|  | #if ENABLE_UNITY_COLLECTIONS_CHECKS | ||
|  |     [Test] | ||
|  |     public void ResizedListToDeferredJobArray() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  |         list.Add(1); | ||
|  | 
 | ||
|  |         var array = list.AsDeferredJobArray(); | ||
|  | #pragma warning disable 0219 // assigned but its value is never used | ||
|  |         Assert.Throws<IndexOutOfRangeException>(() => { var value = array[0]; }); | ||
|  | #pragma warning restore 0219 | ||
|  |         Assert.AreEqual(0, array.Length); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void ResizeListWhileJobIsRunning() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  |         list.Resize(42, NativeArrayOptions.UninitializedMemory); | ||
|  | 
 | ||
|  |         var setValuesJob = new GetArrayValuesJobParallel { array = list.AsDeferredJobArray() }; | ||
|  |         var jobHandle = setValuesJob.Schedule(list, 3); | ||
|  | 
 | ||
|  |         Assert.Throws<InvalidOperationException>(() => list.Resize(1, NativeArrayOptions.UninitializedMemory)); | ||
|  | 
 | ||
|  |         jobHandle.Complete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void AliasArrayThrows() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  | 
 | ||
|  |         var aliasJob = new AliasJob { list = list, array = list.AsDeferredJobArray() }; | ||
|  |         Assert.Throws<InvalidOperationException>(() => aliasJob.Schedule()); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void DeferredListMustExistInJobData() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  | 
 | ||
|  |         var job = new ParallelForWithoutList(); | ||
|  |         Assert.Throws<InvalidOperationException>(() => job.Schedule(list, 64)); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void DeferredListCantBeDeletedWhileJobIsRunning() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  |         list.Resize(42, NativeArrayOptions.UninitializedMemory); | ||
|  | 
 | ||
|  |         var setValuesJob = new GetArrayValuesJobParallel { array = list.AsDeferredJobArray() }; | ||
|  |         var jobHandle = setValuesJob.Schedule(list, 3); | ||
|  | 
 | ||
|  |         Assert.Throws<InvalidOperationException>(() => list.Dispose()); | ||
|  | 
 | ||
|  |         jobHandle.Complete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     [Test] | ||
|  |     public void DeferredArrayCantBeAccessedOnMainthread() | ||
|  |     { | ||
|  |         var list = new NativeList<int>(RwdAllocator.ToAllocator); | ||
|  |         list.Add(1); | ||
|  | 
 | ||
|  |         var defer = list.AsDeferredJobArray(); | ||
|  | 
 | ||
|  |         Assert.AreEqual(0, defer.Length); | ||
|  |         Assert.Throws<IndexOutOfRangeException>(() => defer[0] = 5); | ||
|  |     } | ||
|  | #endif | ||
|  | 
 | ||
|  |     [TearDown] | ||
|  |     public void TearDown() | ||
|  |     { | ||
|  | #if ENABLE_UNITY_COLLECTIONS_CHECKS | ||
|  |         JobsUtility.JobDebuggerEnabled = JobsDebuggerWasEnabled; | ||
|  | #endif | ||
|  |     } | ||
|  | } |