/**
* 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.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 rounding functions.
*
* @author David Arnu, Thilo Kamradt
*
*/
public class AntlrParserRoundingTest extends AntlrParserTest {
// round
@Test
public void roundDownSimple() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.4)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(1, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundUpSimple() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.7)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(2, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void round1ArgumentInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("round(INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Math.round(Double.POSITIVE_INFINITY), expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundDown2Args() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.3333,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.33, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundUp2Args() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.666,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundUp2ArgsNegative() {
try {
Expression expression = getExpressionWithFunctionContext("round(-1.666,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(-1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundUp2ArgsDouble() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.666,2.5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundDown2ArgsDouble() {
try {
Expression expression = getExpressionWithFunctionContext("round(1.3333,2.5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.33, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void round2ArgumentInfinity1() {
try {
Expression expression = getExpressionWithFunctionContext("round(INFINITY, 2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void round2ArgumentInfinity2() {
try {
Expression expression = getExpressionWithFunctionContext("round(2, INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void round2ArgumentNegInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("round(2, -INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void round2ArgumentNegativePrecission() {
try {
Expression expression = getExpressionWithFunctionContext("round(2, -5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(0, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundMissing1Argument() {
try {
Expression expression = getExpressionWithFunctionContext("round(MISSING_NUMERIC)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundMissing2ArgumentFirst() {
try {
Expression expression = getExpressionWithFunctionContext("round(MISSING_NUMERIC, 5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundMissing2ArgumentSecond() {
try {
Expression expression = getExpressionWithFunctionContext("round(5.55,MISSING_NUMERIC)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(6, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void roundEmpty() {
try {
getExpressionWithFunctionContext("round()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void roundWrongType() {
try {
getExpressionWithFunctionContext("round(\"aa\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void roundWrongTypes() {
try {
getExpressionWithFunctionContext("round(\"aa\", \"bb\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
// rint
@Test
public void rintDownSimple() {
try {
Expression expression = getExpressionWithFunctionContext("rint(2.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(2, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintUpSimple() {
try {
Expression expression = getExpressionWithFunctionContext("rint(1.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(2, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rint1ArgumentInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("rint(INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Math.rint(Double.POSITIVE_INFINITY), expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintDown2Args() {
try {
Expression expression = getExpressionWithFunctionContext("rint(1.3333,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.33, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintUp2Args() {
try {
Expression expression = getExpressionWithFunctionContext("rint(1.666,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintUp2ArgsNegative() {
try {
Expression expression = getExpressionWithFunctionContext("rint(-1.666,2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(-1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintUp2ArgsDouble() {
try {
Expression expression = getExpressionWithFunctionContext("rint(1.666,2.5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.67, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintDown2ArgsDouble() {
try {
Expression expression = getExpressionWithFunctionContext("rint(1.3333,2.5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(1.33, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rint2ArgumentInfinity1() {
try {
Expression expression = getExpressionWithFunctionContext("rint(INFINITY, 2)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rint2ArgumentInfinity2() {
try {
Expression expression = getExpressionWithFunctionContext("rint(2, INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rint2ArgumentNegInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("rint(2, -INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rint2ArgumentNegativePrecission() {
try {
Expression expression = getExpressionWithFunctionContext("round(2562, -3)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(3000, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintMissing1Argument() {
try {
Expression expression = getExpressionWithFunctionContext("rint(MISSING_NUMERIC)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintMissing2ArgumentFirst() {
try {
Expression expression = getExpressionWithFunctionContext("rint(MISSING_NUMERIC, 5)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintMissing2ArgumentSecond() {
try {
Expression expression = getExpressionWithFunctionContext("rint(5.55,MISSING_NUMERIC)");
assertEquals(ExpressionType.DOUBLE, expression.getExpressionType());
assertEquals(6, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void rintEmpty() {
try {
getExpressionWithFunctionContext("rint()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void rintWrongType() {
try {
getExpressionWithFunctionContext("rint(\"aa\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void rintWrongTypes() {
try {
getExpressionWithFunctionContext("rint(\"aa\", \"bb\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
// floor
@Test
public void floorDownSimple() {
try {
Expression expression = getExpressionWithFunctionContext("floor(2.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(2, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void floorDownSimpleNegative() {
try {
Expression expression = getExpressionWithFunctionContext("floor(-2.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(-3, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void floor1ArgumentInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("floor(INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void floor1ArgumentNegInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("floor(-INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void floorMissing1Argument() {
try {
Expression expression = getExpressionWithFunctionContext("floor(MISSING_NUMERIC)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void floorEmpty() {
try {
getExpressionWithFunctionContext("floor()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void floorWrongType() {
try {
getExpressionWithFunctionContext("floor(\"aa\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
// ceil
@Test
public void ceilSimple() {
try {
Expression expression = getExpressionWithFunctionContext("ceil(2.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(3, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ceilSimpleNegative() {
try {
Expression expression = getExpressionWithFunctionContext("ceil(-2.5)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(-2, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ceil1ArgumentInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("ceil(INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ceil1ArgumentNegInfinity() {
try {
Expression expression = getExpressionWithFunctionContext("ceil(-INFINITY)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ceilMissing1Argument() {
try {
Expression expression = getExpressionWithFunctionContext("ceil(MISSING_NUMERIC)");
assertEquals(ExpressionType.INTEGER, expression.getExpressionType());
assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15);
} catch (ExpressionException e) {
fail(e.getMessage());
}
}
@Test
public void ceilEmpty() {
try {
getExpressionWithFunctionContext("ceil()");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void ceilWrongType() {
try {
getExpressionWithFunctionContext("ceil(\"aa\")");
fail();
} catch (ExpressionException e) {
assertNotNull(e.getMessage());
}
}
}