/******************************************************************************* * Copyright (c) 2009 SpringSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andrew Eisenberg - initial API and implementation * Andrew Eisenberg <andrew@eisenberg.as> - [JUnit] Rerun failed first does not work with JUnit4 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=140392 *******************************************************************************/ package org.eclipse.jdt.junit.tests; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.Description; import org.junit.runner.RunWith; import org.junit.runner.Runner; import org.junit.runner.manipulation.Sorter; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.Suite; import org.junit.runners.model.InitializationError; import org.junit.runners.model.RunnerBuilder; import org.eclipse.jdt.internal.junit4.runner.FailuresFirstSorter; /** * Tests for FailuresFirstSorter in org.eclipse.jdt.junit4.runtime. * * @since 3.6 */ @SuppressWarnings("nls") public class RerunFailFirstTests { static class Data { public static class T1 { public T1() { } @Test public void m1() { } @Test public void m2() { } @Test public void m3() { } } public static class T2 { public T2() { } @Test public void m1() { } @Test public void m2() { } @Test public void m3() { } } public static class T3 { public T3() { } @Test public void m1() { } @Test public void m2() { } @Test public void m3() { } } @RunWith(Suite.class) @Suite.SuiteClasses({ T1.class, T2.class, T3.class }) static class M0 { public M0() { } } } private Suite runner; @Before public void setUp() throws InitializationError { runner= new Suite(Data.M0.class, new RunnerBuilder() { @Override public Runner runnerForClass(Class<?> testClass) throws Throwable { return new BlockJUnit4ClassRunner(testClass); } }); } @Test public void noFailures() throws Exception { Assert.assertEquals("M0 T1 m2 m3 m1 T2 m2 m3 m1 T3 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } @Test public void noFailuresWithSorter() throws Exception { runner.sort(new Sorter(new FailuresFirstSorter(new String[0]))); Assert.assertEquals("M0 T1 m2 m3 m1 T2 m2 m3 m1 T3 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } @Test public void failuresWithSorter1() throws Exception { runner.sort(new Sorter(new FailuresFirstSorter(new String[] { "m2(" + Data.T1.class.getName() + ")" }))); Assert.assertEquals("M0 T1 m2 m3 m1 T2 m2 m3 m1 T3 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } @Test public void failuresWithSorter2() throws Exception { runner.sort(new Sorter(new FailuresFirstSorter(new String[] { "m1(" + Data.T1.class.getName() + ")" }))); Assert.assertEquals("M0 T1 m1 m2 m3 T2 m2 m3 m1 T3 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } @Test public void failuresWithSorter3() throws Exception { runner.sort(new Sorter(new FailuresFirstSorter(new String[] { "m1(" + Data.T2.class.getName() + ")" }))); Assert.assertEquals("M0 T2 m1 m2 m3 T1 m2 m3 m1 T3 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } @Test public void failuresWithSorter4() throws Exception { runner.sort(new Sorter(new FailuresFirstSorter( new String[] { "m1(" + Data.T2.class.getName() + ")", "m1(" + Data.T3.class.getName() + ")", "m3(" + Data.T2.class.getName() + ")" }))); Assert.assertEquals("M0 T2 m3 m1 m2 T3 m1 m2 m3 T1 m2 m3 m1 ", buildDescriptionOrder(runner.getDescription())); } private String buildDescriptionOrder(Description description) { StringBuilder sb= new StringBuilder(); String displayName= description.getDisplayName(); if (description.isSuite()) { int dollarIndex= displayName.lastIndexOf('$'); sb.append(displayName.substring(dollarIndex + 1, dollarIndex + 3)); } else { int parenIndex= displayName.indexOf('('); sb.append(displayName.substring(parenIndex - 2, parenIndex)); } sb.append(" "); for (Description child : description.getChildren()) { sb.append(buildDescriptionOrder(child)); } return sb.toString(); } }