/* * 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.SparseArray; import android.widget.EditText; import android.widget.ListView; import android.widget.Spinner; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.content.BroadcastScript; 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.bricks.Brick; import org.catrobat.catroid.content.bricks.BroadcastBrick; import org.catrobat.catroid.content.bricks.BroadcastWaitBrick; import org.catrobat.catroid.ui.MainMenuActivity; import org.catrobat.catroid.ui.adapter.BrickAdapter; import org.catrobat.catroid.uitest.annotation.Device; import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase; import org.catrobat.catroid.uitest.util.UiTestUtils; import java.util.List; public class BroadcastBricksTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private Project project; private Sprite sprite; private final SparseArray<String> expectedSpinnerText = new SparseArray<String>(); private String defaultBroadcastMessage = ""; private final int broadcastReceiverSpinnerId = R.id.brick_broadcast_receive_spinner; private final int broadcastSpinnerId = R.id.brick_broadcast_spinner; private final int broadcastWaitSpinnerId = R.id.brick_broadcast_wait_spinner; public BroadcastBricksTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); defaultBroadcastMessage = solo.getString(R.string.brick_broadcast_default_value); expectedSpinnerText.put(broadcastReceiverSpinnerId, defaultBroadcastMessage); expectedSpinnerText.put(broadcastSpinnerId, defaultBroadcastMessage); expectedSpinnerText.put(broadcastWaitSpinnerId, defaultBroadcastMessage); createProject(); UiTestUtils.getIntoScriptActivityFromMainMenu(solo); } @Device public void testBroadcastBricks() { checkSetupBricks(); final String firstBroadcastMessage = "First"; final String secondBroadcastMessage = "Second"; final String thirdBroadcastMessage = "Third"; enterNewTextIntoSpinner(broadcastReceiverSpinnerId, firstBroadcastMessage); pressSpinnerItem(broadcastSpinnerId, firstBroadcastMessage); pressSpinnerItem(broadcastWaitSpinnerId, firstBroadcastMessage); enterNewTextIntoSpinner(broadcastSpinnerId, secondBroadcastMessage); enterNewTextIntoSpinner(broadcastWaitSpinnerId, thirdBroadcastMessage); pressSpinnerItem(broadcastSpinnerId, thirdBroadcastMessage); dismissEnterNewTextIntoSpinner(broadcastReceiverSpinnerId); dismissEnterNewTextIntoSpinner(broadcastSpinnerId); dismissEnterNewTextIntoSpinner(broadcastWaitSpinnerId); solo.waitForText(solo.getString(R.string.brick_broadcast_receive)); solo.clickOnText(solo.getString(R.string.brick_broadcast_receive)); solo.waitForText(solo.getString(R.string.brick_context_dialog_delete_script)); solo.clickOnText(solo.getString(R.string.brick_context_dialog_delete_script)); solo.waitForText(solo.getString(R.string.yes)); solo.clickOnButton(solo.getString(R.string.yes)); solo.sleep(200); UiTestUtils.addNewBrick(solo, R.string.category_control, R.string.brick_broadcast); // to gain focus solo.clickOnScreen(400, 400); if (solo.searchText(solo.getString(R.string.brick_context_dialog_move_brick), true)) { solo.goBack(); } Spinner broadcastSpinner = (Spinner) solo.getView(R.id.brick_broadcast_spinner); assertEquals("Wrong selection", defaultBroadcastMessage, broadcastSpinner.getSelectedItem().toString()); } @Device public void testRemoveUnusedMessages() { checkSetupBricks(); final String broadcastMessage = "Broadcast message"; enterNewTextIntoSpinner(broadcastReceiverSpinnerId, broadcastMessage); pressSpinnerItem(broadcastSpinnerId, broadcastMessage); pressSpinnerItem(broadcastWaitSpinnerId, broadcastMessage); solo.sleep(500); UiTestUtils.clickOnHomeActionBarButton(solo); UiTestUtils.getIntoScriptActivityFromMainMenu(solo); checkCorrectSpinnerSelections(); checkIfUnusedBroadcastMessagesHaveBeenRemoved(broadcastReceiverSpinnerId, broadcastMessage); checkIfUnusedBroadcastMessagesHaveBeenRemoved(broadcastSpinnerId, broadcastMessage); checkIfUnusedBroadcastMessagesHaveBeenRemoved(broadcastWaitSpinnerId, broadcastMessage); } private void checkIfUnusedBroadcastMessagesHaveBeenRemoved(int spinnerId, String broadcastMessage) { Spinner spinner = (Spinner) solo.getView(spinnerId); assertEquals("broadcastWaitSpinner has not the correct number of elements", 2, spinner.getCount()); assertEquals("First spinner element isn't " + solo.getString(R.string.new_broadcast_message), solo.getString(R.string.new_broadcast_message), spinner.getItemAtPosition(0)); assertEquals("First broadcast message isn't" + broadcastMessage, broadcastMessage, spinner.getItemAtPosition(1)); } private void checkCorrectSpinnerSelections() { assertEquals("Wrong broadcast message in broadcast receiver.", expectedSpinnerText.get(broadcastReceiverSpinnerId), ((Spinner) solo.getCurrentActivity().findViewById(broadcastReceiverSpinnerId)).getSelectedItem().toString()); assertEquals("Wrong broadcast message in broadcast.", expectedSpinnerText.get(broadcastSpinnerId), ((Spinner) solo.getCurrentActivity().findViewById(broadcastSpinnerId)).getSelectedItem().toString()); assertEquals("Wrong broadcast message in broadcastWait.", expectedSpinnerText.get(broadcastWaitSpinnerId), ((Spinner) solo.getCurrentActivity().findViewById(broadcastWaitSpinnerId)).getSelectedItem().toString()); } private void enterNewTextIntoSpinner(int spinnerId, String text) { solo.clickOnView(solo.getView(spinnerId)); solo.waitForText(solo.getString(R.string.new_broadcast_message)); solo.clickInList(0); solo.waitForView(EditText.class); solo.enterText(0, text); solo.clickOnText(solo.getString(R.string.ok)); solo.waitForView(solo.getView(spinnerId)); gainFocus(); expectedSpinnerText.put(spinnerId, text); checkCorrectSpinnerSelections(); } private void pressSpinnerItem(int spinnerId, String text) { solo.clickOnView(solo.getView(spinnerId)); solo.clickOnText(text); solo.waitForView(solo.getView(spinnerId)); gainFocus(); expectedSpinnerText.put(spinnerId, text); checkCorrectSpinnerSelections(); } private void dismissEnterNewTextIntoSpinner(int spinnerId) { solo.clickOnView(solo.getView(spinnerId)); solo.waitForText(solo.getString(R.string.new_broadcast_message)); solo.clickInList(0); solo.waitForView(EditText.class); solo.goBack(); solo.getCurrentActivity().findViewById(spinnerId); checkCorrectSpinnerSelections(); } private void checkSetupBricks() { ListView view = UiTestUtils.getScriptListView(solo); BrickAdapter adapter = (BrickAdapter) view.getAdapter(); assertEquals("String has changed", solo.getString(R.string.brick_broadcast_default_value), defaultBroadcastMessage); assertEquals("Wrong number of scripts.", 1, sprite.getNumberOfScripts()); assertTrue("Wrong script instance.", sprite.getScript(0) instanceof BroadcastScript); int childrenCount = sprite.getScript(adapter.getScriptCount() - 1).getBrickList().size(); assertEquals("Incorrect number of bricks in sprite.", 3, UiTestUtils.getScriptListView(solo).getChildCount()); assertEquals("Incorrect number of bricks in broadcast script.", 2, childrenCount); List<Brick> projectBrickList = project.getDefaultScene().getSpriteList().get(0).getScript(0).getBrickList(); assertEquals("Incorrect number of bricks.", 2, projectBrickList.size()); assertTrue("Wrong Brick instance.", projectBrickList.get(0) instanceof BroadcastBrick); assertTrue("Wrong Brick instance.", adapter.getItem(1) instanceof BroadcastBrick); } private void gainFocus() { solo.clickOnText(solo.getString(R.string.brick_broadcast_receive)); if (solo.searchText(solo.getString(R.string.brick_context_dialog_delete_script), true)) { solo.goBack(); } } private void createProject() { project = new Project(null, UiTestUtils.DEFAULT_TEST_PROJECT_NAME); sprite = new SingleSprite("cat"); Script script = new BroadcastScript(defaultBroadcastMessage); BroadcastBrick broadcastBrick = new BroadcastBrick(defaultBroadcastMessage); BroadcastWaitBrick broadcastWaitBrick = new BroadcastWaitBrick(defaultBroadcastMessage); script.addBrick(broadcastBrick); script.addBrick(broadcastWaitBrick); sprite.addScript(script); project.getDefaultScene().addSprite(sprite); ProjectManager.getInstance().setProject(project); ProjectManager.getInstance().setCurrentSprite(sprite); ProjectManager.getInstance().setCurrentScript(script); } }