diff --git a/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java b/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java index 65a3c27cd04d..2a00e764b9ee 100644 --- a/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java +++ b/java/java-tests/testSrc/com/intellij/TestClassesFilterTest.java @@ -55,68 +55,71 @@ public class TestClassesFilterTest extends TestCase { "com.intellij.package6.ExcludedTest\n" + "com.intellij.package7.*package8"; - TestClassesFilter classesFilter = TestClassesFilter.createOn(new InputStreamReader(new ByteArrayInputStream(filterText.getBytes()))); - String group1Name = "Group1"; - assertTrue(classesFilter.matches("com.intellij.package1.Test", group1Name)); - assertTrue(classesFilter.matches("com.intellij.package1.Test2", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package2.Test", group1Name)); - assertTrue(classesFilter.matches("com.intellij.package2.ExcludedTest", group1Name)); - assertTrue(classesFilter.matches("com.intellij.package3.package4", group1Name)); - assertTrue(classesFilter.matches("com.intellij.package3.package5.package4", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package3", group1Name)); - assertFalse(classesFilter.matches("com.intellij", group1Name)); - assertFalse(classesFilter.matches("com.intellij.Test", group1Name)); + TestClassesFilter classesFilter = GroupBasedTestClassFilter + .createOn(new InputStreamReader(new ByteArrayInputStream(filterText.getBytes())), "Group1"); + assertTrue(classesFilter.matches("com.intellij.package1.Test")); + assertTrue(classesFilter.matches("com.intellij.package1.Test2")); + assertFalse(classesFilter.matches("com.intellij.package2.Test")); + assertTrue(classesFilter.matches("com.intellij.package2.ExcludedTest")); + assertTrue(classesFilter.matches("com.intellij.package3.package4")); + assertTrue(classesFilter.matches("com.intellij.package3.package5.package4")); + assertFalse(classesFilter.matches("com.intellij.package3")); + assertFalse(classesFilter.matches("com.intellij")); + assertFalse(classesFilter.matches("com.intellij.Test")); - assertFalse(classesFilter.matches("com.intellij.package5.Test", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package5.Test2", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package6.Test", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package6.ExcludedTest", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package7.package8", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package7.package5.package8", group1Name)); - assertFalse(classesFilter.matches("com.intellij.package7", group1Name)); + assertFalse(classesFilter.matches("com.intellij.package5.Test")); + assertFalse(classesFilter.matches("com.intellij.package5.Test2")); + assertFalse(classesFilter.matches("com.intellij.package6.Test")); + assertFalse(classesFilter.matches("com.intellij.package6.ExcludedTest")); + assertFalse(classesFilter.matches("com.intellij.package7.package8")); + assertFalse(classesFilter.matches("com.intellij.package7.package5.package8")); + assertFalse(classesFilter.matches("com.intellij.package7")); - String group2Name = "Group2"; - assertFalse(classesFilter.matches("com.intellij.package1.Test", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package1.Test2", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package2.Test", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package2.ExcludedTest", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package3.package4", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package3.package5.package4", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package3", group2Name)); - assertFalse(classesFilter.matches("com.intellij", group2Name)); - assertFalse(classesFilter.matches("com.intellij.Test", group2Name)); + classesFilter = GroupBasedTestClassFilter + .createOn(new InputStreamReader(new ByteArrayInputStream(filterText.getBytes())), "Group2"); + assertFalse(classesFilter.matches("com.intellij.package1.Test")); + assertFalse(classesFilter.matches("com.intellij.package1.Test2")); + assertFalse(classesFilter.matches("com.intellij.package2.Test")); + assertFalse(classesFilter.matches("com.intellij.package2.ExcludedTest")); + assertFalse(classesFilter.matches("com.intellij.package3.package4")); + assertFalse(classesFilter.matches("com.intellij.package3.package5.package4")); + assertFalse(classesFilter.matches("com.intellij.package3")); + assertFalse(classesFilter.matches("com.intellij")); + assertFalse(classesFilter.matches("com.intellij.Test")); - assertTrue(classesFilter.matches("com.intellij.package5.Test", group2Name)); - assertTrue(classesFilter.matches("com.intellij.package5.Test2", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package6.Test", group2Name)); - assertTrue(classesFilter.matches("com.intellij.package6.ExcludedTest", group2Name)); - assertTrue(classesFilter.matches("com.intellij.package7.package8", group2Name)); - assertTrue(classesFilter.matches("com.intellij.package7.package5.package8", group2Name)); - assertFalse(classesFilter.matches("com.intellij.package7", group2Name)); + assertTrue(classesFilter.matches("com.intellij.package5.Test")); + assertTrue(classesFilter.matches("com.intellij.package5.Test2")); + assertFalse(classesFilter.matches("com.intellij.package6.Test")); + assertTrue(classesFilter.matches("com.intellij.package6.ExcludedTest")); + assertTrue(classesFilter.matches("com.intellij.package7.package8")); + assertTrue(classesFilter.matches("com.intellij.package7.package5.package8")); + assertFalse(classesFilter.matches("com.intellij.package7")); - checkForNullGroup(classesFilter, null); - checkForNullGroup(classesFilter, TestClassesFilter.ALL_EXCLUDE_DEFINED); + checkForNullGroup(filterText, null); + checkForNullGroup(filterText, GroupBasedTestClassFilter.ALL_EXCLUDE_DEFINED); } - private static void checkForNullGroup(TestClassesFilter classesFilter, String group0Name) { - assertFalse(classesFilter.matches("com.intellij.package1.Test", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package1.Test2", group0Name)); - assertTrue(classesFilter.matches("com.intellij.package2.Test", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package2.ExcludedTest", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package3.package4", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package3.package5.package4", group0Name)); - assertTrue(classesFilter.matches("com.intellij.package3", group0Name)); - assertTrue(classesFilter.matches("com.intellij", group0Name)); - assertTrue(classesFilter.matches("com.intellij.Test", group0Name)); + private static void checkForNullGroup(String filterText, String group0Name) { + TestClassesFilter classesFilter = GroupBasedTestClassFilter.createOn(new InputStreamReader(new ByteArrayInputStream(filterText.getBytes())), group0Name); - assertFalse(classesFilter.matches("com.intellij.package5.Test", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package5.Test2", group0Name)); - assertTrue(classesFilter.matches("com.intellij.package6.Test", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package6.ExcludedTest", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package7.package8", group0Name)); - assertFalse(classesFilter.matches("com.intellij.package7.package5.package8", group0Name)); - assertTrue(classesFilter.matches("com.intellij.package7", group0Name)); + assertFalse(classesFilter.matches("com.intellij.package1.Test")); + assertFalse(classesFilter.matches("com.intellij.package1.Test2")); + assertTrue(classesFilter.matches("com.intellij.package2.Test")); + assertFalse(classesFilter.matches("com.intellij.package2.ExcludedTest")); + assertFalse(classesFilter.matches("com.intellij.package3.package4")); + assertFalse(classesFilter.matches("com.intellij.package3.package5.package4")); + assertTrue(classesFilter.matches("com.intellij.package3")); + assertTrue(classesFilter.matches("com.intellij")); + assertTrue(classesFilter.matches("com.intellij.Test")); + + assertFalse(classesFilter.matches("com.intellij.package5.Test")); + assertFalse(classesFilter.matches("com.intellij.package5.Test2")); + assertTrue(classesFilter.matches("com.intellij.package6.Test")); + assertFalse(classesFilter.matches("com.intellij.package6.ExcludedTest")); + assertFalse(classesFilter.matches("com.intellij.package7.package8")); + assertFalse(classesFilter.matches("com.intellij.package7.package5.package8")); + assertTrue(classesFilter.matches("com.intellij.package7")); } } diff --git a/platform/testFramework/src/com/intellij/GroupBasedTestClassFilter.java b/platform/testFramework/src/com/intellij/GroupBasedTestClassFilter.java new file mode 100644 index 000000000000..67d2c768af7a --- /dev/null +++ b/platform/testFramework/src/com/intellij/GroupBasedTestClassFilter.java @@ -0,0 +1,193 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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.intellij; + +import com.intellij.openapi.util.text.StringUtil; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Encapsulates logic of filtering test classes (classes that contain test-cases). + *
+ * We want to have such facility in order to be able to execute different sets of tests like'fast tests',
+ * 'problem tests' etc.
+ *
+ * I.e. assumed usage scenario is to create object of this class with necessary filtering criteria and use it's
+ * {@link #matches(String)} method for determining if particular test should be executed.
+ *
+ * The filtering is performed by fully-qualified test class name. There are two ways to define the criteria at the moment:
+ * TestClassesFilter object assuming that the given stream contains grouped test class filters
+ * at the following format:
+ *
+ * '[' symbol and ends with ']' symbol defines start
+ * of the new test group. That means that all test class filters that follows this line belongs to the same
+ * test group which name is defined by the text contained between '[' and ']'
+ * + * [CVS] + * com.intellij.cvsSupport2.* + * [STRESS_TESTS] + * com.intellij.application.InspectionPerformanceTest + * com.intellij.application.TraverseUITest + *+ * + * It defines two test groups: + *
'com.intellij.cvsSupport2.*';true if given test class name
+ * is matched with any test class name filter configured for the test group with the given name.
+ *
+ * Note: there is a special case processing when given group name is {@link #ALL_EXCLUDE_DEFINED}. This method
+ * returns true only if all registered patterns (for all test groups) don't match given test class name.
+ *
+ * @param className target test class name to check
+ * @return true if given test group name is defined (not null) and test class with given
+ * name belongs to the test group with given name;
+ * true if given group if undefined or equal to {@link #ALL_EXCLUDE_DEFINED} and given test
+ * class name is not matched by all registered patterns;
+ * false otherwise
+ */
+ @Override
+ public boolean matches(String className) {
+ boolean result = matchesAnyPattern(myTestGroupPatterns, className);
+ //null group means all patterns from each defined group should be excluded
+ if (isAllExcludeDefinedGroup(myTestGroupName)) {
+ return !result;
+ }
+ else {
+ return result;
+ }
+ }
+
+ private static boolean isAllExcludeDefinedGroup(String groupName) {
+ return StringUtil.isEmpty(groupName) || ALL_EXCLUDE_DEFINED.equalsIgnoreCase(groupName.trim());
+ }
+
+ private List'fast tests',
- * 'problem tests' etc.
- *
- * I.e. assumed usage scenario is to create object of this class with necessary filtering criteria and use it's
- * {@link #matches(String, String)} method for determining if particular test should be executed.
- *
- * The filtering is performed by fully-qualified test class name. There are two ways to define the criteria at the moment:
- * TestClassesFilter object with the given list of matching patterns (at regexp format).
- *
- * @param filterList list of test class matching patterns
- */
- TestClassesFilter(ListTestClassesFilter object assuming that the given stream contains grouped test class filters
- * at the following format:
- *
- * '[' symbol and ends with ']' symbol defines start
- * of the new test group. That means that all test class filters that follows this line belongs to the same
- * test group which name is defined by the text contained between '[' and ']'
- * - * [CVS] - * com.intellij.cvsSupport2.* - * [STRESS_TESTS] - * com.intellij.application.InspectionPerformanceTest - * com.intellij.application.TraverseUITest - *- * - * It defines two test groups: - *
'com.intellij.cvsSupport2.*';true if given test class name
- * is matched with any test class name filter configured for the test group with the given name.
- *
- * Note: there is a special case processing when given group name is {@link #ALL_EXCLUDE_DEFINED}. This method
- * returns true only if all registered patterns (for all test groups) don't match given test class name.
- *
- * @param className target test class name to check
- * @param groupName target test group name to check
- * @return true if given test group name is defined (not null) and test class with given
- * name belongs to the test group with given name;
- * true if given group if undefined or equal to {@link #ALL_EXCLUDE_DEFINED} and given test
- * class name is not matched by all registered patterns;
- * false otherwise
- */
- public boolean matches(String className, String groupName) {
- List