123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- using NUnit.Framework;
- using System;
- using System.Collections.Generic;
- using Unity.Burst;
- using Unity.Burst.Editor;
- using Unity.Jobs;
-
- // This concrete generic type is only referenced in this assembly-level attribute,
- // not anywhere else in code. This is to test that such types can be picked up
- // by BurstReflection.
- [assembly: BurstReflectionTests.RegisterGenericJobType(typeof(BurstReflectionTests.GenericParallelForJob<int>))]
-
- [TestFixture]
- public class BurstReflectionTests
- {
- private List<System.Reflection.Assembly> _assemblies;
-
- [OneTimeSetUp]
- public void SetUp()
- {
- _assemblies = BurstReflection.EditorAssembliesThatCanPossiblyContainJobs;
- }
-
- [Test]
- public void CanGetAssemblyList()
- {
- Assert.That(_assemblies, Has.Count.GreaterThan(0));
- }
-
- [Test]
- [TestCase("BurstReflectionTests.MyJob - (IJob)")]
- [TestCase("BurstReflectionTests.MyGenericJob`1[System.Int32] - (IJob)")]
- [TestCase("BurstReflectionTests.MyGenericJob2`1[System.Int32] - (BurstReflectionTests.IMyGenericJob`1[System.Int32])")]
- [TestCase("BurstReflectionTests.MyGenericJob2`1[System.Double] - (BurstReflectionTests.IMyGenericJob`1[System.Double])")]
- [TestCase("BurstReflectionTests.NonGenericType.TestMethod1()")]
- [TestCase("BurstReflectionTests.GenericType`1[System.Int32].TestMethod1()")]
- [TestCase("BurstReflectionTests.GenericType`1.NestedNonGeneric[System.Int32].TestMethod2()")]
- [TestCase("BurstReflectionTests.GenericType`1.NestedGeneric`1[System.Int32,System.Single].TestMethod3()")]
- [TestCase("BurstReflectionTests.MyGenericJobSeparateAssembly`1[System.Int32] - (BurstReflectionTestsSeparateAssembly.IMyGenericJobSeparateAssembly`1[System.Int32])")]
- [TestCase("BurstReflectionTests.GenericParallelForJob`1[System.Int32] - (IJobParallelFor)")]
- public void CanFindJobType(string compileTargetName)
- {
- var result = BurstReflection.FindExecuteMethods(_assemblies, BurstReflectionAssemblyOptions.None);
-
- Assert.That(result.LogMessages, Is.Empty);
-
- var compileTarget = result.CompileTargets.Find(x => x.GetDisplayName() == compileTargetName);
- Assert.That(compileTarget, Is.Not.Null);
- }
-
- [BurstCompile]
- private struct MyJob : IJob
- {
- public void Execute() { }
- }
-
- [BurstCompile]
- private struct MyGenericJob<T> : IJob
- {
- public void Execute() { }
-
- private static void UseConcreteType()
- {
- new MyGenericJob<int>().Execute();
- }
- }
-
- [Unity.Jobs.LowLevel.Unsafe.JobProducerType(typeof(MyJobProducer<,>))]
- private interface IMyGenericJob<T>
- {
- void Execute();
- }
-
- [BurstCompile]
- private struct MyGenericJob2<T> : IMyGenericJob<T>
- {
- public void Execute() { }
-
- private static void UseConcreteType()
- {
- new MyGenericJob2<int>().Execute();
- }
- }
-
- private static class MyJobProducer<TJob, T>
- {
- public static void Execute(ref TJob job)
- {
-
- }
- }
-
- private struct MyGenericJob2Wrapper<T1, T2>
- {
- public MyGenericJob2<T2> Job;
-
- private static void UseConcreteType()
- {
- var x = new MyGenericJob2Wrapper<float, double>();
- x.Job.Execute();
- }
- }
-
- [BurstCompile]
- private struct NonGenericType
- {
- [BurstCompile]
- public static void TestMethod1() { }
- }
-
- [BurstCompile]
- private struct GenericType<T>
- {
- public static Action Delegate1;
- public static Action Delegate2;
- public static Action Delegate3;
-
- [BurstCompile]
- public static void TestMethod1() { }
-
- [BurstCompile]
- public class NestedNonGeneric
- {
- [BurstCompile]
- public static void TestMethod2() { }
- }
-
- [BurstCompile]
- public class NestedGeneric<T2>
- {
- [BurstCompile]
- public static void TestMethod3() { }
- }
-
- private static void UseConcreteType()
- {
- // Store the delegates to static fields to avoid
- // them being optimized-away in Release builds
- Delegate1 = GenericType<int>.TestMethod1;
- Delegate2 = GenericType<int>.NestedNonGeneric.TestMethod2;
- Delegate3 = GenericType<int>.NestedGeneric<float>.TestMethod3;
- }
- }
-
- [BurstCompile]
- private struct MyGenericJobSeparateAssembly<T> : BurstReflectionTestsSeparateAssembly.IMyGenericJobSeparateAssembly<T>
- {
- public void Execute() { }
-
- private static void UseConcreteType()
- {
- new MyGenericJobSeparateAssembly<int>().Execute();
- }
- }
-
- [Test]
- [TestCase("BurstReflectionTests.GenericMethodContainer.GenericMethod(T)")]
- public void ExcludesGenericMethods(string compileTargetName)
- {
- var result = BurstReflection.FindExecuteMethods(_assemblies, BurstReflectionAssemblyOptions.None);
-
- Assert.That(result.LogMessages, Is.Empty);
-
- var compileTarget = result.CompileTargets.Find(x => x.GetDisplayName() == compileTargetName);
- Assert.That(compileTarget, Is.Null);
- }
-
- [BurstCompile]
- private static class GenericMethodContainer
- {
- [BurstCompile]
- private static void GenericMethod<T>(T p)
- {
- }
- }
-
- [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
- internal class RegisterGenericJobTypeAttribute : Attribute
- {
- public Type ConcreteType;
-
- public RegisterGenericJobTypeAttribute(Type type)
- {
- ConcreteType = type;
- }
- }
-
- [BurstCompile]
- internal struct GenericParallelForJob<T> : IJobParallelFor
- where T : struct
- {
- public void Execute(int index)
- {
- throw new System.NotImplementedException();
- }
- }
- }
|