/*
* Copyright 2013 serso aka se.solovyev
*
* 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.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details
*
* Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org
*/
package org.solovyev.android.calculator.model;
import jscl.AngleUnit;
import jscl.MathEngine;
import jscl.NumeralBase;
import jscl.math.Expression;
import jscl.math.Generic;
import jscl.math.function.Constant;
import org.junit.Before;
import org.junit.Test;
import org.solovyev.android.calculator.BaseCalculatorTest;
import org.solovyev.android.calculator.jscl.JsclOperation;
import org.solovyev.android.calculator.variables.CppVariable;
public class EvaluateTest extends BaseCalculatorTest {
@Before
public void setUp() throws Exception {
super.setUp();
engine.getMathEngine().setPrecision(3);
}
@Test
public void testEvaluate() throws Exception {
final MathEngine cm = engine.getMathEngine();
final AngleUnit defaultAngleUnit = cm.getAngleUnits();
assertEval("cos(t)+10%", "cos(t)+10%", JsclOperation.simplify);
final Generic expression = cm.simplifyGeneric("cos(t)+10%");
expression.substitute(new Constant("t"), Expression.valueOf(100d));
assertEval("it", "it", JsclOperation.simplify);
assertEval("10%", "10%", JsclOperation.simplify);
assertEval("0", "eq(0, 1)");
assertEval("1", "eq(1, 1)");
assertEval("1", "eq( 1, 1)");
assertEval("1", "eq( 1, 1)", JsclOperation.simplify);
assertEval("1", "lg(10)");
assertEval("4", "2+2");
try {
cm.setAngleUnits(AngleUnit.rad);
assertEval("-0.757", "sin(4)");
assertEval("0.524", "asin(0.5)");
assertEval("-0.396", "sin(4)asin(0.5)");
assertEval("-0.56", "sin(4)asin(0.5)√(2)");
assertEval("-0.56", "sin(4)asin(0.5)√(2)");
} finally {
cm.setAngleUnits(defaultAngleUnit);
}
assertEval("7.389", "e^2");
assertEval("7.389", "exp(1)^2");
assertEval("7.389", "exp(2)");
assertEval("2+i", "2*1+√(-1)");
try {
cm.setAngleUnits(AngleUnit.rad);
assertEval("0.921+Πi", "ln(5cosh(38π√(2cos(2))))");
assertEval("-3.41+3.41i", "(5tan(2i)+2i)/(1-i)");
} finally {
cm.setAngleUnits(defaultAngleUnit);
}
assertEval("7.389i", "iexp(2)");
assertEval("2+7.389i", "2+iexp(2)");
assertEval("2+7.389i", "2+√(-1)exp(2)");
assertEval("2-2.5i", "2-2.5i");
assertEval("-2-2.5i", "-2-2.5i");
assertEval("-2+2.5i", "-2+2.5i");
assertEval("-2+2.1i", "-2+2.1i");
assertEval("-0.1-0.2i", "(1-i)/(2+6i)");
assertEval("24", "4!");
assertEval("24", "(2+2)!");
assertEval("120", "(2+2+1)!");
assertEval("24", "(2.0+2.0)!");
assertEval("24", "4.0!");
assertEval("720", "(3!)!");
assertEval("36", Expression.valueOf("3!^2").numeric().toString());
assertEval("3", Expression.valueOf("cubic(27)").numeric().toString());
assertError("i!");
assertEval("1", cm.evaluate("(π/π)!"));
assertError("(-1)i!");
assertEval("24i", "4!i");
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("si", 5d).build().toJsclConstant());
try {
cm.setAngleUnits(AngleUnit.rad);
assertEval("0.451", "acos(0.8999999999999811)");
assertEval("-0.959", "sin(5)");
assertEval("-4.795", "sin(5)si");
assertEval("-23.973", "sisin(5)si");
assertEval("-23.973", "si*sin(5)si");
assertEval("-3.309", "sisin(5si)si");
} finally {
cm.setAngleUnits(defaultAngleUnit);
}
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("s", 1d).build().toJsclConstant());
assertEval("5", cm.evaluate("si"));
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("k", 3.5d).build().toJsclConstant());
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("k1", 4d).build().toJsclConstant());
assertEval("4", "k11");
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("t").build().toJsclConstant());
assertEval("11t", "t11");
assertEval("11et", "t11e");
assertEval("∞", "∞");
assertEval("∞", "Infinity");
assertEval("11∞t", "t11∞");
assertEval("-t+t^3", "t(t-1)(t+1)");
assertEval("100", "0.1E3");
assertEval("3.957", "ln(8)lg(8)+ln(8)");
assertEval("0.933", "0x:E/0x:F");
try {
cm.setNumeralBase(NumeralBase.hex);
assertEval("0.EE E", "0x:E/0x:F");
assertEval("0.EE E", cm.simplify("0x:E/0x:F"));
assertEval("0.EE E", "E/F");
assertEval("0.EE E", cm.simplify("E/F"));
} finally {
cm.setNumeralBase(NumeralBase.dec);
}
assertEval("0", "((((((0))))))");
assertEval("0", "((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))");
/* assertEval("0.524", cm.evaluate( "30°").getResult());
assertEval("0.524", cm.evaluate( "(10+20)°").getResult());
assertEval("1.047", cm.evaluate( "(10+20)°*2").getResult());
try {
assertEval("0.278", cm.evaluate( "30°^2").getResult());
fail();
} catch (ParseException e) {
if ( !e.getMessage().equals("Power operation after postfix function is currently unsupported!") ) {
fail();
}
}*//*
*//* try {
cm.setTimeout(5000);
assertEval("2", cm.evaluate( "2!").getResult());
} finally {
cm.setTimeout(3000);
}*/
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("t").build().toJsclConstant());
assertEval("2t", "∂(t^2,t)", JsclOperation.simplify);
assertEval("2t", "∂(t^2,t)");
engine.getVariablesRegistry().addOrUpdate(CppVariable.builder("t", 2d).build().toJsclConstant());
assertEval("2t", "∂(t^2,t)", JsclOperation.simplify);
assertEval("4", "∂(t^2,t)");
assertEval("-x+xln(x)", "∫(ln(x), x)", JsclOperation.simplify);
assertEval("-(x-xln(x))/(ln(2)+ln(5))", "∫(log(10, x), x)", JsclOperation.simplify);
assertEval("∫((ln(2)+ln(5))/ln(x), x)", "∫(ln(10)/ln(x), x)", JsclOperation.simplify);
//assertEval("∫(ln(10)/ln(x), x)", Expression.valueOf("∫(log(x, 10), x)").expand().toString());
assertEval("∫((ln(2)+ln(5))/ln(x), x)", "∫(log(x, 10), x)");
assertEval("∫((ln(2)+ln(5))/ln(x), x)", "∫(log(x, 10), x)", JsclOperation.simplify);
}
}