linux-packaging-mono/mcs/nunit24/NUnitCore/core/NamespaceTreeBuilder.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

166 lines
4.8 KiB
C#

// ****************************************************************
// This is free software licensed under the NUnit license. You
// may obtain a copy of the license as well as information regarding
// copyright ownership at http://nunit.org/?p=license&r=2.4.
// ****************************************************************
using System.Collections;
namespace NUnit.Core
{
/// <summary>
/// Class that can build a tree of automatic namespace
/// suites from a group of fixtures.
/// </summary>
public class NamespaceTreeBuilder
{
#region Instance Variables
/// <summary>
/// Hashtable of all test suites we have created to represent namespaces.
/// Used to locate namespace parent suites for fixtures.
/// </summary>
Hashtable namespaceSuites = new Hashtable();
/// <summary>
/// The root of the test suite being created by this builder.
/// </summary>
TestSuite rootSuite;
#endregion
#region Constructor
public NamespaceTreeBuilder( TestSuite rootSuite )
{
this.rootSuite = rootSuite;
}
#endregion
#region Properties
public TestSuite RootSuite
{
get { return rootSuite; }
}
#endregion
#region Public Methods
public void Add( IList fixtures )
{
foreach (TestSuite fixture in fixtures)
//if (fixture is SetUpFixture)
// Add(fixture as SetUpFixture);
//else
Add( fixture );
}
public void Add( TestSuite fixture )
{
string ns = fixture.TestName.FullName;
int index = ns.LastIndexOf( '.' );
ns = index > 0 ? ns.Substring( 0, index ) : string.Empty;
TestSuite containingSuite = BuildFromNameSpace( ns );
if (fixture is SetUpFixture)
{
// The SetUpFixture must replace the namespace suite
// in which it is "contained".
//
// First, add the old suite's children
foreach (TestSuite child in containingSuite.Tests)
fixture.Add(child);
// Make the parent of the containing suite point to this
// fixture instead
// TODO: Get rid of this somehow?
TestSuite parent = (TestSuite)containingSuite.Parent;
if (parent == null)
{
fixture.TestName.Name = rootSuite.TestName.Name;
rootSuite = fixture;
}
else
{
parent.Tests.Remove(containingSuite);
parent.Add(fixture);
}
// Update the hashtable
namespaceSuites[ns] = fixture;
}
else
containingSuite.Add( fixture );
}
//public void Add( SetUpFixture fixture )
//{
// string ns = fixture.FullName;
// int index = ns.LastIndexOf( '.' );
// ns = index > 0 ? ns.Substring( 0, index ) : string.Empty;
// TestSuite suite = BuildFromNameSpace( ns );
// // Make the parent point to this instead
// // TODO: Get rid of this somehow?
// TestSuite parent = suite.Parent;
// if ( parent != null )
// {
// parent.Tests.Remove( suite );
// parent.Add( fixture );
// }
// // Add the old suite's children
// foreach( TestSuite child in suite.Tests )
// fixture.Add( child );
// if (parent == null && fixture is SetUpFixture)
// {
// suite.Tests.Clear();
// suite.Add(fixture);
// }
// // Update the hashtable
// namespaceSuites[ns] = fixture;
//}
#endregion
#region Helper Method
private TestSuite BuildFromNameSpace( string nameSpace )
{
if( nameSpace == null || nameSpace == "" ) return rootSuite;
TestSuite suite = (TestSuite)namespaceSuites[nameSpace];
if(suite!=null) return suite;
int index = nameSpace.LastIndexOf(".");
//string prefix = string.Format( "[{0}]" );
if( index == -1 )
{
suite = new TestSuite( nameSpace );
if ( rootSuite == null )
rootSuite = suite;
else
rootSuite.Add(suite);
namespaceSuites[nameSpace]=suite;
}
else
{
string parentNameSpace = nameSpace.Substring( 0,index );
TestSuite parent = BuildFromNameSpace( parentNameSpace );
string suiteName = nameSpace.Substring( index+1 );
suite = new TestSuite( parentNameSpace, suiteName );
parent.Add( suite );
namespaceSuites[nameSpace] = suite;
}
return suite;
}
#endregion
}
}