1fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinpackage junitparams.internal;
2fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
3fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.Before;
4fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.Ignore;
5fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.Test;
6fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.runner.Description;
7fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.runner.RunWith;
8fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.runners.model.FrameworkMethod;
9fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport org.junit.runners.model.TestClass;
10fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
11fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport junitparams.JUnitParamsRunner;
12fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport junitparams.Parameters;
13fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
14fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport static org.assertj.core.api.Assertions.assertThat;
15fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinimport static org.junit.Assert.*;
16fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
17fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin@RunWith(JUnitParamsRunner.class)
18fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffinpublic class TestMethodTest {
19fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    TestMethod plainTestMethod;
20fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    TestMethod arrayTestMethod;
21fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
22fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Before
23fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void setUp() throws Exception {
24fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        plainTestMethod = new TestMethod(new FrameworkMethod(TestMethodTest.class.getMethod("forOthersToWork", new Class[]{String.class})),
25fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new TestClass(this.getClass()));
26fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        arrayTestMethod = new TestMethod(new FrameworkMethod(TestMethodTest.class.getMethod("forOthersToWorkWithArray",
27fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new Class[]{(new String[]{}).getClass()})),
28fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new TestClass(this.getClass()));
29fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
30fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
31fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
32fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters({"a","b"})
33fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void forOthersToWork(String arg) throws Exception {
34fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertThat(arg).isIn("a","b");
35fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
36fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
37fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
38fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
39fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters({"a,b","b,a"})
40fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void forOthersToWorkWithArray(String... arg) throws Exception {
41fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertThat(arg).containsOnlyOnce("a","b");
42fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
43fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
44fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
45fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Ignore
46fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void flatTestMethodStructure() throws Exception {
47fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        System.setProperty("JUnitParams.flat", "true");
48fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
49b03560c32573b9057dc1daaf877501dbb4e16f8dPaul Duffin        Description description = plainTestMethod.describableFrameworkMethod().getDescription();
50fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
51fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("for_others_to_work(junitparams.internal.TestMethodTest)", description.getDisplayName());
52fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertTrue(description.getChildren().isEmpty());
53fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        System.clearProperty("JUnitParams.flat");
54fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
55fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
56fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
572a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    // Android-changed: CTS and AndroidJUnitRunner rely on specific format to test names, changing
582a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    // them will prevent CTS and AndroidJUnitRunner from working properly; see b/36541809
592a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    @Ignore
60fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
61fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void hierarchicalTestMethodStructure() throws Exception {
62fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        System.clearProperty("JUnitParams.flat");
63b03560c32573b9057dc1daaf877501dbb4e16f8dPaul Duffin        Description description = plainTestMethod.describableFrameworkMethod().getDescription();
64fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
65fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("forOthersToWork", description.getDisplayName());
66fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("[0] a (forOthersToWork)(junitparams.internal.TestMethodTest)", description.getChildren().get(0).getDisplayName());
67fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("[1] b (forOthersToWork)(junitparams.internal.TestMethodTest)", description.getChildren().get(1).getDisplayName());
68fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
69fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
702a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    // Android-changed: CTS and AndroidJUnitRunner rely on specific format to test names, changing
712a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    // them will prevent CTS and AndroidJUnitRunner from working properly; see b/36541809
722a75dcb2fd1490ace0acf82e948aae2829b87e8dPaul Duffin    @Ignore
73fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
74fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void hierarchicalArrayTestMethodStructure() throws Exception {
75fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        System.clearProperty("JUnitParams.flat");
76b03560c32573b9057dc1daaf877501dbb4e16f8dPaul Duffin        Description description = arrayTestMethod.describableFrameworkMethod().getDescription();
77fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
78fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("forOthersToWorkWithArray", description.getDisplayName());
79fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("[0] a,b (forOthersToWorkWithArray)(junitparams.internal.TestMethodTest)",
80fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                description.getChildren().get(0).getDisplayName());
81fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals("[1] b,a (forOthersToWorkWithArray)(junitparams.internal.TestMethodTest)",
82fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                description.getChildren().get(1).getDisplayName());
83fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
84fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
85fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
86fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters
87fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void testVarargs(String... strings){
88fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	assertArrayEquals("Hello world".split(" "), strings);
89fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
90fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
91fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    protected Object[] parametersForTestVarargs(){
92fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        return new Object[]{
93fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new Object[]{"Hello", "world"}
94fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	};
95fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
96fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
97fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
98fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters
99fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void testVarargsCustomClass(Pair... pairs){
100fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin		assertEquals(pairs[0].x, pairs[0].y);
101fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin		assertEquals(pairs[1].x, pairs[1].y);
102ea07fbcef796fdacd3110b41eec7a6c6e55044fcPaul Duffin		assertNotEquals(pairs[2].x, pairs[2].y);
103fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
104fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
105fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    protected Object[] parametersForTestVarargsCustomClass(){
106fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        return new Object[]{
107fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new Object[]{new Pair(0, 0), new Pair(1, 1), new Pair(2, 3)}
108fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	};
109fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
110fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
111fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
112fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters
113fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void testVarargsMoreArgs(int sumOfX, int sumOfY, Pair... pairs){
114fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        int sumOfXFromPairs = 0;
115fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        int sumOfYFromPairs = 0;
116fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        for (Pair pair : pairs) {
117fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin            sumOfXFromPairs += pair.x;
118fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin            sumOfYFromPairs += pair.y;
119fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        }
120fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals(sumOfX, sumOfXFromPairs);
121fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals(sumOfY, sumOfYFromPairs);
122fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
123fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
124fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    protected Object parametersForTestVarargsMoreArgs(){
125fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        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,
126fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                15), new Pair(7, 5)}};
127fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
128fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
129fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
130fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters
131fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void testVargsMoreArgsOfTheSameType(Pair sum, Pair... pairs) {
132fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals(sum.x, pairs[0].x + pairs[1].x);
133fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals(sum.y, pairs[0].y + pairs[1].y);
134fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
135fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
136fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    protected Object parametersForTestVargsMoreArgsOfTheSameType(){
137fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        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,
138fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                21), new Pair(2, 19)}};
139fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
140fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
141fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Test
142fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    @Parameters(method = "nullArray")
143fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    public void varargsCheckPassesWithNullArray(boolean isNull, String... array) throws Exception {
144fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        assertEquals(isNull, array == null);
145fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
146fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
147fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    private Object nullArray() {
148fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        return new Object[] {
149fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new Object[] { false, new String[] { "1", "2" } },
150fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin                new Object[] { true, null },
151fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin        };
152fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
153fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin
154fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    private class Pair{
155fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	int x,y;
156fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	public Pair(int x, int y){
157fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    		this.x = x;
158fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    		this.y = y;
159fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    	}
160fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin    }
161fd1f9491413fcdbfae3cbd43651db31fdabce41aPaul Duffin}
162