TestSuiteResult
Represents the result of running a test suite
using NUnit.Framework.Interfaces;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
namespace NUnit.Framework.Internal
{
public class TestSuiteResult : TestResult
{
private int _passCount;
private int _failCount;
private int _warningCount;
private int _skipCount;
private int _inconclusiveCount;
private ConcurrentQueue<ITestResult> _children;
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)
{
_children = new ConcurrentQueue<ITestResult>();
}
public virtual void AddResult(ITestResult result)
{
ConcurrentQueue<ITestResult> concurrentQueue = Children as ConcurrentQueue<ITestResult>;
if (concurrentQueue != null)
concurrentQueue.Enqueue(result);
else {
IList<ITestResult> list = Children as IList<ITestResult>;
if (list == null)
throw new NotSupportedException("cannot add results to Children");
list.Add(result);
}
RwLock.EnterWriteLock();
try {
if (base.ResultState != ResultState.Cancelled) {
switch (result.ResultState.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(result.ResultState, TestResult.CHILD_WARNINGS_MESSAGE);
break;
case TestStatus.Failed:
if (base.ResultState.Status != TestStatus.Failed)
SetResult(ResultState.ChildFailure, TestResult.CHILD_ERRORS_MESSAGE);
break;
case TestStatus.Skipped:
if (result.ResultState.Label == "Ignored" && (base.ResultState.Status == TestStatus.Inconclusive || base.ResultState.Status == TestStatus.Passed))
SetResult(ResultState.Ignored, TestResult.CHILD_IGNORE_MESSAGE);
break;
}
}
InternalAssertCount += result.AssertCount;
_passCount += result.PassCount;
_failCount += result.FailCount;
_warningCount += result.WarningCount;
_skipCount += result.SkipCount;
_inconclusiveCount += result.InconclusiveCount;
} finally {
RwLock.ExitWriteLock();
}
}
}
}