diff --git a/calculatorpp-core/pom.xml b/calculatorpp-core/pom.xml index ad384cd1..97e64d4f 100644 --- a/calculatorpp-core/pom.xml +++ b/calculatorpp-core/pom.xml @@ -30,6 +30,13 @@ test + + net.sf.opencsv + opencsv + 2.0 + test + + org.mockito mockito-core diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java index c4b67ff3..6fe7698e 100644 --- a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/AbstractCalculatorTest.java @@ -1,7 +1,5 @@ package org.solovyev.android.calculator; -import jscl.JsclMathEngine; -import org.jetbrains.annotations.NotNull; import org.mockito.Mockito; import org.solovyev.android.calculator.history.CalculatorHistory; @@ -12,21 +10,9 @@ import org.solovyev.android.calculator.history.CalculatorHistory; */ public class AbstractCalculatorTest { - protected static void staticSetUp() throws Exception { - CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class)); - } - protected void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class)); + CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), CalculatorTestUtils.newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class)); + CalculatorLocatorImpl.getInstance().getEngine().init(); } - @NotNull - private static CalculatorEngineImpl newCalculatorEngine() { - final CalculatorMathRegistry varsRegistry = Mockito.mock(CalculatorMathRegistry.class); - //Mockito.when(varsRegistry.get()) - - final CalculatorEngineImpl result = new CalculatorEngineImpl(JsclMathEngine.getInstance(), varsRegistry, Mockito.mock(CalculatorMathRegistry.class), Mockito.mock(CalculatorMathRegistry.class), Mockito.mock(CalculatorMathRegistry.class), null); - result.init(); - return result; - } } diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java new file mode 100644 index 00000000..3f538770 --- /dev/null +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java @@ -0,0 +1,33 @@ +package org.solovyev.android.calculator; + +import jscl.JsclMathEngine; +import org.jetbrains.annotations.NotNull; +import org.mockito.Mockito; +import org.solovyev.android.calculator.history.CalculatorHistory; + +/** + * User: serso + * Date: 10/7/12 + * Time: 8:40 PM + */ +public class CalculatorTestUtils { + + public static void staticSetUp() throws Exception { + CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class)); + CalculatorLocatorImpl.getInstance().getEngine().init(); + } + + @NotNull + static CalculatorEngineImpl newCalculatorEngine() { + final MathEntityDao mathEntityDao = Mockito.mock(MathEntityDao.class); + + final JsclMathEngine jsclEngine = JsclMathEngine.getInstance(); + + final CalculatorVarsRegistry varsRegistry = new CalculatorVarsRegistry(jsclEngine.getConstantsRegistry(), mathEntityDao); + final CalculatorFunctionsMathRegistry functionsRegistry = new CalculatorFunctionsMathRegistry(jsclEngine.getFunctionsRegistry(), mathEntityDao); + final CalculatorOperatorsMathRegistry operatorsRegistry = new CalculatorOperatorsMathRegistry(jsclEngine.getOperatorsRegistry(), mathEntityDao); + final CalculatorPostfixFunctionsRegistry postfixFunctionsRegistry = new CalculatorPostfixFunctionsRegistry(jsclEngine.getPostfixFunctionsRegistry(), mathEntityDao); + + return new CalculatorEngineImpl(jsclEngine, varsRegistry, functionsRegistry, operatorsRegistry, postfixFunctionsRegistry, null); + } +} diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java similarity index 88% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java rename to calculatorpp-core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java index a9b21894..9d0e3d27 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/FromJsclSimplifyTextProcessorTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/FromJsclSimplifyTextProcessorTest.java @@ -1,9 +1,9 @@ -package org.solovyev.android.calculator.model; +package org.solovyev.android.calculator; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.solovyev.android.calculator.CalculatorLocatorImpl; +import org.solovyev.android.calculator.model.Var; import org.solovyev.android.calculator.text.FromJsclSimplifyTextProcessor; import java.text.DecimalFormatSymbols; @@ -13,11 +13,11 @@ import java.text.DecimalFormatSymbols; * Date: 10/20/11 * Time: 3:43 PM */ -public class FromJsclSimplifyTextProcessorTest { +public class FromJsclSimplifyTextProcessorTest extends AbstractCalculatorTest { @BeforeClass - public static void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().getEngine().init(); + public static void staticSetUp() throws Exception { + CalculatorTestUtils.staticSetUp(); } @Test @@ -28,7 +28,7 @@ public class FromJsclSimplifyTextProcessorTest { //Assert.assertEquals("((e)(e))", tp.process("((2.718281828459045)*(2.718281828459045))")); DecimalFormatSymbols decimalGroupSymbols = new DecimalFormatSymbols(); decimalGroupSymbols.setGroupingSeparator(' '); - ((AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine()).setDecimalGroupSymbols(decimalGroupSymbols); + CalculatorLocatorImpl.getInstance().getEngine().setDecimalGroupSymbols(decimalGroupSymbols); //Assert.assertEquals("123 456 789e", tp.process("123456789*2.718281828459045")); //Assert.assertEquals("123 456 789e", tp.process("123 456 789 * 2.718281828459045")); //Assert.assertEquals("t11e", tp.process("t11*2.718281828459045")); diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java similarity index 83% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java rename to calculatorpp-core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java index 33fde252..3ba2a771 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/jscl/FromJsclNumericTextProcessorTest.java @@ -13,18 +13,19 @@ import jscl.math.Generic; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.solovyev.android.calculator.CalculatorLocatorImpl; +import org.solovyev.android.calculator.AbstractCalculatorTest; +import org.solovyev.android.calculator.CalculatorTestUtils; /** * User: serso * Date: 10/18/11 * Time: 10:42 PM */ -public class FromJsclNumericTextProcessorTest { +public class FromJsclNumericTextProcessorTest extends AbstractCalculatorTest { - @BeforeClass - public static void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().getEngine().init(); + @BeforeClass + public static void staticSetUp() throws Exception { + CalculatorTestUtils.staticSetUp(); } @Test diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java index 2d678522..af6e8e86 100644 --- a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/math/MathTypeTest.java @@ -10,6 +10,7 @@ import junit.framework.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.solovyev.android.calculator.AbstractCalculatorTest; +import org.solovyev.android.calculator.CalculatorTestUtils; /** * User: serso @@ -20,7 +21,7 @@ public class MathTypeTest extends AbstractCalculatorTest { @BeforeClass public static void staticSetUp() throws Exception { - AbstractCalculatorTest.staticSetUp(); + CalculatorTestUtils.staticSetUp(); } @Test diff --git a/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java new file mode 100644 index 00000000..edffffd9 --- /dev/null +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java @@ -0,0 +1,448 @@ +/* + * Copyright (c) 2009-2011. Created by serso aka se.solovyev. + * For more information, please, contact se.solovyev@gmail.com + */ + +package org.solovyev.android.calculator.model; + +import jscl.AngleUnit; +import jscl.JsclMathEngine; +import jscl.MathEngine; +import jscl.NumeralBase; +import jscl.math.Expression; +import jscl.math.Generic; +import jscl.math.function.Constant; +import jscl.math.function.CustomFunction; +import jscl.text.ParseException; +import junit.framework.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.solovyev.android.calculator.CalculatorEvalException; +import org.solovyev.android.calculator.CalculatorLocatorImpl; +import org.solovyev.android.calculator.CalculatorTestUtils; + +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +import static junit.framework.Assert.fail; + +/** + * User: serso + * Date: 9/17/11 + * Time: 9:47 PM + */ + +@SuppressWarnings("deprecation") +public class AndroidCalculatorEngineTest { + + @BeforeClass + public static void setUp() throws Exception { + CalculatorTestUtils.staticSetUp(); + CalculatorLocatorImpl.getInstance().getEngine().setPrecision(3); + } + + + @Test + public void testDegrees() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + final AngleUnit defaultAngleUnit = cm.getAngleUnits(); + try { + cm.setAngleUnits(AngleUnit.rad); + cm.setPrecision(3); + try { + Assert.assertEquals("0.017", cm.evaluate("°")); + fail(); + } catch (ParseException e) { + + } + + Assert.assertEquals("0.017", cm.evaluate( "1°")); + Assert.assertEquals("0.349", cm.evaluate( "20.0°")); + Assert.assertEquals("0.5", cm.evaluate( "sin(30°)")); + Assert.assertEquals("0.524", cm.evaluate( "asin(sin(30°))")); + Assert.assertEquals("∂(cos(t), t, t, 1°)", cm.evaluate( "∂(cos(t),t,t,1°)")); + + Assert.assertEquals("∂(cos(t), t, t, 1°)", cm.simplify("∂(cos(t),t,t,1°)")); + } finally { + cm.setAngleUnits(defaultAngleUnit); + } + } + +/* @Test + public void testLongExecution() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + try { + cm.evaluate( "3^10^10^10"); + fail(); + } catch (ParseException e) { + if (e.getMessageCode().equals(Messages.msg_3)) { + + } else { + System.out.print(e.getCause().getMessage()); + fail(); + } + } + + try { + cm.evaluate("9999999!"); + fail(); + } catch (ParseException e) { + if (e.getMessageCode().equals(Messages.msg_3)) { + + } else { + System.out.print(e.getCause().getMessage()); + fail(); + } + } + + final long start = System.currentTimeMillis(); + try { + cm.evaluate( "3^10^10^10"); + fail(); + } catch (ParseException e) { + if (e.getMessage().startsWith("Too long calculation")) { + final long end = System.currentTimeMillis(); + Assert.assertTrue(end - start < 1000); + } else { + fail(); + } + } + + }*/ + + @Test + public void testEvaluate() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("cos(t)+10%", cm.simplify( "cos(t)+10%")); + + final Generic expression = cm.simplifyGeneric("cos(t)+10%"); + expression.substitute(new Constant("t"), Expression.valueOf(100d)); + + Assert.assertEquals("it", cm.simplify( "it")); + Assert.assertEquals("10%", cm.simplify( "10%")); + Assert.assertEquals("0", cm.evaluate( "eq(0, 1)")); + Assert.assertEquals("1", cm.evaluate( "eq(1, 1)")); + Assert.assertEquals("1", cm.evaluate( "eq( 1, 1)")); + Assert.assertEquals("1", cm.simplify( "eq( 1, 1)")); + Assert.assertEquals("1", cm.evaluate( "lg(10)")); + Assert.assertEquals("4", cm.evaluate( "2+2")); + final AngleUnit defaultAngleUnit = cm.getAngleUnits(); + try { + cm.setAngleUnits(AngleUnit.rad); + Assert.assertEquals("-0.757", cm.evaluate( "sin(4)")); + Assert.assertEquals("0.524", cm.evaluate( "asin(0.5)")); + Assert.assertEquals("-0.396", cm.evaluate( "sin(4)asin(0.5)")); + Assert.assertEquals("-0.56", cm.evaluate( "sin(4)asin(0.5)√(2)")); + Assert.assertEquals("-0.56", cm.evaluate( "sin(4)asin(0.5)√(2)")); + } finally { + cm.setAngleUnits(defaultAngleUnit); + } + Assert.assertEquals("7.389", cm.evaluate( "e^2")); + Assert.assertEquals("7.389", cm.evaluate( "exp(1)^2")); + Assert.assertEquals("7.389", cm.evaluate( "exp(2)")); + Assert.assertEquals("2+i", cm.evaluate( "2*1+√(-1)")); + try { + cm.setAngleUnits(AngleUnit.rad); + Assert.assertEquals("0.921+Πi", cm.evaluate( "ln(5cosh(38π√(2cos(2))))")); + Assert.assertEquals("-3.41+3.41i", cm.evaluate( "(5tan(2i)+2i)/(1-i)")); + } finally { + cm.setAngleUnits(defaultAngleUnit); + } + Assert.assertEquals("7.389i", cm.evaluate( "iexp(2)")); + Assert.assertEquals("2+7.389i", cm.evaluate( "2+iexp(2)")); + Assert.assertEquals("2+7.389i", cm.evaluate( "2+√(-1)exp(2)")); + Assert.assertEquals("2-2.5i", cm.evaluate( "2-2.5i")); + Assert.assertEquals("-2-2.5i", cm.evaluate( "-2-2.5i")); + Assert.assertEquals("-2+2.5i", cm.evaluate( "-2+2.5i")); + Assert.assertEquals("-2+2.1i", cm.evaluate( "-2+2.1i")); + Assert.assertEquals("-0.1-0.2i", cm.evaluate( "(1-i)/(2+6i)")); + + junit.framework.Assert.assertEquals("24", cm.evaluate( "4!")); + junit.framework.Assert.assertEquals("24", cm.evaluate( "(2+2)!")); + junit.framework.Assert.assertEquals("120", cm.evaluate( "(2+2+1)!")); + junit.framework.Assert.assertEquals("24", cm.evaluate( "(2.0+2.0)!")); + junit.framework.Assert.assertEquals("24", cm.evaluate( "4.0!")); + junit.framework.Assert.assertEquals("720", cm.evaluate( "(3!)!")); + junit.framework.Assert.assertEquals("36", Expression.valueOf("3!^2").numeric().toString()); + junit.framework.Assert.assertEquals("3", Expression.valueOf("cubic(27)").numeric().toString()); + try { + junit.framework.Assert.assertEquals("√(-1)!", cm.evaluate( "i!")); + fail(); + } catch (ParseException e) { + } + + junit.framework.Assert.assertEquals("1", cm.evaluate( "(π/π)!")); + + try { + junit.framework.Assert.assertEquals("i", cm.evaluate( "(-1)i!")); + fail(); + } catch (ParseException e) { + + } + junit.framework.Assert.assertEquals("24i", cm.evaluate( "4!i")); + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("si", 5d)); + + try { + cm.setAngleUnits(AngleUnit.rad); + Assert.assertEquals("0.451", cm.evaluate( "acos(0.8999999999999811)")); + Assert.assertEquals("-0.959", cm.evaluate( "sin(5)")); + Assert.assertEquals("-4.795", cm.evaluate( "sin(5)si")); + Assert.assertEquals("-23.973", cm.evaluate( "sisin(5)si")); + Assert.assertEquals("-23.973", cm.evaluate( "si*sin(5)si")); + Assert.assertEquals("-3.309", cm.evaluate( "sisin(5si)si")); + } finally { + cm.setAngleUnits(defaultAngleUnit); + } + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("s", 1d)); + Assert.assertEquals("5", cm.evaluate( "si")); + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("k", 3.5d)); + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("k1", 4d)); + Assert.assertEquals("4", cm.evaluate( "k11")); + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", (String) null)); + Assert.assertEquals("11t", cm.evaluate( "t11")); + Assert.assertEquals("11et", cm.evaluate( "t11e")); + Assert.assertEquals("∞", cm.evaluate( "∞")); + Assert.assertEquals("∞", cm.evaluate( "Infinity")); + Assert.assertEquals("11∞t", cm.evaluate( "t11∞")); + Assert.assertEquals("-t+t^3", cm.evaluate( "t(t-1)(t+1)")); + + Assert.assertEquals("100", cm.evaluate( "0.1E3")); + Assert.assertEquals("3.957", cm.evaluate( "ln(8)lg(8)+ln(8)")); + + Assert.assertEquals("0.933", cm.evaluate( "0x:E/0x:F")); + + try { + cm.setNumeralBase(NumeralBase.hex); + Assert.assertEquals("E/F", cm.evaluate( "0x:E/0x:F")); + Assert.assertEquals("E/F", cm.simplify( "0x:E/0x:F")); + Assert.assertEquals("E/F", cm.evaluate( "E/F")); + Assert.assertEquals("E/F", cm.simplify( "E/F")); + } finally { + cm.setNumeralBase(NumeralBase.dec); + } + + Assert.assertEquals("0", cm.evaluate( "((((((0))))))")); + Assert.assertEquals("0", cm.evaluate( "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))")); + + + /* Assert.assertEquals("0.524", cm.evaluate( "30°").getResult()); + Assert.assertEquals("0.524", cm.evaluate( "(10+20)°").getResult()); + Assert.assertEquals("1.047", cm.evaluate( "(10+20)°*2").getResult()); + try { + Assert.assertEquals("0.278", cm.evaluate( "30°^2").getResult()); + junit.framework.Assert.fail(); + } catch (ParseException e) { + if ( !e.getMessage().equals("Power operation after postfix function is currently unsupported!") ) { + junit.framework.Assert.fail(); + } + }*//* + +*//* try { + cm.setTimeout(5000); + Assert.assertEquals("2", cm.evaluate( "2!").getResult()); + } finally { + cm.setTimeout(3000); + }*/ + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", (String) null)); + Assert.assertEquals("2t", cm.simplify( "∂(t^2,t)")); + Assert.assertEquals("2t", cm.evaluate( "∂(t^2,t)")); + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", "2")); + Assert.assertEquals("2t", cm.simplify( "∂(t^2,t)")); + Assert.assertEquals("4", cm.evaluate( "∂(t^2,t)")); + + Assert.assertEquals("-x+x*ln(x)", cm.simplify("∫(ln(x), x)")); + Assert.assertEquals("-(x-x*ln(x))/(ln(2)+ln(5))", cm.simplify("∫(log(10, x), x)")); + + Assert.assertEquals("∫((ln(2)+ln(5))/ln(x), x)", cm.simplify("∫(ln(10)/ln(x), x)")); + Assert.assertEquals("∫(ln(10)/ln(x), x)", Expression.valueOf("∫(log(x, 10), x)").expand().toString()); + Assert.assertEquals("∫((ln(2)+ln(5))/ln(x), x)", cm.simplify("∫(log(x, 10), x)")); + } + + @Test + public void testFormatting() throws Exception { + final MathEngine ce = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("12 345", ce.simplify( "12345")); + + } + + @Test + public void testI() throws ParseException, CalculatorEvalException { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("-i", cm.evaluate( "i^3")); + for (int i = 0; i < 1000; i++) { + double real = (Math.random()-0.5) * 1000; + double imag = (Math.random()-0.5) * 1000; + int exp = (int)(Math.random() * 10); + + final StringBuilder sb = new StringBuilder(); + sb.append(real); + if ( imag > 0 ) { + sb.append("+"); + } + sb.append(imag); + sb.append("^").append(exp); + try { + cm.evaluate( sb.toString()); + } catch (Throwable e) { + fail(sb.toString()); + } + } + } + + @Test + public void testEmptyFunction() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + try { + cm.evaluate( "cos(cos(cos(cos(acos(acos(acos(acos(acos(acos(acos(acos(cos(cos(cos(cos(cosh(acos(cos(cos(cos(cos(cos(acos(acos(acos(acos(acos(acos(acos(acos(cos(cos(cos(cos(cosh(acos(cos())))))))))))))))))))))))))))))))))))))"); + Assert.fail(); + } catch (ParseException e) { + } + Assert.assertEquals("0.34+1.382i", cm.evaluate( "ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(100)))))))))))))))")); + try { + cm.evaluate( "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos())))))))))))))))))))))))))))))))))))"); + Assert.fail(); + } catch (ParseException e) { + } + + final AngleUnit defaultAngleUnit = cm.getAngleUnits(); + try { + cm.setAngleUnits(AngleUnit.rad); + Assert.assertEquals("0.739", cm.evaluate( "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(1))))))))))))))))))))))))))))))))))))")); + } finally { + cm.setAngleUnits(defaultAngleUnit); + } + + CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("si", 5d)); + Assert.assertEquals("5", cm.evaluate( "si")); + + try { + cm.evaluate( "sin"); + Assert.fail(); + } catch (ParseException e) { + } + } + + @Test + public void testRounding() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + try { + DecimalFormatSymbols decimalGroupSymbols = new DecimalFormatSymbols(Locale.getDefault()); + decimalGroupSymbols.setDecimalSeparator('.'); + decimalGroupSymbols.setGroupingSeparator('\''); + cm.setDecimalGroupSymbols(decimalGroupSymbols); + cm.setPrecision(2); + Assert.assertEquals("12'345'678.9", cm.evaluate( "1.23456789E7")); + cm.setPrecision(10); + Assert.assertEquals("12'345'678.9", cm.evaluate( "1.23456789E7")); + Assert.assertEquals("123'456'789", cm.evaluate( "1.234567890E8")); + Assert.assertEquals("1'234'567'890.1", cm.evaluate( "1.2345678901E9")); + } finally { + cm.setPrecision(3); + DecimalFormatSymbols decimalGroupSymbols = new DecimalFormatSymbols(Locale.getDefault()); + decimalGroupSymbols.setDecimalSeparator('.'); + decimalGroupSymbols.setGroupingSeparator(JsclMathEngine.GROUPING_SEPARATOR_DEFAULT.charAt(0)); + cm.setDecimalGroupSymbols(decimalGroupSymbols); + } + } + + @Test + public void testComparisonFunction() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("0", cm.evaluate( "eq(0, 1)")); + Assert.assertEquals("1", cm.evaluate( "eq(1, 1)")); + Assert.assertEquals("1", cm.evaluate( "eq(1, 1.0)")); + Assert.assertEquals("0", cm.evaluate( "eq(1, 1.000000000000001)")); + Assert.assertEquals("0", cm.evaluate( "eq(1, 0)")); + + Assert.assertEquals("1", cm.evaluate( "lt(0, 1)")); + Assert.assertEquals("0", cm.evaluate( "lt(1, 1)")); + Assert.assertEquals("0", cm.evaluate( "lt(1, 0)")); + + Assert.assertEquals("0", cm.evaluate( "gt(0, 1)")); + Assert.assertEquals("0", cm.evaluate( "gt(1, 1)")); + Assert.assertEquals("1", cm.evaluate( "gt(1, 0)")); + + Assert.assertEquals("1", cm.evaluate( "ne(0, 1)")); + Assert.assertEquals("0", cm.evaluate( "ne(1, 1)")); + Assert.assertEquals("1", cm.evaluate( "ne(1, 0)")); + + Assert.assertEquals("1", cm.evaluate( "le(0, 1)")); + Assert.assertEquals("1", cm.evaluate( "le(1, 1)")); + Assert.assertEquals("0", cm.evaluate( "le(1, 0)")); + + Assert.assertEquals("0", cm.evaluate( "ge(0, 1)")); + Assert.assertEquals("1", cm.evaluate( "ge(1, 1)")); + Assert.assertEquals("1", cm.evaluate( "ge(1, 0)")); + + Assert.assertEquals("0", cm.evaluate( "ap(0, 1)")); + Assert.assertEquals("1", cm.evaluate( "ap(1, 1)")); + //Assert.assertEquals("1", cm.evaluate( "ap(1, 1.000000000000001)").getResult()); + Assert.assertEquals("0", cm.evaluate( "ap(1, 0)")); + + } + + + @Test + public void testNumeralSystems() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("11 259 375", cm.evaluate( "0x:ABCDEF")); + Assert.assertEquals("30 606 154.462", cm.evaluate( "0x:ABCDEF*e")); + Assert.assertEquals("30 606 154.462", cm.evaluate( "e*0x:ABCDEF")); + Assert.assertEquals("e", cm.evaluate( "e*0x:ABCDEF/0x:ABCDEF")); + Assert.assertEquals("30 606 154.462", cm.evaluate( "0x:ABCDEF*e*0x:ABCDEF/0x:ABCDEF")); + Assert.assertEquals("30 606 154.462", cm.evaluate( "c+0x:ABCDEF*e*0x:ABCDEF/0x:ABCDEF-c+0x:C-0x:C")); + Assert.assertEquals("1 446 257 064 651.832", cm.evaluate( "28*28 * sin(28) - 0b:1101 + √(28) + exp ( 28) ")); + Assert.assertEquals("13", cm.evaluate( "0b:1101")); + + try { + cm.evaluate( "0b:π"); + Assert.fail(); + } catch (ParseException e) { + // ok + } + + final NumeralBase defaultNumeralBase = cm.getNumeralBase(); + try{ + cm.setNumeralBase(NumeralBase.bin); + Assert.assertEquals("101", cm.evaluate( "10+11")); + Assert.assertEquals("10/11", cm.evaluate( "10/11")); + + cm.setNumeralBase(NumeralBase.hex); + Assert.assertEquals("63 7B", cm.evaluate( "56CE+CAD")); + Assert.assertEquals("E", cm.evaluate( "E")); + } finally { + cm.setNumeralBase(defaultNumeralBase); + } + } + + @Test + public void testLog() throws Exception { + final MathEngine cm = CalculatorLocatorImpl.getInstance().getEngine().getMathEngine0(); + + Assert.assertEquals("∞", Expression.valueOf("1/0").numeric().toString()); + Assert.assertEquals("∞", Expression.valueOf("ln(10)/ln(1)").numeric().toString()); + + // logarithm + Assert.assertEquals("ln(x)/ln(base)", ((CustomFunction) cm.getFunctionsRegistry().get("log")).getContent()); + Assert.assertEquals("∞", cm.evaluate( "log(1, 10)")); + Assert.assertEquals("3.322", cm.evaluate( "log(2, 10)")); + Assert.assertEquals("1.431", cm.evaluate( "log(5, 10)")); + Assert.assertEquals("0.96", cm.evaluate( "log(11, 10)")); + Assert.assertEquals("1/(bln(a))", cm.simplify( "∂(log(a, b), b)")); + Assert.assertEquals("-ln(b)/(aln(a)^2)", cm.simplify( "∂(log(a, b), a)")); + + } +} diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java similarity index 91% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java rename to calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java index 57f2600a..3ee2b8b7 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/NumeralBaseTest.java @@ -10,9 +10,7 @@ import org.jetbrains.annotations.NotNull; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.solovyev.android.calculator.CalculatorEvalException; -import org.solovyev.android.calculator.CalculatorLocatorImpl; -import org.solovyev.android.calculator.CalculatorParseException; +import org.solovyev.android.calculator.*; import org.solovyev.common.Converter; import java.io.InputStreamReader; @@ -24,12 +22,12 @@ import java.util.List; * Date: 12/14/11 * Time: 4:16 PM */ -public class NumeralBaseTest { +public class NumeralBaseTest extends AbstractCalculatorTest { @BeforeClass - public static void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().getEngine().init(); - ((AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine()).setPrecision(3); + public static void staticSetUp() throws Exception { + CalculatorTestUtils.staticSetUp(); + CalculatorLocatorImpl.getInstance().getEngine().setPrecision(3); } @Test diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java similarity index 95% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java rename to calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java index 0d8a8b17..ecf0db42 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java +++ b/calculatorpp-core/src/test/java/org/solovyev/android/calculator/model/ToJsclTextProcessorTest.java @@ -11,10 +11,7 @@ import jscl.NumeralBase; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.solovyev.android.calculator.CalculatorLocatorImpl; -import org.solovyev.android.calculator.CalculatorParseException; -import org.solovyev.android.calculator.PreparedExpression; -import org.solovyev.android.calculator.ToJsclTextProcessor; +import org.solovyev.android.calculator.*; import org.solovyev.android.calculator.text.TextProcessor; /** @@ -22,11 +19,11 @@ import org.solovyev.android.calculator.text.TextProcessor; * Date: 9/26/11 * Time: 12:13 PM */ -public class ToJsclTextProcessorTest { +public class ToJsclTextProcessorTest extends AbstractCalculatorTest { @BeforeClass - public static void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().getEngine().init(); + public static void staticSetUp() throws Exception { + CalculatorTestUtils.staticSetUp(); } @Test diff --git a/calculatorpp/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv b/calculatorpp-core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv similarity index 100% rename from calculatorpp/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv rename to calculatorpp-core/src/test/resources/org/solovyev/android/calculator/model/nb_table.csv diff --git a/calculatorpp/pom.xml b/calculatorpp/pom.xml index 69e4a62e..408c8e4a 100644 --- a/calculatorpp/pom.xml +++ b/calculatorpp/pom.xml @@ -115,6 +115,13 @@ test + + org.mockito + mockito-core + 1.9.0 + test + + org.simpleframework simple-xml diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java b/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java new file mode 100644 index 00000000..31fd2bd0 --- /dev/null +++ b/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorTestUtils.java @@ -0,0 +1,33 @@ +package org.solovyev.android.calculator; + +import jscl.JsclMathEngine; +import org.jetbrains.annotations.NotNull; +import org.mockito.Mockito; +import org.solovyev.android.calculator.history.CalculatorHistory; + +/** + * User: serso + * Date: 10/7/12 + * Time: 8:56 PM + */ +public class CalculatorTestUtils { + + public static void staticSetUp() throws Exception { + CalculatorLocatorImpl.getInstance().init(new CalculatorImpl(), newCalculatorEngine(), Mockito.mock(CalculatorClipboard.class), Mockito.mock(CalculatorNotifier.class), Mockito.mock(CalculatorHistory.class)); + CalculatorLocatorImpl.getInstance().getEngine().init(); + } + + @NotNull + static CalculatorEngineImpl newCalculatorEngine() { + final MathEntityDao mathEntityDao = Mockito.mock(MathEntityDao.class); + + final JsclMathEngine jsclEngine = JsclMathEngine.getInstance(); + + final CalculatorVarsRegistry varsRegistry = new CalculatorVarsRegistry(jsclEngine.getConstantsRegistry(), mathEntityDao); + final CalculatorFunctionsMathRegistry functionsRegistry = new CalculatorFunctionsMathRegistry(jsclEngine.getFunctionsRegistry(), mathEntityDao); + final CalculatorOperatorsMathRegistry operatorsRegistry = new CalculatorOperatorsMathRegistry(jsclEngine.getOperatorsRegistry(), mathEntityDao); + final CalculatorPostfixFunctionsRegistry postfixFunctionsRegistry = new CalculatorPostfixFunctionsRegistry(jsclEngine.getPostfixFunctionsRegistry(), mathEntityDao); + + return new CalculatorEngineImpl(jsclEngine, varsRegistry, functionsRegistry, operatorsRegistry, postfixFunctionsRegistry, null); + } +} diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/plot/CalculatorppTestRunner.java b/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java similarity index 90% rename from calculatorpp/src/test/java/org/solovyev/android/calculator/plot/CalculatorppTestRunner.java rename to calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java index c5155e17..d6258b1e 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/plot/CalculatorppTestRunner.java +++ b/calculatorpp/src/test/java/org/solovyev/android/calculator/CalculatorppTestRunner.java @@ -1,4 +1,4 @@ -package org.solovyev.android.calculator.plot; +package org.solovyev.android.calculator; import com.xtremelabs.robolectric.RobolectricTestRunner; import org.jetbrains.annotations.NotNull; diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java b/calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java index b2e10d35..a381faca 100644 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java +++ b/calculatorpp/src/test/java/org/solovyev/android/calculator/TextHighlighterTest.java @@ -9,6 +9,7 @@ package org.solovyev.android.calculator; import jscl.MathEngine; import jscl.NumeralBase; import junit.framework.Assert; +import org.junit.Before; import org.junit.Test; import org.solovyev.android.calculator.text.TextProcessor; import org.solovyev.android.calculator.view.TextHighlighter; @@ -23,7 +24,12 @@ import java.util.Random; */ public class TextHighlighterTest { - @Test + @Before + public void setUp() throws Exception { + CalculatorTestUtils.staticSetUp(); + } + + @Test public void testProcess() throws Exception { TextProcessor textHighlighter = new TextHighlighter(0, false); diff --git a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java b/calculatorpp/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java deleted file mode 100644 index cf98f495..00000000 --- a/calculatorpp/src/test/java/org/solovyev/android/calculator/model/AndroidCalculatorEngineTest.java +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2009-2011. Created by serso aka se.solovyev. - * For more information, please, contact se.solovyev@gmail.com - */ - -package org.solovyev.android.calculator.model; - -import org.junit.BeforeClass; -import org.solovyev.android.calculator.CalculatorLocatorImpl; - -/** - * User: serso - * Date: 9/17/11 - * Time: 9:47 PM - */ - -public class AndroidCalculatorEngineTest { - - @BeforeClass - public static void setUp() throws Exception { - CalculatorLocatorImpl.getInstance().getEngine().init(); - ((AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine()).setPrecision(3); - } -/* - @Test - public void testDegrees() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - final AngleUnit defaultAngleUnit = cm.getEngine().getAngleUnits(); - try { - cm.getEngine().setAngleUnits(AngleUnit.rad); - cm.setPrecision(3); - try { - Assert.assertEquals("0.017", cm.evaluate(JsclOperation.numeric, "°")); - fail(); - } catch (CalculatorParseException e) { - - } - - Assert.assertEquals("0.017", cm.evaluate(JsclOperation.numeric, "1°").getStringResult()); - Assert.assertEquals("0.349", cm.evaluate(JsclOperation.numeric, "20.0°").getStringResult()); - Assert.assertEquals("0.5", cm.evaluate(JsclOperation.numeric, "sin(30°)").getStringResult()); - Assert.assertEquals("0.524", cm.evaluate(JsclOperation.numeric, "asin(sin(30°))").getStringResult()); - Assert.assertEquals("∂(cos(t), t, t, 1°)", cm.evaluate(JsclOperation.numeric, "∂(cos(t),t,t,1°)").getStringResult()); - - Assert.assertEquals("∂(cos(t), t, t, 1°)", cm.evaluate(JsclOperation.simplify, "∂(cos(t),t,t,1°)").getStringResult()); - } finally { - cm.getEngine().setAngleUnits(defaultAngleUnit); - } - } - - @Test - public void testLongExecution() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - try { - cm.evaluate(JsclOperation.numeric, "3^10^10^10"); - Assert.fail(); - } catch (CalculatorParseException e) { - if (e.getMessageCode().equals(Messages.msg_3)) { - - } else { - System.out.print(e.getCause().getMessage()); - Assert.fail(); - } - } - - try { - cm.evaluate(JsclOperation.numeric, "9999999!"); - Assert.fail(); - } catch (CalculatorParseException e) { - if (e.getMessageCode().equals(Messages.msg_3)) { - - } else { - System.out.print(e.getCause().getMessage()); - Assert.fail(); - } - } - - *//*final long start = System.currentTimeMillis(); - try { - cm.evaluate(JsclOperation.numeric, "3^10^10^10"); - Assert.fail(); - } catch (ParseException e) { - if (e.getMessage().startsWith("Too long calculation")) { - final long end = System.currentTimeMillis(); - Assert.assertTrue(end - start < 1000); - } else { - Assert.fail(); - } - }*//* - - } - - @Test - public void testEvaluate() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("cos(t)+10%", cm.evaluate(JsclOperation.simplify, "cos(t)+10%").getStringResult()); - - final Generic expression = cm.getEngine().simplifyGeneric("cos(t)+10%"); - expression.substitute(new Constant("t"), Expression.valueOf(100d)); - - Assert.assertEquals("it", cm.evaluate(JsclOperation.simplify, "it").getStringResult()); - Assert.assertEquals("10%", cm.evaluate(JsclOperation.simplify, "10%").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "eq(0, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq(1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq( 1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.simplify, "eq( 1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "lg(10)").getStringResult()); - Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "2+2").getStringResult()); - final AngleUnit defaultAngleUnit = cm.getEngine().getAngleUnits(); - try { - cm.getEngine().setAngleUnits(AngleUnit.rad); - Assert.assertEquals("-0.757", cm.evaluate(JsclOperation.numeric, "sin(4)").getStringResult()); - Assert.assertEquals("0.524", cm.evaluate(JsclOperation.numeric, "asin(0.5)").getStringResult()); - Assert.assertEquals("-0.396", cm.evaluate(JsclOperation.numeric, "sin(4)asin(0.5)").getStringResult()); - Assert.assertEquals("-0.56", cm.evaluate(JsclOperation.numeric, "sin(4)asin(0.5)√(2)").getStringResult()); - Assert.assertEquals("-0.56", cm.evaluate(JsclOperation.numeric, "sin(4)asin(0.5)√(2)").getStringResult()); - } finally { - cm.getEngine().setAngleUnits(defaultAngleUnit); - } - Assert.assertEquals("7.389", cm.evaluate(JsclOperation.numeric, "e^2").getStringResult()); - Assert.assertEquals("7.389", cm.evaluate(JsclOperation.numeric, "exp(1)^2").getStringResult()); - Assert.assertEquals("7.389", cm.evaluate(JsclOperation.numeric, "exp(2)").getStringResult()); - Assert.assertEquals("2+i", cm.evaluate(JsclOperation.numeric, "2*1+√(-1)").getStringResult()); - try { - cm.getEngine().setAngleUnits(AngleUnit.rad); - Assert.assertEquals("0.921+Πi", cm.evaluate(JsclOperation.numeric, "ln(5cosh(38π√(2cos(2))))").getStringResult()); - Assert.assertEquals("-3.41+3.41i", cm.evaluate(JsclOperation.numeric, "(5tan(2i)+2i)/(1-i)").getStringResult()); - } finally { - cm.getEngine().setAngleUnits(defaultAngleUnit); - } - Assert.assertEquals("7.389i", cm.evaluate(JsclOperation.numeric, "iexp(2)").getStringResult()); - Assert.assertEquals("2+7.389i", cm.evaluate(JsclOperation.numeric, "2+iexp(2)").getStringResult()); - Assert.assertEquals("2+7.389i", cm.evaluate(JsclOperation.numeric, "2+√(-1)exp(2)").getStringResult()); - Assert.assertEquals("2-2.5i", cm.evaluate(JsclOperation.numeric, "2-2.5i").getStringResult()); - Assert.assertEquals("-2-2.5i", cm.evaluate(JsclOperation.numeric, "-2-2.5i").getStringResult()); - Assert.assertEquals("-2+2.5i", cm.evaluate(JsclOperation.numeric, "-2+2.5i").getStringResult()); - Assert.assertEquals("-2+2.1i", cm.evaluate(JsclOperation.numeric, "-2+2.1i").getStringResult()); - Assert.assertEquals("-0.1-0.2i", cm.evaluate(JsclOperation.numeric, "(1-i)/(2+6i)").getStringResult()); - - junit.framework.Assert.assertEquals("24", cm.evaluate(JsclOperation.numeric, "4!").getStringResult()); - junit.framework.Assert.assertEquals("24", cm.evaluate(JsclOperation.numeric, "(2+2)!").getStringResult()); - junit.framework.Assert.assertEquals("120", cm.evaluate(JsclOperation.numeric, "(2+2+1)!").getStringResult()); - junit.framework.Assert.assertEquals("24", cm.evaluate(JsclOperation.numeric, "(2.0+2.0)!").getStringResult()); - junit.framework.Assert.assertEquals("24", cm.evaluate(JsclOperation.numeric, "4.0!").getStringResult()); - junit.framework.Assert.assertEquals("720", cm.evaluate(JsclOperation.numeric, "(3!)!").getStringResult()); - junit.framework.Assert.assertEquals("36", Expression.valueOf("3!^2").numeric().toString()); - junit.framework.Assert.assertEquals("3", Expression.valueOf("cubic(27)").numeric().toString()); - try { - junit.framework.Assert.assertEquals("√(-1)!", cm.evaluate(JsclOperation.numeric, "i!").getStringResult()); - fail(); - } catch (CalculatorParseException e) { - } - - junit.framework.Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "(π/π)!").getStringResult()); - - try { - junit.framework.Assert.assertEquals("i", cm.evaluate(JsclOperation.numeric, "(-1)i!").getStringResult()); - fail(); - } catch (CalculatorParseException e) { - - } - junit.framework.Assert.assertEquals("24i", cm.evaluate(JsclOperation.numeric, "4!i").getStringResult()); - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("si", 5d)); - - try { - cm.getEngine().setAngleUnits(AngleUnit.rad); - Assert.assertEquals("0.451", cm.evaluate(JsclOperation.numeric, "acos(0.8999999999999811)").getStringResult()); - Assert.assertEquals("-0.959", cm.evaluate(JsclOperation.numeric, "sin(5)").getStringResult()); - Assert.assertEquals("-4.795", cm.evaluate(JsclOperation.numeric, "sin(5)si").getStringResult()); - Assert.assertEquals("-23.973", cm.evaluate(JsclOperation.numeric, "sisin(5)si").getStringResult()); - Assert.assertEquals("-23.973", cm.evaluate(JsclOperation.numeric, "si*sin(5)si").getStringResult()); - Assert.assertEquals("-3.309", cm.evaluate(JsclOperation.numeric, "sisin(5si)si").getStringResult()); - } finally { - cm.getEngine().setAngleUnits(defaultAngleUnit); - } - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("s", 1d)); - Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getStringResult()); - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("k", 3.5d)); - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("k1", 4d)); - Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "k11").getStringResult()); - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", (String) null)); - Assert.assertEquals("11t", cm.evaluate(JsclOperation.numeric, "t11").getStringResult()); - Assert.assertEquals("11et", cm.evaluate(JsclOperation.numeric, "t11e").getStringResult()); - Assert.assertEquals("∞", cm.evaluate(JsclOperation.numeric, "∞").getStringResult()); - Assert.assertEquals("∞", cm.evaluate(JsclOperation.numeric, "Infinity").getStringResult()); - Assert.assertEquals("11∞t", cm.evaluate(JsclOperation.numeric, "t11∞").getStringResult()); - Assert.assertEquals("-t+t^3", cm.evaluate(JsclOperation.numeric, "t(t-1)(t+1)").getStringResult()); - - Assert.assertEquals("100", cm.evaluate(JsclOperation.numeric, "0.1E3").getStringResult()); - Assert.assertEquals("3.957", cm.evaluate(JsclOperation.numeric, "ln(8)lg(8)+ln(8)").getStringResult()); - - Assert.assertEquals("0.933", cm.evaluate(JsclOperation.numeric, "0x:E/0x:F").getStringResult()); - - try { - cm.getEngine().setNumeralBase(NumeralBase.hex); - Assert.assertEquals("E/F", cm.evaluate(JsclOperation.numeric, "0x:E/0x:F").getStringResult()); - Assert.assertEquals("E/F", cm.evaluate(JsclOperation.simplify, "0x:E/0x:F").getStringResult()); - Assert.assertEquals("E/F", cm.evaluate(JsclOperation.numeric, "E/F").getStringResult()); - Assert.assertEquals("E/F", cm.evaluate(JsclOperation.simplify, "E/F").getStringResult()); - } finally { - cm.getEngine().setNumeralBase(NumeralBase.dec); - } - - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "((((((0))))))").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))").getStringResult()); - - - *//* Assert.assertEquals("0.524", cm.evaluate(JsclOperation.numeric, "30°").getResult()); - Assert.assertEquals("0.524", cm.evaluate(JsclOperation.numeric, "(10+20)°").getResult()); - Assert.assertEquals("1.047", cm.evaluate(JsclOperation.numeric, "(10+20)°*2").getResult()); - try { - Assert.assertEquals("0.278", cm.evaluate(JsclOperation.numeric, "30°^2").getResult()); - junit.framework.Assert.fail(); - } catch (ParseException e) { - if ( !e.getMessage().equals("Power operation after postfix function is currently unsupported!") ) { - junit.framework.Assert.fail(); - } - }*//* - -*//* try { - cm.setTimeout(5000); - Assert.assertEquals("2", cm.evaluate(JsclOperation.numeric, "2!").getResult()); - } finally { - cm.setTimeout(3000); - }*//* - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", (String) null)); - Assert.assertEquals("2t", cm.evaluate(JsclOperation.simplify, "∂(t^2,t)").getStringResult()); - Assert.assertEquals("2t", cm.evaluate(JsclOperation.numeric, "∂(t^2,t)").getStringResult()); - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("t", "2")); - Assert.assertEquals("2t", cm.evaluate(JsclOperation.simplify, "∂(t^2,t)").getStringResult()); - Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "∂(t^2,t)").getStringResult()); - - Assert.assertEquals("-x+x*ln(x)", cm.getEngine().simplify("∫(ln(x), x)")); - Assert.assertEquals("-(x-x*ln(x))/(ln(2)+ln(5))", cm.getEngine().simplify("∫(log(10, x), x)")); - - Assert.assertEquals("∫((ln(2)+ln(5))/ln(x), x)", cm.getEngine().simplify("∫(ln(10)/ln(x), x)")); - Assert.assertEquals("∫(ln(10)/ln(x), x)", Expression.valueOf("∫(log(x, 10), x)").expand().toString()); - Assert.assertEquals("∫((ln(2)+ln(5))/ln(x), x)", cm.getEngine().simplify("∫(log(x, 10), x)")); - } - - @Test - public void testFormatting() throws Exception { - final AndroidCalculatorEngine ce = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("12 345", ce.evaluate(JsclOperation.simplify, "12345").getStringResult()); - - } - - @Test - public void testI() throws CalculatorParseException, CalculatorEvalException { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("-i", cm.evaluate(JsclOperation.numeric, "i^3").getStringResult()); - for (int i = 0; i < 1000; i++) { - double real = (Math.random()-0.5) * 1000; - double imag = (Math.random()-0.5) * 1000; - int exp = (int)(Math.random() * 10); - - final StringBuilder sb = new StringBuilder(); - sb.append(real); - if ( imag > 0 ) { - sb.append("+"); - } - sb.append(imag); - sb.append("^").append(exp); - try { - cm.evaluate(JsclOperation.numeric, sb.toString()).getStringResult(); - } catch (Throwable e) { - fail(sb.toString()); - } - } - } - - @Test - public void testEmptyFunction() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - try { - cm.evaluate(JsclOperation.numeric, "cos(cos(cos(cos(acos(acos(acos(acos(acos(acos(acos(acos(cos(cos(cos(cos(cosh(acos(cos(cos(cos(cos(cos(acos(acos(acos(acos(acos(acos(acos(acos(cos(cos(cos(cos(cosh(acos(cos())))))))))))))))))))))))))))))))))))))"); - Assert.fail(); - } catch (CalculatorParseException e) { - } - Assert.assertEquals("0.34+1.382i", cm.evaluate(JsclOperation.numeric, "ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(ln(100)))))))))))))))").getStringResult()); - try { - cm.evaluate(JsclOperation.numeric, "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos())))))))))))))))))))))))))))))))))))"); - Assert.fail(); - } catch (CalculatorParseException e) { - } - - final AngleUnit defaultAngleUnit = cm.getEngine().getAngleUnits(); - try { - cm.getEngine().setAngleUnits(AngleUnit.rad); - Assert.assertEquals("0.739", cm.evaluate(JsclOperation.numeric, "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(1))))))))))))))))))))))))))))))))))))").getStringResult()); - } finally { - cm.getEngine().setAngleUnits(defaultAngleUnit); - } - - CalculatorLocatorImpl.getInstance().getEngine().getVarsRegistry().add(new Var.Builder("si", 5d)); - Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getStringResult()); - - try { - cm.evaluate(JsclOperation.numeric, "sin"); - Assert.fail(); - } catch (CalculatorParseException e) { - } - } - - @Test - public void testRounding() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - try { - DecimalFormatSymbols decimalGroupSymbols = new DecimalFormatSymbols(Locale.getDefault()); - decimalGroupSymbols.setDecimalSeparator('.'); - decimalGroupSymbols.setGroupingSeparator('\''); - cm.setDecimalGroupSymbols(decimalGroupSymbols); - cm.setPrecision(2); - Assert.assertEquals("12'345'678.9", cm.evaluate(JsclOperation.numeric, "1.23456789E7").getStringResult()); - cm.setPrecision(10); - Assert.assertEquals("12'345'678.9", cm.evaluate(JsclOperation.numeric, "1.23456789E7").getStringResult()); - Assert.assertEquals("123'456'789", cm.evaluate(JsclOperation.numeric, "1.234567890E8").getStringResult()); - Assert.assertEquals("1'234'567'890.1", cm.evaluate(JsclOperation.numeric, "1.2345678901E9").getStringResult()); - } finally { - cm.setPrecision(3); - DecimalFormatSymbols decimalGroupSymbols = new DecimalFormatSymbols(Locale.getDefault()); - decimalGroupSymbols.setDecimalSeparator('.'); - decimalGroupSymbols.setGroupingSeparator(JsclMathEngine.GROUPING_SEPARATOR_DEFAULT.charAt(0)); - cm.setDecimalGroupSymbols(decimalGroupSymbols); - } - } - - @Test - public void testComparisonFunction() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "eq(0, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq(1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq(1, 1.0)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "eq(1, 1.000000000000001)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "eq(1, 0)").getStringResult()); - - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "lt(0, 1)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "lt(1, 1)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "lt(1, 0)").getStringResult()); - - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "gt(0, 1)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "gt(1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "gt(1, 0)").getStringResult()); - - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ne(0, 1)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "ne(1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ne(1, 0)").getStringResult()); - - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "le(0, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "le(1, 1)").getStringResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "le(1, 0)").getStringResult()); - - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "ge(0, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ge(1, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ge(1, 0)").getStringResult()); - - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "ap(0, 1)").getStringResult()); - Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ap(1, 1)").getStringResult()); - //Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "ap(1, 1.000000000000001)").getResult()); - Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "ap(1, 0)").getStringResult()); - - } - - - @Test - public void testNumeralSystems() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("11 259 375", cm.evaluate(JsclOperation.numeric, "0x:ABCDEF").getStringResult()); - Assert.assertEquals("30 606 154.462", cm.evaluate(JsclOperation.numeric, "0x:ABCDEF*e").getStringResult()); - Assert.assertEquals("30 606 154.462", cm.evaluate(JsclOperation.numeric, "e*0x:ABCDEF").getStringResult()); - Assert.assertEquals("e", cm.evaluate(JsclOperation.numeric, "e*0x:ABCDEF/0x:ABCDEF").getStringResult()); - Assert.assertEquals("30 606 154.462", cm.evaluate(JsclOperation.numeric, "0x:ABCDEF*e*0x:ABCDEF/0x:ABCDEF").getStringResult()); - Assert.assertEquals("30 606 154.462", cm.evaluate(JsclOperation.numeric, "c+0x:ABCDEF*e*0x:ABCDEF/0x:ABCDEF-c+0x:C-0x:C").getStringResult()); - Assert.assertEquals("1 446 257 064 651.832", cm.evaluate(JsclOperation.numeric, "28*28 * sin(28) - 0b:1101 + √(28) + exp ( 28) ").getStringResult()); - Assert.assertEquals("13", cm.evaluate(JsclOperation.numeric, "0b:1101").getStringResult()); - - try { - cm.evaluate(JsclOperation.numeric, "0b:π").getStringResult(); - Assert.fail(); - } catch (CalculatorParseException e) { - // ok - } - - final NumeralBase defaultNumeralBase = cm.getEngine().getNumeralBase(); - try{ - cm.getEngine().setNumeralBase(NumeralBase.bin); - Assert.assertEquals("101", cm.evaluate(JsclOperation.numeric, "10+11").getStringResult()); - Assert.assertEquals("10/11", cm.evaluate(JsclOperation.numeric, "10/11").getStringResult()); - - cm.getEngine().setNumeralBase(NumeralBase.hex); - Assert.assertEquals("63 7B", cm.evaluate(JsclOperation.numeric, "56CE+CAD").getStringResult()); - Assert.assertEquals("E", cm.evaluate(JsclOperation.numeric, "E").getStringResult()); - } finally { - cm.setNumeralBase(defaultNumeralBase); - } - } - - @Test - public void testLog() throws Exception { - final AndroidCalculatorEngine cm = (AndroidCalculatorEngine) CalculatorLocatorImpl.getInstance().getEngine(); - - Assert.assertEquals("∞", Expression.valueOf("1/0").numeric().toString()); - Assert.assertEquals("∞", Expression.valueOf("ln(10)/ln(1)").numeric().toString()); - - // logarithm - Assert.assertEquals("ln(x)/ln(base)", ((CustomFunction) cm.getFunctionsRegistry().get("log")).getContent()); - Assert.assertEquals("∞", cm.evaluate(JsclOperation.numeric, "log(1, 10)").getStringResult()); - Assert.assertEquals("3.322", cm.evaluate(JsclOperation.numeric, "log(2, 10)").getStringResult()); - Assert.assertEquals("1.431", cm.evaluate(JsclOperation.numeric, "log(5, 10)").getStringResult()); - Assert.assertEquals("0.96", cm.evaluate(JsclOperation.numeric, "log(11, 10)").getStringResult()); - Assert.assertEquals("1/(bln(a))", cm.evaluate(JsclOperation.simplify, "∂(log(a, b), b)").getStringResult()); - Assert.assertEquals("-ln(b)/(aln(a)^2)", cm.evaluate(JsclOperation.simplify, "∂(log(a, b), a)").getStringResult()); - - }*/ -} diff --git a/pom.xml b/pom.xml index 471d7388..529242c7 100644 --- a/pom.xml +++ b/pom.xml @@ -181,6 +181,16 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.3 + + perTest + + + @@ -234,16 +244,6 @@ 1.5 - - -