| // Copyright 2010 The Bazel Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.testing.junit.junit4.runner; |
| |
| import java.util.regex.Pattern; |
| import org.junit.runner.Description; |
| import org.junit.runner.manipulation.Filter; |
| |
| /** |
| * Filter that filters out test cases that either matches or does not match a specified regular |
| * expression. |
| */ |
| public final class RegExTestCaseFilter extends Filter { |
| private static final String TEST_NAME_FORMAT = "%s#%s"; |
| |
| private final Pattern pattern; |
| private final boolean isNegated; |
| |
| /** |
| * Returns a filter that evaluates to {@code true} if the test case description matches |
| * specified regular expression. Otherwise, returns {@code false}. |
| */ |
| public static RegExTestCaseFilter include(String regularExpression) { |
| return new RegExTestCaseFilter(regularExpression, false); |
| } |
| |
| /** |
| * Returns a filter that evaluates to {@code false} if the test case description matches |
| * specified regular expression. Otherwise, returns {@code true}. |
| */ |
| public static RegExTestCaseFilter exclude(String regularExpression) { |
| return new RegExTestCaseFilter(regularExpression, true); |
| } |
| |
| private RegExTestCaseFilter(String regularExpression, boolean isNegated) { |
| this.isNegated = isNegated; |
| this.pattern = Pattern.compile(regularExpression); |
| } |
| |
| @Override |
| public boolean shouldRun(Description description) { |
| if (description.isSuite()) { |
| return true; |
| } |
| |
| boolean match = pattern.matcher(formatDescriptionName(description)).find(); |
| return isNegated ? !match : match; |
| } |
| |
| @Override |
| public String describe() { |
| return String.format("%sRegEx[%s]", isNegated ? "NOT " : "", pattern.toString()); |
| } |
| |
| private static String formatDescriptionName(Description description) { |
| String methodName = (description.getMethodName() == null) ? "" : description.getMethodName(); |
| |
| String className = (description.getClassName() == null) ? "" : description.getClassName(); |
| if (methodName.trim().isEmpty() || className.trim().isEmpty()) { |
| return description.getDisplayName(); |
| } |
| return String.format(TEST_NAME_FORMAT, className, methodName); |
| } |
| } |