/** * 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.assertTrue; 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 String information functions. * * @author David Arnu, Thilo Kamradt * */ public class AntlrParserStringInformationTest extends AntlrParserTest { // compare @Test public void compareEqual() { try { Expression expression = getExpressionWithFunctionContext("compare(\"abc\", \"abc\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(0, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareOneSmaller() { try { Expression expression = getExpressionWithFunctionContext("compare(\"abc\", \"abcd\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(-1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareTwoSmaller() { try { Expression expression = getExpressionWithFunctionContext("compare(\"abc\", \"abcde\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(-2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareLarger() { try { Expression expression = getExpressionWithFunctionContext("compare(\"babc\", \"abc\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareMissing1() { try { Expression expression = getExpressionWithFunctionContext("compare( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareMissing2() { try { Expression expression = getExpressionWithFunctionContext("compare(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void compareWrongFirstType() { try { getExpressionWithFunctionContext(" compare(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void compareWrongSecondType() { try { getExpressionWithFunctionContext(" compare(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void compareWrongArgumentNumber() { try { getExpressionWithFunctionContext(" compare(\"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void compareEmpty() { try { getExpressionWithFunctionContext(" compare()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // contains @Test public void containsTrue() { try { Expression expression = getExpressionWithFunctionContext("contains(\"abcd\", \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void containsFalse() { try { Expression expression = getExpressionWithFunctionContext("contains(\"aaa\", \"bbb\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void containsMissing1() { try { Expression expression = getExpressionWithFunctionContext("contains( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void containsMissing2() { try { Expression expression = getExpressionWithFunctionContext("contains(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void containsEmpty() { try { getExpressionWithFunctionContext(" contains()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void containsWrongNumberOfArguments() { try { getExpressionWithFunctionContext(" contains(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void containsWrongFirstType() { try { getExpressionWithFunctionContext(" contains(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void containsWrongSecondType() { try { getExpressionWithFunctionContext(" contains(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // Matches @Test public void matchesTrue() { try { Expression expression = getExpressionWithFunctionContext("matches(\"abcd\", \"a[bxyz]c[abcdxyz]\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void matchesFalse() { try { Expression expression = getExpressionWithFunctionContext("matches(\"abcd\", \"a[xyz]c[abcxyz]\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void matchesIllegalExpression() { try { Expression expression = getExpressionWithFunctionContext("matches(\"abcd\", \"a[xyz]c[abcxyz]{1,3\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); expression.evaluateBoolean(); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void matchesMissing1() { try { Expression expression = getExpressionWithFunctionContext("matches( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void matchesMissing2() { try { Expression expression = getExpressionWithFunctionContext("matches(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void matchesEmpty() { try { getExpressionWithFunctionContext(" matches()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void matchesWrongNumberOfArguments() { try { getExpressionWithFunctionContext("matches(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void matchesWrongFirstType() { try { getExpressionWithFunctionContext("matches(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void matchesWrongSecondType() { try { getExpressionWithFunctionContext("matches(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // equals @Test public void equalsTrue() { try { Expression expression = getExpressionWithFunctionContext("equals(\"abcd\", \"abcd\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void equalsFalse() { try { Expression expression = getExpressionWithFunctionContext("equals(\"abcd\", \"Zer0 als Nummer\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void equalsMissing1() { try { Expression expression = getExpressionWithFunctionContext("equals( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void equalsMissing2() { try { Expression expression = getExpressionWithFunctionContext("equals(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void equalsEmpty() { try { getExpressionWithFunctionContext("equals()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void equalsWrongNumberOfArguments() { try { getExpressionWithFunctionContext("equals(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void equalsWrongFirstType() { try { getExpressionWithFunctionContext("equals(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void equalsWrongSecondType() { try { getExpressionWithFunctionContext("equals(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // starts @Test public void startsTrue() { try { Expression expression = getExpressionWithFunctionContext("starts(\"abcd\", \"ab\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void startsFalse() { try { Expression expression = getExpressionWithFunctionContext("starts(\"abcd\", \"bi\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void startsMissing1() { try { Expression expression = getExpressionWithFunctionContext("starts( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void startsMissing2() { try { Expression expression = getExpressionWithFunctionContext("starts(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void statsEmpty() { try { getExpressionWithFunctionContext("starts()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void startsWrongNumberOfArguments() { try { getExpressionWithFunctionContext("starts(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void startsWrongFirstType() { try { getExpressionWithFunctionContext("starts(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void startsWrongSecondType() { try { getExpressionWithFunctionContext("starts(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // ends @Test public void endsTrue() { try { Expression expression = getExpressionWithFunctionContext("ends(\"abcd\", \"cd\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void endsFalse() { try { Expression expression = getExpressionWithFunctionContext("ends(\"abcd\", \"bi\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void endsMissing1() { try { Expression expression = getExpressionWithFunctionContext("ends( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void endsMissing2() { try { Expression expression = getExpressionWithFunctionContext("ends(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void endsEmpty() { try { getExpressionWithFunctionContext("ends()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void endsWrongNumberOfArguments() { try { getExpressionWithFunctionContext("ends(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void endsWrongFirstType() { try { getExpressionWithFunctionContext("ends(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void endsWrongSecondType() { try { getExpressionWithFunctionContext("ends(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // finds @Test public void findsTrue() { try { Expression expression = getExpressionWithFunctionContext("finds(\"abcd\", \"cd\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsFalse() { try { Expression expression = getExpressionWithFunctionContext("finds(\"abcd\", \"bi\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsEmptyInString() { try { Expression expression = getExpressionWithFunctionContext("finds(\"abcd\", \"\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsStringInEmpty() { try { Expression expression = getExpressionWithFunctionContext("finds(\"\", \"bi\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertTrue(!expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsIllegalExpression() { try { Expression expression = getExpressionWithFunctionContext("finds(\"abcd\", \"[xyz]c[abcxyz]{1,3\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); expression.evaluateBoolean(); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void findsMissing1() { try { Expression expression = getExpressionWithFunctionContext("finds( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsMissing2() { try { Expression expression = getExpressionWithFunctionContext("finds(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.BOOLEAN, expression.getExpressionType()); assertEquals(null, expression.evaluateBoolean()); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void findsEmpty() { try { getExpressionWithFunctionContext("finds()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void findsWrongNumberOfArguments() { try { getExpressionWithFunctionContext("finds(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void findsWrongFirstType() { try { getExpressionWithFunctionContext("finds(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void findsWrongSecondType() { try { getExpressionWithFunctionContext("finds(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // index @Test public void indexMatchingString() { try { Expression expression = getExpressionWithFunctionContext("index(\"abcd\",\"c\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(2, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexNotMatchingString() { try { Expression expression = getExpressionWithFunctionContext("index(\"abcd\",\"t\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(-1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexEmptySubstring() { try { Expression expression = getExpressionWithFunctionContext("index(\"abcd\",\"\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(0, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexEmptyMainString() { try { Expression expression = getExpressionWithFunctionContext("index(\"\",\"c\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(-1, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexMissing1() { try { Expression expression = getExpressionWithFunctionContext("index( MISSING_NOMINAL, \"abc\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexMissing2() { try { Expression expression = getExpressionWithFunctionContext("index(\"abc\", MISSING_NOMINAL)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void indexEmpty() { try { getExpressionWithFunctionContext("index()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void indexWrongNumberOfArguments() { try { getExpressionWithFunctionContext("index(\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void indexWrongFirstType() { try { getExpressionWithFunctionContext("index(5, \"abc\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void indexWrongSecondType() { try { getExpressionWithFunctionContext("index(\"abc\",5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } // length @Test public void lengthSimpleUse() { try { Expression expression = getExpressionWithFunctionContext("length(\"abcd\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(4, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void lengthEmptyString() { try { Expression expression = getExpressionWithFunctionContext("length(\"\")"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(0, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void lengthMissing() { try { Expression expression = getExpressionWithFunctionContext("length(MISSING_NOMINAL)"); assertEquals(ExpressionType.INTEGER, expression.getExpressionType()); assertEquals(Double.NaN, expression.evaluateNumerical(), 1e-15); } catch (ExpressionException e) { fail(e.getMessage()); } } @Test public void lengthsEmpty() { try { getExpressionWithFunctionContext("length()"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void lengthWrongNumberOfArguments() { try { getExpressionWithFunctionContext("length(\"aaa\",\"aaa\")"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } @Test public void lengthWrongType() { try { getExpressionWithFunctionContext("length(5)"); fail(); } catch (ExpressionException e) { assertNotNull(e.getMessage()); } } }