diff --git a/java_console/.idea/libraries/commons_math3.xml b/java_console/.idea/libraries/commons_math3.xml
index 0e5aa44f78..9096ed682d 100644
--- a/java_console/.idea/libraries/commons_math3.xml
+++ b/java_console/.idea/libraries/commons_math3.xml
@@ -1,8 +1,6 @@
-
-
-
+
diff --git a/java_console/build.xml b/java_console/build.xml
index 33bffbf859..e7462d5c9a 100644
--- a/java_console/build.xml
+++ b/java_console/build.xml
@@ -53,7 +53,6 @@
-
diff --git a/java_console/lib/commons-math3-3.3.jar b/java_console/lib/commons-math3-3.3.jar
deleted file mode 100644
index 25102f2f93..0000000000
Binary files a/java_console/lib/commons-math3-3.3.jar and /dev/null differ
diff --git a/java_console/models/models.iml b/java_console/models/models.iml
index d60f872522..7e4d7d85e1 100644
--- a/java_console/models/models.iml
+++ b/java_console/models/models.iml
@@ -20,7 +20,6 @@
-
diff --git a/java_console/models/src/com/autsia/bracer/BracerParser.java b/java_console/models/src/com/autsia/bracer/BracerParser.java
index 2a10fcdc75..8104d249bb 100644
--- a/java_console/models/src/com/autsia/bracer/BracerParser.java
+++ b/java_console/models/src/com/autsia/bracer/BracerParser.java
@@ -27,9 +27,6 @@ import java.util.Locale;
import java.util.Stack;
import java.util.StringTokenizer;
-import org.apache.commons.math3.complex.Complex;
-import org.apache.commons.math3.complex.ComplexFormat;
-
/**
* Class for parsing and evaluating math expressions
*
@@ -46,12 +43,8 @@ public class BracerParser {
private final String OPERATORS = "+-*/&|!";
/* separator of arguments */
private final String SEPARATOR = ",";
- /* imaginary symbol */
- private final String IMAGINARY = "I";
/* variable token */
private final String VARIABLE = "var";
- /* settings for complex formatting */
- private ComplexFormat complexFormat = new ComplexFormat(IMAGINARY);
/* settings for numbers formatting */
private NumberFormat numberFormat = NumberFormat.getInstance(Locale.US);
/* temporary stack that holds operators, functions and brackets */
@@ -80,7 +73,6 @@ public class BracerParser {
public void setPrecision(int precision) {
numberFormat.setMinimumFractionDigits(precision);
numberFormat.setMaximumFractionDigits(precision);
- complexFormat = new ComplexFormat(IMAGINARY, numberFormat, numberFormat);
}
/**
@@ -111,7 +103,6 @@ public class BracerParser {
* degree character
*/
expression = expression.replace(" ", "")
- .replace("°", "*" + Double.toString(Math.PI) + "/180")
.replace("(-", "(0-").replace(",-", ",0-").replace("(+", "(0+")
.replace(",+", ",0+").replace("true", "1").replace("false", "0")
.replace("or", "|").replace("and", "&");
@@ -143,14 +134,7 @@ public class BracerParser {
stackRPN.push(stackOperations.pop());
}
} else if (isNumber(token)) {
- if (token.equals(IMAGINARY)) {
- stackRPN.push(complexFormat.format(new Complex(0, 1)));
- } else if (token.contains(IMAGINARY)) {
- stackRPN.push(complexFormat.format(complexFormat.parse("0+"
- + token)));
- } else {
- stackRPN.push(token);
- }
+ stackRPN.push(token);
} else if (isOperator(token)) {
while (!stackOperations.empty()
&& isOperator(stackOperations.lastElement())
@@ -198,7 +182,7 @@ public class BracerParser {
* @since 3.0
*/
public String evaluate(double variableValue) throws ParseException {
- /* check if is there something to evaluate */
+ /* check if is there something to evaluate */
if (stackRPN.empty()) {
return "";
}
@@ -220,22 +204,22 @@ public class BracerParser {
if (isNumber(token)) {
stackAnswer.push(token);
} else if (isOperator(token)) {
- Complex a = complexFormat.parse(stackAnswer.pop());
- Complex b = complexFormat.parse(stackAnswer.pop());
- boolean aBoolean = a.getReal() == 1.0;
- boolean bBoolean = b.getReal() == 1.0;
+ Double a = Double.valueOf(stackAnswer.pop());
+ Double b = Double.valueOf(stackAnswer.pop());
+ boolean aBoolean = a.doubleValue() == 1.0;
+ boolean bBoolean = b.doubleValue() == 1.0;
switch (token) {
case "+":
- stackAnswer.push(complexFormat.format(b.add(a)));
+ stackAnswer.push(Double.toString(b + a));
break;
case "-":
- stackAnswer.push(complexFormat.format(b.subtract(a)));
+ stackAnswer.push(Double.toString(b - (a)));
break;
case "*":
- stackAnswer.push(complexFormat.format(b.multiply(a)));
+ stackAnswer.push(Double.toString(b * (a)));
break;
case "/":
- stackAnswer.push(complexFormat.format(b.divide(a)));
+ stackAnswer.push(Double.toString(b / (a)));
break;
case "|":
stackAnswer.push(String.valueOf(aBoolean || bBoolean ? "1" : "0"));
@@ -245,70 +229,66 @@ public class BracerParser {
break;
}
} else if (isFunction(token)) {
- Complex a = complexFormat.parse(stackAnswer.pop());
- boolean aBoolean = a.getReal() == 1.0;
+ Double a = Double.valueOf(stackAnswer.pop());
+ boolean aBoolean = a.doubleValue() == 1.0;
switch (token) {
- case "abs":
- stackAnswer.push(complexFormat.format(a.abs()));
- break;
- case "acos":
- stackAnswer.push(complexFormat.format(a.acos()));
- break;
- case "arg":
- stackAnswer.push(complexFormat.format(a.getArgument()));
- break;
- case "asin":
- stackAnswer.push(complexFormat.format(a.asin()));
- break;
- case "atan":
- stackAnswer.push(complexFormat.format(a.atan()));
- break;
- case "conj":
- stackAnswer.push(complexFormat.format(a.conjugate()));
- break;
+// case "abs":
+// stackAnswer.push(Double.toString(a.abs()));
+// break;
+// case "acos":
+// stackAnswer.push(Double.toString(a.acos()));
+// break;
+// case "arg":
+// stackAnswer.push(complexFormat.format(a.getArgument()));
+// break;
+// case "asin":
+// stackAnswer.push(complexFormat.format(a.asin()));
+// break;
+// case "atan":
+// stackAnswer.push(complexFormat.format(a.atan()));
+// break;
+// case "conj":
+// stackAnswer.push(complexFormat.format(a.conjugate()));
+// break;
case "cos":
- stackAnswer.push(complexFormat.format(a.cos()));
- break;
- case "cosh":
- stackAnswer.push(complexFormat.format(a.cosh()));
+ stackAnswer.push(Double.toString(Math.cos(a)));
break;
+// case "cosh":
+// stackAnswer.push(complexFormat.format(a.cosh()));
+// break;
case "exp":
- stackAnswer.push(complexFormat.format(a.exp()));
- break;
- case "imag":
- stackAnswer.push(complexFormat.format(a.getImaginary()));
- break;
- case "log":
- stackAnswer.push(complexFormat.format(a.log()));
- break;
- case "neg":
- stackAnswer.push(complexFormat.format(a.negate()));
- break;
- case "real":
- stackAnswer.push(complexFormat.format(a.getReal()));
+ stackAnswer.push(Double.toString(Math.exp(a)));
break;
+// case "imag":
+// stackAnswer.push(complexFormat.format(a.getImaginary()));
+// break;
+// case "log":
+// stackAnswer.push(complexFormat.format(a.log()));
+// break;
+// case "neg":
+// stackAnswer.push(complexFormat.format(a.negate()));
+// break;
case "sin":
- stackAnswer.push(complexFormat.format(a.sin()));
- break;
- case "sinh":
- stackAnswer.push(complexFormat.format(a.sinh()));
- break;
- case "sqrt":
- stackAnswer.push(complexFormat.format(a.sqrt()));
- break;
- case "tan":
- stackAnswer.push(complexFormat.format(a.tan()));
- break;
- case "tanh":
- stackAnswer.push(complexFormat.format(a.tanh()));
+ stackAnswer.push(Double.toString(Math.sin(a)));
break;
+// case "sqrt":
+// stackAnswer.push(Double.toString(a.sqrt()));
+// break;
+// case "tan":
+// stackAnswer.push(Double.toString(a.tan()));
+// break;
+// case "tanh":
+// stackAnswer.push(Double.toString(a.tanh()));
+// break;
case "pow":
- Complex b = complexFormat.parse(stackAnswer.pop());
- stackAnswer.push(complexFormat.format(b.pow(a)));
+ Double b = Double.valueOf(stackAnswer.pop());
+ stackAnswer.push(Double.toString(Math.pow(a, b)));
break;
case "not":
stackAnswer.push(String.valueOf(!aBoolean ? "1" : "0"));
break;
+ default:
+ throw new IllegalStateException("Unexpected: " + token);
}
}
}
@@ -320,44 +300,6 @@ public class BracerParser {
return stackAnswer.pop();
}
- /**
- * Evaluates non-variable expression and returns it's value as a Complex
- * object
- *
- * @return Complex
representation of complex number
- * @throws ParseException
if the input expression is not
- * correct
- * @since 4.0
- */
- public Complex evaluateComplex() throws ParseException {
- return complexFormat.parse(evaluate());
- }
-
- /**
- * Evaluates variable expression and returns it's value as a Complex object
- *
- * @param variableValue User-specified Double
value
- * @return Complex
representation of complex number
- * @throws ParseException
if the input expression is not
- * correct
- * @since 4.0
- */
- public Complex evaluateComplex(double variableValue) throws ParseException {
- return complexFormat.parse(evaluate(variableValue));
- }
-
- /**
- * Converts Complex
object to it's String
- * representation
- *
- * @param number Input Complex
number to convert
- * @return String
representation of complex number
- * @since 5.0
- */
- public String format(Complex number) {
- return complexFormat.format(number);
- }
-
/**
* Get back an unmodifiable copy of the stack
*/
@@ -377,7 +319,7 @@ public class BracerParser {
try {
Double.parseDouble(token);
} catch (Exception e) {
- return token.contains(IMAGINARY) || token.equals(VARIABLE);
+ return token.equals(VARIABLE);
}
return true;
}
diff --git a/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java b/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java
new file mode 100644
index 0000000000..0d34a04846
--- /dev/null
+++ b/java_console/models/src/com/autsia/bracer/test/BracerParserTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2014 Dmytro Titov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.autsia.bracer.test;
+
+import java.util.Collection;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.autsia.bracer.BracerParser;
+
+/**
+ * Test class.
+ * User: Dmytro
+ * Date: 23.01.13
+ * Time: 12:52
+ */
+public class BracerParserTest {
+ private final String INPUT_NOVAR = "-sin(3+4+cos(6)/exp(10/pow(22,-1)))";
+ private final String INPUT_VAR = "-sin(3+var+cos(10)/exp(10/pow(22,-1)))";
+ private BracerParser bracerParser;
+
+ @Before
+ public void setUp() throws Exception {
+ bracerParser = new BracerParser(3);
+ }
+
+ @Test
+ public void testSetPrecision() throws Exception {
+ bracerParser.setPrecision(10);
+ Assert.assertEquals(10, bracerParser.getPrecision());
+ }
+
+ @Test
+ public void testGetPrecision() throws Exception {
+ Assert.assertEquals(3, bracerParser.getPrecision());
+ }
+
+ @Test
+ public void testEvaluateNoVar() throws Exception {
+ bracerParser.parse(INPUT_NOVAR);
+ Assert.assertEquals("-0.6570194619480038", bracerParser.evaluate());
+ }
+
+ @Test
+ public void testEvaluateVar() throws Exception {
+ bracerParser.parse(INPUT_VAR);
+ Assert.assertEquals("-0.6569578792490918", bracerParser.evaluate(4));
+ }
+
+ @Test
+ public void testSimpleBoolean() throws Exception {
+ bracerParser.parse("true or false");
+ Assert.assertEquals("1", bracerParser.evaluate());
+ }
+
+ @Test
+ public void testBoolean() throws Exception {
+ bracerParser.parse("( ( true and ( false or ( true and ( ( true ) or ( false ) ) ) ) ) and ( ( false ) ) )");
+ Assert.assertEquals("0", bracerParser.evaluate());
+
+ Collection stackRPN = bracerParser.getStackRPN();
+
+ Assert.assertEquals("[&, 0, &, |, &, |, 0, 1, 1, 0, 1]", stackRPN.toString());
+ }
+
+ @Test
+ public void testBooleanNot1() throws Exception {
+ bracerParser.parse("not( ( true and ( false or ( true and ( not( true ) or ( false ) ) ) ) ) and ( ( false ) ) )");
+ Assert.assertEquals("1", bracerParser.evaluate());
+ }
+
+ @Test
+ public void testBooleanNot2() throws Exception {
+ bracerParser.parse("(((true | false) & not(false)) | (true | false))");
+ Assert.assertEquals("1", bracerParser.evaluate());
+
+ Collection stackRPN = bracerParser.getStackRPN();
+
+ Assert.assertEquals("[|, |, 0, 1, &, not, 0, |, 0, 1]", stackRPN.toString());
+ }
+}