WorkItemBuilder
WorkItemBuilder class knows how to build a tree of work items from a tree of tests
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal.Abstractions;
using NUnit.Framework.Internal.Extensions;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
namespace NUnit.Framework.Internal.Execution
{
public static class WorkItemBuilder
{
private class WorkItemOrderComparer : IComparer<WorkItem>
{
[System.Runtime.CompilerServices.NullableContext(2)]
public int Compare(WorkItem x, WorkItem y)
{
if (x == null && y == null)
return 0;
if (x == null)
return -1;
if (y == null)
return 1;
int num = x.Test.Properties.TryGet("Order", 2147483647);
int value = y.Test.Properties.TryGet("Order", 2147483647);
return num.CompareTo(value);
}
}
[System.Runtime.CompilerServices.NullableContext(1)]
[return: System.Runtime.CompilerServices.Nullable(2)]
public static WorkItem CreateWorkItem(ITest test, ITestFilter filter, bool recursive = false)
{
return CreateWorkItem(test, filter, new DebuggerProxy(), recursive, true);
}
[System.Runtime.CompilerServices.NullableContext(1)]
[return: System.Runtime.CompilerServices.Nullable(2)]
internal static WorkItem CreateWorkItem(ITest test, ITestFilter filter, IDebugger debugger, bool recursive = false, bool root = true)
{
TestSuite testSuite = test as TestSuite;
if (testSuite == null) {
if (root || filter.Pass(test))
return new SimpleWorkItem((TestMethod)test, filter, debugger);
return null;
}
CompositeWorkItem compositeWorkItem = root ? new CompositeWorkItem(testSuite, filter) : null;
if (recursive) {
int num = 0;
foreach (ITest test2 in testSuite.Tests) {
WorkItem workItem = CreateWorkItem(test2, filter, debugger, recursive, false);
if (workItem != null) {
if (compositeWorkItem == null)
compositeWorkItem = new CompositeWorkItem(testSuite, filter);
if (workItem.TargetApartment == ApartmentState.Unknown && compositeWorkItem.TargetApartment != ApartmentState.Unknown)
workItem.TargetApartment = compositeWorkItem.TargetApartment;
if (test2.Properties.ContainsKey("Order")) {
compositeWorkItem.Children.Insert(0, workItem);
num++;
} else
compositeWorkItem.Children.Add(workItem);
}
}
if (num > 0)
compositeWorkItem.Children.Sort(0, num, new WorkItemOrderComparer());
}
return compositeWorkItem;
}
}
}