using System;
using System.Collections;
namespace NUnit.Core
{
///
/// Summary description for CategoryFilter.
///
///
[Serializable]
public class CategoryFilter : Filter
{
ArrayList categories;
public CategoryFilter() : this( false ) { }
public CategoryFilter( bool exclude ) : base( exclude )
{
categories = new ArrayList();
}
public CategoryFilter( string name ) : this( name, false ) { }
public CategoryFilter( string name, bool exclude ) : base( exclude )
{
categories = new ArrayList();
categories.Add( name );
}
public CategoryFilter( string[] names ) : this( names, false ) { }
public CategoryFilter( string[] names, bool exclude ) : base( exclude )
{
categories = new ArrayList();
categories.AddRange( names );
}
public void AddCategory(string name)
{
categories.Add( name );
}
#region IFilter Members
public override bool Pass(TestSuite suite)
{
// return CheckCategories( suite ) ? !Exclude : Exclude;
if ( categories.Count == 0 ) return true;
bool pass = Exclude;
if (CheckCategories(suite))
return !Exclude;
foreach (Test test in suite.Tests)
{
if ( test.Filter(this) == !Exclude )
{
pass=true;
break;
}
}
return pass;
}
public override bool Pass(TestCase test)
{
if ( categories.Count == 0 )
return true;
return CheckCategories( test ) ? !Exclude : Exclude ;
// if (CheckCategories(test.Parent))
// return true;
//
// return CheckCategories(test);
}
#endregion
///
/// Method returns true if the test has a particular
/// category or if an ancestor test does. We don't
/// worry about whether this is an include or an
/// exclude filter at this point because only positive
/// categories are inherited, not their absence.
///
private bool CheckCategories(Test test)
{
return test.HasCategory( categories )
|| test.Parent != null
&& test.Parent.HasCategory( categories );
// if (test.Categories != null)
// {
// foreach (string name in categories)
// {
// if (test.Categories.Contains(name))
// return true;
// }
// }
//
// return false;
}
}
}