package junitparams.internal;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.TestClass;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
@RunWith(JUnitParamsRunner.class)
public class TestMethodTest {
TestMethod plainTestMethod;
TestMethod arrayTestMethod;
@Before
public void setUp() throws Exception {
plainTestMethod = new TestMethod(new FrameworkMethod(TestMethodTest.class.getMethod("forOthersToWork", new Class[]{String.class})),
new TestClass(this.getClass()));
arrayTestMethod = new TestMethod(new FrameworkMethod(TestMethodTest.class.getMethod("forOthersToWorkWithArray",
new Class[]{(new String[]{}).getClass()})),
new TestClass(this.getClass()));
}
@Test
@Parameters({"a","b"})
public void forOthersToWork(String arg) throws Exception {
assertThat(arg).isIn("a","b");
}
@Test
@Parameters({"a,b","b,a"})
public void forOthersToWorkWithArray(String... arg) throws Exception {
assertThat(arg).containsOnlyOnce("a","b");
}
@Test
@Ignore
public void flatTestMethodStructure() throws Exception {
System.setProperty("JUnitParams.flat", "true");
Description description = plainTestMethod.describableFrameworkMethod().getDescription();
assertEquals("for_others_to_work(junitparams.internal.TestMethodTest)", description.getDisplayName());
assertTrue(description.getChildren().isEmpty());
System.clearProperty("JUnitParams.flat");
}
// Android-changed: CTS and AndroidJUnitRunner rely on specific format to test names, changing
// them will prevent CTS and AndroidJUnitRunner from working properly; see b/36541809
@Ignore
@Test
public void hierarchicalTestMethodStructure() throws Exception {
System.clearProperty("JUnitParams.flat");
Description description = plainTestMethod.describableFrameworkMethod().getDescription();
assertEquals("forOthersToWork", description.getDisplayName());
assertEquals("[0] a (forOthersToWork)(junitparams.internal.TestMethodTest)", description.getChildren().get(0).getDisplayName());
assertEquals("[1] b (forOthersToWork)(junitparams.internal.TestMethodTest)", description.getChildren().get(1).getDisplayName());
}
// Android-changed: CTS and AndroidJUnitRunner rely on specific format to test names, changing
// them will prevent CTS and AndroidJUnitRunner from working properly; see b/36541809
@Ignore
@Test
public void hierarchicalArrayTestMethodStructure() throws Exception {
System.clearProperty("JUnitParams.flat");
Description description = arrayTestMethod.describableFrameworkMethod().getDescription();
assertEquals("forOthersToWorkWithArray", description.getDisplayName());
assertEquals("[0] a,b (forOthersToWorkWithArray)(junitparams.internal.TestMethodTest)",
description.getChildren().get(0).getDisplayName());
assertEquals("[1] b,a (forOthersToWorkWithArray)(junitparams.internal.TestMethodTest)",
description.getChildren().get(1).getDisplayName());
}
@Test
@Parameters
public void testVarargs(String... strings){
assertArrayEquals("Hello world".split(" "), strings);
}
protected Object[] parametersForTestVarargs(){
return new Object[]{
new Object[]{"Hello", "world"}
};
}
@Test
@Parameters
public void testVarargsCustomClass(Pair... pairs){
assertEquals(pairs[0].x, pairs[0].y);
assertEquals(pairs[1].x, pairs[1].y);
assertNotEquals(pairs[2].x, pairs[2].y);
}
protected Object[] parametersForTestVarargsCustomClass(){
return new Object[]{
new Object[]{new Pair(0, 0), new Pair(1, 1), new Pair(2, 3)}
};
}
@Test
@Parameters
public void testVarargsMoreArgs(int sumOfX, int sumOfY, Pair... pairs){
int sumOfXFromPairs = 0;
int sumOfYFromPairs = 0;
for (Pair pair : pairs) {
sumOfXFromPairs += pair.x;
sumOfYFromPairs += pair.y;
}
assertEquals(sumOfX, sumOfXFromPairs);
assertEquals(sumOfY, sumOfYFromPairs);
}
protected Object parametersForTestVarargsMoreArgs(){
return new Object[]{new Object[]{40, 50, new Pair(17, 21), new Pair(12, 18), new Pair(11, 11)}, new Object[]{10, 20, new Pair(3,
15), new Pair(7, 5)}};
}
@Test
@Parameters
public void testVargsMoreArgsOfTheSameType(Pair sum, Pair... pairs) {
assertEquals(sum.x, pairs[0].x + pairs[1].x);
assertEquals(sum.y, pairs[0].y + pairs[1].y);
}
protected Object parametersForTestVargsMoreArgsOfTheSameType(){
return new Object[]{new Object[]{new Pair(10, 30), new Pair(7, 17), new Pair(3, 13)}, new Object[]{new Pair(20, 40), new Pair(18,
21), new Pair(2, 19)}};
}
@Test
@Parameters(method = "nullArray")
public void varargsCheckPassesWithNullArray(boolean isNull, String... array) throws Exception {
assertEquals(isNull, array == null);
}
private Object nullArray() {
return new Object[] {
new Object[] { false, new String[] { "1", "2" } },
new Object[] { true, null },
};
}
private class Pair{
int x,y;
public Pair(int x, int y){
this.x = x;
this.y = y;
}
}
}