Skip to content

Commit 323e4c8

Browse files
committed
Added tests for interpreter pattern
1 parent de78490 commit 323e4c8

5 files changed

Lines changed: 277 additions & 0 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.iluwatar.interpreter;
2+
3+
import org.junit.Test;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.function.BiFunction;
8+
9+
import static org.junit.Assert.assertEquals;
10+
import static org.junit.Assert.assertNotNull;
11+
12+
/**
13+
* Date: 12/14/15 - 11:48 AM
14+
*
15+
* @author Jeroen Meulemeester
16+
*/
17+
public abstract class ExpressionTest<E extends Expression> {
18+
19+
/**
20+
* Generate inputs ranging from -10 to 10 for both input params and calculate the expected result
21+
*
22+
* @param resultCalc The function used to calculate the expected result
23+
* @return A data set with test entries
24+
*/
25+
static List<Object[]> prepareParameters(final BiFunction<Integer, Integer, Integer> resultCalc) {
26+
final List<Object[]> testData = new ArrayList<>();
27+
for (int i = -10; i < 10; i++) {
28+
for (int j = -10; j < 10; j++) {
29+
testData.add(new Object[]{
30+
new NumberExpression(i),
31+
new NumberExpression(j),
32+
resultCalc.apply(i, j)
33+
});
34+
}
35+
}
36+
return testData;
37+
}
38+
39+
/**
40+
* The input used as first parameter during the test
41+
*/
42+
private final NumberExpression first;
43+
44+
/**
45+
* The input used as second parameter during the test
46+
*/
47+
private final NumberExpression second;
48+
49+
/**
50+
* The expected result of the calculation, taking the first and second parameter in account
51+
*/
52+
private final int result;
53+
54+
/**
55+
* The expected {@link E#toString()} response
56+
*/
57+
private final String expectedToString;
58+
59+
/**
60+
* Factory, used to create a new test object instance with the correct first and second parameter
61+
*/
62+
private final BiFunction<NumberExpression, NumberExpression, E> factory;
63+
64+
/**
65+
* Create a new test instance with the given parameters and expected results
66+
*
67+
* @param first The input used as first parameter during the test
68+
* @param second The input used as second parameter during the test
69+
* @param result The expected result of the tested expression
70+
* @param expectedToString The expected {@link E#toString()} response
71+
* @param factory Factory, used to create a new test object instance
72+
*/
73+
ExpressionTest(final NumberExpression first, final NumberExpression second, final int result,
74+
final String expectedToString, final BiFunction<NumberExpression, NumberExpression, E> factory) {
75+
76+
this.first = first;
77+
this.second = second;
78+
this.result = result;
79+
this.expectedToString = expectedToString;
80+
this.factory = factory;
81+
}
82+
83+
/**
84+
* Get the first parameter
85+
*
86+
* @return The first parameter
87+
*/
88+
final NumberExpression getFirst() {
89+
return this.first;
90+
}
91+
92+
/**
93+
* Verify if the expression calculates the correct result when calling {@link E#interpret()}
94+
*/
95+
@Test
96+
public void testInterpret() {
97+
final E expression = this.factory.apply(this.first, this.second);
98+
assertNotNull(expression);
99+
assertEquals(this.result, expression.interpret());
100+
}
101+
102+
/**
103+
* Verify if the expression has the expected {@link E#toString()} value
104+
*/
105+
@Test
106+
public void testToString() {
107+
final E expression = this.factory.apply(this.first, this.second);
108+
assertNotNull(expression);
109+
assertEquals(expectedToString, expression.toString());
110+
}
111+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.iluwatar.interpreter;
2+
3+
import org.junit.runner.RunWith;
4+
import org.junit.runners.Parameterized;
5+
import org.junit.runners.Parameterized.Parameters;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Date: 12/14/15 - 12:08 PM
11+
*
12+
* @author Jeroen Meulemeester
13+
*/
14+
@RunWith(Parameterized.class)
15+
public class MinusExpressionTest extends ExpressionTest<MinusExpression> {
16+
17+
/**
18+
* Create a new set of test entries with the expected result
19+
*
20+
* @return The list of parameters used during this test
21+
*/
22+
@Parameters
23+
public static List<Object[]> data() {
24+
return prepareParameters((f, s) -> f - s);
25+
}
26+
27+
/**
28+
* Create a new test instance using the given test parameters and expected result
29+
*
30+
* @param first The first expression parameter
31+
* @param second The second expression parameter
32+
* @param result The expected result
33+
*/
34+
public MinusExpressionTest(final NumberExpression first, final NumberExpression second, final int result) {
35+
super(first, second, result, "-", MinusExpression::new);
36+
}
37+
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.iluwatar.interpreter;
2+
3+
import org.junit.runner.RunWith;
4+
import org.junit.runners.Parameterized;
5+
import org.junit.runners.Parameterized.Parameters;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Date: 12/14/15 - 12:08 PM
11+
*
12+
* @author Jeroen Meulemeester
13+
*/
14+
@RunWith(Parameterized.class)
15+
public class MultiplyExpressionTest extends ExpressionTest<MultiplyExpression> {
16+
17+
/**
18+
* Create a new set of test entries with the expected result
19+
*
20+
* @return The list of parameters used during this test
21+
*/
22+
@Parameters
23+
public static List<Object[]> data() {
24+
return prepareParameters((f, s) -> f * s);
25+
}
26+
27+
/**
28+
* Create a new test instance using the given test parameters and expected result
29+
*
30+
* @param first The first expression parameter
31+
* @param second The second expression parameter
32+
* @param result The expected result
33+
*/
34+
public MultiplyExpressionTest(final NumberExpression first, final NumberExpression second, final int result) {
35+
super(first, second, result, "*", MultiplyExpression::new);
36+
}
37+
38+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.iluwatar.interpreter;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.junit.runners.Parameterized;
6+
import org.junit.runners.Parameterized.Parameters;
7+
8+
import java.util.List;
9+
10+
import static org.junit.Assert.assertEquals;
11+
12+
/**
13+
* Date: 12/14/15 - 12:08 PM
14+
*
15+
* @author Jeroen Meulemeester
16+
*/
17+
@RunWith(Parameterized.class)
18+
public class NumberExpressionTest extends ExpressionTest<NumberExpression> {
19+
20+
/**
21+
* Create a new set of test entries with the expected result
22+
*
23+
* @return The list of parameters used during this test
24+
*/
25+
@Parameters
26+
public static List<Object[]> data() {
27+
return prepareParameters((f, s) -> f);
28+
}
29+
30+
/**
31+
* Create a new test instance using the given test parameters and expected result
32+
*
33+
* @param first The first expression parameter
34+
* @param second The second expression parameter
35+
* @param result The expected result
36+
*/
37+
public NumberExpressionTest(final NumberExpression first, final NumberExpression second, final int result) {
38+
super(first, second, result, "number", (f, s) -> f);
39+
}
40+
41+
/**
42+
* Verify if the {@link NumberExpression#NumberExpression(String)} constructor works as expected
43+
*/
44+
@Test
45+
public void testFromString() throws Exception {
46+
final int expectedValue = getFirst().interpret();
47+
final String testStingValue = String.valueOf(expectedValue);
48+
final NumberExpression numberExpression = new NumberExpression(testStingValue);
49+
assertEquals(expectedValue, numberExpression.interpret());
50+
}
51+
52+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.iluwatar.interpreter;
2+
3+
import org.junit.runner.RunWith;
4+
import org.junit.runners.Parameterized;
5+
import org.junit.runners.Parameterized.Parameters;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Date: 12/14/15 - 12:08 PM
11+
*
12+
* @author Jeroen Meulemeester
13+
*/
14+
@RunWith(Parameterized.class)
15+
public class PlusExpressionTest extends ExpressionTest<PlusExpression> {
16+
17+
/**
18+
* Create a new set of test entries with the expected result
19+
*
20+
* @return The list of parameters used during this test
21+
*/
22+
@Parameters
23+
public static List<Object[]> data() {
24+
return prepareParameters((f, s) -> f + s);
25+
}
26+
27+
/**
28+
* Create a new test instance using the given test parameters and expected result
29+
*
30+
* @param first The first expression parameter
31+
* @param second The second expression parameter
32+
* @param result The expected result
33+
*/
34+
public PlusExpressionTest(final NumberExpression first, final NumberExpression second, final int result) {
35+
super(first, second, result, "+", PlusExpression::new);
36+
}
37+
38+
}

0 commit comments

Comments
 (0)