UnityGame/Library/PackageCache/com.unity.test-framework/UnityEditor.TestRunner/GUI/TestRunnerResult.cs

184 lines
6.3 KiB
C#
Raw Normal View History

2024-10-27 10:53:47 +03:00
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)
{
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;
UpdateParentResult(results);
}
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 && !result.isSuite)
{
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);
}
}
}