/* * 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.ui.fragment; import android.content.res.Resources; import android.view.View; import android.widget.CheckBox; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.content.Project; import org.catrobat.catroid.content.Scene; import org.catrobat.catroid.content.SingleSprite; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.formulaeditor.UserVariable; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.ui.BackPackActivity; import org.catrobat.catroid.ui.MainMenuActivity; import org.catrobat.catroid.ui.ProjectActivity; import org.catrobat.catroid.ui.ScriptActivity; import org.catrobat.catroid.ui.adapter.SceneListAdapter; import org.catrobat.catroid.ui.controller.BackPackListManager; import org.catrobat.catroid.ui.fragment.BackPackSceneListFragment; import org.catrobat.catroid.ui.fragment.SceneListFragment; import org.catrobat.catroid.ui.fragment.SpritesListFragment; import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase; import org.catrobat.catroid.uitest.util.UiTestUtils; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import static org.catrobat.catroid.common.Constants.BACKPACK_DIRECTORY; import static org.catrobat.catroid.common.Constants.DEFAULT_ROOT; import static org.catrobat.catroid.utils.Utils.buildPath; public class SceneListFragmentTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { public SceneListFragmentTest() { super(MainMenuActivity.class); } private static final String LOCAL_VARIABLE_NAME = "test_local"; private static final double LOCAL_VARIABLE_VALUE = 0xDEADBEEF; private static final String GLOBAL_VARIABLE_NAME = "test_global"; private static final double GLOBAL_VARIABLE_VALUE = 0xC0FFEE; private static final String SCENE_NAME = "testScene1"; private static final String SCENE_NAME2 = "testScene2"; private static final String SCENE_NAME3 = "testScene3"; private static final String SPRITE_NAME = "testSprite1"; private static final String SPRITE_NAME2 = "testSprite2"; private static final String SCENE_NAME_UNPACKED = "testScene11"; private static final String SCENE_NAME2_UNPACKED = "testScene21"; private static final int TIME_TO_WAIT_BACKPACK = 1000; private static final int TIME_TO_WAIT = 400; private Sprite sprite; private Project project; private String delete; private String unpack; private String backpack; private String backpackTitle; private String backpackReplaceDialogSingle; private String backpackReplaceDialogMultiple; @Override protected void setUp() throws Exception { super.setUp(); UiTestUtils.createTestProject(UiTestUtils.PROJECTNAME1); UiTestUtils.createTestProject(); project = ProjectManager.getInstance().getCurrentProject(); sprite = new SingleSprite(SPRITE_NAME); Sprite sprite2 = new SingleSprite(SPRITE_NAME2); project.getDefaultScene().rename(SCENE_NAME, getActivity(), false); project.getDefaultScene().addSprite(sprite); project.getDefaultScene().addSprite(sprite2); project.getDefaultScene().getDataContainer().addSpriteUserVariableToSprite(sprite, LOCAL_VARIABLE_NAME); project.getDefaultScene().getDataContainer().getUserVariable(LOCAL_VARIABLE_NAME, sprite).setValue(LOCAL_VARIABLE_VALUE); project.getDefaultScene().getDataContainer().addProjectUserVariable(GLOBAL_VARIABLE_NAME); project.getDefaultScene().getDataContainer().getUserVariable(GLOBAL_VARIABLE_NAME, null).setValue(GLOBAL_VARIABLE_VALUE); Scene scene2 = new Scene(getActivity(), SCENE_NAME2, project); Scene scene3 = new Scene(getActivity(), SCENE_NAME3, project); project.addScene(scene2); project.addScene(scene3); ProjectManager.getInstance().setProject(project); Resources resources = getActivity().getBaseContext().getResources(); backpackTitle = solo.getString(R.string.backpack_title); delete = solo.getString(R.string.delete); unpack = solo.getString(R.string.unpack); backpack = solo.getString(R.string.backpack); backpackReplaceDialogSingle = resources.getString(R.string.backpack_replace_scene, SCENE_NAME); backpackReplaceDialogMultiple = solo.getString(R.string.backpack_replace_scene_multiple); UiTestUtils.clearBackPack(true); solo.clickOnText(solo.getString(R.string.main_menu_continue)); } @Override protected void tearDown() throws Exception { UiTestUtils.clearBackPack(true); UiTestUtils.clearAllUtilTestProjects(); super.tearDown(); } public void testDragAndDropDown() { List<Scene> sceneList = ProjectManager.getInstance().getCurrentProject().getSceneList(); int offset = sceneList.size(); for (int i = 1; i < 3; i++) { addSceneWithName("TestScene" + (i + offset)); } solo.goBack(); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.clickOnText(ProjectManager.getInstance().getCurrentProject().getName()); assertEquals("Wrong List before DragAndDropTest", sceneList.get(0).getName(), SCENE_NAME); assertEquals("Wrong List before DragAndDropTest", sceneList.get(1).getName(), SCENE_NAME2); assertEquals("Wrong List before DragAndDropTest", sceneList.get(2).getName(), SCENE_NAME3); assertEquals("Wrong List before DragAndDropTest", sceneList.get(3).getName(), "TestScene4"); assertEquals("Wrong List before DragAndDropTest", sceneList.get(4).getName(), "TestScene5"); ArrayList<Integer> yPositionList = UiTestUtils.getListItemYPositions(solo, 1); UiTestUtils.longClickAndDrag(solo, 10, yPositionList.get(1), 10, yPositionList.get(4) + 100, 20); assertEquals("Wrong List after DragAndDropTest", sceneList.get(0).getName(), SCENE_NAME); assertEquals("Wrong List after DragAndDropTest", sceneList.get(1).getName(), SCENE_NAME3); assertEquals("Wrong List after DragAndDropTest", sceneList.get(2).getName(), "TestScene4"); assertEquals("Wrong List after DragAndDropTest", sceneList.get(3).getName(), SCENE_NAME2); assertEquals("Wrong List after DragAndDropTest", sceneList.get(4).getName(), "TestScene5"); } public void testDragAndDropUp() { List<Scene> sceneList = ProjectManager.getInstance().getCurrentProject().getSceneList(); int offset = sceneList.size(); for (int i = 1; i < 3; i++) { addSceneWithName("TestScene" + (i + offset)); } solo.goBack(); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.clickOnText(ProjectManager.getInstance().getCurrentProject().getName()); assertEquals("Wrong List before DragAndDropTest", sceneList.get(0).getName(), SCENE_NAME); assertEquals("Wrong List before DragAndDropTest", sceneList.get(1).getName(), SCENE_NAME2); assertEquals("Wrong List before DragAndDropTest", sceneList.get(2).getName(), SCENE_NAME3); assertEquals("Wrong List before DragAndDropTest", sceneList.get(3).getName(), "TestScene4"); assertEquals("Wrong List before DragAndDropTest", sceneList.get(4).getName(), "TestScene5"); ArrayList<Integer> yPositionList = UiTestUtils.getListItemYPositions(solo, 1); UiTestUtils.longClickAndDrag(solo, 10, yPositionList.get(4), 10, yPositionList.get(1) - 100, 20); assertEquals("Wrong List after DragAndDropTest", sceneList.get(0).getName(), SCENE_NAME); assertEquals("Wrong List after DragAndDropTest", sceneList.get(1).getName(), SCENE_NAME2); assertEquals("Wrong List after DragAndDropTest", sceneList.get(2).getName(), SCENE_NAME3); assertEquals("Wrong List after DragAndDropTest", sceneList.get(3).getName(), "TestScene5"); assertEquals("Wrong List after DragAndDropTest", sceneList.get(4).getName(), "TestScene4"); } public void testLocalVariablesWhenSceneCopiedFromScenesListFragment() { clickOnSingleActionModeItem(SCENE_NAME, solo.getString(R.string.copy), R.id.copy); solo.sleep(1000); String copiedSceneName = SCENE_NAME + solo.getString(R.string.copy_sprite_name_suffix); solo.waitForText(copiedSceneName); assertTrue(copiedSceneName + " not found!", solo.searchText(copiedSceneName)); Scene clonedScene = null; for (Scene tempScene : project.getSceneList()) { if (tempScene.getName().equals(copiedSceneName)) { clonedScene = tempScene; } } if (clonedScene == null) { fail("no cloned scene in project"); } List<UserVariable> userVariableList = project.getDefaultScene().getDataContainer() .getOrCreateVariableListForSprite(clonedScene.getSpriteBySpriteName(sprite.getName())); Set<String> hashSet = new HashSet<String>(); for (UserVariable userVariable : userVariableList) { assertTrue("Variable already exists", hashSet.add(userVariable.getName())); } } public void testDeleteAllButOneScenesActionMode() { UiTestUtils.openActionMode(solo, delete, R.id.delete); solo.clickOnText(SCENE_NAME); solo.clickOnText(SCENE_NAME2); UiTestUtils.acceptAndCloseActionMode(solo); solo.clickOnText(solo.getString(R.string.yes)); solo.sleep(TIME_TO_WAIT); assertFalse("Scene " + SCENE_NAME + " was not deleted", ProjectManager.getInstance().getCurrentProject() .getSceneByName(SCENE_NAME) != null); assertFalse("Scene " + SCENE_NAME2 + " was not deleted", ProjectManager.getInstance().getCurrentProject() .getSceneByName(SCENE_NAME2) != null); assertTrue("Sprite List Fragment did not show up", solo.waitForFragmentByTag(SpritesListFragment.TAG)); } public void testDeleteAllScenesActionMode() { UiTestUtils.openActionMode(solo, delete, R.id.delete); solo.clickOnText(SCENE_NAME); solo.clickOnText(SCENE_NAME2); solo.clickOnText(SCENE_NAME3); UiTestUtils.acceptAndCloseActionMode(solo); solo.clickOnText(solo.getString(R.string.yes)); solo.sleep(TIME_TO_WAIT); assertFalse("Scene " + SCENE_NAME + " was not deleted", ProjectManager.getInstance().getCurrentProject() .getSceneByName(SCENE_NAME) != null); assertFalse("Scene " + SCENE_NAME2 + " was not deleted", ProjectManager.getInstance().getCurrentProject() .getSceneByName(SCENE_NAME2) != null); assertFalse("Scene " + SCENE_NAME3 + " was not deleted", ProjectManager.getInstance().getCurrentProject() .getSceneByName(SCENE_NAME2) != null); assertTrue("Sprite List Fragment did not show up", solo.waitForFragmentByTag(SpritesListFragment.TAG)); Scene scene = ProjectManager.getInstance().getCurrentScene(); assertTrue("Scene is not empty", scene.getSpriteList().size() == 1 && scene.getSpriteList().get(0) .getListWithAllBricks().size() == 0 && scene.getSpriteList().get(0).getSoundList().size() == 0 && scene.getSpriteList().get(0).getLookDataList().size() == 0); } public void testSelectAllActionModeButton() { String selectAll = solo.getString(R.string.select_all).toUpperCase(Locale.getDefault()); String deselectAll = solo.getString(R.string.deselect_all).toUpperCase(Locale.getDefault()); solo.sleep(TIME_TO_WAIT); UiTestUtils.openActionMode(solo, solo.getString(R.string.copy), R.id.copy); assertTrue("Select All is not shown", UiTestUtils.waitForShownState(solo, solo.getView(R.id.select_all), true)); UiTestUtils.clickOnText(solo, selectAll); for (CheckBox checkBox : solo.getCurrentViews(CheckBox.class)) { if (checkBox.isShown()) { assertTrue("CheckBox is not checked!", checkBox.isChecked()); } } assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); UiTestUtils.clickOnText(solo, deselectAll); for (CheckBox checkBox : solo.getCurrentViews(CheckBox.class)) { if (checkBox.isShown()) { assertFalse("CheckBox is checked!", checkBox.isChecked()); } } assertFalse("Deselect All is still shown", solo.searchText(deselectAll, 1, false, true)); solo.clickOnCheckBox(0); assertTrue("Select All is not shown", UiTestUtils.waitForShownState(solo, solo.getView(R.id.select_all), true)); solo.clickOnCheckBox(0); assertTrue("Select All is not shown", UiTestUtils.waitForShownState(solo, solo.getView(R.id.select_all), true)); solo.goBack(); UiTestUtils.openActionMode(solo, solo.getString(R.string.delete), R.id.delete); assertTrue("Select All is not shown", UiTestUtils.waitForShownState(solo, solo.getView(R.id.select_all), true)); UiTestUtils.clickOnText(solo, selectAll); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.clickOnCheckBox(0); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.clickOnCheckBox(0); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.goBack(); UiTestUtils.openActionMode(solo, solo.getString(R.string.backpack), R.id.backpack); assertTrue("Select All is not shown", UiTestUtils.waitForShownState(solo, solo.getView(R.id.select_all), true)); UiTestUtils.clickOnText(solo, selectAll); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.clickOnCheckBox(0); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.clickOnCheckBox(0); assertTrue("Deselect All is not shown", solo.searchText(deselectAll, 1, false, true)); solo.goBack(); UiTestUtils.openActionMode(solo, solo.getString(R.string.rename), R.id.rename); assertFalse("Select All is shown", solo.searchText(selectAll, 1, false, true)); solo.clickOnCheckBox(0); assertFalse("Deselect All is shown", solo.searchText(deselectAll, 1, false, true)); } public void testEmptyActionModeDialogsInBackPack() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); UiTestUtils.deleteAllItems(solo); UiTestUtils.openActionMode(solo, solo.getString(R.string.delete), R.id.delete); solo.waitForDialogToOpen(); assertTrue("Nothing to delete dialog not shown", solo.waitForText(solo.getString(R.string .nothing_to_delete))); solo.clickOnButton(0); solo.waitForDialogToClose(); UiTestUtils.openActionMode(solo, unpack, R.id.unpacking); solo.waitForDialogToOpen(); assertTrue("Nothing to unpack dialog not shown", solo.waitForText(solo.getString(R.string .nothing_to_unpack))); } public void testBackpackSceneSingle() { backPackItem(SCENE_NAME); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); assertTrue("BackPack title didn't show up", solo.waitForText(backpackTitle, 0, TIME_TO_WAIT_BACKPACK)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); } public void testBackpackSceneDouble() { backPackItem(SCENE_NAME); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); solo.goBack(); backPackItem(SCENE_NAME2); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); assertTrue("BackPack title didn't show up", solo.waitForText(backpackTitle, 0, TIME_TO_WAIT_BACKPACK)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT)); } public void testBackPackSceneSimpleUnpacking() { backPackItem(SCENE_NAME); solo.sleep(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); clickOnSingleActionModeItem(SCENE_NAME, unpack, R.id.unpacking); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME_UNPACKED, 0, TIME_TO_WAIT)); deleteSprite(SCENE_NAME2); solo.sleep(TIME_TO_WAIT); UiTestUtils.openBackPack(solo); assertTrue("Backpack is empty!", solo.searchText(backpackTitle)); assertTrue("Scene wasn't kept in backpack!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); } public void testBackPackSceneSimpleUnpackingAndDelete() { solo.sleep(TIME_TO_WAIT_BACKPACK); SceneListAdapter adapter = getSceneListAdapter(false); assertNotNull("Could not get Adapter", adapter); int oldCount = adapter.getCount(); backPackItem(SCENE_NAME2); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.goBack(); deleteSprite(SCENE_NAME2); solo.sleep(TIME_TO_WAIT); UiTestUtils.openBackPack(solo); clickOnSingleActionModeItem(SCENE_NAME2, unpack, R.id.unpacking); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT)); int newCount = adapter.getCount(); assertEquals("Counts have to be equal", oldCount, newCount); } public void testBackPackSceneMultipleUnpacking() { solo.sleep(TIME_TO_WAIT_BACKPACK); SceneListAdapter adapter = getSceneListAdapter(false); int oldCount = adapter.getCount(); assertNotNull("Could not get Adapter", adapter); backPackItem(SCENE_NAME); solo.sleep(TIME_TO_WAIT_BACKPACK); clickOnSingleActionModeItem(SCENE_NAME, unpack, R.id.unpacking); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); solo.sleep(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME_UNPACKED, 0, TIME_TO_WAIT)); backPackItem(SCENE_NAME2); solo.sleep(TIME_TO_WAIT_BACKPACK); clickOnSingleActionModeItem(SCENE_NAME2, unpack, R.id.unpacking); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); solo.sleep(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME2_UNPACKED, 0, TIME_TO_WAIT)); int newCount = adapter.getCount(); assertEquals("There are scenes missing", oldCount + 2, newCount); } public void testBackPackAndUnPackFromDifferentProgrammes() { solo.sleep(TIME_TO_WAIT_BACKPACK); SceneListAdapter adapter = getSceneListAdapter(false); assertNotNull("Could not get Adapter", adapter); backPackItem(SCENE_NAME); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.goBack(); solo.goBack(); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.clickOnText(UiTestUtils.PROJECTNAME1); solo.sleep(TIME_TO_WAIT_BACKPACK); ProjectManager.getInstance().getCurrentProject().addScene(new Scene(getActivity(), "testSceneOther", ProjectManager.getInstance().getCurrentProject())); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.goBack(); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.clickOnText(UiTestUtils.PROJECTNAME1); UiTestUtils.openBackPack(solo); solo.sleep(TIME_TO_WAIT_BACKPACK); clickOnSingleActionModeItem(SCENE_NAME, unpack, R.id.unpacking); solo.waitForDialogToClose(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME, 1, 3000)); } public void testBackPackActionModeCheckingAndTitle() { UiTestUtils.openBackPackActionModeWhenEmpty(solo); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); int timeToWaitForTitle = 300; String scene = solo.getString(R.string.scene); String scenes = solo.getString(R.string.scenes); assertFalse("Scene should not be displayed in title", solo.waitForText(scene, 4, 300, false, true)); checkIfCheckboxesAreCorrectlyChecked(false, false, false); int expectedNumberOfSelectedScenes = 1; String expectedTitle = backpack + " " + expectedNumberOfSelectedScenes + " " + scene; solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(false, true, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedNumberOfSelectedScenes = 2; expectedTitle = backpack + " " + expectedNumberOfSelectedScenes + " " + scenes; // Check if multiple-selection is possible solo.clickOnCheckBox(0); checkIfCheckboxesAreCorrectlyChecked(true, true, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedNumberOfSelectedScenes = 1; expectedTitle = backpack + " " + expectedNumberOfSelectedScenes + " " + scene; solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(true, false, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedTitle = backpack; solo.clickOnCheckBox(0); checkIfCheckboxesAreCorrectlyChecked(false, false, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); } public void testBackPackActionModeIfNothingSelected() { UiTestUtils.openBackPackActionModeWhenEmpty(solo); int expectedNumberOfScenes = ProjectManager.getInstance().getCurrentProject().getSceneList().size(); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); checkIfCheckboxesAreCorrectlyChecked(false, false, false); UiTestUtils.acceptAndCloseActionMode(solo); assertFalse("ActionMode didn't disappear", solo.waitForText(backpack, 1, TIME_TO_WAIT, false, true)); checkIfNumberOfScenesIsEqual(expectedNumberOfScenes); UiTestUtils.openBackPackActionModeWhenEmpty(solo); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); checkIfCheckboxesAreCorrectlyChecked(false, false, false); solo.goBack(); assertFalse("ActionMode didn't disappear", solo.waitForText(backpack, 1, TIME_TO_WAIT, false, true)); checkIfNumberOfScenesIsEqual(expectedNumberOfScenes); } public void testBackPackActionModeIfSomethingSelectedAndPressingBack() { UiTestUtils.openBackPackActionModeWhenEmpty(solo); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); solo.clickOnCheckBox(0); solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(true, true, false); solo.goBack(); solo.sleep(TIME_TO_WAIT_BACKPACK); assertFalse("ActionMode didn't disappear", solo.waitForText(backpack, 1, TIME_TO_WAIT, false, true)); assertFalse("Backpack was opened, but shouldn't be!", solo.waitForText(backpackTitle, 1, TIME_TO_WAIT, false, true)); } public void testBackPackSelectAll() { UiTestUtils.openBackPackActionModeWhenEmpty(solo); solo.waitForActivity("ProjectActivity"); String selectAll = solo.getString(R.string.select_all).toUpperCase(Locale.getDefault()); String deselectAll = solo.getString(R.string.deselect_all).toUpperCase(Locale.getDefault()); UiTestUtils.clickOnText(solo, selectAll); for (CheckBox checkBox : solo.getCurrentViews(CheckBox.class)) { assertTrue("CheckBox is not Checked!", checkBox.isChecked()); } assertTrue("Deselect All is not shown", solo.waitForText(deselectAll, 1, 200, false, true)); UiTestUtils.acceptAndCloseActionMode(solo); assertTrue("Backpack didn't appear", solo.waitForText(backpackTitle)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME3, 0, TIME_TO_WAIT)); } public void testBackPackSceneDeleteContextMenu() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); SceneListAdapter adapter = getSceneListAdapter(true); int oldCount = adapter.getCount(); List<Scene> backPackSceneList = BackPackListManager.getInstance().getBackPackedScenes(); clickOnContextMenuItem(SCENE_NAME, delete); solo.sleep(TIME_TO_WAIT_BACKPACK); int newCount = adapter.getCount(); solo.sleep(500); assertEquals("Not all scenes were backpacked", 3, oldCount); assertEquals("Scene wasn't deleted in backpack", 2, newCount); assertEquals("Count of the backpack sceneList is not correct", newCount, backPackSceneList.size()); } public void testBackPackSceneDeleteActionMode() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); SceneListAdapter adapter = getSceneListAdapter(true); int oldCount = adapter.getCount(); List<Scene> backPackSceneList = BackPackListManager.getInstance().getBackPackedScenes(); UiTestUtils.deleteAllItems(solo); int newCount = adapter.getCount(); solo.sleep(500); assertTrue("No backpack is emtpy text appeared", solo.searchText(backpack)); assertTrue("No backpack is emtpy text appeared", solo.searchText(solo.getString(R.string.is_empty))); assertEquals("Not all scenes were backpacked", 3, oldCount); assertEquals("Scene wasn't deleted in backpack", 0, newCount); assertEquals("Count of the backpack sceneList is not correct", newCount, backPackSceneList.size()); } public void testBackPackSceneActionModeDifferentProgrammes() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); solo.goBack(); solo.goBack(); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.clickOnText(UiTestUtils.PROJECTNAME1); solo.sleep(TIME_TO_WAIT_BACKPACK); ProjectManager.getInstance().getCurrentProject().addScene(new Scene(getActivity(), "testSceneOther", ProjectManager.getInstance().getCurrentProject())); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.goBack(); solo.sleep(TIME_TO_WAIT_BACKPACK); solo.clickOnText(UiTestUtils.PROJECTNAME1); UiTestUtils.openBackPack(solo); UiTestUtils.openActionMode(solo, unpack, R.id.unpacking); String selectAll = solo.getString(R.string.select_all).toUpperCase(Locale.getDefault()); UiTestUtils.clickOnText(solo, selectAll); UiTestUtils.acceptAndCloseActionMode(solo); solo.waitForActivity(ProjectActivity.class); assertTrue("scene wasn't unpacked, but should be!", solo.waitForText(SCENE_NAME, 1, 1000)); assertTrue("Scene wasn't unpacked!", solo.waitForText(SCENE_NAME2, 1, 1000)); UiTestUtils.deleteAllItems(solo); assertFalse("Scene wasn't deleted!", solo.waitForText(SCENE_NAME, 1, 1000)); assertFalse("Scene wasn't deleted!", solo.waitForText(SCENE_NAME2, 1, 1000)); } public void testBackPackDeleteActionModeCheckingAndTitle() { solo.sleep(TIME_TO_WAIT_BACKPACK); UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); UiTestUtils.openActionMode(solo, delete, R.id.delete); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); int timeToWaitForTitle = 300; String scene = solo.getString(R.string.scene); String scenes = solo.getString(R.string.scenes); assertFalse("Scene should not be displayed in title", solo.waitForText(scene, 4, 300, false, true)); checkIfCheckboxesAreCorrectlyChecked(false, false, false); int expectedNumberOfSelectedScenes = 1; String expectedTitle = delete + " " + expectedNumberOfSelectedScenes + " " + scene; solo.sleep(TIME_TO_WAIT_BACKPACK); solo.clickOnCheckBox(0); solo.sleep(TIME_TO_WAIT_BACKPACK); checkIfCheckboxesAreCorrectlyChecked(true, false, false); assertTrue("Title not as expected" + expectedTitle, solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedNumberOfSelectedScenes = 2; expectedTitle = delete + " " + expectedNumberOfSelectedScenes + " " + scenes; // Check if multiple-selection is possible solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(true, true, false); assertTrue("Title not as aspected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedNumberOfSelectedScenes = 1; expectedTitle = delete + " " + expectedNumberOfSelectedScenes + " " + scene; solo.clickOnCheckBox(0); checkIfCheckboxesAreCorrectlyChecked(false, true, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); expectedTitle = delete; solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(false, false, false); assertTrue("Title not as expected", solo.waitForText(expectedTitle, 0, timeToWaitForTitle, false, true)); } public void testBackPackDeleteActionModeIfNothingSelected() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); UiTestUtils.openActionMode(solo, delete, R.id.delete); int expectedNumberOfScenes = BackPackListManager.getInstance().getBackPackedScenes().size(); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); checkIfCheckboxesAreCorrectlyChecked(false, false, false); UiTestUtils.acceptAndCloseActionMode(solo); assertFalse("ActionMode didn't disappear", solo.waitForText(delete, 1, TIME_TO_WAIT, false, true)); checkIfNumberOfScenesIsEqual(expectedNumberOfScenes); UiTestUtils.openActionMode(solo, delete, R.id.delete); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); checkIfCheckboxesAreCorrectlyChecked(false, false, false); solo.goBack(); assertFalse("ActionMode didn't disappear", solo.waitForText(delete, 1, TIME_TO_WAIT, false, true)); checkIfNumberOfScenesIsEqual(expectedNumberOfScenes); } public void testBackPackDeleteActionModeIfSomethingSelectedAndPressingBack() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); UiTestUtils.openActionMode(solo, delete, R.id.delete); assertTrue("Bottom bar is visible", solo.getView(R.id.bottom_bar).getVisibility() == View.GONE); solo.clickOnCheckBox(0); solo.clickOnCheckBox(1); checkIfCheckboxesAreCorrectlyChecked(true, true, false); solo.goBack(); assertFalse("ActionMode didn't disappear", solo.waitForText(delete, 1, TIME_TO_WAIT, false, true)); } public void testBackPackDeleteSelectAll() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); UiTestUtils.openActionMode(solo, delete, R.id.delete); solo.waitForActivity("BackPackActivity"); String selectAll = solo.getString(R.string.select_all).toUpperCase(Locale.getDefault()); UiTestUtils.clickOnText(solo, selectAll); checkIfCheckboxesAreCorrectlyChecked(true, true, true); assertFalse("Select All is still shown", solo.waitForText(selectAll, 1, 200, false, true)); UiTestUtils.acceptAndCloseActionMode(solo); solo.sleep(TIME_TO_WAIT_BACKPACK); assertFalse("Scene wasn't deleted!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT, false, true)); assertFalse("Scene wasn't deleted!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT, false, true)); assertTrue("No empty bg found!", solo.waitForText(solo.getString(R.string.is_empty), 0, TIME_TO_WAIT)); } public void testBackPackAlreadyPackedDialogSingleItem() { backPackItem(SCENE_NAME); solo.sleep(TIME_TO_WAIT_BACKPACK); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); solo.goBack(); solo.waitForActivity(ScriptActivity.class.getSimpleName()); backPackItem(SCENE_NAME); solo.waitForDialogToOpen(); assertTrue("Scene already exists backpack dialog not shown!", solo.waitForText(backpackReplaceDialogSingle, 0, TIME_TO_WAIT)); solo.clickOnButton(solo.getString(R.string.yes)); solo.waitForDialogToClose(); solo.waitForActivity(BackPackActivity.class); solo.waitForFragmentByTag(SceneListFragment.TAG); solo.sleep(200); assertTrue("Should be in backpack!", solo.waitForText(backpackTitle, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); assertTrue("Scene was not replaced!", BackPackListManager.getInstance().getBackPackedScenes().size() == 1); } public void testBackPackAlreadyPackedDialogMultipleItems() { UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT)); solo.goBack(); solo.waitForActivity(ScriptActivity.class.getSimpleName()); UiTestUtils.openBackPackActionMode(solo); String selectAll = solo.getString(R.string.select_all).toUpperCase(Locale.getDefault()); UiTestUtils.clickOnText(solo, selectAll); UiTestUtils.acceptAndCloseActionMode(solo); solo.waitForDialogToOpen(); assertTrue("Scene already exists backpack dialog not shown!", solo.waitForText(backpackReplaceDialogMultiple, 0, TIME_TO_WAIT)); solo.clickOnButton(solo.getString(R.string.yes)); solo.waitForDialogToClose(); solo.waitForActivity(BackPackActivity.class); solo.waitForFragmentByTag(SceneListFragment.TAG); solo.sleep(200); assertTrue("Should be in backpack!", solo.waitForText(backpackTitle, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME, 0, TIME_TO_WAIT)); assertTrue("Scene wasn't backpacked!", solo.waitForText(SCENE_NAME2, 0, TIME_TO_WAIT)); assertTrue("Scene was not replaced!", BackPackListManager.getInstance().getAllBackpackedScenes().size() == 3); } public void testBackPackSerializationAndDeserialization() { File backPackFile = new File(buildPath(DEFAULT_ROOT, BACKPACK_DIRECTORY, StorageHandler.BACKPACK_FILENAME)); assertFalse("Backpack.json should not exist!", backPackFile.exists()); UiTestUtils.backPackAllItems(solo, getActivity(), SCENE_NAME, SCENE_NAME2); solo.goBack(); solo.sleep(TIME_TO_WAIT_BACKPACK); assertFalse("No items have been backpacked!", BackPackListManager.getInstance().getBackpack() .backpackedScenes.isEmpty()); assertTrue("Backpack.json has not been saved!", backPackFile.exists()); UiTestUtils.clearBackPack(false); solo.sleep(TIME_TO_WAIT); assertTrue("Backpacked items not deleted!", BackPackListManager.getInstance().getBackpack() .backpackedScenes.isEmpty()); BackPackListManager.getInstance().loadBackpack(); solo.sleep(TIME_TO_WAIT_BACKPACK); assertFalse("Backpacked items haven't been restored from backpack.json!", BackPackListManager.getInstance() .getBackpack().backpackedScenes.isEmpty()); } private void clickOnSingleActionModeItem(String spriteName, String menuItemName, int menuId) { UiTestUtils.openActionMode(solo, menuItemName, menuId); solo.clickOnText(spriteName); UiTestUtils.acceptAndCloseActionMode(solo); } private void backPackItem(String sceneName) { if (BackPackListManager.getInstance().getBackPackedScenes().size() == 0) { UiTestUtils.openBackPackActionModeWhenEmpty(solo); } else { UiTestUtils.openBackPackActionMode(solo); } solo.clickOnText(sceneName); UiTestUtils.acceptAndCloseActionMode(solo); } private void clickOnContextMenuItem(String spriteName, String menuItemName) { solo.clickLongOnText(spriteName); solo.waitForText(menuItemName); solo.clickOnText(menuItemName); } private BackPackSceneListFragment getBackPackSceneFragment() { BackPackActivity activity = (BackPackActivity) solo.getCurrentActivity(); return (BackPackSceneListFragment) activity.getFragment(BackPackActivity.FRAGMENT_BACKPACK_SCENES); } private SceneListFragment getScenesListFragment() { ProjectActivity activity = (ProjectActivity) solo.getCurrentActivity(); return activity.getSceneListFragment(); } private SceneListAdapter getSceneListAdapter(boolean forBackpack) { solo.waitForActivity(ProjectActivity.class); solo.waitForFragmentByTag(SceneListFragment.TAG); SceneListAdapter adapter = (SceneListAdapter) (forBackpack ? getBackPackSceneFragment().getListAdapter() : getScenesListFragment().getListAdapter()); return adapter; } private void checkIfCheckboxesAreCorrectlyChecked(boolean firstCheckboxExpectedChecked, boolean secondCheckboxExpectedChecked, boolean thirdCheckboxExpectedChecked) { solo.sleep(300); CheckBox firstCheckBox = solo.getCurrentViews(CheckBox.class).get(0); CheckBox secondCheckBox = solo.getCurrentViews(CheckBox.class).get(1); CheckBox thirdCheckBox = solo.getCurrentViews(CheckBox.class).get(2); if (solo.getCurrentViews(CheckBox.class).size() > 3) { firstCheckBox = solo.getCurrentViews(CheckBox.class).get(3); secondCheckBox = solo.getCurrentViews(CheckBox.class).get(4); thirdCheckBox = solo.getCurrentViews(CheckBox.class).get(5); } assertEquals("First checkbox not correctly checked", firstCheckboxExpectedChecked, firstCheckBox.isChecked()); assertEquals("Second checkbox not correctly checked", secondCheckboxExpectedChecked, secondCheckBox.isChecked()); assertEquals("Third checkbox not correctly checked", thirdCheckboxExpectedChecked, thirdCheckBox.isChecked()); } private void deleteSprite(String spriteName) { clickOnSingleActionModeItem(spriteName, delete, R.id.delete); solo.waitForDialogToOpen(); solo.waitForText(solo.getString(R.string.yes)); solo.clickOnText(solo.getString(R.string.yes)); } private void checkIfNumberOfScenesIsEqual(int expectedNumber) { List<Scene> sceneList = ProjectManager.getInstance().getCurrentProject().getSceneList(); assertEquals("Number of scenes is not as expected", expectedNumber, sceneList.size()); } private void addSceneWithName(String sceneName) { Scene sceneToAdd = new Scene(getActivity(), sceneName, ProjectManager.getInstance().getCurrentProject()); ProjectManager.getInstance().addScene(sceneToAdd); } }