NamespaceTreeBuilder
Class that can build a tree of automatic namespace
suites from a group of fixtures.
using System.Collections.Generic;
namespace NUnit.Framework.Internal.Builders
{
public class NamespaceTreeBuilder
{
private Dictionary<string, TestSuite> _namespaceIndex = new Dictionary<string, TestSuite>();
private TestSuite _globalInsertionPoint;
public TestSuite RootSuite { get; set; }
public NamespaceTreeBuilder(TestSuite rootSuite)
{
Guard.ArgumentNotNull(rootSuite, "rootSuite");
RootSuite = (_globalInsertionPoint = rootSuite);
}
public void Add(IList<Test> fixtures)
{
foreach (TestSuite fixture in fixtures) {
Add(fixture);
}
}
public void Add(TestSuite fixture)
{
string namespaceForFixture = GetNamespaceForFixture(fixture);
TestSuite namespaceSuite = GetNamespaceSuite(namespaceForFixture);
if (fixture is SetUpFixture)
AddSetUpFixture(fixture, namespaceSuite, namespaceForFixture);
else
namespaceSuite.Add(fixture);
}
private static string GetNamespaceForFixture(TestSuite fixture)
{
string text = fixture.FullName;
int num = text.IndexOfAny(new char[2] {
'[',
'('
});
if (num >= 0)
text = text.Substring(0, num);
num = text.LastIndexOf('.');
return (num > 0) ? text.Substring(0, num) : string.Empty;
}
private TestSuite GetNamespaceSuite(string ns)
{
Guard.ArgumentNotNull(ns, "ns");
if (ns == "")
return _globalInsertionPoint;
if (_namespaceIndex.ContainsKey(ns))
return _namespaceIndex[ns];
TestSuite testSuite = null;
int num = ns.LastIndexOf(".");
if (num == -1) {
testSuite = new TestSuite(ns);
_globalInsertionPoint.Add(testSuite);
} else {
string text = ns.Substring(0, num);
TestSuite namespaceSuite = GetNamespaceSuite(text);
string name = ns.Substring(num + 1);
testSuite = new TestSuite(text, name);
namespaceSuite.Add(testSuite);
}
_namespaceIndex[ns] = testSuite;
return testSuite;
}
private void AddSetUpFixture(TestSuite newSetupFixture, TestSuite containingSuite, string ns)
{
foreach (TestSuite test in containingSuite.Tests) {
newSetupFixture.Add(test);
}
containingSuite.Tests.Clear();
if (containingSuite is SetUpFixture || containingSuite is TestAssembly)
containingSuite.Add(newSetupFixture);
else {
TestSuite testSuite = (TestSuite)containingSuite.Parent;
if (testSuite == null) {
newSetupFixture.Name = RootSuite.Name;
RootSuite = newSetupFixture;
} else {
testSuite.Tests.Remove(containingSuite);
testSuite.Add(newSetupFixture);
}
}
_namespaceIndex[ns] = newSetupFixture;
if (ns == "")
_globalInsertionPoint = newSetupFixture;
}
}
}