219 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using NUnit.Framework.Interfaces; | ||
|  | using NUnit.Framework.Internal; | ||
|  | using UnityEngine.TestRunner.NUnitExtensions.Filters; | ||
|  | using UnityEngine.TestTools; | ||
|  | 
 | ||
|  | namespace UnityEngine.TestRunner.NUnitExtensions | ||
|  | { | ||
|  |     internal static class TestExtensions | ||
|  |     { | ||
|  |         private static List<string> ExtractFixtureCategories(ITest test) | ||
|  |         { | ||
|  |             var fixtureCategories = test.Properties[PropertyNames.Category].Cast<string>().ToList(); | ||
|  |             if (test.Parent != null) | ||
|  |             { | ||
|  |                 fixtureCategories.AddRange(ExtractFixtureCategories(test.Parent)); | ||
|  |             } | ||
|  | 
 | ||
|  |             return fixtureCategories; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static List<string> GetAllCategoriesFromTest(this ITest test) | ||
|  |         { | ||
|  |             // Only mark tests as Uncategorized if the test fixture doesn't have a category, | ||
|  |             // otherwise the test inherits the Fixture category. | ||
|  |             // Recursively try checking until Parent is null - cause category can be set on higher level. | ||
|  |             var categories = ExtractFixtureCategories(test); | ||
|  |             if (categories.Count == 0 && test is TestMethod) | ||
|  |             { | ||
|  |                 categories.Add(CategoryFilterExtended.k_DefaultCategory); | ||
|  |             } | ||
|  | 
 | ||
|  |             return categories; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void ParseForNameDuplicates(this ITest test) | ||
|  |         { | ||
|  |             var duplicates = new Dictionary<string, int>(); | ||
|  |             for (var i = 0; i < test.Tests.Count; i++) | ||
|  |             { | ||
|  |                 var child = test.Tests[i]; | ||
|  |                 int count; | ||
|  |                 if (duplicates.TryGetValue(child.FullName, out count)) | ||
|  |                 { | ||
|  |                     count++; | ||
|  |                     child.Properties.Add("childIndex", count); | ||
|  |                     duplicates[child.FullName] = count; | ||
|  |                 } | ||
|  |                 else | ||
|  |                 { | ||
|  |                     duplicates.Add(child.FullName, 1); | ||
|  |                 } | ||
|  |                 ParseForNameDuplicates(child); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void ApplyPlatformToPropertyBag(this ITest test, TestPlatform testPlatform) | ||
|  |         { | ||
|  |             test.Properties.Set("platform", testPlatform); | ||
|  |             foreach (var child in test.Tests) | ||
|  |             { | ||
|  |                 child.ApplyPlatformToPropertyBag(testPlatform); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static int GetChildIndex(this ITest test) | ||
|  |         { | ||
|  |             var index = test.Properties["childIndex"]; | ||
|  |             return (int)index[0]; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool HasChildIndex(this ITest test) | ||
|  |         { | ||
|  |             var index = test.Properties["childIndex"]; | ||
|  |             return index.Count > 0; | ||
|  |         } | ||
|  | 
 | ||
|  |         private static string GetAncestorPath(ITest test) | ||
|  |         { | ||
|  |             var path = ""; | ||
|  |             var testParent = test.Parent; | ||
|  | 
 | ||
|  |             while (testParent != null && testParent.Parent != null && !string.IsNullOrEmpty(testParent.Name)) | ||
|  |             { | ||
|  |                 path = testParent.Name + "/" + path; | ||
|  |                 testParent = testParent.Parent; | ||
|  |             } | ||
|  | 
 | ||
|  |             return path; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetUniqueName(this ITest test) | ||
|  |         { | ||
|  |             var id = GetAncestorPath(test) + GetFullName(test); | ||
|  |             if (test.HasChildIndex()) | ||
|  |             { | ||
|  |                 var index = test.GetChildIndex(); | ||
|  |                 if (index >= 0) | ||
|  |                     id += index; | ||
|  |             } | ||
|  |             if (test.IsSuite) | ||
|  |             { | ||
|  |                 id += "[suite]"; | ||
|  |             } | ||
|  |             return id; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static int GetRetryIteration(this ITest test) | ||
|  |         { | ||
|  |             if (test.Properties.ContainsKey("retryIteration")) | ||
|  |             { | ||
|  |                 return test.Properties["retryIteration"].OfType<int>().First(); | ||
|  |             } | ||
|  | 
 | ||
|  |             return 0; | ||
|  |         } | ||
|  |          | ||
|  |         public static int GetRepeatIteration(this ITest test) | ||
|  |         { | ||
|  |             if (test.Properties.ContainsKey("repeatIteration")) | ||
|  |             { | ||
|  |                 return test.Properties["repeatIteration"].OfType<int>().First(); | ||
|  |             } | ||
|  | 
 | ||
|  |             return 0; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetFullName(this ITest test) | ||
|  |         { | ||
|  |             var typeInfo = test.TypeInfo ?? test.Parent?.TypeInfo ?? test.Tests.FirstOrDefault()?.TypeInfo; | ||
|  |             if (typeInfo == null) | ||
|  |             { | ||
|  |                 return "[" + test.Name + "]"; | ||
|  |             } | ||
|  | 
 | ||
|  |             var assemblyId = typeInfo.Assembly.GetName().Name; | ||
|  |             if (assemblyId == test.Name) | ||
|  |             { | ||
|  |                 return $"[{test.Name}]"; | ||
|  |             } | ||
|  | 
 | ||
|  |             return string.Format("[{0}][{1}]", assemblyId, test.FullName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetFullNameWithoutDllPath(this ITest test) | ||
|  |         { | ||
|  |             if (test.Parent == null) | ||
|  |             { | ||
|  |                 return string.Empty; | ||
|  |             } | ||
|  |             var typeInfo = test.TypeInfo ?? test.Parent?.TypeInfo; | ||
|  |             if (typeInfo == null && IsAssembly(test)) | ||
|  |             { | ||
|  |                 return test.Name; | ||
|  |             } | ||
|  | 
 | ||
|  |             return test.FullName; | ||
|  |         } | ||
|  | 
 | ||
|  |         private static bool IsAssembly(this ITest test) | ||
|  |         { | ||
|  |             return test.Parent.Parent == null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetSkipReason(this ITest test) | ||
|  |         { | ||
|  |             if (test.Properties.ContainsKey(PropertyNames.SkipReason)) | ||
|  |                 return (string)test.Properties.Get(PropertyNames.SkipReason); | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetParentId(this ITest test) | ||
|  |         { | ||
|  |             if (test.Parent != null) | ||
|  |                 return test.Parent.Id; | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetParentFullName(this ITest test) | ||
|  |         { | ||
|  |             if (test.Parent != null) | ||
|  |                 return test.Parent.FullName; | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string GetParentUniqueName(this ITest test) | ||
|  |         { | ||
|  |             if (test.Parent != null) | ||
|  |                 return GetUniqueName(test.Parent); | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         internal static string GetFullName(string testFullName, int childIndex) | ||
|  |         { | ||
|  |             return childIndex != -1 ? GetIndexedTestCaseName(testFullName, childIndex) : testFullName; | ||
|  |         } | ||
|  |         private static string GetIndexedTestCaseName(string fullName, int index) | ||
|  |         { | ||
|  |             var generatedTestSuffix = " GeneratedTestCase" + index; | ||
|  |             if (fullName.EndsWith(")")) | ||
|  |             { | ||
|  |                 // Test names from generated TestCaseSource look like Test(TestCaseSourceType) | ||
|  |                 // This inserts a unique test case index in the name, so that it becomes Test(TestCaseSourceType GeneratedTestCase0) | ||
|  |                 return fullName.Substring(0, fullName.Length - 1) + generatedTestSuffix + fullName[fullName.Length - 1]; | ||
|  |             } | ||
|  | 
 | ||
|  |             // In some cases there can be tests with duplicate names generated in other ways and they won't have () in their name | ||
|  |             // We just append a suffix at the end of the name in that case | ||
|  |             return fullName + generatedTestSuffix; | ||
|  |         } | ||
|  |     } | ||
|  | } |