/* * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2016 The Catrobat Team * (<http://developer.catrobat.org/credits>) * * 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. * * An additional term exception under section 7 of the GNU Affero * General Public License, version 3, is available at * http://developer.catrobat.org/license_additional_term * * 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 org.catrobat.catroid.test.formulaeditor; import android.test.InstrumentationTestCase; import org.catrobat.catroid.formulaeditor.Functions; import org.catrobat.catroid.formulaeditor.InternFormulaUtils; import org.catrobat.catroid.formulaeditor.InternToken; import org.catrobat.catroid.formulaeditor.InternTokenType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class InternFormulaUtilsTest extends InstrumentationTestCase { public void testGetFunctionByFunctionBracketCloseOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); assertNull("End function-bracket index is 0", InternFormulaUtils.getFunctionByFunctionBracketClose(null, 0)); assertNull("End function-bracket index is InternTokenListSize", InternFormulaUtils.getFunctionByFunctionBracketClose(internTokens, 2)); assertNull("No function name before brackets", InternFormulaUtils.getFunctionByFunctionBracketClose(internTokens, 1)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); assertNull("No function name before brackets", InternFormulaUtils.getFunctionByFunctionBracketClose(internTokens, 2)); } public void testgetFunctionByParameterDelimiter() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.RAND.name())); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.RAND.name())); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.RAND.name())); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); List<InternToken> functionTokens = InternFormulaUtils.getFunctionByParameterDelimiter(internTokens, 8); assertEquals("GetFunctionByParameter wrong function returned", functionTokens.size(), internTokens.size()); for (int index = 0; index < functionTokens.size(); index++) { assertTrue( "GetFunctionByParameter wrong function returned", functionTokens.get(index).getInternTokenType() == internTokens.get(index).getInternTokenType() && functionTokens.get(index).getTokenStringValue() .compareTo(internTokens.get(index).getTokenStringValue()) == 0); } } public void testgetFunctionByParameterDelimiterOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); assertNull("Function delimiter index is 0", InternFormulaUtils.getFunctionByParameterDelimiter(null, 0)); assertNull("End delimiter index is InternTokenListSize", InternFormulaUtils.getFunctionByParameterDelimiter(internTokens, 2)); assertNull("No function name before brackets", InternFormulaUtils.getFunctionByParameterDelimiter(internTokens, 1)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); assertNull("No function name before brackets", InternFormulaUtils.getFunctionByParameterDelimiter(internTokens, 2)); } public void testgetFunctionByFunctionBracketOpenOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); assertNull("Function bracket index is 0", InternFormulaUtils.getFunctionByFunctionBracketOpen(null, 0)); assertNull("End delimiter index is InternTokenListSize", InternFormulaUtils.getFunctionByFunctionBracketOpen(internTokens, 2)); assertNull("No function name before brackets", InternFormulaUtils.getFunctionByFunctionBracketOpen(internTokens, 1)); } public void testgenerateTokenListByBracketOpenOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); assertNull("Index is >= list.size", InternFormulaUtils.generateTokenListByBracketOpen(internTokens, 3)); assertNull("Index Token is not bracket open", InternFormulaUtils.generateTokenListByBracketOpen(internTokens, 0)); } public void testgenerateTokenListByBracketOpen() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); List<InternToken> functionTokens = InternFormulaUtils.generateTokenListByBracketOpen(internTokens, 0); assertEquals("GetFunctionByParameter wrong function returned", functionTokens.size(), internTokens.size()); for (int index = 0; index < functionTokens.size(); index++) { assertTrue( "GetFunctionByParameter wrong function returned", functionTokens.get(index).getInternTokenType() == internTokens.get(index).getInternTokenType() && functionTokens.get(index).getTokenStringValue() .compareTo(internTokens.get(index).getTokenStringValue()) == 0); } } public void testgenerateTokenListByBracketCloseOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); assertNull("Index is >= list.size", InternFormulaUtils.generateTokenListByBracketClose(internTokens, 3)); assertNull("Index Token is not bracket close", InternFormulaUtils.generateTokenListByBracketClose(internTokens, 0)); } public void testgenerateTokenListByBracketClose() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER, "1")); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE)); List<InternToken> functionTokens = InternFormulaUtils.generateTokenListByBracketClose(internTokens, 8); assertEquals("GetFunctionByParameter wrong function returned", functionTokens.size(), internTokens.size()); for (int index = 0; index < functionTokens.size(); index++) { assertTrue( "GetFunctionByParameter wrong function returned", functionTokens.get(index).getInternTokenType() == internTokens.get(index).getInternTokenType() && functionTokens.get(index).getTokenStringValue() .compareTo(internTokens.get(index).getTokenStringValue()) == 0); } } public void testgetFunctionParameterInternTokensAsListsOnErrorInput() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertNull("InternToken list is null", InternFormulaUtils.getFunctionParameterInternTokensAsLists(null)); assertNull("InternToken list is too small", InternFormulaUtils.getFunctionParameterInternTokensAsLists(internTokens)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertNull("First token is not a FunctionName Token", InternFormulaUtils.getFunctionParameterInternTokensAsLists(internTokens)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertNull("Second token is not a Bracket Token", InternFormulaUtils.getFunctionParameterInternTokensAsLists(internTokens)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertNull("Function has no close bracket in list", InternFormulaUtils.getFunctionParameterInternTokensAsLists(internTokens)); } public void testIsFunction() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertFalse("List contains more elements than just ONE function", InternFormulaUtils.isFunction(internTokens)); } public void testgetFirstInternTokenTypeOnErrorInput() throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); Method method = InternFormulaUtils.class.getDeclaredMethod("getFirstInternTokenType", List.class); method.setAccessible(true); Object[] arguments = new Object[1]; arguments[0] = null; assertNull("Token list is null", method.invoke(null, arguments)); arguments[0] = internTokens; assertNull("Token list is null", method.invoke(null, arguments)); } public void testisPeriodTokenOnError() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE)); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertFalse("Shoult return false, when parameter is null", InternFormulaUtils.isPeriodToken(null)); assertFalse("List size not equal to 1", InternFormulaUtils.isPeriodToken(internTokens)); } public void testisFunctionTokenOnError() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.NUMBER)); assertFalse("Should return false on null", InternFormulaUtils.isFunctionToken(null)); assertFalse("Should return false when List size < 1", InternFormulaUtils.isFunctionToken(internTokens)); } public void testIsNumberOnError() { assertFalse("Should return false if parameter is null", InternFormulaUtils.isNumberToken(null)); } public void testreplaceFunctionButKeepParametersOnError() { ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); assertNull("Should return null if functionToReplace is null", InternFormulaUtils.replaceFunctionButKeepParameters(null, null)); assertEquals("Function without params whould return null", internTokens, InternFormulaUtils.replaceFunctionButKeepParameters(internTokens, internTokens)); } public void testgetFunctionParameterCountOnError() throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method method = InternFormulaUtils.class.getDeclaredMethod("getFunctionParameterCount", List.class); method.setAccessible(true); ArrayList<InternToken> internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.NUMBER)); Object[] params = new Object[1]; params[0] = null; assertEquals("Should return 0 if List is null", 0, method.invoke(null, params)); params[0] = internTokens; assertEquals("Should return 0 if List size < 4", 0, method.invoke(null, params)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); params[0] = internTokens; assertEquals("Should return 0 if first Token is not a function name token", 0, method.invoke(null, params)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); params[0] = internTokens; assertEquals("Should return 0 if second Token is not a function bracket open token", 0, method.invoke(null, params)); internTokens = new ArrayList<InternToken>(); internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN)); internTokens.add(new InternToken(InternTokenType.NUMBER)); internTokens.add(new InternToken(InternTokenType.NUMBER)); params[0] = internTokens; assertEquals("Should return 0 if function list does not contain a bracket close token", 0, method.invoke(null, params)); } public void testDeleteNumberByOffset() { InternToken numberToken = new InternToken(InternTokenType.NUMBER, "1.1"); assertTrue("Wrong charakter deletd", InternFormulaUtils.deleteNumberByOffset(numberToken, 0) == numberToken); } }