summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-05-21 17:59:40 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-05-21 18:20:44 -0500
commit779bf983226f9799dc19d84a3f2cb9a3e26cd540 (patch)
treed636f821761af426bb6a6817c052f23be104abed
parentfc5045c4da18b6fd811c6748aa7b5184a80f6769 (diff)
Add tests for submethods of ExpressionParser
These tests fail right now, because ExpressionParser has a bug. They should help me fix it.
-rw-r--r--src/test/java/sevenUnits/utils/ExpressionParserTest.java77
1 files changed, 74 insertions, 3 deletions
diff --git a/src/test/java/sevenUnits/utils/ExpressionParserTest.java b/src/test/java/sevenUnits/utils/ExpressionParserTest.java
index 3a95285..ede931f 100644
--- a/src/test/java/sevenUnits/utils/ExpressionParserTest.java
+++ b/src/test/java/sevenUnits/utils/ExpressionParserTest.java
@@ -17,6 +17,7 @@
package sevenUnits.utils;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.List;
import java.util.stream.IntStream;
@@ -39,9 +40,11 @@ class ExpressionParserTest {
private static final ExpressionParser<Integer> numberParser = new ExpressionParser.Builder<>(
Integer::parseInt).addBinaryOperator("+", (o1, o2) -> o1 + o2, 0)
.addBinaryOperator("-", (o1, o2) -> o1 - o2, 0)
- .addBinaryOperator("*", (o1, o2) -> o1 * o2, 1)
- .addBinaryOperator("/", (o1, o2) -> o1 / o2, 1)
- .addBinaryOperator("^", (o1, o2) -> (int) Math.pow(o1, o2), 2).build();
+ .addUnaryOperator("neg", o1 -> -o1, 1)
+ .addBinaryOperator("*", (o1, o2) -> o1 * o2, 2)
+ .addBinaryOperator("/", (o1, o2) -> o1 / o2, 2)
+ .addUnaryOperator("recip", o1 -> 1 / o1, 3)
+ .addBinaryOperator("^", (o1, o2) -> (int) Math.pow(o1, o2), 4).build();
/**
* The expressions used in the expression parsing tests
@@ -69,6 +72,45 @@ class ExpressionParserTest {
.mapToObj(i -> Arguments.of(TEST_EXPRESSIONS.get(i), RESULTS[i]));
}
+ private static final Stream<Arguments> testConvertExpressionToRPN() {
+ return Stream.of(Arguments.of("1 + 2 ^ 5 * 3", "1 2 5 ^ 3 * +"),
+ Arguments.of("(1 + 2) ^ 5 * 3", "1 2 + 5 ^ 3 *"),
+ Arguments.of("12 * 5 + (3 ^ (2 * 3) - 72) / (3 + 3 * 2)",
+ "12 5 * 3 2 3 * ^ 72 - 3 3 2 * + / +"),
+ Arguments.of("1 + 2 + 3 + 4", "1 2 + 3 + 4 +"),
+ Arguments.of("12 - 4 - 3", "12 4 - 3 -"),
+ Arguments.of("12 - (4 - 3)", "12 4 3 - -"),
+ Arguments.of("1 / 2 + 3", "1 2 / 3 +"), Arguments.of("12", "12"),
+ Arguments.of("2 * 3 + 4", "2 3 * 4 +"),
+ Arguments.of("(2 * 3) + 4", "2 3 * 4 +"),
+ Arguments.of("2 * 3 - 4", "2 3 * 4 -"),
+ Arguments.of("(2 * 3) - 4", "2 3 * 4 -"),
+ Arguments.of("2 * (3 + 4)", "2 3 4 + *"),
+ Arguments.of("2 * (3 - 4)", "2 3 4 - *"),
+ Arguments.of("neg 2", "2 neg"),
+ Arguments.of("1 + neg 2", "1 2 neg +"));
+ }
+
+ private static final Stream<Arguments> testParseRPN() {
+ return Stream.of(Arguments.of("1 2 5 ^ 3 * +", 97),
+ Arguments.of("1 2 + 5 ^ 3 *", 729),
+ Arguments.of("12 5 * 3 2 3 * ^ 72 - 3 3 2 * + / +", 133),
+ Arguments.of("1 2 + 3 + 4 +", 10), Arguments.of("12 4 - 3 -", 5),
+ Arguments.of("12 4 3 - -", 11), Arguments.of("1 2 / 3 +", 3),
+ Arguments.of("12", 12), Arguments.of("2 3 * 4 +", 10),
+ Arguments.of("2 3 * 4 -", 2), Arguments.of("2 3 4 + *", 14),
+ Arguments.of("2 3 4 - *", -2), Arguments.of("2 neg", -2),
+ Arguments.of("1 2 neg +", -1));
+ }
+
+ private static final Stream<String> testInvalidExpression() {
+ return Stream.of("+", "1 +", "1 + * 2", "1 (+ 1)", "neg");
+ }
+
+ private static final Stream<String> testInvalidRPN() {
+ return Stream.of("+", "1 +", "1 + * 2", "1 * 2", "1 2", "neg");
+ }
+
/**
* Test method for
* {@link sevenUnits.utils.ExpressionParser#parseExpression(java.lang.String)}.
@@ -78,4 +120,33 @@ class ExpressionParserTest {
public void testParseExpression(String expression, int value) {
assertEquals(value, numberParser.parseExpression(expression));
}
+
+ @ParameterizedTest
+ @MethodSource
+ public void testConvertExpressionToRPN(String expression,
+ String expectedRPN) {
+ assertEquals(expectedRPN,
+ numberParser.convertExpressionToReversePolish(expression));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ public void testInvalidExpression(String expression) {
+ assertThrows(RuntimeException.class,
+ () -> numberParser.convertExpressionToReversePolish(expression));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ public void testParseRPN(String expressionRPN, int value) {
+ assertEquals(value,
+ numberParser.parseReversePolishExpression(expressionRPN));
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ public void testInvalidRPN(String expressionRPN) {
+ assertThrows(RuntimeException.class,
+ () -> numberParser.parseReversePolishExpression(expressionRPN));
+ }
}