120 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.Reflection;
 | |
| using NUnit;
 | |
| using NUnit.Framework.Api;
 | |
| using NUnit.Framework.Interfaces;
 | |
| using NUnit.Framework.Internal;
 | |
| using Unity.Profiling;
 | |
| using UnityEngine.TestRunner.NUnitExtensions;
 | |
| using UnityEngine.TestRunner.NUnitExtensions.Filters;
 | |
| 
 | |
| namespace UnityEngine.TestTools.NUnitExtensions
 | |
| {
 | |
|     internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder, IAsyncTestAssemblyBuilder
 | |
|     {
 | |
|         private readonly string m_ProductName;
 | |
|         private readonly ITestSuiteModifier[] m_TestSuiteModifiers;
 | |
| 
 | |
|         public UnityTestAssemblyBuilder(string[] orderedTestNames, int randomSeed)
 | |
|         {
 | |
|             m_TestSuiteModifiers = (orderedTestNames != null && orderedTestNames.Length > 0) || randomSeed != 0
 | |
|                 ? new ITestSuiteModifier[] {new OrderedTestSuiteModifier(orderedTestNames, randomSeed)}
 | |
|                 : new ITestSuiteModifier[0];
 | |
|             m_ProductName = Application.productName;
 | |
|         }
 | |
| 
 | |
|         public ITest Build(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options)
 | |
|         {
 | |
|             var test = BuildAsync(assemblies, testPlatforms, options);
 | |
|             while (test.MoveNext())
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             return test.Current;
 | |
|         }
 | |
|         
 | |
|         struct PlatformAssembly : IEquatable<PlatformAssembly>
 | |
|         {
 | |
|             public System.Reflection.Assembly Assembly;
 | |
|             public TestPlatform Platform;
 | |
| 
 | |
|             public bool Equals(PlatformAssembly other)
 | |
|             {
 | |
|                 return Equals(Assembly, other.Assembly) && Platform == other.Platform;
 | |
|             }
 | |
| 
 | |
|             public override bool Equals(object obj)
 | |
|             {
 | |
|                 return obj is PlatformAssembly other && Equals(other);
 | |
|             }
 | |
| 
 | |
|             public override int GetHashCode()
 | |
|             {
 | |
|                 unchecked
 | |
|                 {
 | |
|                     return ((Assembly != null ? Assembly.GetHashCode() : 0) * 397) ^ (int) Platform;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static Dictionary<PlatformAssembly, TestSuite> CachedAssemblies = new Dictionary<PlatformAssembly, TestSuite>();
 | |
| 
 | |
|         public IEnumerator<ITest> BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options)
 | |
|         {
 | |
|             var productName = string.Join("_", m_ProductName.Split(Path.GetInvalidFileNameChars()));
 | |
|             var suite = new TestSuite(productName);
 | |
|             var lastYieldTime = Time.realtimeSinceStartup;
 | |
|             for (var index = 0; index < assemblies.Length; index++)
 | |
|             {
 | |
|                 var assembly = assemblies[index];
 | |
|                 var platform = testPlatforms[index];
 | |
| 
 | |
|                 using (new ProfilerMarker(nameof(UnityTestAssemblyBuilder) + "." + assembly.GetName().Name).Auto())
 | |
|                 {
 | |
|                     var key = new PlatformAssembly {Assembly = assembly, Platform = platform};
 | |
|                     if (!CachedAssemblies.TryGetValue(key, out var assemblySuite))
 | |
|                     {
 | |
|                         assemblySuite = Build(assembly, GetNUnitTestBuilderSettings(platform)) as TestSuite;
 | |
|                         if (assemblySuite != null)
 | |
|                         {
 | |
|                             assemblySuite.Properties.Set("platform", platform);
 | |
|                             EditorOnlyFilter.ApplyPropertyToTest(assemblySuite, platform == TestPlatform.EditMode);
 | |
|                         }
 | |
|                         CachedAssemblies.Add(key, assemblySuite);
 | |
|                     }
 | |
| 
 | |
|                     if (assemblySuite != null && assemblySuite.HasChildren)
 | |
|                     {
 | |
|                         suite.Add(assemblySuite);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (Time.realtimeSinceStartup > lastYieldTime + 0.1f)
 | |
|                 {
 | |
|                     yield return null;
 | |
|                     lastYieldTime = Time.realtimeSinceStartup;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             suite.ParseForNameDuplicates();
 | |
|             suite.Properties.Set("platform", testPlatforms.MergeFlags());
 | |
| 
 | |
|             foreach (var testSuiteModifier in m_TestSuiteModifiers)
 | |
|             {
 | |
|                 suite = testSuiteModifier.ModifySuite(suite);
 | |
|             }
 | |
| 
 | |
|             yield return suite;
 | |
|         }
 | |
| 
 | |
|         public static Dictionary<string, object> GetNUnitTestBuilderSettings(TestPlatform testPlatform)
 | |
|         {
 | |
|             var emptySettings = new Dictionary<string, object>();
 | |
|             emptySettings.Add(FrameworkPackageSettings.TestParameters, "platform=" + testPlatform);
 | |
|             return emptySettings;
 | |
|         }
 | |
|     }
 | |
| }
 |