/*
* 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.R;
import org.catrobat.catroid.formulaeditor.ExternInternRepresentationMapping;
import org.catrobat.catroid.formulaeditor.Functions;
import org.catrobat.catroid.formulaeditor.InternFormula;
import org.catrobat.catroid.formulaeditor.InternFormula.CursorTokenPropertiesAfterModification;
import org.catrobat.catroid.formulaeditor.InternFormula.TokenSelectionType;
import org.catrobat.catroid.formulaeditor.InternFormulaTokenSelection;
import org.catrobat.catroid.formulaeditor.InternToken;
import org.catrobat.catroid.formulaeditor.InternTokenType;
import org.catrobat.catroid.formulaeditor.Operators;
import org.catrobat.catroid.formulaeditor.Sensors;
import org.catrobat.catroid.test.utils.Reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class InternFormulaTest extends InstrumentationTestCase {
public void testInsertRightToCurrentToken() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Enter decimal mark error", internTokens.get(0).getTokenStringValue().compareTo("0.") == 0);
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Enter decimal mark error", internTokens.get(1).getTokenStringValue().compareTo("0.") == 0);
internTokens = new ArrayList<InternToken>();
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Enter decimal mark error", internTokens.get(0).getTokenStringValue().compareTo("0.") == 0);
}
public void testInsertLeftToCurrentToken() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, false);
String externFormulaStringBeforeInput = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Number changed!",
externFormulaStringBeforeInput.compareTo(internFormula.getExternFormulaString()) == 0);
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(6, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_0, getInstrumentation().getTargetContext(), null);
assertTrue("Append number error", internTokens.get(0).getTokenStringValue().compareTo("42.420") == 0);
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(6, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Append number error", internTokens.get(0).getTokenStringValue().compareTo("42.42") == 0);
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "4242"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(5, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Append decimal mark error", internTokens.get(0).getTokenStringValue().compareTo("4242.") == 0);
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_decimal_mark,
getInstrumentation().getTargetContext(), null);
assertTrue("Prepend decimal mark error", internTokens.get(0).getTokenStringValue().compareTo("0.") == 0);
}
public void testInsertOperatorInNumberToken() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "1234"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(2, false);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_mult,
getInstrumentation().getTargetContext(), null);
assertTrue("Insert operator in number token error", internTokens.get(0).getTokenStringValue().compareTo("12") == 0);
assertTrue("Insert operator in number token error", internTokens.get(1).getTokenStringValue().compareTo("MULT") == 0);
assertTrue("Insert operator in number token error", internTokens.get(2).getTokenStringValue().compareTo("34") == 0);
}
public void testReplaceFunctionByToken() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.COS.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.ROUND.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
String externFormulaString = internFormula.getExternFormulaString();
int doubleClickIndex = externFormulaString.length();
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 9, internFormula.getSelection().getEndIndex());
internFormula.handleKeyInput(R.id.formula_editor_keyboard_4, getInstrumentation().getTargetContext(), null);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_2, getInstrumentation().getTargetContext(), null);
assertNull("Selection found but should not", internFormula.getSelection());
externFormulaString = internFormula.getExternFormulaString();
doubleClickIndex = externFormulaString.length();
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 0, internFormula.getSelection().getEndIndex());
}
public void testReplaceFunctionButKeepParameters() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.COS.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.ROUND.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
String externFormulaString = internFormula.getExternFormulaString();
int doubleClickIndex = externFormulaString.length();
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 9, internFormula.getSelection().getEndIndex());
internFormula.handleKeyInput(R.string.formula_editor_function_rand, getInstrumentation().getTargetContext(),
null);
assertEquals("Selection start index not as expected", 2, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 8, internFormula.getSelection().getEndIndex());
externFormulaString = internFormula.getExternFormulaString();
doubleClickIndex = externFormulaString.length();
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 11, internFormula.getSelection().getEndIndex());
internFormula.handleKeyInput(R.string.formula_editor_function_sqrt, getInstrumentation().getTargetContext(),
null);
externFormulaString = internFormula.getExternFormulaString();
doubleClickIndex = externFormulaString.length();
assertEquals("Selection start index not as expected", 2, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 8, internFormula.getSelection().getEndIndex());
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 9, internFormula.getSelection().getEndIndex());
}
public void testSelectBrackets() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.COS.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
String externFormulaString = internFormula.getExternFormulaString();
int doubleClickIndex = externFormulaString.length();
int offsetRight = 0;
while (offsetRight < 3) {
internFormula.setCursorAndSelection(doubleClickIndex - offsetRight, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
offsetRight++;
}
internFormula.setCursorAndSelection(doubleClickIndex - offsetRight, true);
assertEquals("Selection start index not as expected", 1, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 4, internFormula.getSelection().getEndIndex());
doubleClickIndex = 0;
int offsetLeft = 0;
while (offsetLeft < 2) {
internFormula.setCursorAndSelection(doubleClickIndex + offsetLeft, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
offsetLeft++;
}
internFormula.setCursorAndSelection(doubleClickIndex + offsetLeft, true);
assertEquals("Selection start index not as expected", 1, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 4, internFormula.getSelection().getEndIndex());
}
public void testSelectFunctionAndSingleTab() {
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.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
String externFormulaString = internFormula.getExternFormulaString();
internFormula.setCursorAndSelection(0, false);
assertNull("Single Tab before Funtion fail", internFormula.getSelection());
int doubleClickIndex = externFormulaString.length();
int offsetRight = 0;
while (offsetRight < 3) {
internFormula.setCursorAndSelection(doubleClickIndex - offsetRight, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
offsetRight++;
}
internFormula.setCursorAndSelection(doubleClickIndex - offsetRight, true);
assertEquals("Selection start index not as expected", 4, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 4, internFormula.getSelection().getEndIndex());
doubleClickIndex = 0;
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
doubleClickIndex = getInstrumentation().getTargetContext().getString(R.string.formula_editor_function_rand)
.length();
int singleClickIndex = doubleClickIndex;
internFormula.setCursorAndSelection(singleClickIndex, false);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
doubleClickIndex++;
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
doubleClickIndex += " 42.42 ".length();
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
doubleClickIndex++;
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 0, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 5, internFormula.getSelection().getEndIndex());
doubleClickIndex++;
internFormula.setCursorAndSelection(doubleClickIndex, true);
assertEquals("Selection start index not as expected", 4, internFormula.getSelection().getStartIndex());
assertEquals("Selection end index not as expected", 4, internFormula.getSelection().getEndIndex());
}
public void testReplaceSelection() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, true);
String externFormulaString = internFormula.getExternFormulaString();
int tokenSelectionStartIndex = -1;
int tokenSelectionEndIndex = 3;
InternFormulaTokenSelection internFormulaTokenSelection = new InternFormulaTokenSelection(
InternFormula.TokenSelectionType.USER_SELECTION, tokenSelectionStartIndex, tokenSelectionEndIndex);
Reflection.setPrivateField(internFormula, "internFormulaTokenSelection", internFormulaTokenSelection);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_0, getInstrumentation().getTargetContext(), null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
}
public void testHandleDeletion() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, false);
String externFormulaString = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
}
public void testDeleteInternTokenByIndex() {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
String externFormulaString = internFormula.getExternFormulaString();
Reflection.setPrivateField(internFormula, "externCursorPosition", -1);
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
internTokens.clear();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN, Operators.PLUS.name()));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
externFormulaString = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
internTokens.clear();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length() + 1, false);
externFormulaString = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
internTokens.clear();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length() + 2, false);
externFormulaString = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
internTokens.clear();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length() + 2, false);
externFormulaString = internFormula.getExternFormulaString();
internFormula.handleKeyInput(R.id.formula_editor_keyboard_delete, getInstrumentation().getTargetContext(),
null);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
assertTrue("ExternFormulaString changed on buggy input!",
internFormula.getExternFormulaString().compareTo(externFormulaString) == 0);
internTokens.clear();
}
public void testSetExternCursorPositionLeftTo() throws NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Method setExternCursorPositionLeftTo = InternFormula.class.getDeclaredMethod("setExternCursorPositionLeftTo",
int.class);
setExternCursorPositionLeftTo.setAccessible(true);
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
ExternInternRepresentationMapping externInternRepresentationMapping = new ExternInternRepresentationMapping();
Reflection.setPrivateField(internFormula, "externInternRepresentationMapping",
externInternRepresentationMapping);
int externCursorPositionBeforeMethodCall = internFormula.getExternCursorPosition();
setExternCursorPositionLeftTo.invoke(internFormula, 1);
assertEquals("Extern cursor position changed!", externCursorPositionBeforeMethodCall,
internFormula.getExternCursorPosition());
}
public void testSetExternCursorPositionRightTo() throws NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Method setExternCursorPositionRightTo = InternFormula.class.getDeclaredMethod("setExternCursorPositionRightTo",
int.class);
setExternCursorPositionRightTo.setAccessible(true);
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
int externCursorPositionBeforeMethodCall = internFormula.getExternCursorPosition();
setExternCursorPositionRightTo.invoke(internFormula, 1);
assertEquals("Extern cursor position changed!", externCursorPositionBeforeMethodCall,
internFormula.getExternCursorPosition());
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internTokens.add(new InternToken(InternTokenType.OPERATOR, Operators.PLUS.name()));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
setExternCursorPositionRightTo.invoke(internFormula, 3);
assertEquals("Extern cursor position changed!", 13, internFormula.getExternCursorPosition());
ExternInternRepresentationMapping externInternRepresentationMapping = new ExternInternRepresentationMapping();
Reflection.setPrivateField(internFormula, "externInternRepresentationMapping",
externInternRepresentationMapping);
externCursorPositionBeforeMethodCall = internFormula.getExternCursorPosition();
setExternCursorPositionRightTo.invoke(internFormula, 1);
assertEquals("Extern cursor position changed!", externCursorPositionBeforeMethodCall,
internFormula.getExternCursorPosition());
}
public void testSelectCursorPositionInternTokenOnError() throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
Method method = InternFormula.class.getDeclaredMethod("selectCursorPositionInternToken",
TokenSelectionType.class);
method.setAccessible(true);
Object[] arguments = new Object[1];
arguments[0] = InternFormula.TokenSelectionType.USER_SELECTION;
Reflection.setPrivateField(internFormula, "cursorPositionInternToken", null);
method.invoke(internFormula, arguments);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
}
public void testSelectCursorPositionInternToken() throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, true);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(0, true);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_CLOSE));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length() + 4, true);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETER_DELIMITER));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length() + 2, true);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(
getInstrumentation().getTargetContext().getResources().getString(R.string.formula_editor_function_sin)
.length(), true);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
assertNull("Selection changed!", Reflection.getPrivateField(internFormula, "internFormulaTokenSelection"));
}
public void testreplaceCursorPositionInternTokenByTokenList() throws NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Method method = InternFormula.class
.getDeclaredMethod("replaceCursorPositionInternTokenByTokenList", List.class);
method.setAccessible(true);
List<InternToken> tokensToReplaceWith = new ArrayList<InternToken>();
tokensToReplaceWith.add(new InternToken(InternTokenType.NUMBER, "1"));
Object[] arguments = new Object[1];
arguments[0] = tokensToReplaceWith;
ArrayList<InternToken> internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "42.42"));
InternFormula internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, true);
Reflection.setPrivateField(internFormula, "cursorPositionInternTokenIndex", -1);
assertEquals("Do not modify on error", CursorTokenPropertiesAfterModification.DO_NOT_MODIFY,
method.invoke(internFormula, arguments));
tokensToReplaceWith = new ArrayList<InternToken>();
tokensToReplaceWith.add(new InternToken(InternTokenType.PERIOD));
arguments = new Object[1];
arguments[0] = tokensToReplaceWith;
assertEquals("Do not modify on when second period token is inserted",
CursorTokenPropertiesAfterModification.DO_NOT_MODIFY, method.invoke(internFormula, arguments));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.NUMBER, "4242"));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
Reflection.setPrivateField(internFormula, "cursorPositionInternTokenIndex", -1);
assertEquals("Do not modify on error", CursorTokenPropertiesAfterModification.DO_NOT_MODIFY,
method.invoke(internFormula, arguments));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.FUNCTION_NAME, Functions.SIN.name()));
internTokens.add(new InternToken(InternTokenType.FUNCTION_PARAMETERS_BRACKET_OPEN));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
assertEquals("Do not modify on error", CursorTokenPropertiesAfterModification.DO_NOT_MODIFY,
method.invoke(internFormula, arguments));
internTokens = new ArrayList<>();
internTokens.add(new InternToken(InternTokenType.SENSOR, Sensors.OBJECT_COLOR.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
assertEquals("Do not modify in error", CursorTokenPropertiesAfterModification.RIGHT,
method.invoke(internFormula, arguments));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.SENSOR, Sensors.OBJECT_BRIGHTNESS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
assertEquals("Do not modify on error", CursorTokenPropertiesAfterModification.RIGHT,
method.invoke(internFormula, arguments));
internTokens = new ArrayList<InternToken>();
internTokens.add(new InternToken(InternTokenType.SENSOR, Sensors.OBJECT_BRIGHTNESS.name()));
internFormula = new InternFormula(internTokens);
internFormula.generateExternFormulaStringAndInternExternMapping(getInstrumentation().getTargetContext());
internFormula.setCursorAndSelection(1, false);
tokensToReplaceWith = new ArrayList<InternToken>();
tokensToReplaceWith.add(new InternToken(InternTokenType.FUNCTION_NAME));
arguments = new Object[1];
arguments[0] = tokensToReplaceWith;
assertEquals("Do not modify on error", CursorTokenPropertiesAfterModification.RIGHT,
method.invoke(internFormula, arguments));
}
}