diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/DefaultRunOrderCalculator.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/DefaultRunOrderCalculator.java index 3ca0a400b1..03f79beeba 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/DefaultRunOrderCalculator.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/DefaultRunOrderCalculator.java @@ -93,7 +93,60 @@ public Comparator comparatorForTestMethods() throw new IllegalStateException( "Unsupported number of runOrders. Expected 1. Got: " + runOrder.length ); } RunOrder methodRunOrder = runOrder[0]; - if ( RunOrder.TESTORDER.equals( methodRunOrder ) ) + if ( RunOrder.REVERSE_ALPHABETICAL.equals( methodRunOrder ) ) + { + String orderParam = parseTestOrder( System.getProperty( "test" ) ); + if ( orderParam == null ) + { + throw new IllegalStateException( "Please set system property -Dtest to use fixed order" ); + } + final LinkedHashMap> orders = new LinkedHashMap<>(); + for ( String s : orderParam.split( "," ) ) + { + String[] nameSplit = s.split( "#" ); + String className = nameSplit[0]; + String testName = nameSplit[1]; + String parenName = testName + "(" + className + ")"; + addTestToOrders( className, orders, parenName ); + } + return new Comparator() + { + + @Override + public int compare( String o1, String o2 ) + { + String className1 = o1; + String testName1 = o1; + if ( o1.contains( "(" ) ) + { + String[] nameSplit1 = o1.split( "\\(" ); + className1 = nameSplit1[1].substring( 0, nameSplit1[1].length() - 1 ); + testName1 = nameSplit1[0]; + addTestToOrders( className1, orders, o1 ); + } + + String className2 = o2; + String testName2 = o2; + if ( o2.contains( "(" ) ) + { + String[] nameSplit2 = o2.split( "\\(" ); + className2 = nameSplit2[1].substring( 0, nameSplit2[1].length() - 1 ); + testName2 = nameSplit2[0]; + addTestToOrders( className2, orders, o2 ); + } + + if ( ! className2.equals( className1 ) ) + { + return className2.compareTo( className1 ); + } + else + { + return testName2.compareTo( testName1 ); + } + } + }; + } + else if ( RunOrder.TESTORDER.equals( methodRunOrder ) ) { String orderParam = parseTestOrder( System.getProperty( "test" ) ); if ( orderParam == null ) diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/api/util/RunOrderCalculatorTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/RunOrderCalculatorTest.java index 63768cf03d..36b38ccc50 100644 --- a/surefire-api/src/test/java/org/apache/maven/surefire/api/util/RunOrderCalculatorTest.java +++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/RunOrderCalculatorTest.java @@ -21,6 +21,9 @@ import java.util.LinkedHashSet; import java.util.Set; +import java.util.List; +import java.util.ArrayList; +import java.util.Comparator; import org.apache.maven.surefire.api.testset.RunOrderParameters; @@ -59,4 +62,44 @@ static class B { } + + public void reverseAlphabeticalRunOrderTestClasses() + { + getClassesToRun(); + TestsToRun testsToRun = new TestsToRun( getClassesToRun() ); + RunOrderParameters runOrderParameters = new RunOrderParameters( "reversealphabetical" , null ); + RunOrderCalculator runOrderCalculator = new DefaultRunOrderCalculator( runOrderParameters, 1 ); + final TestsToRun testsToRun1 = runOrderCalculator.orderTestClasses( testsToRun ); + assertEquals( B.class, testsToRun1.iterator().next() ); + } + + public void reverseAlphabeticalRunOrderTestMethods() + { + RunOrderParameters runOrderParameters = new RunOrderParameters( "reversealphabetical" , null ); + RunOrderCalculator runOrderCalculator = new DefaultRunOrderCalculator( runOrderParameters, 1 ); + System.setProperty( "test", "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$B#C,org.apache.maven.surefire.api.util.RunOrderCalculatorTest$B#D,org.apache.maven.surefire.api.util.RunOrderCalculatorTest$A#A,org.apache.maven.surefire.api.util.RunOrderCalculatorTest$A#B" ); + Comparator reverseAlphabeticalRunOrderComparator = runOrderCalculator.comparatorForTestMethods(); + List list = new ArrayList(); + list.add( "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$B#A" ); + list.add( "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$B#B" ); + list.add( "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$A#C" ); + list.add( "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$A#D" ); + list.sort( reverseAlphabeticalRunOrderComparator ); + assertEquals( list.get(0), "org.apache.maven.surefire.api.util.RunOrderCalculatorTest$B#B" ); + } + + public void shouldThrowExceptionForNullTestMethod() + { + RunOrderParameters runOrderParameters = new RunOrderParameters( "reversealphabetical" , null ); + RunOrderCalculator runOrderCalculator = new DefaultRunOrderCalculator( runOrderParameters, 1 ); + System.clearProperty( "test" ); + try + { + runOrderCalculator.comparatorForTestMethods(); + } + catch ( IllegalStateException expected ) + { + assertEquals( expected.getMessage(), "Please set system property -Dtest to use fixed order" ); + } + } }