TestSuiteResult
Represents the result of running a test suite
using NUnit.Framework.Interfaces;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Internal
{
[NullableContext(1)]
[Nullable(0)]
public class TestSuiteResult : TestResult
{
private int _passCount;
private int _failCount;
private int _warningCount;
private int _skipCount;
private int _inconclusiveCount;
private int _totalCount;
private readonly ConcurrentQueue<ITestResult> _children = new ConcurrentQueue<ITestResult>();
public override int TotalCount {
get {
RwLock.EnterReadLock();
try {
return _totalCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override int FailCount {
get {
RwLock.EnterReadLock();
try {
return _failCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override int PassCount {
get {
RwLock.EnterReadLock();
try {
return _passCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override int WarningCount {
get {
RwLock.EnterReadLock();
try {
return _warningCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override int SkipCount {
get {
RwLock.EnterReadLock();
try {
return _skipCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override int InconclusiveCount {
get {
RwLock.EnterReadLock();
try {
return _inconclusiveCount;
} finally {
RwLock.ExitReadLock();
}
}
}
public override bool HasChildren => !_children.IsEmpty;
public override IEnumerable<ITestResult> Children => _children;
public TestSuiteResult(TestSuite suite)
: base(suite)
{
}
public virtual void AddResult(ITestResult result)
{
_children.Enqueue(result);
RwLock.EnterWriteLock();
try {
MergeChildResult(result);
} finally {
RwLock.ExitWriteLock();
}
}
private void MergeChildResult(ITestResult childResult)
{
if (base.ResultState != ResultState.Cancelled)
UpdateResultState(childResult.ResultState);
InternalAssertCount += childResult.AssertCount;
_passCount += childResult.PassCount;
_failCount += childResult.FailCount;
_warningCount += childResult.WarningCount;
_skipCount += childResult.SkipCount;
_inconclusiveCount += childResult.InconclusiveCount;
_totalCount += childResult.PassCount + childResult.FailCount + childResult.SkipCount + childResult.InconclusiveCount + childResult.WarningCount;
}
private void UpdateResultState(ResultState childResultState)
{
switch (childResultState.Status) {
case TestStatus.Passed:
if (base.ResultState.Status == TestStatus.Inconclusive)
SetResult(ResultState.Success);
break;
case TestStatus.Warning:
if (base.ResultState.Status == TestStatus.Inconclusive || base.ResultState.Status == TestStatus.Passed)
SetResult(ResultState.ChildWarning, TestResult.CHILD_WARNINGS_MESSAGE);
break;
case TestStatus.Failed:
if (childResultState.Label == "Cancelled")
SetResult(ResultState.Cancelled, "Test run cancelled by user");
else if (base.ResultState.Status != TestStatus.Failed) {
SetResult(ResultState.ChildFailure, TestResult.CHILD_ERRORS_MESSAGE);
}
break;
case TestStatus.Skipped:
if (childResultState.Label == "Ignored" && (base.ResultState.Status == TestStatus.Inconclusive || base.ResultState.Status == TestStatus.Passed))
SetResult(ResultState.ChildIgnored, TestResult.CHILD_IGNORE_MESSAGE);
break;
}
}
}
}