/**
* Copyright (C) 2001-2017 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.junit.Test;
import com.rapidminer.example.ExampleSet;
import com.rapidminer.tools.expression.ExampleResolver;
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 mathematical functions.
*
* @author David Arnu, Marcel Seifert
*
*/
public class AntlrParserMathematicalTest extends AntlrParserTest {
/**
* Sqrt tests
*/
@Test
public void sqrtInt() {
try {
Expression expression = getExpressionWithFunctionContext("sqrt(16)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(4, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sqrtDouble() {
try {
Expression expression = getExpressionWithFunctionContext("sqrt(12.5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Math.sqrt(12.5), expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sqrtNeg() {
try {
Expression expression = getExpressionWithFunctionContext("sqrt(-4)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sqrtNaN() {
try {
Expression expression = getExpressionWithFunctionContext("sqrt(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void sqrtEmpty() {
try {
getExpressionWithFunctionContext("sqrt()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void sqrtString() {
try {
getExpressionWithFunctionContext("sqrt( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* exp tests
*/
@Test
public void expInt() {
try {
Expression expression = getExpressionWithFunctionContext("exp(1)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Math.E, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void expDouble() {
try {
Expression expression = getExpressionWithFunctionContext("exp(1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Math.E, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void expNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("exp(-INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void expPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("exp(INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void expZero() {
try {
Expression expression = getExpressionWithFunctionContext("exp(0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void expNaN() {
try {
Expression expression = getExpressionWithFunctionContext("exp(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void expEmpty() {
try {
getExpressionWithFunctionContext("exp()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void expString() {
try {
getExpressionWithFunctionContext("exp( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* ln tests
*/
@Test
public void lnInt() {
try {
Expression expression = getExpressionWithFunctionContext("ln(1)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnDouble() {
try {
Expression expression = getExpressionWithFunctionContext("ln(1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnNegative() {
try {
Expression expression = getExpressionWithFunctionContext("ln(-1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("ln(-INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("ln(INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnZero() {
try {
Expression expression = getExpressionWithFunctionContext("ln(0.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void lnNaN() {
try {
Expression expression = getExpressionWithFunctionContext("ln(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void lnEmpty() {
try {
getExpressionWithFunctionContext("ln()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void lnString() {
try {
getExpressionWithFunctionContext("ln( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* log tests
*/
@Test
public void logInt() {
try {
Expression expression = getExpressionWithFunctionContext("log(1)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logDouble() {
try {
Expression expression = getExpressionWithFunctionContext("log(1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logNegative() {
try {
Expression expression = getExpressionWithFunctionContext("log(-1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("log(-INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("log(INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logZero() {
try {
Expression expression = getExpressionWithFunctionContext("log(0.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void logNaN() {
try {
Expression expression = getExpressionWithFunctionContext("log(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void logEmpty() {
try {
getExpressionWithFunctionContext("log()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void logString() {
try {
getExpressionWithFunctionContext("log( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* ld tests
*/
@Test
public void ldInt() {
try {
Expression expression = getExpressionWithFunctionContext("ld(1)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldDouble() {
try {
Expression expression = getExpressionWithFunctionContext("ld(1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(0.0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldNegative() {
try {
Expression expression = getExpressionWithFunctionContext("ld(-1.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("ld(-INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("ld(INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldZero() {
try {
Expression expression = getExpressionWithFunctionContext("ld(0.0)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ldNaN() {
try {
Expression expression = getExpressionWithFunctionContext("ld(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void ldEmpty() {
try {
getExpressionWithFunctionContext("ld()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void ldString() {
try {
getExpressionWithFunctionContext("ld( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* sgn tests
*/
@Test
public void sgnInt() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(1)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnDouble() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(5.4)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnNegative() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(-8.7)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(-1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(-INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(-1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnZero() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(0.0)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnNegZero() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(-0.0)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(-0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnNaN() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(MISSING_NUMERICAL)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void sgnMissingInt() {
try {
ExampleSet exampleSet = makeMissingIntegerExampleSet();
ExampleResolver resolver = new ExampleResolver(exampleSet);
Expression expression = getExpressionWithFunctionsAndExamples("sgn([integer])", resolver);
resolver.bind(exampleSet.getExample(0));
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void sgnEmpty() {
try {
getExpressionWithFunctionContext("sgn()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void sgnString() {
try {
getExpressionWithFunctionContext("sgn( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
/**
* abs tests
*/
@Test
public void absInt() {
try {
Expression expression = getExpressionWithFunctionContext("abs(1)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absDouble() {
try {
Expression expression = getExpressionWithFunctionContext("abs(5.4)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(5.4, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absNegative() {
try {
Expression expression = getExpressionWithFunctionContext("abs(-8.7)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(8.7, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absNegInf() {
try {
Expression expression = getExpressionWithFunctionContext("abs(-INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absPosInf() {
try {
Expression expression = getExpressionWithFunctionContext("abs(INFINITY)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absZero() {
try {
Expression expression = getExpressionWithFunctionContext("abs(0)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absNaN() {
try {
Expression expression = getExpressionWithFunctionContext("sgn(MISSING_NUMERICAL)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void absMissingInt() {
try {
ExampleSet exampleSet = makeMissingIntegerExampleSet();
ExampleResolver resolver = new ExampleResolver(exampleSet);
Expression expression = getExpressionWithFunctionsAndExamples("abs([integer])", resolver);
resolver.bind(exampleSet.getExample(0));
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void absEmpty() {
try {
getExpressionWithFunctionContext("abs()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void absString() {
try {
getExpressionWithFunctionContext("abs( \"blup\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
}