Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / test / net / sf / openrocket / util / ExpressionParserTest.java
diff --git a/core/test/net/sf/openrocket/util/ExpressionParserTest.java b/core/test/net/sf/openrocket/util/ExpressionParserTest.java
new file mode 100644 (file)
index 0000000..efbabe9
--- /dev/null
@@ -0,0 +1,94 @@
+package net.sf.openrocket.util;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ExpressionParserTest {
+       
+       private static final double EPS = 1e-10;
+       
+       private ExpressionParser parser = new ExpressionParser();
+       
+       @Test
+       public void testPlainNumber() throws InvalidExpressionException {
+               assertEquals(1.0, parser.parse("1"), EPS);
+               assertEquals(1.0, parser.parse("\t 1 "), EPS);
+               assertEquals(0.9, parser.parse(".9"), EPS);
+               assertEquals(1.0, parser.parse("1."), EPS);
+               assertEquals(1.2, parser.parse("1.2"), EPS);
+               assertEquals(1.2, parser.parse("01.200"), EPS);
+       }
+       
+       @Test
+       public void testNegativeNumber() throws InvalidExpressionException {
+               assertEquals(-1.0, parser.parse("-1"), EPS);
+               assertEquals(-15.0, parser.parse("-15"), EPS);
+               assertEquals(-0.9, parser.parse("-.9"), EPS);
+               assertEquals(-1.0, parser.parse("-1."), EPS);
+               assertEquals(-1.2, parser.parse("-1.2"), EPS);
+               assertEquals(-1.2, parser.parse("-01.200"), EPS);
+       }
+       
+       
+       @Test
+       public void testDecimalComma() throws InvalidExpressionException {
+               assertEquals(1.0, parser.parse("1,"), EPS);
+               assertEquals(1.2, parser.parse("1,2"), EPS);
+               assertEquals(1.2, parser.parse("01,200"), EPS);
+               assertEquals(0.9, parser.parse(",9"), EPS);
+       }
+       
+       
+       @Test
+       public void testSimpleExpression() throws InvalidExpressionException {
+               assertEquals(3.0, parser.parse("1+2"), EPS);
+               assertEquals(6.0, parser.parse("1+2.5*2"), EPS);
+               assertEquals(7.0, parser.parse("(1+2.5) * 2"), EPS);
+               assertEquals(1.0 + 2.0 / 3.0, parser.parse("1+2/3"), EPS);
+       }
+       
+       @Test
+       public void testFraction() throws InvalidExpressionException {
+               assertEquals(1.5, parser.parse("1 1/2"), EPS);
+               assertEquals(11 + 11.0 / 22.0, parser.parse("11 11/22"), EPS);
+               assertEquals(-11 - 11.0 / 22.0, parser.parse("-11 11/22"), EPS);
+               assertEquals(1.5, parser.parse("  1    1 / 2"), EPS);
+               assertEquals(11 + 11.0 / 22.0, parser.parse("  11    11 / 22"), EPS);
+               assertEquals(2.0 + 3.0 / 7.0, parser.parse("1 + 1 3/7"), EPS);
+               assertEquals(2.0 + 3.0 / 7.0, parser.parse("1 + 1 3/7"), EPS);
+               assertEquals(3.0, parser.parse("1 1/2* 2"), EPS);
+               assertEquals(3.0, parser.parse("1 1/2* 2"), EPS);
+       }
+       
+       @Test
+       public void testCharConversion() throws InvalidExpressionException {
+               assertEquals(1 + 1.0 / 9.0, parser.parse("1 \u2081 \u2044 \u2089"), EPS);
+       }
+       
+       @Test
+       public void testInvalidExpression() {
+               expectInvalid("1+");
+               expectInvalid("1+2/");
+               expectInvalid("1 2");
+               expectInvalid("12 2.5");
+               expectInvalid("1 2.5/4");
+               expectInvalid("11 22.55/44");
+               expectInvalid("1 2/4.1");
+               expectInvalid("11 22/44.11");
+               expectInvalid("1.2 3/4");
+               expectInvalid("12.23 34/45");
+               
+               expectInvalid("1. 2");
+               expectInvalid("1 .2");
+       }
+       
+       private void expectInvalid(String exp) {
+               try {
+                       double value = parser.parse(exp);
+                       fail("Expression '" + exp + "' evaluated to " + value + ", expected failure");
+               } catch (InvalidExpressionException e) {
+                       // expected
+               }
+       }
+}