blob: 3da0f09e1c720bb799432a3f73548061622e0dc8 [file] [log] [blame]
/*
* 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.
*/
/*
* User: anna
* Date: 11-Jun-2009
*/
package com.intellij.junit4;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.junit.internal.runners.JUnit38ClassRunner;
import org.junit.internal.runners.SuiteMethod;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runners.ParentRunner;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import java.lang.reflect.Method;
import java.util.*;
class IdeaSuite extends Suite {
private final String myName;
public IdeaSuite(List runners, String name) throws InitializationError {
super(null, runners);
myName = name;
}
public IdeaSuite(final RunnerBuilder builder, Class[] classes, String name) throws InitializationError {
super(builder, classes);
myName = name;
}
public Description getDescription() {
Description description = Description.createSuiteDescription(myName, getTestClass().getAnnotations());
try {
final Method getFilteredChildrenMethod = ParentRunner.class.getDeclaredMethod("getFilteredChildren", new Class[0]);
getFilteredChildrenMethod.setAccessible(true);
Collection filteredChildren = (Collection)getFilteredChildrenMethod.invoke(this, new Object[0]);
for (Iterator iterator = filteredChildren.iterator(); iterator.hasNext();) {
Object child = iterator.next();
description.addChild(describeChild((Runner)child));
}
}
catch (Exception e) {
e.printStackTrace();
}
return description;
}
protected Description describeChild(Runner child) {
final Description superDescription = super.describeChild(child);
if (child instanceof ClassAwareSuiteMethod) {
final Description description = Description.createSuiteDescription(((ClassAwareSuiteMethod)child).getKlass());
ArrayList children = superDescription.getChildren();
for (int i = 0, size = children.size(); i < size; i++) {
description.addChild((Description)children.get(i));
}
return description;
}
return superDescription;
}
protected List getChildren() {
final List children = new ArrayList(super.getChildren());
final Set allNames = new HashSet();
for (Iterator iterator = children.iterator(); iterator.hasNext();) {
final Object child = iterator.next();
allNames.add(describeChild((Runner)child).getDisplayName());
}
for (Iterator iterator = children.iterator(); iterator.hasNext();) {
final Object child = iterator.next();
if (isSuite(child)) {
skipSuiteComponents(allNames, child);
}
}
for (Iterator iterator = children.iterator(); iterator.hasNext(); ) {
Object child = iterator.next();
if (!isSuite(child) && !allNames.contains(describeChild((Runner)child).getDisplayName())) {
iterator.remove();
}
}
return children;
}
private static boolean isSuite(Object child) {
return child instanceof Suite || child instanceof SuiteMethod;
}
private void skipSuiteComponents(Set allNames, Object child) {
try {
if (child instanceof Suite) {
final Method getChildrenMethod = Suite.class.getDeclaredMethod("getChildren", new Class[0]);
getChildrenMethod.setAccessible(true);
final List tests = (List)getChildrenMethod.invoke(child, new Object[0]);
for (Iterator suiteIterator = tests.iterator(); suiteIterator.hasNext();) {
final String displayName = describeChild((Runner)suiteIterator.next()).getDisplayName();
if (allNames.contains(displayName)) {
allNames.remove(displayName);
}
}
} else if (child instanceof SuiteMethod) {
final Method getChildrenMethod = JUnit38ClassRunner.class.getDeclaredMethod("getTest", new Class[0]);
getChildrenMethod.setAccessible(true);
final Test test = (Test)getChildrenMethod.invoke(child, new Object[0]);
if (test instanceof TestSuite) {
final Enumeration tests = ((TestSuite)test).tests();
while (tests.hasMoreElements()) {
final Test t = (Test)tests.nextElement();
if (t instanceof TestSuite) {
final String testDescription = ((TestSuite)t).getName();
if (allNames.contains(testDescription)) {
allNames.remove(testDescription);
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}