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}