195 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			195 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEditor.TestTools.TestRunner.Api; | ||
|  | using UnityEngine; | ||
|  | 
 | ||
|  | namespace UnityEditor.TestTools.TestRunner.GUI | ||
|  | { | ||
|  |     [Serializable] | ||
|  |     internal class TestRunnerResult : UITestRunnerFilter.IClearableResult | ||
|  |     { | ||
|  |         public string id; | ||
|  |         public string uniqueId; | ||
|  |         public string name; | ||
|  |         public string fullName; | ||
|  |         public ResultStatus resultStatus = ResultStatus.NotRun; | ||
|  |         public float duration; | ||
|  |         public string messages; | ||
|  |         public string output; | ||
|  |         public string stacktrace; | ||
|  |         public bool notRunnable; | ||
|  |         public bool ignoredOrSkipped; | ||
|  |         public string description; | ||
|  |         public bool isSuite; | ||
|  |         public List<string> categories; | ||
|  |         public string parentId; | ||
|  |         public string parentUniqueId; | ||
|  | 
 | ||
|  |         //This field is suppose to mark results from before domain reload | ||
|  |         //Such result is outdated because the code might haev changed | ||
|  |         //This field will get reset every time a domain reload happens | ||
|  |         [NonSerialized] | ||
|  |         public bool notOutdated; | ||
|  | 
 | ||
|  |         protected Action<TestRunnerResult> m_OnResultUpdate; | ||
|  | 
 | ||
|  |         internal TestRunnerResult(ITestAdaptor test) | ||
|  |         { | ||
|  |             id = test.Id; | ||
|  |             uniqueId = test.UniqueName; | ||
|  | 
 | ||
|  |             fullName = test.FullName; | ||
|  |             name = test.Name; | ||
|  |             description = test.Description; | ||
|  |             isSuite = test.IsSuite; | ||
|  | 
 | ||
|  |             ignoredOrSkipped = test.RunState == RunState.Ignored || test.RunState == RunState.Skipped; | ||
|  |             notRunnable = test.RunState == RunState.NotRunnable; | ||
|  | 
 | ||
|  |             if (ignoredOrSkipped) | ||
|  |             { | ||
|  |                 resultStatus = ResultStatus.Skipped; | ||
|  |                 messages = test.SkipReason; | ||
|  |             } | ||
|  |             if (notRunnable) | ||
|  |             { | ||
|  |                 resultStatus = ResultStatus.Failed; | ||
|  |                 messages = test.SkipReason; | ||
|  |             } | ||
|  |             categories = test.Categories.ToList(); | ||
|  |             parentId = test.ParentId; | ||
|  |             parentUniqueId = test.ParentUniqueName; | ||
|  |         } | ||
|  | 
 | ||
|  |         internal TestRunnerResult(ITestResultAdaptor testResult) : this(testResult.Test) | ||
|  |         { | ||
|  |             notOutdated = true; | ||
|  | 
 | ||
|  |             messages = testResult.Message; | ||
|  |             output = testResult.Output; | ||
|  |             stacktrace = testResult.StackTrace; | ||
|  |             duration = (float)testResult.Duration; | ||
|  |             if (testResult.Test.IsSuite && testResult.ResultState == "Ignored") | ||
|  |             { | ||
|  |                 resultStatus = ResultStatus.Passed; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 resultStatus = ParseNUnitResultStatus(testResult.TestStatus); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void CalculateParentResult(string parentId, IDictionary<string, List<TestRunnerResult>> results) | ||
|  |         { | ||
|  |             if (results == null) return; | ||
|  |             results.TryGetValue(parentId , out var childrenResult); | ||
|  |             if (childrenResult == null) return; | ||
|  |             if (childrenResult.TrueForAll(x => x.resultStatus == ResultStatus.Passed)) resultStatus = ResultStatus.Passed; | ||
|  |             if (childrenResult.TrueForAll(x => x.resultStatus == ResultStatus.Skipped)) resultStatus = ResultStatus.Skipped; | ||
|  |             else if (childrenResult.Any(x => x.resultStatus == ResultStatus.Skipped)) | ||
|  |             { | ||
|  |                 resultStatus = ResultStatus.Passed; | ||
|  |             } | ||
|  |             if (childrenResult.Any(x => x.resultStatus == ResultStatus.Inconclusive)) resultStatus = ResultStatus.Inconclusive; | ||
|  |             if (childrenResult.Any(x => x.resultStatus == ResultStatus.Failed)) resultStatus = ResultStatus.Failed; | ||
|  |             if (childrenResult.Any(x => x.resultStatus == ResultStatus.NotRun)) resultStatus = ResultStatus.NotRun; | ||
|  |             UpdateParentResult(results); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void CalculateAndSetParentDuration(string parentId, IDictionary<string, List<TestRunnerResult>> results) | ||
|  |         { | ||
|  |             if (results == null) return; | ||
|  |             results.TryGetValue(parentId , out var childrenResult); | ||
|  |             if (childrenResult == null) return; | ||
|  |             var totalDuration = childrenResult.Sum(x => x.duration); | ||
|  |             duration = (float)totalDuration; | ||
|  |         } | ||
|  | 
 | ||
|  |         private void UpdateParentResult(IDictionary<string, List<TestRunnerResult>> results) | ||
|  |         { | ||
|  |             if (string.IsNullOrEmpty(parentUniqueId)) return; | ||
|  |             results.TryGetValue(parentUniqueId, out var parentResultList); | ||
|  |             if (parentResultList != null && parentResultList.Count > 0) | ||
|  |             { | ||
|  |                 parentResultList.Add(this); | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 results.Add(parentUniqueId, new List<TestRunnerResult> {this}); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Update(TestRunnerResult result) | ||
|  |         { | ||
|  |             if (ReferenceEquals(result, null)) | ||
|  |                 return; | ||
|  |             resultStatus = result.resultStatus; | ||
|  |             duration = result.duration; | ||
|  |             messages = result.messages; | ||
|  |             output = result.output; | ||
|  |             stacktrace = result.stacktrace; | ||
|  |             ignoredOrSkipped = result.ignoredOrSkipped; | ||
|  |             notRunnable = result.notRunnable; | ||
|  |             description = result.description; | ||
|  |             notOutdated = result.notOutdated; | ||
|  |             if (m_OnResultUpdate != null) | ||
|  |             { | ||
|  |                 m_OnResultUpdate(this); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void SetResultChangedCallback(Action<TestRunnerResult> resultUpdated) | ||
|  |         { | ||
|  |             m_OnResultUpdate = resultUpdated; | ||
|  |         } | ||
|  | 
 | ||
|  |         [Serializable] | ||
|  |         internal enum ResultStatus | ||
|  |         { | ||
|  |             NotRun, | ||
|  |             Passed, | ||
|  |             Failed, | ||
|  |             Inconclusive, | ||
|  |             Skipped | ||
|  |         } | ||
|  | 
 | ||
|  |         private static ResultStatus ParseNUnitResultStatus(TestStatus status) | ||
|  |         { | ||
|  |             switch (status) | ||
|  |             { | ||
|  |                 case TestStatus.Passed: | ||
|  |                     return ResultStatus.Passed; | ||
|  |                 case TestStatus.Failed: | ||
|  |                     return ResultStatus.Failed; | ||
|  |                 case TestStatus.Inconclusive: | ||
|  |                     return ResultStatus.Inconclusive; | ||
|  |                 case TestStatus.Skipped: | ||
|  |                     return ResultStatus.Skipped; | ||
|  |                 default: | ||
|  |                     return ResultStatus.NotRun; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override string ToString() | ||
|  |         { | ||
|  |             return string.Format("{0} ({1})", name, fullName); | ||
|  |         } | ||
|  | 
 | ||
|  |         public string Id { get { return uniqueId; } } | ||
|  |         public string FullName { get { return fullName; } } | ||
|  |         public string ParentId { get { return parentUniqueId; } } | ||
|  |         public bool IsSuite { get { return isSuite; } } | ||
|  |         public List<string> Categories { get { return categories; } } | ||
|  | 
 | ||
|  |         public void Clear() | ||
|  |         { | ||
|  |             resultStatus = ResultStatus.NotRun; | ||
|  |             stacktrace = string.Empty; | ||
|  |             duration = 0.0f; | ||
|  |             if (m_OnResultUpdate != null) | ||
|  |                 m_OnResultUpdate(this); | ||
|  |         } | ||
|  |     } | ||
|  | } |