com.rapidminer.tools.expression.internal.function.AntlrParserTrigonometricTest.java Source code

Java tutorial

Introduction

Here is the source code for com.rapidminer.tools.expression.internal.function.AntlrParserTrigonometricTest.java

Source

/**
 * Copyright (C) 2001-2015 by RapidMiner and the contributors
 *
 * Complete list of developers available at our web site:
 *
 * http://rapidminer.com
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU Affero General Public License as published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with this program.
 * If not, see http://www.gnu.org/licenses/.
 */
package com.rapidminer.tools.expression.internal.function;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import org.apache.commons.math3.util.FastMath;
import org.junit.Test;

import com.rapidminer.tools.expression.Expression;
import com.rapidminer.tools.expression.ExpressionException;
import com.rapidminer.tools.expression.ExpressionType;
import com.rapidminer.tools.expression.internal.antlr.AntlrParser;

/**
 *
 * Tests the results of {@link AntlrParser#parse(String)} for trigonometric functions.
 *
 * @author Denis Schernov
 *
 */
public class AntlrParserTrigonometricTest extends AntlrParserTest {

    // sin()
    @Test
    public void sinInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinInf() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinEmpty() {
        try {
            getExpressionWithFunctionContext("sin()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinString() {
        try {
            getExpressionWithFunctionContext("sin( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinNull() {
        try {
            getExpressionWithFunctionContext("sin(0)");
            Expression expression = getExpressionWithFunctionContext("sin(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("sin(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sin(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // cos()
    @Test
    public void cosInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosINFINITY() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosEmpty() {
        try {
            getExpressionWithFunctionContext("cos()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosString() {
        try {
            getExpressionWithFunctionContext("cos( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosNull() {
        try {
            getExpressionWithFunctionContext("cos(0)");
            Expression expression = getExpressionWithFunctionContext("cos(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("cos(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cos(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // tan()
    @Test
    public void tanInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanEmpty() {
        try {
            getExpressionWithFunctionContext("tan()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanString() {
        try {
            getExpressionWithFunctionContext("tan( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanNull() {
        try {
            getExpressionWithFunctionContext("tan(0)");
            Expression expression = getExpressionWithFunctionContext("tan(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("tan(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tan(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // cot()
    @Test
    public void cotInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.tan(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.tan(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.tan(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotEmpty() {
        try {
            getExpressionWithFunctionContext("cot()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotString() {
        try {
            getExpressionWithFunctionContext("cot( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cotPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("cot(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(0, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // sec()
    @Test
    public void secInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.cos(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.cos(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.cos(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secEmpty() {
        try {
            getExpressionWithFunctionContext("sec()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secString() {
        try {
            getExpressionWithFunctionContext("sec( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.cos(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.cos(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void secPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("sec(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // cosec()
    @Test
    public void cosecInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.sin(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.sin(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.sin(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecEmpty() {
        try {
            getExpressionWithFunctionContext("cosec()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecString() {
        try {
            getExpressionWithFunctionContext("cosec( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.sin(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void cosecPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosec(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(1.0 / Math.sin(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // asin()
    @Test
    public void asinInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(INIFNITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinEmpty() {
        try {
            getExpressionWithFunctionContext("asin()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinString() {
        try {
            getExpressionWithFunctionContext("asin( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("asin(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // acos()
    @Test
    public void acosInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosInfinity() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(INFINITY)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosEmpty() {
        try {
            getExpressionWithFunctionContext("acos()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosString() {
        try {
            getExpressionWithFunctionContext("acos( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acosPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("acos(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.acos(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // atan()
    @Test
    public void atanInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanEmpty() {
        try {
            getExpressionWithFunctionContext("atan()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanString() {
        try {
            getExpressionWithFunctionContext("atan( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.asin(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // atan2()
    @Test
    public void atan2IntInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(16,16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(16, 16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2DoubleInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(16.3,16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(16.3, 16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2IntDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(16,16.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(16, 16.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2DoubleDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(33.3,33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(33.3, 33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NegativeNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(-10,-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(-10, -10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NegativePositive() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(-10,10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(-10, 10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PositiveNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(10,-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(10, -10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NullNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(0,0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(0, 0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NullNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(0,90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(0, 90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NinetyNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(90,0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(90, 0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NinetyNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(90,90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(90, 90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NullPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(0,pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(0, Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NinetyPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(90,pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(90, Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi,0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI, 0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi,90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI, 90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NullPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(0,pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(0, Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2NinetyPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(90,pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(90, Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiHalfNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi/2,0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI / 2, 0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiHalfNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi/2,90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI / 2, 90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi,pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI, Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi,pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI, Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiHalfPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi/2,pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI / 2, Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2PiHalfPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atan2(pi/2,pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.atan2(Math.PI / 2, Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2Empty() {
        try {
            getExpressionWithFunctionContext("atan2()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2String() {
        try {
            getExpressionWithFunctionContext("atan2( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atan2StringInt() {
        try {
            getExpressionWithFunctionContext("atan2( \"blup\",1)");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // sinh()
    @Test
    public void sinhInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhEmpty() {
        try {
            getExpressionWithFunctionContext("sinh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhString() {
        try {
            getExpressionWithFunctionContext("sinh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void sinhPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("sinh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.sinh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // cosh()
    @Test
    public void coshInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshEmpty() {
        try {
            getExpressionWithFunctionContext("cosh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshString() {
        try {
            getExpressionWithFunctionContext("cosh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void coshPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("cosh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.cosh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // tanh()
    @Test
    public void tanhInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhEmpty() {
        try {
            getExpressionWithFunctionContext("tanh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhString() {
        try {
            getExpressionWithFunctionContext("tanh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void tanhPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("tanh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(Math.tanh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // asinh()
    @Test
    public void asinhInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhEmpty() {
        try {
            getExpressionWithFunctionContext("asinh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhString() {
        try {
            getExpressionWithFunctionContext("asinh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void asinhPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("asinh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.asinh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // acosh()
    @Test
    public void acoshInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshEmpty() {
        try {
            getExpressionWithFunctionContext("acosh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshString() {
        try {
            getExpressionWithFunctionContext("acosh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void acoshPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("acosh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.acosh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    // atanh()
    @Test
    public void atanhInt() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(16)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(16), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhDouble() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(33.3)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(33.3), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhNegative() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(-10)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(-10), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhEmpty() {
        try {
            getExpressionWithFunctionContext("atanh()");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhString() {
        try {
            getExpressionWithFunctionContext("atanh( \"blup\")");
            fail();
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhNull() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(0)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(0), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhNinety() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(90)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(90), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhPi() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(pi)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(Math.PI), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }

    @Test
    public void atanhPiHalf() {
        try {
            Expression expression = getExpressionWithFunctionContext("atanh(pi/2)");
            assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
            assertEquals(FastMath.atanh(Math.PI / 2), expression.evaluateNumerical(), 1e-15);
        } catch (ExpressionException e) {
            assertNotNull(e.getMessage());
        }
    }
}