// ****************************************************************
// Copyright 2007, Charlie Poole
// This is free software licensed under the NUnit license. You may
// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
// ****************************************************************
using System;
using System.Collections;
using System.Collections.Specialized;
namespace NUnit.Core
{
///
/// TestInfo holds common info about a test. It represents only
/// a single test or a suite and contains no references to other
/// tests. Since it is informational only, it can easily be passed
/// around using .Net remoting.
///
/// TestInfo is used directly in all EventListener events and in
/// TestResults. It contains an ID, which can be used by a
/// runner to locate the actual test.
///
/// TestInfo also serves as the base class for TestNode, which
/// adds hierarchical information and is used in client code to
/// maintain a visible image of the structure of the tests.
///
[Serializable]
public class TestInfo : ITest
{
#region Instance Variables
///
/// TestName that identifies this test
///
private TestName testName;
private string testType;
private RunState runState;
///
/// Reason for not running the test
///
private string ignoreReason;
///
/// Number of test cases in this test or suite
///
private int testCaseCount;
///
/// True if this is a suite
///
private bool isSuite;
///
/// The test description
///
private string description;
///
/// A list of all the categories assigned to a test
///
private ArrayList categories = new ArrayList();
///
/// A dictionary of properties, used to add information
/// to tests without requiring the class to change.
///
private ListDictionary properties = new ListDictionary();
#endregion
#region Constructors
///
/// Construct from an ITest
///
/// Test from which a TestNode is to be constructed
public TestInfo( ITest test )
{
this.testName = (TestName)test.TestName.Clone();
this.testType = test.TestType;
this.runState = test.RunState;
this.ignoreReason = test.IgnoreReason;
this.description = test.Description;
this.isSuite = test.IsSuite;
if (test.Categories != null)
this.categories.AddRange(test.Categories);
if (test.Properties != null)
{
this.properties = new ListDictionary();
foreach( DictionaryEntry entry in test.Properties )
this.properties.Add( entry.Key, entry.Value );
}
this.testCaseCount = test.TestCount;
}
///
/// Construct as a parent to multiple tests.
///
/// The name to use for the new test
/// An array of child tests
public TestInfo( TestName testName, ITest[] tests )
{
this.testName = testName;
this.testType = "Test Project";
this.runState = RunState.Runnable;
this.ignoreReason = null;
this.description = null;
this.isSuite = true;
foreach( ITest test in tests )
{
this.testCaseCount += test.TestCount;
}
}
#endregion
#region Properties
///
/// Gets the completely specified name of the test
/// encapsulated in a TestName object.
///
public TestName TestName
{
get { return testName; }
}
///
/// Gets a string representing the kind of test this
/// object represents for display purposes.
///
public string TestType
{
get { return testType; }
}
///
/// The test description
///
public string Description
{
get { return description; }
set { description = value; }
}
///
/// Gets the RunState for this test
///
public RunState RunState
{
get { return runState; }
set { runState = value; }
}
///
/// The reason for ignoring a test
///
public string IgnoreReason
{
get { return ignoreReason; }
set { ignoreReason = value; }
}
///
/// Count of test cases in this test.
///
public int TestCount
{
get { return testCaseCount; }
}
///
/// Gets the parent test of this test
///
public virtual ITest Parent
{
get { return null; }
}
///
/// Gets a list of the categories applied to this test
///
public IList Categories
{
get { return categories; }
}
///
/// Gets a list of any child tests
///
public virtual IList Tests
{
get { return null; }
}
///
/// True if this is a suite, false if a test case
///
public bool IsSuite
{
get { return isSuite; }
}
///
/// Gets the Properties dictionary for this test
///
public IDictionary Properties
{
get
{
if ( properties == null )
properties = new ListDictionary();
return properties;
}
}
#endregion
#region Methods
///
/// Counts the test cases that would be run if this
/// test were executed using the provided filter.
///
/// The filter to apply
/// A count of test cases
public virtual int CountTestCases(ITestFilter filter)
{
if (filter.IsEmpty)
return TestCount;
if (!isSuite)
return filter.Pass(this) ? 1 : 0;
int count = 0;
if (filter.Pass(this))
{
foreach (ITest test in Tests)
{
count += test.CountTestCases(filter);
}
}
return count;
}
#endregion
}
}