/*
* 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.ProjectManager;
import org.catrobat.catroid.content.Project;
import org.catrobat.catroid.formulaeditor.FormulaElement;
import org.catrobat.catroid.formulaeditor.FormulaElement.ElementType;
import org.catrobat.catroid.formulaeditor.Functions;
import org.catrobat.catroid.formulaeditor.InternFormulaParser;
import org.catrobat.catroid.formulaeditor.InternToken;
import org.catrobat.catroid.formulaeditor.InternTokenType;
import org.catrobat.catroid.formulaeditor.Operators;
import java.util.LinkedList;
import java.util.List;
public class FormulaElementTest extends InstrumentationTestCase {
public void testGetInternTokenList() {
List<InternToken> internTokenList = new LinkedList<InternToken>();
internTokenList.add(new InternToken(InternTokenType.BRACKET_OPEN));
internTokenList.add(new InternToken(InternTokenType.OPERATOR, Operators.MINUS.name()));
internTokenList.add(new InternToken(InternTokenType.NUMBER, "1"));
internTokenList.add(new InternToken(InternTokenType.BRACKET_CLOSE));
InternFormulaParser internParser = new InternFormulaParser(internTokenList);
FormulaElement parseTree = internParser.parseFormula();
assertNotNull("Formula is not parsed correctly: ( - 1 )", parseTree);
assertEquals("Formula interpretation is not as expected", -1d, parseTree.interpretRecursive(null));
List<InternToken> internTokenListAfterConversion = parseTree.getInternTokenList();
assertEquals("Generate InternTokenList from Tree error", internTokenListAfterConversion.size(),
internTokenList.size());
for (int index = 0; index < internTokenListAfterConversion.size(); index++) {
assertTrue(
"Generate InternTokenList from Tree error",
internTokenListAfterConversion.get(index).getInternTokenType() == internTokenList.get(index)
.getInternTokenType()
&& internTokenListAfterConversion.get(index).getTokenStringValue()
.compareTo(internTokenList.get(index).getTokenStringValue()) == 0);
}
}
public void testInterpretNonExistingUserVariable() {
Project project = new Project(getInstrumentation().getTargetContext(), "testProject");
ProjectManager.getInstance().setProject(project);
FormulaElement formulaElement = new FormulaElement(ElementType.USER_VARIABLE, "notExistingUserVariable", null);
assertEquals("Not existing UserVariable misinterpretation",
FormulaElement.NOT_EXISTING_USER_VARIABLE_INTERPRETATION_VALUE, formulaElement.interpretRecursive(null));
}
public void testInterpretNonExistingUserList() {
Project project = new Project(getInstrumentation().getTargetContext(), "testProject");
ProjectManager.getInstance().setProject(project);
FormulaElement formulaElement = new FormulaElement(ElementType.USER_LIST, "notExistingUserList", null);
assertEquals("Not existing UserList misinterpretation",
FormulaElement.NOT_EXISTING_USER_LIST_INTERPRETATION_VALUE, formulaElement.interpretRecursive(null));
}
public void testInterpretNotExisitingUnaryOperator() {
FormulaElement formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.PLUS.name(), null, null,
new FormulaElement(ElementType.NUMBER, "1.0", null));
assertEquals("Not existing unary operator misinterpretation", 0d, formulaElement.interpretRecursive(null));
}
public void testCheckDegeneratedDoubleValues() {
FormulaElement formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.PLUS.name(), null,
new FormulaElement(ElementType.NUMBER, Double.toString(Double.MAX_VALUE), null), new FormulaElement(
ElementType.NUMBER, Double.toString(Double.MAX_VALUE), null));
assertEquals("Degenerated double values error", Double.MAX_VALUE, formulaElement.interpretRecursive(null));
formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.MINUS.name(), null, new FormulaElement(
ElementType.NUMBER, Double.toString(Double.MAX_VALUE * -1d), null), new FormulaElement(
ElementType.NUMBER, Double.toString(Double.MAX_VALUE), null));
assertEquals("Degenerated double values error", Double.MAX_VALUE * -1d, formulaElement.interpretRecursive(null));
formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.DIVIDE.name(), null, new FormulaElement(
ElementType.NUMBER, "0", null), new FormulaElement(ElementType.NUMBER, "0", null));
assertEquals("Degenerated double values error", Double.NaN, formulaElement.interpretRecursive(null));
}
public void testIsLogicalOperator() {
FormulaElement formulaElement = new FormulaElement(ElementType.USER_VARIABLE, "notExistingUserVariable", null);
assertFalse("isLogicalOperator found logical operator but was userVariable", formulaElement.isLogicalOperator());
}
public void testContainsElement() {
FormulaElement formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.MINUS.name(), null,
new FormulaElement(ElementType.NUMBER, "0.0", null), new FormulaElement(ElementType.USER_VARIABLE,
"user-variable", null));
assertTrue("ContainsElement: uservariable not found", formulaElement.containsElement(ElementType.USER_VARIABLE));
formulaElement = new FormulaElement(ElementType.FUNCTION, Functions.SIN.name(), null, new FormulaElement(
ElementType.OPERATOR, "+", null), null);
assertTrue("ContainsElement: Operator \" + \" should not have been found!",
!formulaElement.containsElement(ElementType.NUMBER));
}
public void testClone() {
FormulaElement formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.MINUS.name(), null,
new FormulaElement(ElementType.NUMBER, "0.0", null), new FormulaElement(ElementType.USER_VARIABLE,
"user-variable", null));
List<InternToken> internTokenList = formulaElement.getInternTokenList();
FormulaElement clonedFormulaElement = formulaElement.clone();
List<InternToken> internTokenListAfterClone = clonedFormulaElement.getInternTokenList();
for (int index = 0; index < internTokenListAfterClone.size(); index++) {
assertTrue(
"Clone error",
internTokenListAfterClone.get(index).getInternTokenType() == internTokenList.get(index)
.getInternTokenType()
&& internTokenListAfterClone.get(index).getTokenStringValue()
.compareTo(internTokenList.get(index).getTokenStringValue()) == 0);
}
formulaElement = new FormulaElement(ElementType.OPERATOR, Operators.MINUS.name(), null, null,
new FormulaElement(ElementType.USER_VARIABLE, "user-variable", null));
internTokenList = formulaElement.getInternTokenList();
clonedFormulaElement = formulaElement.clone();
internTokenListAfterClone = clonedFormulaElement.getInternTokenList();
for (int index = 0; index < internTokenListAfterClone.size(); index++) {
assertTrue(
"Clone error",
internTokenListAfterClone.get(index).getInternTokenType() == internTokenList.get(index)
.getInternTokenType()
&& internTokenListAfterClone.get(index).getTokenStringValue()
.compareTo(internTokenList.get(index).getTokenStringValue()) == 0);
}
}
}