A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Reflection; 5using NUnit; 6using NUnit.Framework.Api; 7using NUnit.Framework.Interfaces; 8using NUnit.Framework.Internal; 9using Unity.Profiling; 10using UnityEngine.TestRunner.NUnitExtensions; 11using UnityEngine.TestRunner.NUnitExtensions.Filters; 12 13namespace UnityEngine.TestTools.NUnitExtensions 14{ 15 internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder, IAsyncTestAssemblyBuilder 16 { 17 private readonly string m_ProductName; 18 private readonly ITestSuiteModifier[] m_TestSuiteModifiers; 19 20 public UnityTestAssemblyBuilder(string[] orderedTestNames, int randomSeed) 21 { 22 m_TestSuiteModifiers = (orderedTestNames != null && orderedTestNames.Length > 0) || randomSeed != 0 23 ? new ITestSuiteModifier[] {new OrderedTestSuiteModifier(orderedTestNames, randomSeed)} 24 : new ITestSuiteModifier[0]; 25 m_ProductName = Application.productName; 26 } 27 28 public ITest Build(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options) 29 { 30 var test = BuildAsync(assemblies, testPlatforms, options); 31 while (test.MoveNext()) 32 { 33 } 34 35 return test.Current; 36 } 37 38 struct PlatformAssembly : IEquatable<PlatformAssembly> 39 { 40 public System.Reflection.Assembly Assembly; 41 public TestPlatform Platform; 42 43 public bool Equals(PlatformAssembly other) 44 { 45 return Equals(Assembly, other.Assembly) && Platform == other.Platform; 46 } 47 48 public override bool Equals(object obj) 49 { 50 return obj is PlatformAssembly other && Equals(other); 51 } 52 53 public override int GetHashCode() 54 { 55 unchecked 56 { 57 return ((Assembly != null ? Assembly.GetHashCode() : 0) * 397) ^ (int) Platform; 58 } 59 } 60 } 61 62 private static Dictionary<PlatformAssembly, TestSuite> CachedAssemblies = new Dictionary<PlatformAssembly, TestSuite>(); 63 64 public IEnumerator<ITest> BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options) 65 { 66 var productName = string.Join("_", m_ProductName.Split(Path.GetInvalidFileNameChars())); 67 var suite = new TestSuite(productName); 68 for (var index = 0; index < assemblies.Length; index++) 69 { 70 var assembly = assemblies[index]; 71 var platform = testPlatforms[index]; 72 73 using (new ProfilerMarker(nameof(UnityTestAssemblyBuilder) + "." + assembly.GetName().Name).Auto()) 74 { 75 var key = new PlatformAssembly {Assembly = assembly, Platform = platform}; 76 if (!CachedAssemblies.TryGetValue(key, out var assemblySuite)) 77 { 78 assemblySuite = Build(assembly, GetNUnitTestBuilderSettings(platform)) as TestSuite; 79 if (assemblySuite != null) 80 { 81 assemblySuite.Properties.Set("platform", platform); 82 EditorOnlyFilter.ApplyPropertyToTest(assemblySuite, platform == TestPlatform.EditMode); 83 } 84 CachedAssemblies.Add(key, assemblySuite); 85 } 86 87 if (assemblySuite != null && assemblySuite.HasChildren) 88 { 89 suite.Add(assemblySuite); 90 } 91 } 92 93 yield return null; 94 } 95 96 suite.ParseForNameDuplicates(); 97 suite.Properties.Set("platform", testPlatforms.MergeFlags()); 98 99 foreach (var testSuiteModifier in m_TestSuiteModifiers) 100 { 101 suite = testSuiteModifier.ModifySuite(suite); 102 } 103 104 yield return suite; 105 } 106 107 public static Dictionary<string, object> GetNUnitTestBuilderSettings(TestPlatform testPlatform) 108 { 109 var emptySettings = new Dictionary<string, object>(); 110 emptySettings.Add(FrameworkPackageSettings.TestParameters, "platform=" + testPlatform); 111 return emptySettings; 112 } 113 } 114}