/** * 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)} from the statistical function block. * * @author David Arnu * */ public class AntlrParserStatisticalTest extends AntlrParserTest { // average @Test public void averageAllEqual() { try { Expression expression = getExpressionWithFunctionContext("avg(2,2,2,2,2)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageSingle() { try { Expression expression = getExpressionWithFunctionContext("avg(2)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageInt() { try { Expression expression = getExpressionWithFunctionContext("avg(1,2,3,4,5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(3, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageDouble() { try { Expression expression = getExpressionWithFunctionContext("avg(1.5, 2.5, 2.5, 2.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(2.25, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageAllWrongType() { try { getExpressionWithFunctionContext("avg(\"aa\", \"bb\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void averageMixedWrongType() { try { getExpressionWithFunctionContext("avg(\"aa\", 1)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void averageInfiniteValue() { try { Expression expression = getExpressionWithFunctionContext("avg(1, 1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageNAValue() { try { Expression expression = getExpressionWithFunctionContext("avg(1, 0/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void averageEmpty() { try { getExpressionWithFunctionContext("avg()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // minimum @Test public void minSingleInteger() { try { Expression expression = getExpressionWithFunctionContext("min(1)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minTwoInteger() { try { Expression expression = getExpressionWithFunctionContext("min(1,2)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minTwoDouble() { try { Expression expression = getExpressionWithFunctionContext("min(2.5,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(1.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minTwoMixed() { try { Expression expression = getExpressionWithFunctionContext("min(2,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(1.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minNA() { try { Expression expression = getExpressionWithFunctionContext("min(2,0/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minMixedWrongType() { try { getExpressionWithFunctionContext("min(\"aa\", 1)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void minWrongType() { try { getExpressionWithFunctionContext("min(\"aa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void minAllWrongType() { try { getExpressionWithFunctionContext("min(\"aa\", \"bb\", \"cc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void minInfinity() { try { Expression expression = getExpressionWithFunctionContext("min(1.5, 2.5, 3.5, 4.5, 5.5, 1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(1.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void minNegInfinity() { try { Expression expression = getExpressionWithFunctionContext("min(1.5, 2.5, 3.5, 4.5, 5.5, -1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } // maximum @Test public void maxSingleInteger() { try { Expression expression = getExpressionWithFunctionContext("max(1)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxTwoInteger() { try { Expression expression = getExpressionWithFunctionContext("max(1,2)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxTwoDouble() { try { Expression expression = getExpressionWithFunctionContext("max(2.5,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(2.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxTwoMixed() { try { Expression expression = getExpressionWithFunctionContext("max(2,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxNA() { try { Expression expression = getExpressionWithFunctionContext("max(2,0/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxInfinity() { try { Expression expression = getExpressionWithFunctionContext("max(1.5, 2.5, 3.5, 4.5, 5.5, 1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxNegInfinity() { try { Expression expression = getExpressionWithFunctionContext("max(1.5, 2.5, 3.5, 4.5, 5.5, -1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(5.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void maxMixedWrongType() { try { getExpressionWithFunctionContext("max(\"aa\", 1)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void maxWrongType() { try { getExpressionWithFunctionContext("max(\"aa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void maxAllWrongType() { try { getExpressionWithFunctionContext("max(\"aa\", \"bb\", \"cc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // binominal @Test public void binomSimpleNSmaller() { try { Expression expression = getExpressionWithFunctionContext("binom(1,2)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(0, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void binomSimpleKSmaller() { try { Expression expression = getExpressionWithFunctionContext("binom(5,2)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(10, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void binomAllWrongType() { try { getExpressionWithFunctionContext("binom(\"aa\", \"bb\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void binomFirstWrongType() { try { getExpressionWithFunctionContext("binom(1.5, 1)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void binomSecondWrongType() { try { getExpressionWithFunctionContext("binom(10, 1.5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void binomEmpty() { try { getExpressionWithFunctionContext("binom()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void binomLargeNumbers() { try { Expression expression = getExpressionWithFunctionContext("binom(20000,4)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(6.664666849995E15, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void binomNAFirst() { try { ExampleSet exampleSet = makeMissingIntegerExampleSet(); ExampleResolver resolver = new ExampleResolver(exampleSet); Expression expression = getExpressionWithFunctionsAndExamples("binom(5,[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 binomNASecond() { try { ExampleSet exampleSet = makeMissingIntegerExampleSet(); ExampleResolver resolver = new ExampleResolver(exampleSet); Expression expression = getExpressionWithFunctionsAndExamples("binom([integer],5)", resolver); resolver.bind(exampleSet.getExample(0)); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } // sum @Test public void sumSingleInteger() { try { Expression expression = getExpressionWithFunctionContext("sum(1)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumTwoInteger() { try { Expression expression = getExpressionWithFunctionContext("sum(1,2)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(3, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumTwoDouble() { try { Expression expression = getExpressionWithFunctionContext("sum(2.5,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(4, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumNA() { try { Expression expression = getExpressionWithFunctionContext("sum(2,0/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumTwoMixed() { try { Expression expression = getExpressionWithFunctionContext("sum(2,1.5)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(3.5, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumMixedWrongType() { try { getExpressionWithFunctionContext("sum(\"aa\", 1)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void sumWrongType() { try { getExpressionWithFunctionContext("sum(\"aa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void sumAllWrongType() { try { getExpressionWithFunctionContext("sum(\"aa\", \"bb\", \"cc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void sumInfinity() { try { Expression expression = getExpressionWithFunctionContext("sum(1.5, 2.5, 3.5, 4.5, 5.5, 1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.POSITIVE_INFINITY, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void sumNegInfinity() { try { Expression expression = getExpressionWithFunctionContext("sum(1.5, 2.5, 3.5, 4.5, 5.5, -1/0)"); assertEquals(ExpressionType.DOUBLE, expression.getExpressionType()); assertEquals(Double.NEGATIVE_INFINITY, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } }