/* * 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.content.brick; import android.util.Log; import android.widget.CheckBox; import android.widget.ListView; 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.ChangeYByNBrick; import org.catrobat.catroid.content.bricks.IfLogicBeginBrick; import org.catrobat.catroid.content.bricks.IfLogicElseBrick; import org.catrobat.catroid.content.bricks.IfLogicEndBrick; import org.catrobat.catroid.content.bricks.SetLookBrick; import org.catrobat.catroid.ui.MainMenuActivity; import org.catrobat.catroid.ui.adapter.BrickAdapter; import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase; import org.catrobat.catroid.uitest.util.UiTestUtils; import java.util.ArrayList; public class IfBrickTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private static final String TAG = IfBrickTest.class.getSimpleName(); private Project project; private IfLogicBeginBrick ifBrick; public IfBrickTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); createProject(); UiTestUtils.getIntoScriptActivityFromMainMenu(solo); } public void testIfBrick() { ListView view = UiTestUtils.getScriptListView(solo); ListView dragDropListView = UiTestUtils.getScriptListView(solo); BrickAdapter adapter = (BrickAdapter) view.getAdapter(); int childrenCount = adapter.getChildCountFromLastGroup(); UiTestUtils.testBrickWithFormulaEditor(solo, ProjectManager.getInstance().getCurrentSprite(), R.id.brick_if_begin_edit_text, 5, Brick.BrickField.IF_CONDITION, ifBrick); assertEquals("Incorrect number of bricks.", 6, dragDropListView.getChildCount()); // don't forget the footer assertEquals("Incorrect number of bricks.", 0, childrenCount); ArrayList<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); assertEquals("Incorrect number of bricks.", 4, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof IfLogicBeginBrick); assertNotNull("TextView does not exist", solo.getText(getActivity().getString(R.string.brick_if_begin))); } public void testStrings() { solo.clickOnView(solo.getView(R.id.brick_if_begin_edit_text)); solo.sleep(100); boolean isFound = solo.searchText(solo.getString(R.string.brick_if_begin_second_part)); assertTrue("String: " + getActivity().getString(R.string.brick_if_begin_second_part) + " not found!", isFound); isFound = solo.searchText(solo.getString(R.string.brick_if_begin)); assertTrue("String: " + getActivity().getString(R.string.brick_if_begin) + " not found!", isFound); } public void testIfBrickParts() { int dragAndDropSteps = 100; ArrayList<Integer> yPosition; ArrayList<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); Log.d(TAG, "Before drag item 1 to item 4 + 20"); logBrickListForJenkins(projectBrickList); yPosition = UiTestUtils.getListItemYPositions(solo, 0); int oldYto = yPosition.get(4) + 20; UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(1), 10, oldYto, dragAndDropSteps); boolean result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag on item 1! y-Coordinate: " + oldYto, result); assertEquals("Incorrect number of bricks.", 4, projectBrickList.size()); assertTrue("Wrong Brick instance.", (projectBrickList.get(1) instanceof IfLogicBeginBrick)); Log.d(TAG, "Before drag item 2 to item 0"); logBrickListForJenkins(projectBrickList); yPosition = UiTestUtils.getListItemYPositions(solo, 0); oldYto = yPosition.get(0); UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(2), 10, oldYto, dragAndDropSteps); result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag on item 2! y-Coordinate: " + oldYto, result); assertEquals("Incorrect number of bricks.", 4, projectBrickList.size()); assertTrue("Wrong Brick instance.", (projectBrickList.get(0) instanceof IfLogicBeginBrick)); Log.d(TAG, "Before drag item 3 to item 0"); logBrickListForJenkins(projectBrickList); yPosition = UiTestUtils.getListItemYPositions(solo, 0); oldYto = yPosition.get(0); UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(3), 10, oldYto, dragAndDropSteps); result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag on item 3! y-Coordinate: " + oldYto, result); assertEquals("Incorrect number of bricks.", 4, projectBrickList.size()); assertTrue("Wrong Brick instance - expected IfElseBrick but was " + projectBrickList.get(1).getClass().getSimpleName(), projectBrickList.get(1) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance - expected ChangeYByNBrick but was " + projectBrickList.get(2).getClass().getSimpleName(), projectBrickList.get(2) instanceof ChangeYByNBrick ); Log.d(TAG, "Before drag item 4 to item 0"); logBrickListForJenkins(projectBrickList); yPosition = UiTestUtils.getListItemYPositions(solo, 0); oldYto = yPosition.get(0); UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(4) - 10, 10, oldYto, dragAndDropSteps); assertEquals("Incorrect number of bricks.", 4, projectBrickList.size()); result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag on item 4! y-Coordinate: " + oldYto, result); Log.d(TAG, "After drag item 4 to item 0"); logBrickListForJenkins(projectBrickList); assertTrue("Wrong Brick instance, expected IfLogicEndBrick but was " + projectBrickList.get(2).getClass().getSimpleName(), projectBrickList.get(2) instanceof IfLogicEndBrick); UiTestUtils.addNewBrick(solo, R.string.brick_broadcast_receive); yPosition = UiTestUtils.getListItemYPositions(solo, 0); Sprite sprite = ProjectManager.getInstance().getCurrentSprite(); assertEquals("Incorrect number of Scripts.", 2, sprite.getNumberOfScripts()); solo.goBack(); yPosition = UiTestUtils.getListItemYPositions(solo, 0); solo.clickOnScreen(20, yPosition.get(3)); clickOnDeleteInDialog(); assertEquals("Incorrect number of bricks.", 1, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof ChangeYByNBrick); yPosition = UiTestUtils.getListItemYPositions(solo, 0); oldYto = yPosition.get(2) + 20; UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(1), 10, oldYto, dragAndDropSteps); result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag! y-Coordinate: " + oldYto, result); assertEquals("Incorrect number of bricks.", 0, projectBrickList.size()); projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(1).getBrickList(); assertEquals("Incorrect number of bricks.", 1, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof ChangeYByNBrick); UiTestUtils.addNewBrick(solo, R.string.brick_if_begin); yPosition = UiTestUtils.getListItemYPositions(solo, 0); int addedYPosition = UiTestUtils.getAddedListItemYPosition(solo); solo.drag(20, 20, addedYPosition, yPosition.get(3) + 20, dragAndDropSteps); UiTestUtils.addNewBrick(solo, R.string.brick_set_look); yPosition = UiTestUtils.getListItemYPositions(solo, 0); addedYPosition = UiTestUtils.getAddedListItemYPosition(solo); solo.drag(20, 20, addedYPosition, yPosition.get(5) + 20, dragAndDropSteps); yPosition = UiTestUtils.getListItemYPositions(solo, 0); oldYto = yPosition.get(5) + 20; UiTestUtils.longClickAndDrag(solo, 10, yPosition.get(4), 10, oldYto, dragAndDropSteps); projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(1).getBrickList(); result = solo.waitForLogMessage("longClickAndDrag finished: " + oldYto, 1000); assertTrue("Timeout during longClickAndDrag! y-Coordinate: " + oldYto, result); Log.d(TAG, "Final order of bricks"); logBrickListForJenkins(projectBrickList); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof ChangeYByNBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(1) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(2) instanceof SetLookBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(3) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(4) instanceof IfLogicEndBrick); } public void testCopyIfLogicBeginBrickActionMode() { UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); solo.clickOnCheckBox(1); UiTestUtils.acceptAndCloseActionMode(solo); ArrayList<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); assertEquals("Incorrect number of bricks.", 7, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(1) instanceof ChangeYByNBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(2) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(3) instanceof IfLogicEndBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(4) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(5) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(6) instanceof IfLogicEndBrick); } public void testCopyIfLogicElseBrickActionMode() { UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); solo.clickOnCheckBox(3); UiTestUtils.acceptAndCloseActionMode(solo); ArrayList<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); assertEquals("Incorrect number of bricks.", 7, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(1) instanceof ChangeYByNBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(2) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(3) instanceof IfLogicEndBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(4) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(5) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(6) instanceof IfLogicEndBrick); } public void testCopyIfLogicEndBrickActionMode() { UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); solo.clickOnCheckBox(4); UiTestUtils.acceptAndCloseActionMode(solo); ArrayList<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); assertEquals("Incorrect number of bricks.", 7, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(1) instanceof ChangeYByNBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(2) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(3) instanceof IfLogicEndBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(4) instanceof IfLogicBeginBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(5) instanceof IfLogicElseBrick); assertTrue("Wrong Brick instance.", projectBrickList.get(6) instanceof IfLogicEndBrick); } public void testSelectionAfterCopyActionMode() { UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); solo.clickOnCheckBox(1); UiTestUtils.acceptAndCloseActionMode(solo); UiTestUtils.openActionMode(solo, solo.getString(R.string.delete), R.id.delete); solo.clickOnCheckBox(6); CheckBox firstIfLogicBeginBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_begin_checkbox, 0); CheckBox secondIfLogicBeginBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_begin_checkbox, 1); CheckBox firstIfLogicElseBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_else_checkbox, 0); CheckBox secondIfLogicElseBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_else_checkbox, 1); // Solo doesn't scroll automatically to get those views solo.scrollToBottom(); CheckBox firstIfLogicEndBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_end_if_checkbox, 0); CheckBox secondIfLogicEndBrickCheckBox = (CheckBox) solo.getView(R.id.brick_if_end_if_checkbox, 1); assertFalse("CheckBox is checked but shouldn't be.", firstIfLogicBeginBrickCheckBox.isChecked()); assertTrue("CheckBox is not checked but should be.", secondIfLogicBeginBrickCheckBox.isChecked()); assertFalse("CheckBox is checked but shouldn't be.", firstIfLogicElseBrickCheckBox.isChecked()); assertTrue("CheckBox is not checked but should be.", secondIfLogicElseBrickCheckBox.isChecked()); assertFalse("CheckBox is checked but shouldn't be.", firstIfLogicEndBrickCheckBox.isChecked()); assertTrue("CheckBox is not checked but should be.", secondIfLogicEndBrickCheckBox.isChecked()); } public void testSelectionActionMode() { UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); UiTestUtils.clickOnCheckBox(solo, 1); CheckBox ifLogicBeginBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_begin_checkbox); CheckBox ifLogicElseBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_else_checkbox); CheckBox ifLogicEndBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_end_if_checkbox); CheckBox changeYByNBrickCheckbox = (CheckBox) solo.getView(R.id.brick_change_y_checkbox); assertTrue("CheckBox is not checked but shouldn be.", ifLogicBeginBrickCheckbox.isChecked() && ifLogicElseBrickCheckbox.isChecked() && ifLogicEndBrickCheckbox.isChecked()); assertFalse("CheckBox is checked but shouldn't be.", changeYByNBrickCheckbox.isChecked()); UiTestUtils.acceptAndCloseActionMode(solo); UiTestUtils.openActionMode(solo, solo.getString(R.string.delete), R.id.delete); UiTestUtils.clickOnCheckBox(solo, 1); ifLogicBeginBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_begin_checkbox); ifLogicElseBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_else_checkbox); ifLogicEndBrickCheckbox = (CheckBox) solo.getView(R.id.brick_if_end_if_checkbox); changeYByNBrickCheckbox = (CheckBox) solo.getView(R.id.brick_change_y_checkbox); assertTrue("CheckBox is not checked but shouldn be.", ifLogicBeginBrickCheckbox.isChecked() && ifLogicElseBrickCheckbox.isChecked() && ifLogicEndBrickCheckbox.isChecked()); assertFalse("CheckBox is checked but shouldn't be.", changeYByNBrickCheckbox.isChecked()); } private void logBrickListForJenkins(ArrayList<Brick> projectBrickList) { for (Brick brick : projectBrickList) { Log.d(TAG, "Brick at Positon " + projectBrickList.indexOf(brick) + ": " + brick.getClass().getSimpleName()); } } private void createProject() { project = new Project(null, UiTestUtils.DEFAULT_TEST_PROJECT_NAME); Sprite sprite = new SingleSprite("cat"); Script script = new StartScript(); ifBrick = new IfLogicBeginBrick(0); IfLogicElseBrick ifElseBrick = new IfLogicElseBrick(ifBrick); IfLogicEndBrick ifEndBrick = new IfLogicEndBrick(ifElseBrick, ifBrick); ifBrick.setIfElseBrick(ifElseBrick); ifBrick.setIfEndBrick(ifEndBrick); script.addBrick(ifBrick); script.addBrick(new ChangeYByNBrick(-10)); script.addBrick(ifElseBrick); script.addBrick(ifEndBrick); sprite.addScript(script); sprite.addScript(new StartScript()); project.getDefaultScene().addSprite(sprite); ProjectManager.getInstance().setProject(project); ProjectManager.getInstance().setCurrentSprite(sprite); ProjectManager.getInstance().setCurrentScript(script); } private void clickOnDeleteInDialog() { if (!solo.waitForText(solo.getString(R.string.brick_context_dialog_delete_brick), 0, 5000)) { fail("Text not shown in 5 secs!"); } solo.clickOnText(solo.getString(R.string.brick_context_dialog_delete_brick)); solo.clickOnText(solo.getString(R.string.yes)); if (!solo.waitForView(ListView.class, 0, 5000)) { fail("Dialog does not close in 5 sec!"); } } }