// **************************************************************** // 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 } }