/*
* 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.Paint;
import android.graphics.Rect;
import android.text.style.BackgroundColorSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.github.johnpersano.supertoasts.library.Style;
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.ChangeSizeByNBrick;
import org.catrobat.catroid.content.bricks.WaitBrick;
import org.catrobat.catroid.formulaeditor.Formula;
import org.catrobat.catroid.formulaeditor.FormulaEditorEditText;
import org.catrobat.catroid.formulaeditor.FormulaElement;
import org.catrobat.catroid.formulaeditor.InternFormulaParser;
import org.catrobat.catroid.formulaeditor.InternToken;
import org.catrobat.catroid.formulaeditor.InternTokenType;
import org.catrobat.catroid.formulaeditor.SensorHandler;
import org.catrobat.catroid.formulaeditor.SensorLoudness;
import org.catrobat.catroid.test.utils.Reflection;
import org.catrobat.catroid.test.utils.SimulatedSensorManager;
import org.catrobat.catroid.test.utils.SimulatedSoundRecorder;
import org.catrobat.catroid.ui.MainMenuActivity;
import org.catrobat.catroid.uitest.annotation.Device;
import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase;
import org.catrobat.catroid.uitest.util.UiTestUtils;
import java.util.LinkedList;
import java.util.List;
public class FormulaEditorEditTextTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> {
private static final String TAG = FormulaEditorEditTextTest.class.getSimpleName();
private static final int CHANGE_SIZE_BY_EDIT_TEXT_RID = R.id.brick_change_size_by_edit_text;
private static final int WAIT_EDIT_TEXT_RID = R.id.brick_wait_edit_text;
private static final int FORMULA_EDITOR_EDIT_TEXT_INDEX = 0;
private static final int FORMULA_EDITOR_EDIT_TEXT_RID = R.id.formula_editor_edit_field;
private String veryLongFormulaString = "9999999999999999999.888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888877777777777777777777777777777777777777777777777777777777777777777777777777777666666666666666666666666666666666666666666666666666666666666666666665555555555555555555555555555555555555555555555555555555555555433";
public FormulaEditorEditTextTest() {
super(MainMenuActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
createProject(UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
}
private void createProject(String projectName) throws InterruptedException {
Project project = new Project(null, projectName);
Sprite firstSprite = new SingleSprite("nom nom nom");
Script startScript = new StartScript();
Brick changeBrick = new ChangeSizeByNBrick(0);
Formula longFormula = createVeryLongFormula();
WaitBrick waitBrick = new WaitBrick(longFormula);
firstSprite.addScript(startScript);
startScript.addBrick(changeBrick);
startScript.addBrick(waitBrick);
project.getDefaultScene().addSprite(firstSprite);
ProjectManager.getInstance().setProject(project);
ProjectManager.getInstance().setCurrentSprite(firstSprite);
}
private void setAbsoluteCursorPosition(int position) {
((FormulaEditorEditText) solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)).setDoNotMoveCursorOnTab(true);
Reflection
.setPrivateField(solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX), "absoluteCursorPosition", position);
clickOnFormulaEditorEditText();
}
private int getAbsoluteCursorPosition() {
Object position = Reflection.getPrivateField(solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX),
"absoluteCursorPosition");
assertTrue("Cursor position not valid", position instanceof Number);
return ((Number) position).intValue();
}
private void doubleClickOnFormulaEditorEditText() {
Rect globalVisibleRect = new Rect();
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getGlobalVisibleRect(globalVisibleRect);
solo.clickOnScreen(30, globalVisibleRect.centerY(), 1);
solo.sleep(100);
solo.clickOnScreen(30, globalVisibleRect.centerY(), 1);
}
private void clickOnFormulaEditorEditText() {
Rect globalVisibleRect = new Rect();
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getGlobalVisibleRect(globalVisibleRect);
solo.clickOnScreen(30, globalVisibleRect.top + 10);
}
public void testSingleTapOnFunctionName() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
BackgroundColorSpan colorHighlight = (BackgroundColorSpan) Reflection.getPrivateField(
new FormulaEditorEditText(getActivity()), "COLOR_HIGHLIGHT");
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
setAbsoluteCursorPosition(2);
assertEquals("Selection cursor not found in text, but should be", 0,
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().getSpanStart(colorHighlight));
assertEquals("Selection cursor not found in text, but should be",
solo.getString(R.string.formula_editor_function_rand).length() + "( 0 , 1 )".length(), solo
.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().getSpanEnd(colorHighlight));
assertEquals("Cursor not found in text, but should be", 2, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)
.getSelectionEnd());
}
public void testCursorBlinking() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
final FormulaEditorEditText formulaEditorEditText = (FormulaEditorEditText) solo.getView(R.id.formula_editor_edit_field);
Paint paintOfCursor = (Paint) Reflection.getPrivateField(formulaEditorEditText, "paint");
int colorPresent = paintOfCursor.getColor();
solo.sleep(500); //Cursor blinks after 500ms
paintOfCursor = (Paint) Reflection.getPrivateField(formulaEditorEditText, "paint");
int colorPresentAfterBlink = paintOfCursor.getColor();
assertTrue("Cursor is not blinking", colorPresent != colorPresentAfterBlink);
colorPresent = colorPresentAfterBlink;
solo.sleep(500); //Cursor blinks after 500ms
paintOfCursor = (Paint) Reflection.getPrivateField(formulaEditorEditText, "paint");
colorPresentAfterBlink = paintOfCursor.getColor();
assertTrue("Cursor is not blinking", colorPresent != colorPresentAfterBlink);
}
public void testHighlightColor() {
BackgroundColorSpan editTextColorSpanActual = new BackgroundColorSpan(0xFF33B5E5);
BackgroundColorSpan editTextColorSpanPresent = (BackgroundColorSpan) Reflection.getPrivateField(
new FormulaEditorEditText(getActivity()), "COLOR_HIGHLIGHT");
assertTrue("Highlight color is wrong", editTextColorSpanActual.getBackgroundColor() == editTextColorSpanPresent.getBackgroundColor());
}
public void testDoubleTapSelection() {
BackgroundColorSpan colorHighlight = (BackgroundColorSpan) Reflection.getPrivateField(
new FormulaEditorEditText(getActivity()), "COLOR_HIGHLIGHT");
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
for (int i = 1; i <= 6; i++) {
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
}
assertTrue("Text not found", solo.searchText("111111", true));
assertTrue("Selection cursor found in text, but should not be", solo
.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().getSpanStart(colorHighlight) == -1);
setAbsoluteCursorPosition(3);
doubleClickOnFormulaEditorEditText();
assertEquals("Selection cursor not found in text, but should be", 0,
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().getSpanStart(colorHighlight));
assertEquals("Selection cursor not found in text, but should be", 6,
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().getSpanEnd(colorHighlight));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertFalse("Text found but shouldnt", solo.searchText("11111", true));
assertTrue("Error cursor found in text, but should not be", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)
.getText().getSpanStart(colorHighlight) == -1);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
assertTrue("Text not found", solo.searchText(solo.getString(R.string.formula_editor_function_rand) + "(", true));
setAbsoluteCursorPosition(3);
doubleClickOnFormulaEditorEditText();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertFalse("Text found but shouldnt",
solo.searchText(solo.getString(R.string.formula_editor_function_rand) + "(", true));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_y_acceleration));
assertTrue("Text not found",
solo.searchText(solo.getString(R.string.formula_editor_sensor_y_acceleration), true));
setAbsoluteCursorPosition(3);
doubleClickOnFormulaEditorEditText();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertFalse("Text found but shouldnt",
solo.searchText(solo.getString(R.string.formula_editor_sensor_y_acceleration), true));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_y_acceleration));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_x_acceleration));
assertTrue(
"Text not found",
solo.searchText(
solo.getString(R.string.formula_editor_sensor_y_acceleration) + " "
+ solo.getString(R.string.formula_editor_sensor_x_acceleration), true));
}
public void testFunctionFirstParameterSelectionAndModification() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
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_1));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4));
assertEquals("Function parameter modification failed", solo.getString(R.string.formula_editor_function_sin)
+ "( 12" + getActivity().getString(R.string.formula_editor_decimal_mark) + "34 ) ",
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(2);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Text deletion was wrong!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
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_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4));
assertEquals("Function parameter modification failed", solo.getString(R.string.formula_editor_function_rand)
+ "( 12" + getActivity().getString(R.string.formula_editor_decimal_mark) + "34 , 1 ) ", solo
.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(2);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Text deletion was wrong!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
}
public void testTryDeleteFunctionComma() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
int commaPosition = 11;
setAbsoluteCursorPosition(commaPosition);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Function parameter modification failed", solo.getString(R.string.formula_editor_function_rand)
+ "( 0 , 1 ) ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
assertEquals("Wrong cursor position", commaPosition - 1, getAbsoluteCursorPosition());
}
public void testBracketValueSelectionAndModification() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_bracket_open));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_bracket_close));
assertEquals("Bracket value modification failed",
"( 1" + getActivity().getString(R.string.formula_editor_decimal_mark) + "3 ) ",
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(1);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
String editTextString = "1" + getActivity().getString(R.string.formula_editor_decimal_mark) + "3 "
+ getActivity().getString(R.string.formula_editor_bracket_close) + " ";
assertEquals("Text deletion was wrong!", editTextString, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)
.getText().toString());
setAbsoluteCursorPosition(0);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_bracket_open));
setAbsoluteCursorPosition(100);
editTextString = getActivity().getString(R.string.formula_editor_bracket_open) + " 1"
+ getActivity().getString(R.string.formula_editor_decimal_mark) + "3 ";
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Text deletion was wrong!", editTextString, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)
.getText().toString());
}
public void testLongClickDeletion() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
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_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4));
solo.clickLongOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Long click deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
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_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4));
setAbsoluteCursorPosition(2);
solo.clickLongOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Long click deletion failed!", "34 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
}
public void testFunctionDeletion() {
int functionRandomLength = solo.getCurrentActivity().getText(R.string.formula_editor_function_rand).length();
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Function deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
setAbsoluteCursorPosition(functionRandomLength + 9);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Function deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Function deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_rand));
setAbsoluteCursorPosition(1);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Function deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
}
public void testNumberInsertion() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
assertEquals("Number insertion failed!", "0" + getActivity().getString(R.string.formula_editor_decimal_mark)
+ "1 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
assertEquals("Delimiter insertion failed!", "0" + getActivity().getString(R.string.formula_editor_decimal_mark)
+ "1 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(1);
doubleClickOnFormulaEditorEditText();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Number deletion failed!", " ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2));
setAbsoluteCursorPosition(0);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
assertEquals("Delimiter insertion failed!", "0" + getActivity().getString(R.string.formula_editor_decimal_mark)
+ "12 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(1);
doubleClickOnFormulaEditorEditText();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_4));
setAbsoluteCursorPosition(0);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2));
setAbsoluteCursorPosition(0);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
setAbsoluteCursorPosition(2);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
assertEquals("Delimiter insertion failed!", "12"
+ getActivity().getString(R.string.formula_editor_decimal_mark) + "34 ",
solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText().toString());
setAbsoluteCursorPosition(1);
doubleClickOnFormulaEditorEditText();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
}
public void testGoBackToDiscardChanges() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
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_plus));
solo.sleep(50);
solo.goBack();
solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title));
solo.clickOnButton(solo.getString(R.string.no));
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_changes_discarded)));
assertEquals("Wrong text in FormulaEditor", "0 ", ((TextView) solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID))
.getText().toString());
}
public void testDiscardDialog() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
solo.sleep(50);
solo.goBack();
solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title));
solo.goBack();
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
solo.sleep(50);
solo.goBack();
solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title));
solo.clickOnButton(solo.getString(R.string.yes));
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_changes_saved)));
assertEquals("Wrong text in FormulaEditor", "99"
+ getActivity().getString(R.string.formula_editor_decimal_mark) + "9 ",
((TextView) solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID)).getText().toString());
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.goBack();
assertEquals("Wrong text in FormulaEditor", "99"
+ getActivity().getString(R.string.formula_editor_decimal_mark) + "9 ",
((TextView) solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID)).getText().toString());
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.sleep(50);
solo.goBack();
solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title));
solo.clickOnButton(solo.getString(R.string.no));
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_changes_discarded)));
assertEquals("Wrong text in FormulaEditor", "99"
+ getActivity().getString(R.string.formula_editor_decimal_mark) + "9 ",
((TextView) solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID)).getText().toString());
}
public void testErrorInFirstAndLastCharactersAndEmptyFormula() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_parse_fail)));
solo.sleep(Style.DURATION_SHORT);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_parse_fail)));
solo.sleep(Style.DURATION_SHORT);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
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_plus));
solo.goBack();
solo.waitForText(solo.getString(R.string.formula_editor_discard_changes_dialog_title));
solo.clickOnButton(solo.getString(R.string.yes));
solo.sleep(50);
assertTrue("Toast not found", solo.searchText(solo.getString(R.string.formula_editor_parse_fail)));
}
public void testTextCursorAndScrolling() {
solo.clickOnView(solo.getView(WAIT_EDIT_TEXT_RID));
solo.sleep(3000);
solo.waitForText(solo.getCurrentActivity().getString(R.string.formula_editor_title));
FormulaEditorEditText editField = (FormulaEditorEditText) solo.getView(R.id.formula_editor_edit_field);
Rect editfieldRect = new Rect();
editField.getGlobalVisibleRect(editfieldRect);
for (int index = 10; index < 20; index++) {
solo.clickOnScreen(100f, editfieldRect.bottom - index);
}
assertTrue("Scroll did not work!", editField.getScrollY() > 0);
setAbsoluteCursorPosition("9999999999999999999".length());
assertTrue("Text could not be found!", solo.searchText("9999999999999999999")); //note always ALL the text can be found by solo, not just the part currently visible due to scroll position
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertTrue("Wrong number of characters deleted!", solo.searchText("99999999999999999"));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
setAbsoluteCursorPosition(veryLongFormulaString.length());
assertTrue("Text could not be found!", solo.searchText("33 "));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertTrue("Wrong number of characters deleted!", solo.searchText("4 "));
}
public void testTextPreviewWithCursorPositions() {
solo.clickOnView(solo.getView(WAIT_EDIT_TEXT_RID));
TextView preview = (TextView) UiTestUtils.getViewContainerByIds(solo, R.id.brick_wait_edit_text,
R.id.formula_editor_brick_space);
FormulaEditorEditText formulaEditorEditText = (FormulaEditorEditText) solo
.getView(FORMULA_EDITOR_EDIT_TEXT_RID);
setAbsoluteCursorPosition(0);
assertTrue("Start not visible in preview after cursor change", preview.getText().toString().contains("9"));
setAbsoluteCursorPosition(formulaEditorEditText.getText().toString().indexOf("76") + 2);
assertTrue("Middle not visible in preview after cursor change", preview.getText().toString().contains("76"));
setAbsoluteCursorPosition(formulaEditorEditText.getText().length());
assertTrue("End not visible in preview after cursor change", preview.getText().toString().contains("33"));
}
public void testParseErrorsAndDeletion() {
String editTextString;
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
solo.sleep(500);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Text not deleted correctly", "8 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
setAbsoluteCursorPosition(1);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
solo.sleep(500);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
assertEquals("Text not deleted correctly", "8 + 8 ", solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
editTextString = "8 + " + getActivity().getString(R.string.formula_editor_function_rand) + "( 0 , 1 ) ";
setAbsoluteCursorPosition(editTextString.length());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_9));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
solo.sleep(500);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
editTextString += "+ 9 ";
assertEquals("Text not deleted correctly", editTextString, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX)
.getText().toString());
setAbsoluteCursorPosition(editTextString.length());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_8));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
editTextString = "8 + " + getActivity().getString(R.string.formula_editor_function_rand) + "( 0 ,";
setAbsoluteCursorPosition(editTextString.length() + 2);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_2));
editTextString += " + 2 ) ";
setAbsoluteCursorPosition(editTextString.length());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_3));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_ok));
solo.sleep(500);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
String expectedString = "8 + " + getActivity().getString(R.string.formula_editor_function_rand) + "( 0 , 2 ) "
+ "3 ";
assertEquals("Text not deleted correctly", expectedString, solo.getEditText(FORMULA_EDITOR_EDIT_TEXT_INDEX).getText()
.toString());
}
public void testStrings() {
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
FormulaEditorEditText formulaEditorEditText = (FormulaEditorEditText) solo
.getView(FORMULA_EDITOR_EDIT_TEXT_RID);
String hyphen = "-";
String costume = "costume";
String sprite = "sprite";
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_abs));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.scrollUp();
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_sin));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_cos));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_cos));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_tan));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_tan));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_ln));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_ln));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_log));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_log));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_pi));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_pi));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_sqrt));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_sqrt));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.waitForText(getActivity().getString(R.string.formula_editor_function_round));
solo.clickOnText(getActivity().getString(R.string.formula_editor_function_round));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_x_acceleration));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_x_acceleration));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_y_acceleration));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_y_acceleration));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_z_acceleration));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_z_acceleration));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_compass_direction));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_compass_direction));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_y_inclination));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_y_inclination));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_x_inclination));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_x_inclination));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_loudness));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_loudness));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_face_detected));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_face_detected));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_face_size));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_face_size));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_face_x_position));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_face_x_position));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.waitForText(getActivity().getString(R.string.formula_editor_sensor_face_y_position));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_face_y_position));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_x));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_x));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_y));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_y));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_transparency));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_transparency));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_brightness));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_brightness));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_size));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_size));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_rotation));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_rotation));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_object));
solo.waitForText(getActivity().getString(R.string.formula_editor_object_layer));
solo.clickOnText(getActivity().getString(R.string.formula_editor_object_layer));
String editTextString = formulaEditorEditText.getText().toString();
boolean hyphenOrCostumephraseOrSpritephraseFound = editTextString.contains(hyphen)
|| editTextString.contains(costume) || editTextString.contains(sprite);
assertFalse("Unallowed char or string found (hyphen, costumephrase, spritephrase).",
hyphenOrCostumephraseOrSpritephraseFound);
}
@Device
public void testComputeDialog() {
//For initialization
SensorLoudness.getSensorLoudness();
SensorLoudness loudnessSensor = (SensorLoudness) Reflection.getPrivateField(SensorLoudness.class, "instance");
SimulatedSoundRecorder simSoundRec = new SimulatedSoundRecorder("/dev/null");
Reflection.setPrivateField(loudnessSensor, "recorder", simSoundRec);
SensorHandler.startSensorListener(solo.getCurrentActivity());
SensorHandler.stopSensorListeners();
SensorHandler sensorHandler = (SensorHandler) Reflection.getPrivateField(SensorHandler.class, "instance");
SimulatedSensorManager sensorManager = new SimulatedSensorManager();
Reflection.setPrivateField(sensorHandler, "sensorManager", sensorManager);
solo.clickOnView(solo.getView(CHANGE_SIZE_BY_EDIT_TEXT_RID));
solo.waitForView(solo.getView(R.id.formula_editor_edit_field));
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_compute));
solo.waitForView(solo.getView(R.id.formula_editor_compute_dialog_textview));
TextView computeTextView = (TextView) solo.getView(R.id.formula_editor_compute_dialog_textview);
assertEquals("computeTextView did not contain the correct value", "-2.0", computeTextView.getText().toString());
solo.goBack();
solo.waitForView(solo.getView(R.id.formula_editor_edit_field));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_minus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_6));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_decimal_mark));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
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_compute));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_compute));
solo.waitForView(solo.getView(R.id.formula_editor_compute_dialog_textview));
computeTextView = (TextView) solo.getView(R.id.formula_editor_compute_dialog_textview);
assertEquals("computeTextView did not contain the correct value", -8.11,
Double.valueOf(computeTextView.getText().toString()), 0.01d);
solo.goBack();
solo.waitForView(solo.getView(R.id.formula_editor_edit_field));
View preview = UiTestUtils.getViewContainerByIds(solo, R.id.brick_change_size_by_edit_text,
R.id.formula_editor_brick_space);
solo.clickOnView(preview);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_sensors));
solo.clickOnText(getActivity().getString(R.string.formula_editor_sensor_x_acceleration));
solo.waitForView(solo.getView(R.id.formula_editor_edit_field));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_plus));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_function));
solo.clickOnText(solo.getString(R.string.formula_editor_function_rand));
String formulaString = getActivity().getString(R.string.formula_editor_sensor_x_acceleration) + " + "
+ solo.getString(R.string.formula_editor_function_rand) + "( 0 , 1";
setAbsoluteCursorPosition(formulaString.length());
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_compute));
solo.waitForView(solo.getView(R.id.formula_editor_compute_dialog_textview));
computeTextView = (TextView) solo.getView(R.id.formula_editor_compute_dialog_textview);
int maxLoops = 100;
String lastComputeString = computeTextView.getText().toString();
while (maxLoops-- > 0) {
Log.e(TAG, "loopCount " + maxLoops);
sensorManager.sendGeneratedSensorValues();
//Wait for runnable in FormulaEditorComputeDialog to
//update the textView
solo.sleep(50);
if (!computeTextView.getText().toString().equals(lastComputeString)) {
break;
}
}
assertTrue("Sensor interpretation error", maxLoops > 0);
solo.goBack();
solo.waitForView(solo.getView(R.id.formula_editor_edit_field));
preview = UiTestUtils.getViewContainerByIds(solo, R.id.brick_change_size_by_edit_text,
R.id.formula_editor_brick_space);
solo.clickOnView(preview);
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_delete));
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_1));
final int zeroCount = 7;
for (int i = 0; i < zeroCount; i++) {
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_0));
}
solo.clickOnView(solo.getView(R.id.formula_editor_keyboard_compute));
computeTextView = (TextView) solo.getView(R.id.formula_editor_compute_dialog_textview);
assertEquals("computeTextView did not contain the correct value", "1.0E" + zeroCount, computeTextView.getText()
.toString());
}
private Formula createVeryLongFormula() {
List<InternToken> internTokenList = new LinkedList<InternToken>();
internTokenList.add(new InternToken(InternTokenType.NUMBER, veryLongFormulaString));
InternFormulaParser internParser = new InternFormulaParser(internTokenList);
FormulaElement root = internParser.parseFormula();
Formula formula = new Formula(root);
return formula;
}
}