package org.test4j.junit.filter.finder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.test4j.junit.annotations.AnnotationDefaultValue;
import org.test4j.junit.annotations.TestPath;
import org.test4j.junit.filter.SuiteType;
import org.test4j.tools.commons.StringHelper;
/**
* 在classpath中查找测试的过滤条件
*
* @author darui.wudr
*/
public class FilterCondiction {
private List<SuiteType> suiteTypes;
/**
* searchInJars Specify if you want to include jar files in the search
*/
private boolean searchInJars;
private List<String> positiveFilters;
private List<String> negationFilters;
private Class<?>[] includedBaseTypes;
private Class<?>[] excludedBaseTypes;
public FilterCondiction() {
this.searchInJars = AnnotationDefaultValue.DEFAULT_INCLUDE_JARS;
this.suiteTypes = Arrays.asList(AnnotationDefaultValue.DEFAULT_SUITE_TYPES);
this.includedBaseTypes = AnnotationDefaultValue.DEFAULT_INCLUDED_BASE_TYPES;
this.excludedBaseTypes = AnnotationDefaultValue.DEFAULT_EXCLUDED_BASES_TYPES;
this.setFilterPatterns(AnnotationDefaultValue.DEFAULT_CLASSNAME_FILTERS);
}
public FilterCondiction(boolean searchInJar, String[] patterns, SuiteType[] suiteTypes, Class<?>[] baseTypes,
Class<?>[] excludedBaseTypes) {
this.searchInJars = searchInJar;
this.suiteTypes = Arrays.asList(suiteTypes);
this.includedBaseTypes = baseTypes;
this.excludedBaseTypes = excludedBaseTypes;
this.setFilterPatterns(patterns);
}
public boolean isSearchInJars() {
return searchInJars;
}
public List<SuiteType> getSuiteTypes() {
return suiteTypes;
}
public List<String> getPositiveFilters() {
return positiveFilters;
}
public List<String> getNegationFilters() {
return negationFilters;
}
public Class<?>[] getIncludedBaseTypes() {
return includedBaseTypes;
}
public Class<?>[] getExcludedBaseTypes() {
return excludedBaseTypes;
}
/**
* filterPatterns A set of regex expression to specify the class names to
* include (included if any pattern matches); use null to include all test
* classes in all packages.
*
* @param filterPatterns
*/
private void setFilterPatterns(String[] filterPatterns) {
this.positiveFilters = new ArrayList<String>();
this.negationFilters = new ArrayList<String>();
if (filterPatterns == null) {
return;
}
for (String pattern : filterPatterns) {
String _pattern = StringHelper.trim(pattern);
if (StringHelper.isBlankOrNull(_pattern)) {
continue;
}
if (_pattern.startsWith("!")) {
_pattern = _pattern.substring(1).trim();
if (StringHelper.isBlankOrNull(_pattern)) {
continue;
}
String regex = convertToRegular(_pattern);
negationFilters.add(regex);
} else {
String regex = convertToRegular(_pattern);
positiveFilters.add(regex);
}
}
}
private String convertToRegular(String input) {
if (StringHelper.isBlankOrNull(input)) {
return ".*";
} else {
String regex = input.replaceAll("\\.", "\\\\.").replaceAll("\\*", ".*").replaceAll("\\?", ".");
return regex;
}
}
public void initFilters(TestPath testFilterAnnotation) {
if (testFilterAnnotation == null) {
return;
}
this.searchInJars = testFilterAnnotation.inJars();
this.suiteTypes = Arrays.asList(testFilterAnnotation.value());
this.includedBaseTypes = testFilterAnnotation.baseType().includes();
this.excludedBaseTypes = testFilterAnnotation.baseType().excludes();
String[] patterns = testFilterAnnotation.patterns();
this.setFilterPatterns(patterns);
}
}