/* * 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.uitest.formulaeditor; import android.graphics.Rect; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; import com.robotium.solo.Solo; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.content.Project; import org.catrobat.catroid.content.Script; import org.catrobat.catroid.content.SingleSprite; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.content.StartScript; import org.catrobat.catroid.content.bricks.Brick; import org.catrobat.catroid.content.bricks.PlaceAtBrick; import org.catrobat.catroid.formulaeditor.Formula; import org.catrobat.catroid.formulaeditor.FormulaEditorEditText; import org.catrobat.catroid.formulaeditor.FormulaEditorHistory; import org.catrobat.catroid.formulaeditor.InterpretationException; import org.catrobat.catroid.test.utils.Reflection; import org.catrobat.catroid.ui.MainMenuActivity; import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase; import org.catrobat.catroid.uitest.util.UiTestUtils; public class FormulaEditorFragmentTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private PlaceAtBrick placeAtBrick; private static final int INITIAL_X = 8; private static final int INITIAL_Y = 7; private static final int X_POS_EDIT_TEXT_RID = R.id.brick_place_at_edit_text_x; private static final int Y_POS_EDIT_TEXT_RID = R.id.brick_place_at_edit_text_y; private static final int FORMULA_EDITOR_EDIT_TEXT_ID = 0; private Sprite sprite; public FormulaEditorFragmentTest() { super(MainMenuActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); createProject(); UiTestUtils.getIntoScriptActivityFromMainMenu(solo); } private void createProject() { Project project = new Project(null, UiTestUtils.DEFAULT_TEST_PROJECT_NAME); sprite = new SingleSprite("cat"); Script script = new StartScript(); placeAtBrick = new PlaceAtBrick(INITIAL_X, INITIAL_Y); script.addBrick(placeAtBrick); sprite.addScript(script); project.getDefaultScene().addSprite(sprite); ProjectManager.getInstance().setProject(project); ProjectManager.getInstance().setCurrentSprite(sprite); ProjectManager.getInstance().setCurrentScript(script); } public void testChangeFormula() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.sleep(150); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); solo.sleep(150); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID, 1)); solo.sleep(50); assertTrue("Saved changes message not found!", solo.searchText(solo.getString(R.string.formula_editor_changes_saved))); solo.goBack(); solo.sleep(100); assertEquals("Value not saved!", "1 ", ((TextView) solo.getView(X_POS_EDIT_TEXT_RID)).getText().toString()); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); assertTrue("Fix error message not found!", solo.searchText(solo.getString(R.string.formula_editor_parse_fail))); solo.sleep(500); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); assertTrue("Changes saved message not found!", solo.searchText(solo.getString(R.string.formula_editor_changes_discarded))); solo.goBack(); solo.goBack(); } public void testPiValueInComputeDialog() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(getActivity().getString(R.string.formula_editor_function_pi)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_compute)); assertTrue("PI has wrong value in Dialog!", solo.searchText(String.valueOf(Math.PI), true)); } public void testOnTheFlyUpdateOfBrickEditText() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); assertEquals("Wrong text in FormulaEditor", "1 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText() .toString()); solo.sleep(100); assertEquals("Wrong text in X EditText", "1 ", ((TextView) solo.getView(X_POS_EDIT_TEXT_RID, 1)).getText() .toString()); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2)); assertEquals("Wrong text in FormulaEditor", "12 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText() .toString()); assertEquals("Wrong text in X EditText", "12 ", ((TextView) solo.getView(X_POS_EDIT_TEXT_RID, 1)).getText() .toString()); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(200); assertEquals("Wrong text in X EditText", "12 ", ((TextView) solo.getView(X_POS_EDIT_TEXT_RID)).getText() .toString()); } public void testUndo() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_mult)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(getActivity().getString(R.string.formula_editor_function_cos)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(getActivity().getString(R.string.formula_editor_function_sin)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(getActivity().getString(R.string.formula_editor_function_tan)); assertEquals("Wrong text in field", "1 - 2 × cos( sin( tan( 0 ) ) ) ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText().toString()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(50); assertEquals("Undo did something wrong", "1 - 2 × cos( sin( 0 ) ) ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText().toString()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(50); assertEquals("Undo did something wrong", "1 - 2 × cos( 0 ) ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(50); assertEquals("Undo did something wrong", "1 - 2 × ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText() .toString()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(50); assertEquals("Undo did something wrong", "1 - 2 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText() .toString()); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(200); assertEquals("Undo did something wrong", "1 - 2 ", ((TextView) solo.getView(X_POS_EDIT_TEXT_RID)).getText() .toString()); solo.goBack(); solo.goBack(); } public void testUndoRedo() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_mult)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_7)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9)); solo.sleep(200); assertEquals("Wrong text in field", "9 - 8 × 7 + 9 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText() .toString()); for (int i = 0; i < 7; i++) { solo.clickOnView(solo.getView(R.id.menu_undo)); } solo.sleep(50); assertEquals("Undo did something wrong", INITIAL_X + " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.clickOnView(solo.getView(R.id.menu_undo)); assertEquals("Undo did something wrong", INITIAL_X + " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); for (int i = 0; i < 7; i++) { solo.clickOnView(solo.getView(R.id.menu_redo)); } solo.sleep(50); assertEquals("Undo did something wrong", "9 - 8 × 7 + 9 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.goBack(); solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title)); solo.clickOnButton(solo.getString(R.string.no)); } public void testUndoLimit() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); int maxHistoryElements = (Integer) Reflection.getPrivateField(new FormulaEditorHistory(null), "MAXIMUM_HISTORY_LENGTH"); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); String searchString = ""; for (int i = 0; i < maxHistoryElements; i++) { solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); searchString += " +"; } solo.sleep(50); assertEquals("Wrong text in field", "1" + searchString + " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); for (int i = 0; i < maxHistoryElements + 2; i++) { solo.clickOnView(solo.getView(R.id.menu_undo)); } assertEquals("Wrong text in field", "1 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getText().toString()); for (int i = 0; i < maxHistoryElements + 2; i++) { solo.clickOnView(solo.getView(R.id.menu_redo)); } assertEquals("Wrong text in field", "1" + searchString + " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.goBack(); solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title)); solo.clickOnButton(solo.getString(R.string.no)); } public void testSimpleInterpretation() { String newXFormula = "10 + 12 - 2 × 3 - 4 "; int newXValue = 10 + 12 - 2 * 3 - 4; String newYFormula = getActivity().getString(R.string.formula_editor_function_rand) + "( " + getActivity().getString(R.string.formula_editor_function_cos) + "( 90 - - 30 ) , 1 ) "; solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.sleep(250); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_mult)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(250); assertTrue("Save failed toast not found", solo.searchText(solo.getString(R.string.formula_editor_changes_saved))); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(getActivity().getString(R.string.formula_editor_function_cos)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0)); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); assertTrue("Changes saved toast not found", solo.searchText(solo.getString(R.string.formula_editor_changes_saved))); assertEquals("Wrong text in FormulaEditor", newXFormula, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID, 1)); solo.sleep(250); assertEquals("Wrong text in FormulaEditor", newYFormula, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID) .getText().toString()); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(300); //Interpretation test Formula formula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.X_POSITION); try { assertEquals("Wrong text in field", newXValue, formula.interpretInteger(sprite).intValue()); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } formula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.Y_POSITION); try { float newYValue = formula.interpretFloat(sprite); assertTrue("Wrong text in field", newYValue >= -0.5f && newYValue <= 1f); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } } public void testRandomInterpretationWithFloatParameters() { String newXFormula = "random(9.9,1)"; solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(300); Formula formula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.X_POSITION); try { float value = formula.interpretFloat(sprite); assertTrue("random() interpretation of float parameter is wrong: " + newXFormula + " value=" + value, 1 <= value && value <= 9.9f && (Math.abs(value) - (int) Math.abs(value)) > 0); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } String newYFormula = "random(7.0,1)"; solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_7)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(300); Formula anotherFormula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.Y_POSITION); try { float anotherValue = anotherFormula.interpretFloat(sprite); assertTrue("random() interpretation of float parameter is wrong: " + newYFormula + " anotherValue=" + anotherValue, 1 <= anotherValue && anotherValue <= 7.0f && (Math.abs(anotherValue) - (int) Math.abs(anotherValue)) > 0); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } } public void testRandomInterpretationWithIntegerParameters() { String newXFormula = "rand(rand(3),1)"; solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(300); Formula formula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.X_POSITION); try { float value = formula.interpretFloat(sprite); assertTrue("random() interpretation of integer parameters is wrong: " + newXFormula + " anotherValue=" + value, (value == 1 || value == 2 || value == 3)); assertEquals("random() interpretation of integer parameters is wrong: " + newXFormula + " anotherValue=" + value, 0, Math.abs(value) - (int) Math.abs(value), 0); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } String newYFormula = "rand(4,1)"; solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.sleep(300); Formula anotherFormula = placeAtBrick.getFormulaWithBrickField(Brick.BrickField.Y_POSITION); try { float anotherValue = anotherFormula.interpretFloat(sprite); assertTrue("random() interpretation of integer parameters is wrong: " + newYFormula + " anotherValue=" + anotherValue, (anotherValue == 1 || anotherValue == 2 || anotherValue == 3 || anotherValue == 4)); assertEquals("random() interpretation of integer parameters is wrong: " + newYFormula + " anotherValue=" + anotherValue, 0, Math.abs(anotherValue) - (int) Math.abs(anotherValue), 0); } catch (InterpretationException interpretationException) { fail("Wrong text in field."); } } public void testIflandscapeModeOrientationIsDeactivated() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); int orientation = getActivity().getRequestedOrientation(); assertTrue("landscapeMode Orientation isn't deactivated", orientation == Solo.PORTRAIT); } public void testGoBackAndEditTextSwitches() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_6)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID, 1)); solo.goBack(); solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title)); solo.clickOnButton(solo.getString(R.string.yes)); boolean isFound = solo.searchText("6") && solo.searchText("-"); assertTrue("6 or - is/are not found!", isFound); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3)); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_5)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok)); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4)); solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID, 1)); isFound = solo.searchText("6") && solo.searchText("+") && solo.searchText("3"); assertTrue("6 + 3 not found!", isFound); solo.clickOnView(solo.getView(Y_POS_EDIT_TEXT_RID, 1)); isFound = solo.searchText("5") && solo.searchText("-") && solo.searchText("4"); assertTrue("5 - 4 not found!", isFound); } public void testRedoAndUndoButtonViewOfKeyboard() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); assertTrue("Formula Editor Fragment not shown!", solo.waitForText(solo.getString(R.string.formula_editor_title))); View undo = solo.getView(R.id.menu_undo); View redo = solo.getView(R.id.menu_redo); assertTrue("Undo Button not inactive!", !undo.isEnabled()); assertTrue("Redo Button not inactive!", !redo.isEnabled()); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_6)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_6)); assertTrue("Undo Button not active!", undo.isEnabled()); assertTrue("Redo Button not inactive!", !redo.isEnabled()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(100); assertTrue("Undo Button not active!", undo.isEnabled()); assertTrue("Redo Button not active!", redo.isEnabled()); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(100); assertTrue("Undo Button not inactive!", !undo.isEnabled()); assertTrue("Redo Button not active!", redo.isEnabled()); } public void testDeleteButtonViewOfKeyboard() { solo.clickOnView(solo.getView(X_POS_EDIT_TEXT_RID)); assertTrue("Formula Editor Fragment not shown!", solo.waitForText(solo.getString(R.string.formula_editor_title))); ImageButton deleteKeyboard = (ImageButton) solo.getView(R.id.formula_editor_keyboard_delete); assertTrue("Delete Button not active!", areDeleteButtonsEnabled(deleteKeyboard)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete)); assertTrue("Delete Button not inactive!", !areDeleteButtonsEnabled(deleteKeyboard)); solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function)); solo.clickOnText(solo.getString(R.string.formula_editor_function_rand)); solo.waitForText(solo.getString(R.string.formula_editor_title)); assertTrue("Delete Button not active!", areDeleteButtonsEnabled(deleteKeyboard)); setAbsoluteCursorPosition(0); assertTrue("Delete Button not inactive!", !areDeleteButtonsEnabled(deleteKeyboard)); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.clickOnView(solo.getView(R.id.menu_undo)); solo.sleep(200); assertTrue("Delete Button not active!", areDeleteButtonsEnabled(deleteKeyboard)); solo.clickOnView(solo.getView(R.id.menu_redo)); solo.clickOnView(solo.getView(R.id.menu_redo)); assertTrue("Delete Button not inactive!", !areDeleteButtonsEnabled(deleteKeyboard)); } private void setAbsoluteCursorPosition(int position) { ((FormulaEditorEditText) solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID)).setDoNotMoveCursorOnTab(true); Reflection.setPrivateField(solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID), "absoluteCursorPosition", position); clickOnFormulaEditorEditText(); } //click on edit text private void clickOnFormulaEditorEditText() { Rect globalVisibleRect = new Rect(); solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_ID).getGlobalVisibleRect(globalVisibleRect); solo.clickOnScreen(30, globalVisibleRect.top + 10); } private boolean areDeleteButtonsEnabled(ImageButton deleteKeyboard) { return deleteKeyboard.isEnabled(); } }