// Path: main/com/dhemery/runtimesuite/ClassFilter.java
// public interface ClassFilter {
// 	/**
// 	 * Indicates whether a class satisfies this filter's criteria.
// 	 * @param candidateClass the class to evaluate against this filter's criteria.
// 	 * @return {@code true} only if {@code candidateClass} satisfies this filter's criteria.
// 	 */
// 	boolean passes(Class<?> candidateClass);
// }
// 
// Path: main/com/dhemery/runtimesuite/filters/ExcludeClassCategories.java
// public class ExcludeClassCategories implements ClassFilter {
// 	private final CategoryMatcher<Class<?>> matcher;
// 
// 	/**
// 	 * @param disallowedCategories the list of categories rejected by this filter.
// 	 */
// 	public ExcludeClassCategories(Class<?>...disallowedCategories) {
// 		matcher = new CategoryMatcher<Class<?>>(disallowedCategories);
// 	}
// 
// 	/**
// 	 * Rejects the class if it is in a disallowed category.
// 	 * @param candidateClass the class to evaluate.
// 	 * @return {@code false} if {@code #candidateClass} is in a disallowed category,
// 	 * otherwise {@code true}. 
// 	 */
// 	public boolean passes(Class<?> candidateClass) {
// 		return !matcher.hasMatchingCategory(candidateClass);
// 	}
// }
// 
// Path: examples/example/categories/CategoryA.java
// public interface CategoryA {}
// 
// Path: examples/example/categories/CategoryB.java
// public interface CategoryB {}
// 
// Path: examples/example/tests/ClassInCategoriesAandB.java
// @Category({CategoryA.class, CategoryB.class})
// public class ClassInCategoriesAandB {}
// 
// Path: examples/example/tests/ClassInCategoriesCandD.java
// @Category({CategoryC.class, CategoryD.class})
// public class ClassInCategoriesCandD {}
// 
// Path: examples/example/tests/ClassInCategoryA.java
// @Category(CategoryA.class)
// public class ClassInCategoryA {}
// 
// Path: examples/example/tests/ClassInCategoryB.java
// @Category(CategoryB.class)
// public class ClassInCategoryB {}
// 
// Path: examples/example/tests/ClassWithNoCategories.java
// public class ClassWithNoCategories {}


import org.junit.Test;
import static org.junit.Assert.*;
import com.dhemery.runtimesuite.ClassFilter;
import com.dhemery.runtimesuite.filters.ExcludeClassCategories;
import example.categories.CategoryA;
import example.categories.CategoryB;
import example.tests.ClassInCategoriesAandB;
import example.tests.ClassInCategoriesCandD;
import example.tests.ClassInCategoryA;
import example.tests.ClassInCategoryB;
import example.tests.ClassWithNoCategories;
package com.dhemery.runtimesuite.tests;







public class AnExcludeClassCategoriesFilter {
	@Test
	public void withAnEmptyCategoryList_passesAllClasses() {
		ClassFilter filter = new ExcludeClassCategories();
		assertTrue(filter.passes(ClassWithNoCategories.class));
		assertTrue(filter.passes(ClassInCategoryA.class));
		assertTrue(filter.passes(ClassInCategoryB.class));
		assertTrue(filter.passes(ClassInCategoriesAandB.class));
	}

	@Test
	public void forASingleCategory_passesEachClassThatLacksThatCategory() {
// Path: main/com/dhemery/runtimesuite/ClassFilter.java
// public interface ClassFilter {
// 	/**
// 	 * Indicates whether a class satisfies this filter's criteria.
// 	 * @param candidateClass the class to evaluate against this filter's criteria.
// 	 * @return {@code true} only if {@code candidateClass} satisfies this filter's criteria.
// 	 */
// 	boolean passes(Class<?> candidateClass);
// }
// 
// Path: main/com/dhemery/runtimesuite/filters/ExcludeClassCategories.java
// public class ExcludeClassCategories implements ClassFilter {
// 	private final CategoryMatcher<Class<?>> matcher;
// 
// 	/**
// 	 * @param disallowedCategories the list of categories rejected by this filter.
// 	 */
// 	public ExcludeClassCategories(Class<?>...disallowedCategories) {
// 		matcher = new CategoryMatcher<Class<?>>(disallowedCategories);
// 	}
// 
// 	/**
// 	 * Rejects the class if it is in a disallowed category.
// 	 * @param candidateClass the class to evaluate.
// 	 * @return {@code false} if {@code #candidateClass} is in a disallowed category,
// 	 * otherwise {@code true}. 
// 	 */
// 	public boolean passes(Class<?> candidateClass) {
// 		return !matcher.hasMatchingCategory(candidateClass);
// 	}
// }
// 
// Path: examples/example/categories/CategoryA.java
// public interface CategoryA {}
// 
// Path: examples/example/categories/CategoryB.java
// public interface CategoryB {}
// 
// Path: examples/example/tests/ClassInCategoriesAandB.java
// @Category({CategoryA.class, CategoryB.class})
// public class ClassInCategoriesAandB {}
// 
// Path: examples/example/tests/ClassInCategoriesCandD.java
// @Category({CategoryC.class, CategoryD.class})
// public class ClassInCategoriesCandD {}
// 
// Path: examples/example/tests/ClassInCategoryA.java
// @Category(CategoryA.class)
// public class ClassInCategoryA {}
// 
// Path: examples/example/tests/ClassInCategoryB.java
// @Category(CategoryB.class)
// public class ClassInCategoryB {}
// 
// Path: examples/example/tests/ClassWithNoCategories.java
// public class ClassWithNoCategories {}


// Path: test/com/dhemery/runtimesuite/tests/AnExcludeClassCategoriesFilter.java
import org.junit.Test;
import static org.junit.Assert.*;
import com.dhemery.runtimesuite.ClassFilter;
import com.dhemery.runtimesuite.filters.ExcludeClassCategories;
import example.categories.CategoryA;
import example.categories.CategoryB;
import example.tests.ClassInCategoriesAandB;
import example.tests.ClassInCategoriesCandD;
import example.tests.ClassInCategoryA;
import example.tests.ClassInCategoryB;
import example.tests.ClassWithNoCategories;

package com.dhemery.runtimesuite.tests;







public class AnExcludeClassCategoriesFilter {
	@Test
	public void withAnEmptyCategoryList_passesAllClasses() {
		ClassFilter filter = new ExcludeClassCategories();
		assertTrue(filter.passes(ClassWithNoCategories.class));
		assertTrue(filter.passes(ClassInCategoryA.class));
		assertTrue(filter.passes(ClassInCategoryB.class));
		assertTrue(filter.passes(ClassInCategoriesAandB.class));
	}

	@Test
	public void forASingleCategory_passesEachClassThatLacksThatCategory() {
		ClassFilter filter = new ExcludeClassCategories(CategoryA.class);