package org.junit.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
public class MethodSorterTest {
private static final String ALPHA = "java.lang.Object alpha(int,double,java.lang.Thread)";
private static final String BETA = "void beta(int[][])";
private static final String GAMMA_VOID = "int gamma()";
private static final String GAMMA_BOOLEAN = "void gamma(boolean)";
private static final String DELTA = "void delta()";
private static final String EPSILON = "void epsilon()";
private static final String SUPER_METHOD = "void superMario()";
private static final String SUB_METHOD = "void subBowser()";
static class DummySortWithoutAnnotation {
Object alpha(int i, double d, Thread t) {
return null;
}
void beta(int[][] x) {
}
int gamma() {
return 0;
}
void gamma(boolean b) {
}
void delta() {
}
void epsilon() {
}
}
static class Super {
void superMario() {
}
}
static class Sub extends Super {
void subBowser() {
}
}
private List<String> getDeclaredMethodNames(Class<?> clazz) {
Method[] actualMethods = MethodSorter.getDeclaredMethods(clazz);
// Obtain just the names instead of the full methods.
List<String> names = new ArrayList<String>();
for (Method m : actualMethods) {
// Filter out synthetic methods from, e.g., coverage tools.
if (!m.isSynthetic()) {
names.add(m.toString().replace(clazz.getName() + '.', ""));
}
}
return names;
}
@Test
public void testMethodsNullSorterSelf() {
List<String> expected = Arrays.asList(EPSILON, BETA, ALPHA, DELTA, GAMMA_VOID, GAMMA_BOOLEAN);
List<String> actual = getDeclaredMethodNames(DummySortWithoutAnnotation.class);
assertEquals(expected, actual);
}
@Test
public void testMethodsNullSorterSuper() {
List<String> expected = Arrays.asList(SUPER_METHOD);
List<String> actual = getDeclaredMethodNames(Super.class);
assertEquals(expected, actual);
}
@Test
public void testMethodsNullSorterSub() {
List<String> expected = Arrays.asList(SUB_METHOD);
List<String> actual = getDeclaredMethodNames(Sub.class);
assertEquals(expected, actual);
}
@FixMethodOrder(MethodSorters.DEFAULT)
static class DummySortWithDefault {
Object alpha(int i, double d, Thread t) {
return null;
}
void beta(int[][] x) {
}
int gamma() {
return 0;
}
void gamma(boolean b) {
}
void delta() {
}
void epsilon() {
}
}
@Test
public void testDefaultMethodSorter() {
List<String> expected = Arrays.asList(EPSILON, BETA, ALPHA, DELTA, GAMMA_VOID, GAMMA_BOOLEAN);
List<String> actual = getDeclaredMethodNames(DummySortWithDefault.class);
assertEquals(expected, actual);
}
@FixMethodOrder(MethodSorters.JVM)
static class DummySortJvm {
Object alpha(int i, double d, Thread t) {
return null;
}
void beta(int[][] x) {
}
int gamma() {
return 0;
}
void gamma(boolean b) {
}
void delta() {
}
void epsilon() {
}
}
@Test
public void testJvmMethodSorter() {
Method[] fromJvmWithSynthetics = DummySortJvm.class.getDeclaredMethods();
Method[] sorted = MethodSorter.getDeclaredMethods(DummySortJvm.class);
assertArrayEquals(fromJvmWithSynthetics, sorted);
}
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
static class DummySortWithNameAsc {
Object alpha(int i, double d, Thread t) {
return null;
}
void beta(int[][] x) {
}
int gamma() {
return 0;
}
void gamma(boolean b) {
}
void delta() {
}
void epsilon() {
}
}
@Test
public void testAscendingMethodSorter() {
List<String> expected = Arrays.asList(ALPHA, BETA, DELTA, EPSILON, GAMMA_VOID, GAMMA_BOOLEAN);
List<String> actual = getDeclaredMethodNames(DummySortWithNameAsc.class);
assertEquals(expected, actual);
}
}