Files
2026-06-17 14:00:51 +02:00

673 lines
40 KiB
Java

package jmri.jmrit.logixng.util.parser.functions;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import jmri.InstanceManager;
import jmri.JmriException;
import jmri.jmrit.logixng.SymbolTable;
import jmri.jmrit.logixng.implementation.DefaultConditionalNG;
import jmri.jmrit.logixng.implementation.DefaultSymbolTable;
import jmri.jmrit.logixng.util.LogixNG_Thread;
import jmri.jmrit.logixng.util.parser.*;
import jmri.util.JUnitUtil;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* Test ParsedExpression
*
* @author Daniel Bergqvist 2019
*/
public class MathFunctionsTest {
private final ExpressionNode expr_boolean_true = new ExpressionNodeTrue();
private final ExpressionNode expr_str_HELLO = new ExpressionNodeString(new Token(TokenType.NONE, "hello", 0));
private final ExpressionNode expr_str_RAD = new ExpressionNodeString(new Token(TokenType.NONE, "rad", 0));
private final ExpressionNode expr_str_DEG = new ExpressionNodeString(new Token(TokenType.NONE, "deg", 0));
private final ExpressionNode expr0_34 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "0.34", 0));
private final ExpressionNode expr0_95 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "0.95", 0));
private final ExpressionNode expr12_34 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "12.34", 0));
private final ExpressionNode expr12_3456789 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "12.3456789", 0));
private final ExpressionNode expr1234567 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "1234567", 0));
private final ExpressionNode expr12 = new ExpressionNodeIntegerNumber(new Token(TokenType.NONE, "12", 0));
private final ExpressionNode expr23 = new ExpressionNodeIntegerNumber(new Token(TokenType.NONE, "23", 0));
private final ExpressionNode exprNeg0_34 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-0.34", 0));
private final ExpressionNode exprNeg0_95 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-0.95", 0));
private final ExpressionNode exprNeg12_34 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-12.34", 0));
private final ExpressionNode exprPi2 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Double.toString(1.0/2*Math.PI), 0));
private final ExpressionNode exprPi = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Double.toString(Math.PI), 0));
private final ExpressionNode expr3Pi2 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Double.toString(3.0/2*Math.PI), 0));
private final ExpressionNode expr2Pi = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Double.toString(2*Math.PI), 0));
private final ExpressionNode expr0 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "0", 0));
private final ExpressionNode expr90 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "90", 0));
private final ExpressionNode expr180 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "180", 0));
private final ExpressionNode expr270 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "270", 0));
private final ExpressionNode expr360 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "360", 0));
private final ExpressionNode expr1 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "1", 0));
private final ExpressionNode expr2 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "2", 0));
private final ExpressionNode expr3 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "3", 0));
private final ExpressionNode exprNeg1 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-1", 0));
private final ExpressionNode exprNeg2 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-2", 0));
private final ExpressionNode exprNeg3 = new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, "-3", 0));
private ExpressionNode getExprNode(String value) {
return new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, value, 0));
}
private List<ExpressionNode> getParameterList(ExpressionNode... exprNodes) {
List<ExpressionNode> list = new ArrayList<>();
Collections.addAll(list, exprNodes);
return list;
}
@Test
public void testBundle() {
assertEquals( "Function \"sin\" has wrong number of parameters",
Bundle.getMessage("WrongNumberOfParameters1", "sin"),
"strings are equal");
assertEquals( "Function \"sin\" has wrong number of parameters",
Bundle.getMessage(Locale.CANADA, "WrongNumberOfParameters1", "sin"),
"strings are equal 2");
// Test Bundle.retry(Locale, String)
assertEquals("Item",Bundle.getMessage("CategoryItem"), "string matches");
}
@Test
public void testSinFunction() throws JmriException {
Function sinFunction = InstanceManager.getDefault(FunctionManager.class).get("sin");
assertEquals( "sin", sinFunction.getName(), "strings matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test sin(x)
assertEquals( (Double)0.3334870921408144,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)0.8134155047893737,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)(-0.22444221895185537),
(Double)sinFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 3");
// Test sin(x) with a string as parameter
assertEquals( (Double)0.3334870921408144,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 4");
// Test sin(x,"rad"), sin(x,"deg"), sin(x,"hello"), sin(x, true)
assertEquals( (Double)0.3334870921408144,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0_34, expr_str_RAD)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)0.21371244079399437,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG)), 0.0000001d,
"numbers are equal 6");
CalculateException e = assertThrows( CalculateException.class,
() -> sinFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_HELLO)),
"exception is thrown");
assertNotNull(e);
e = assertThrows( CalculateException.class,
() -> sinFunction.calculate(symbolTable, getParameterList(expr12_34, expr_boolean_true)),
"exception is thrown 2");
assertNotNull(e);
// Test sin(x,"deg", 12, 23)
assertEquals( (Double)18.675418424366967,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 7");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 8");
assertEquals( (Double)23.0,
(Double)sinFunction.calculate(symbolTable, getParameterList(exprPi2, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 8");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(exprPi, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 9");
assertEquals( (Double)12.0,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr3Pi2, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 10");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr2Pi, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 11");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr0, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 12");
assertEquals( (Double)23.0,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr90, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 13");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr180, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 14");
assertEquals( (Double)12.0,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr270, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 15");
assertEquals( (Double)17.5,
(Double)sinFunction.calculate(symbolTable, getParameterList(expr360, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 16");
// Test sin()
WrongNumberOfParametersException ex = assertThrows( WrongNumberOfParametersException.class,
() -> sinFunction.calculate(symbolTable, getParameterList()),
"exception is thrown 3");
assertNotNull(ex);
}
@Test
public void testCosFunction() throws JmriException {
Function cosFunction = InstanceManager.getDefault(FunctionManager.class).get("cos");
assertEquals( "cos", cosFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test cos(x)
assertEquals( (Double)0.9427546655283462,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)0.5816830894638836,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)(0.9744873987650982),
(Double)cosFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 3");
// Test cos(x) with a string as parameter
assertEquals( (Double)0.9427546655283462,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 4");
// Test cos(x,"rad"), cos(x,"deg"), cos(x,"hello"), cos(x, true)
assertEquals( (Double)0.9427546655283462,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0_34, expr_str_RAD)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)0.976896613081381,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG)), 0.0000001d,
"numbers are equal 6");
CalculateException e = assertThrows( CalculateException.class,
() -> cosFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_HELLO)),
"exception is thrown");
assertNotNull(e);
e = assertThrows( CalculateException.class,
() -> cosFunction.calculate(symbolTable, getParameterList(expr12_34, expr_boolean_true)),
"exception is thrown 2");
assertNotNull(e);
// Test cos(x,"deg", 12, 23)
assertEquals( (Double)22.872931371947594,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 7");
assertEquals( (Double)23.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 8");
assertEquals( (Double)17.5,
(Double)cosFunction.calculate(symbolTable, getParameterList(exprPi2, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 9");
assertEquals( (Double)12.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(exprPi, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 10");
assertEquals( (Double)17.5,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr3Pi2, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 11");
assertEquals( (Double)23.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr2Pi, expr_str_RAD, expr12, expr23)), 0.0000001d,
"numbers are equal 12");
assertEquals( (Double)23.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr0, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 13");
assertEquals( (Double)17.5,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr90, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 14");
assertEquals( (Double)12.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr180, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 15");
assertEquals( (Double)17.5,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr270, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 16");
assertEquals( (Double)23.0,
(Double)cosFunction.calculate(symbolTable, getParameterList(expr360, expr_str_DEG, expr12, expr23)), 0.0000001d,
"numbers are equal 17");
// Test cos()
WrongNumberOfParametersException ex = assertThrows( WrongNumberOfParametersException.class,
() -> cosFunction.calculate(symbolTable, getParameterList()),
"exception is thrown");
assertNotNull(ex);
}
@Test
public void testTanFunction() throws JmriException {
Function tanFunction = InstanceManager.getDefault(FunctionManager.class).get("tan");
assertEquals( "tan", tanFunction.getName(), "strings matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test tan(x)
assertEquals( (Double)0.35373687803912257,
(Double)tanFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)1.398382589287699,
(Double)tanFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)(-0.23031823627096235),
(Double)tanFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 3");
// Test tan(x) with a string as parameter
assertEquals( (Double)0.35373687803912257,
(Double)tanFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 4");
// Test tan(x,"rad"), tan(x,"deg"), tan(x,"hello"), tan(x, true)
assertEquals( (Double)0.35373687803912257,
(Double)tanFunction.calculate(symbolTable, getParameterList(expr0_34, expr_str_RAD)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)0.21876669233184345,
(Double)tanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG)), 0.0000001d,
"numbers are equal 6");
CalculateException e = assertThrows( CalculateException.class,
() -> tanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_HELLO)),
"exception is thrown");
assertNotNull(e);
e = assertThrows( CalculateException.class,
() -> tanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_boolean_true)),
"exception is thrown");
assertNotNull(e);
// Test tan()
WrongNumberOfParametersException ex = assertThrows( WrongNumberOfParametersException.class,
() -> tanFunction.calculate(symbolTable, getParameterList()),
"exception is thrown");
assertNotNull(ex);
}
@Test
public void testArctanFunction() throws JmriException {
Function atanFunction = InstanceManager.getDefault(FunctionManager.class).get("atan");
assertEquals( "atan", atanFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test atan(x)
assertEquals( (Double)0.3277385067805555,
(Double)atanFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)0.7597627548757708,
(Double)atanFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)1.4899357456343294,
(Double)atanFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 3");
// Test atan(x) with a string as parameter
assertEquals( (Double)0.3277385067805555,
(Double)atanFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 4");
// Test atan(x,"rad"), atan(x,"deg"), atan(x,"hello"), atan(x, true)
assertEquals( (Double)0.3277385067805555,
(Double)atanFunction.calculate(symbolTable, getParameterList(expr0_34, expr_str_RAD)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)85.36702997052444, (Double)atanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_DEG)), 0.0000001d,
"numbers are equal 6");
CalculateException e = assertThrows( CalculateException.class,
() -> atanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_str_HELLO)),
"exception is thrown");
assertNotNull(e);
e = assertThrows( CalculateException.class,
() -> atanFunction.calculate(symbolTable, getParameterList(expr12_34, expr_boolean_true)),
"exception is thrown");
assertNotNull(e);
// Test atan()
WrongNumberOfParametersException ex = assertThrows( WrongNumberOfParametersException.class,
() -> atanFunction.calculate(symbolTable, getParameterList()),
"exception is thrown");
assertNotNull(ex);
}
@Test
public void testAbsFunction() throws JmriException {
Function absFunction = InstanceManager.getDefault(FunctionManager.class).get("abs");
assertEquals( "abs", absFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
assertEquals( (Double)0.34,
(Double)absFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)0.95,
(Double)absFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)(12.34),
(Double)absFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 3");
assertEquals( (Double)0.34,
(Double)absFunction.calculate(symbolTable, getParameterList(exprNeg0_34)), 0.0000001d,
"numbers are equal 4");
assertEquals( (Double)0.95,
(Double)absFunction.calculate(symbolTable, getParameterList(exprNeg0_95)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)(12.34),
(Double)absFunction.calculate(symbolTable, getParameterList(exprNeg12_34)), 0.0000001d,
"numbers are equal 6");
}
@Test
public void testRandomFunction() throws JmriException {
Function randomFunction = InstanceManager.getDefault(FunctionManager.class).get("random");
assertEquals( "random", randomFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test random()
for (int i=0; i < 100; i++) {
double value = (double) randomFunction.calculate(symbolTable, getParameterList());
assertTrue(value >= 0.0);
assertTrue(value < 1.0);
}
// Test random(max)
for (int max=1; max < 1000; max += 100) {
for (int i=0; i < 100; i++) {
double value = (double) randomFunction.calculate(symbolTable, getParameterList(
new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Integer.toString(max), 0))));
assertTrue(value >= 0.0);
assertTrue(value < max);
}
}
// Test random(min, max)
for (int min=1; min < 1000; min += 100) {
for (int size=1; size < 1000; size += 100) {
for (int i=0; i < 100; i++) {
double value = (double) randomFunction.calculate(symbolTable, getParameterList(
new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Integer.toString(min), 0)),
new ExpressionNodeFloatingNumber(new Token(TokenType.NONE, Integer.toString(min+size), 0))));
assertTrue(value >= min);
assertTrue(value < min+size);
}
}
}
}
@Test
public void testSqrFunction() throws JmriException {
Function sqrFunction = InstanceManager.getDefault(FunctionManager.class).get("sqr");
assertEquals( "sqr", sqrFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
assertEquals( 144L,
(long)(Long)sqrFunction.calculate(symbolTable, getParameterList(expr12)),
"numbers are equal");
assertEquals( 529, (long)(Long)sqrFunction.calculate(symbolTable, getParameterList(expr23)),
"numbers are equal 2");
assertEquals( (Double)0.1156, (Double)sqrFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 3");
assertEquals( (Double)0.9025, (Double)sqrFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 4");
assertEquals( (Double)152.2756, (Double)sqrFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)0.1156, (Double)sqrFunction.calculate(symbolTable, getParameterList(exprNeg0_34)), 0.0000001d,
"numbers are equal 6");
assertEquals( (Double)0.9025, (Double)sqrFunction.calculate(symbolTable, getParameterList(exprNeg0_95)), 0.0000001d,
"numbers are equal 7");
assertEquals( (Double)152.2756, (Double)sqrFunction.calculate(symbolTable, getParameterList(exprNeg12_34)), 0.0000001d,
"numbers are equal 8");
}
@Test
public void testSqrtFunction() throws JmriException {
Function sqrtFunction = InstanceManager.getDefault(FunctionManager.class).get("sqrt");
assertEquals( "sqrt", sqrtFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
assertEquals( (Double)3.4641016151377544,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(expr12)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)4.795831523312719,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(expr23)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)0.5830951894845301,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal 3");
assertEquals( (Double)0.9746794344808963,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 4");
assertEquals( (Double)3.5128336140500593,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(expr12_34)), 0.0000001d,
"numbers are equal 5");
assertEquals( Double.NaN,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(exprNeg0_34)), 0.0000001d,
"numbers are equal 6");
assertEquals( Double.NaN,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(exprNeg0_95)), 0.0000001d,
"numbers are equal 7");
assertEquals( Double.NaN,
(Double)sqrtFunction.calculate(symbolTable, getParameterList(exprNeg12_34)), 0.0000001d,
"numbers are equal 8");
}
@Test
public void testRoundFunction() throws JmriException {
Function roundFunction = InstanceManager.getDefault(FunctionManager.class).get("round");
assertEquals( "round", roundFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test round(x)
assertEquals( (Double)0.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d,
"numbers are equal");
assertEquals( (Double)1.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d,
"numbers are equal 2");
assertEquals( (Double)12.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789)), 0.0000001d,
"numbers are equal 3");
assertEquals( (Double)1.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"))), 0.0000001d,
"numbers are equal 4");
assertEquals( (Double)2.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"))), 0.0000001d,
"numbers are equal 5");
assertEquals( (Double)2.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"))), 0.0000001d,
"numbers are equal 6");
// Test round(x) with number of decimals
assertEquals( (Double)12.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr0)), 0.0000001d,
"numbers are equal 6a");
assertEquals( (Double)12.3,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr1)), 0.0000001d,
"numbers are equal 6b");
assertEquals( (Double)12.35,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr2)), 0.0000001d,
"numbers are equal 6c");
assertEquals( (Double)12.346,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr3)), 0.0000001d,
"numbers are equal 6d");
assertEquals( (Double)10.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg1)), 0.0000001d,
"numbers are equal 6e");
assertEquals( (Double)0.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg2)), 0.0000001d,
"numbers are equal 6f");
assertEquals( (Double)0.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg3)), 0.0000001d,
"numbers are equal 6g");
assertEquals( (Double)1234567.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr1234567)), 0.0000001d,
"numbers are equal 6h");
assertEquals( (Double)1234567.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr1234567, expr0)), 0.0000001d,
"numbers are equal 6i");
assertEquals( (Double)1234570.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg1)), 0.0000001d,
"numbers are equal 7");
assertEquals( (Double)1234600.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg2)), 0.0000001d,
"numbers are equal 8");
assertEquals( (Double)1235000.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg3)), 0.0000001d,
"numbers are equal 9");
assertEquals( (Double)1.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"), getExprNode("0"))), 0.0000001d,
"numbers are equal 10");
assertEquals( (Double)2.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"), getExprNode("0"))), 0.0000001d,
"numbers are equal 11");
assertEquals( (Double)2.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"), getExprNode("0"))), 0.0000001d,
"numbers are equal 12");
assertEquals( (Double)1.00,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.004"), getExprNode("2"))), 0.0000001d,
"numbers are equal 13");
assertEquals( (Double)1.01,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.00500001"), getExprNode("2"))), 0.0000001d,
"numbers are equal 14");
assertEquals( (Double)1.01,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("1.006"), getExprNode("2"))), 0.0000001d,
"numbers are equal 15");
assertEquals( (Double)100.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("140"), getExprNode("-2"))), 0.0000001d,
"numbers are equal 16");
assertEquals( (Double)200.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("150"), getExprNode("-2"))), 0.0000001d,
"numbers are equal 17");
assertEquals( (Double)200.0,
(Double)roundFunction.calculate(symbolTable, getParameterList(getExprNode("160"), getExprNode("-2"))), 0.0000001d,
"numbers are equal 18");
}
@Test
public void testCeilFunction() throws JmriException {
Function ceilFunction = InstanceManager.getDefault(FunctionManager.class).get("ceil");
assertEquals( "ceil", ceilFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test ceil(x)
assertEquals( (Double)1.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d, "numbers are equal");
assertEquals( (Double)13.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789)), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"))), 0.0000001d, "numbers are equal");
// Test ceil(x) with number of decimals
assertEquals( (Double)13.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr0)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.4, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.35, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.346, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)20.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)100.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1000.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234567.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr1234567)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234567.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr1234567, expr0)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234570.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234600.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1235000.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)2.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.01, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.004"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.01, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.00500001"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.01, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("1.006"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)200.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("140"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)200.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("150"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)200.0, (Double)ceilFunction.calculate(symbolTable, getParameterList(getExprNode("160"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
}
@Test
public void testFloorFunction() throws JmriException {
Function floorFunction = InstanceManager.getDefault(FunctionManager.class).get("floor");
assertEquals( "floor", floorFunction.getName(), "string matches");
SymbolTable symbolTable = new DefaultSymbolTable(new DefaultConditionalNG("IQC1", null));
// Test floor(x)
assertEquals( (Double)0.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr0_34)), 0.0000001d, "numbers are equal");
assertEquals( (Double)0.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr0_95)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"))), 0.0000001d, "numbers are equal");
// Test floor(x) with number of decimals
assertEquals( (Double)12.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr0)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.3, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.34, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)12.345, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, expr3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)10.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)0.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)0.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr12_3456789, exprNeg3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234567.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr1234567)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234567.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr1234567, expr0)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234560.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg1)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234500.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg2)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1234000.0, (Double)floorFunction.calculate(symbolTable, getParameterList(expr1234567, exprNeg3)), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.4"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.5"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.6"), getExprNode("0"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.00, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.004"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.00, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.00500001"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)1.00, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("1.006"), getExprNode("2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)100.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("140"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)100.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("150"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
assertEquals( (Double)100.0, (Double)floorFunction.calculate(symbolTable, getParameterList(getExprNode("160"), getExprNode("-2"))), 0.0000001d, "numbers are equal");
}
// The minimal setup for log4J
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
}
@AfterEach
public void tearDown() {
LogixNG_Thread.stopAllLogixNGThreads();
JUnitUtil.deregisterBlockManagerShutdownTask();
JUnitUtil.tearDown();
}
}