/* * 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.test.content; import android.test.AndroidTestCase; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.content.Project; import org.catrobat.catroid.content.Scene; import org.catrobat.catroid.content.StartScript; import org.catrobat.catroid.content.bricks.AddItemToUserListBrick; import org.catrobat.catroid.content.bricks.MoveNStepsBrick; import org.catrobat.catroid.content.bricks.SceneStartBrick; import org.catrobat.catroid.content.bricks.SceneTransitionBrick; import org.catrobat.catroid.content.bricks.SetSizeToBrick; import org.catrobat.catroid.content.bricks.SetVariableBrick; import org.catrobat.catroid.formulaeditor.Formula; import org.catrobat.catroid.formulaeditor.FormulaElement; import org.catrobat.catroid.formulaeditor.UserList; import org.catrobat.catroid.formulaeditor.UserVariable; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.ui.controller.BackPackListManager; import org.catrobat.catroid.ui.controller.BackPackSceneController; import org.catrobat.catroid.uitest.util.UiTestUtils; import org.catrobat.catroid.utils.UtilFile; import org.catrobat.catroid.utils.Utils; import java.io.File; import java.util.List; public class SceneTest extends AndroidTestCase { private static final String SCENE_NAME = "testScene"; @Override protected void setUp() throws Exception { super.setUp(); Project project = new Project(getContext(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME, false); ProjectManager.getInstance().setProject(project); ProjectManager.getInstance().saveProject(getContext()); Scene scene = StorageHandler.getInstance().createDefaultScene(SCENE_NAME, false, false, getContext()); UtilFile.deleteDirectory(new File(Utils.buildScenePath(project.getName(), project.getDefaultScene().getName()))); project.removeScene(project.getDefaultScene()); project.addScene(scene); ProjectManager.getInstance().setCurrentScene(scene); ProjectManager.getInstance().setProject(project); StorageHandler.getInstance().saveProject(project); } @Override protected void tearDown() throws Exception { ProjectManager.getInstance().deleteCurrentProject(getContext()); super.tearDown(); } public void testCloneScene() { ProjectManager projectManager = ProjectManager.getInstance(); Scene cloneScene = projectManager.getCurrentScene().clone(); assertNotNull("cloned scene was null", cloneScene); assertTrue("Scene was not cloned correctly", Utils.isStandardScene(projectManager.getCurrentProject(), cloneScene .getName(), getContext())); assertFalse("Scene was the same instance", cloneScene.equals(projectManager.getCurrentScene())); } public void testRename() { Scene scene = ProjectManager.getInstance().getCurrentScene(); File originalSceneDir = new File(Utils.buildScenePath(scene.getProject().getName(), scene.getName())); assertTrue("Original dir does not exist " + originalSceneDir.getAbsolutePath(), originalSceneDir.exists()); long originalSize = folderSize(originalSceneDir); assertTrue("rename did not work", scene.rename("newName", getContext(), false)); File renamedSceneDir = new File(Utils.buildScenePath(scene.getProject().getName(), scene.getName())); assertTrue("Renamed dir does not exist " + renamedSceneDir.getAbsolutePath(), renamedSceneDir.exists()); assertFalse("Original dir still exists " + originalSceneDir.getAbsolutePath(), originalSceneDir.exists()); assertEquals("Directories are not same size", originalSize, folderSize(renamedSceneDir)); } public void testBackpackScene() throws InterruptedException { Scene scene = ProjectManager.getInstance().getCurrentScene(); boolean success = BackPackSceneController.getInstance().backpackScene(scene); assertTrue("Scene was not backpacked correctly", success && BackPackListManager.getInstance() .backPackedScenesContains(scene, true)); long original = folderSize(new File(Utils.buildScenePath(scene.getProject().getName(), scene.getName()))); long backpackSize = folderSize(new File(Utils.buildBackpackScenePath(scene.getName()))); assertEquals("Scene Folder was not copied to Backpack correctly", original, backpackSize); Scene backPackedScene = BackPackListManager.getInstance().getBackPackedScenes().get(0); assertTrue("Backpacked scene not cloned correctly", Utils.isStandardScene(ProjectManager.getInstance() .getCurrentProject(), backPackedScene.getName(), getContext())); BackPackListManager.getInstance().saveBackpack(); Thread.sleep(2000); BackPackListManager.getInstance().loadBackpack(); Thread.sleep(2000); assertTrue("Scene was not serialized and deserialized correctly", BackPackListManager.getInstance() .backPackedScenesContains(scene, true)); Scene unpackedScene = BackPackSceneController.getInstance().unpackScene(backPackedScene); assertTrue("Scene was not unpacked correctly", unpackedScene != null && Utils.isStandardScene(unpackedScene .getProject(), unpackedScene.getName(), getContext())); long unpackedSize = folderSize(new File(Utils.buildScenePath(unpackedScene.getProject().getName(), unpackedScene.getName()))); assertEquals("Unpacked Folder has not correct size", original, unpackedSize); } public void testBackPackScenesWithHiddenScene() throws InterruptedException { Project currentProject = ProjectManager.getInstance().getCurrentProject(); String hiddenSceneName1 = "hiddenScene1"; String hiddenSceneName2 = "hiddenScene2"; Scene hiddenScene1 = StorageHandler.getInstance().createDefaultScene(hiddenSceneName1, false, false, getContext()); currentProject.addScene(hiddenScene1); Scene hiddenScene2 = StorageHandler.getInstance().createDefaultScene(hiddenSceneName2, false, false, getContext()); currentProject.addScene(hiddenScene2); SceneTransitionBrick transitionBrick = new SceneTransitionBrick(hiddenSceneName1); SceneStartBrick startBrick = new SceneStartBrick(hiddenSceneName2); StartScript script = new StartScript(); script.addBrick(transitionBrick); script.addBrick(startBrick); currentProject.getDefaultScene().getSpriteList().get(0).addScript(script); StorageHandler.getInstance().saveProject(currentProject); Scene scene = ProjectManager.getInstance().getCurrentProject().getDefaultScene(); boolean success = BackPackSceneController.getInstance().backpackScene(scene); assertTrue("Scene was not backpacked correctly", success && BackPackListManager.getInstance() .backPackedScenesContains(scene, true) && BackPackListManager.getInstance() .backPackedScenesContains(hiddenScene1, false) && BackPackListManager.getInstance() .backPackedScenesContains(hiddenScene2, false)); long original = folderSize(new File(Utils.buildScenePath(scene.getProject().getName(), scene.getName()))); long backpackSize = folderSize(new File(Utils.buildBackpackScenePath(scene.getName()))); assertEquals("Scene Folder was not copied to Backpack correctly", original, backpackSize); original = folderSize(new File(Utils.buildScenePath(hiddenScene1.getProject().getName(), hiddenSceneName1))); backpackSize = folderSize(new File(Utils.buildBackpackScenePath(hiddenSceneName1))); assertEquals(hiddenScene1 + " Folder was not copied to Backpack correctly", original, backpackSize); original = folderSize(new File(Utils.buildScenePath(hiddenScene2.getProject().getName(), hiddenSceneName2))); backpackSize = folderSize(new File(Utils.buildBackpackScenePath(hiddenSceneName2))); assertEquals(hiddenScene2 + " Folder was not copied to Backpack correctly", original, backpackSize); Scene backPackedScene = BackPackListManager.getInstance().getBackPackedScenes().get(0); assertTrue("Backpacked scene not cloned correctly", Utils.isStandardScene(ProjectManager.getInstance() .getCurrentProject(), backPackedScene.getName(), getContext())); Scene hiddenBackPackedScene1 = BackPackListManager.getInstance().getHiddenSceneByName(hiddenSceneName1); assertTrue("Backpacked scene" + hiddenSceneName1 + "not cloned correctly", Utils.isStandardScene(ProjectManager.getInstance().getCurrentProject(), hiddenBackPackedScene1.getName(), getContext())); Scene hiddenBackPackedScene2 = BackPackListManager.getInstance().getHiddenSceneByName(hiddenSceneName2); assertTrue("Backpacked scene" + hiddenSceneName2 + "not cloned correctly", Utils.isStandardScene(ProjectManager.getInstance().getCurrentProject(), hiddenBackPackedScene1.getName(), getContext())); BackPackListManager.getInstance().saveBackpack(); Thread.sleep(2000); BackPackListManager.getInstance().loadBackpack(); Thread.sleep(2000); assertTrue("Scene was not serialized and deserialized correctly", BackPackListManager.getInstance() .backPackedScenesContains(scene, true)); assertTrue(hiddenSceneName1 + " was not serialized and deserialized correctly", BackPackListManager .getInstance().backPackedScenesContains(hiddenBackPackedScene1, false)); assertTrue(hiddenSceneName2 + " was not serialized and deserialized correctly", BackPackListManager .getInstance().backPackedScenesContains(hiddenBackPackedScene1, false)); String unpackedHiddenSceneName1 = Utils.getUniqueSceneName(hiddenBackPackedScene1.getName(), false); String unpackedHiddenSceneName2 = Utils.getUniqueSceneName(hiddenBackPackedScene2.getName(), false); Scene unpackedScene = BackPackSceneController.getInstance().unpackScene(backPackedScene); assertNotNull("unpacked scene was null", unpackedScene); assertTrue("Scene was not unpacked correctly", Utils.isStandardScene(unpackedScene .getProject(), unpackedScene.getName(), getContext())); long unpackedSize = folderSize(new File(Utils.buildScenePath(unpackedScene.getProject().getName(), unpackedScene.getName()))); assertEquals("Unpacked Folder has not correct size", original, unpackedSize); unpackedScene = ProjectManager.getInstance().getCurrentProject().getSceneByName(unpackedHiddenSceneName1); assertTrue(unpackedHiddenSceneName1 + " was not unpacked correctly", unpackedScene != null && Utils.isStandardScene(unpackedScene.getProject(), unpackedScene.getName(), getContext())); unpackedSize = folderSize(new File(Utils.buildScenePath(unpackedScene.getProject().getName(), unpackedScene.getName()))); assertEquals("Unpacked Folder has not correct size", original, unpackedSize); unpackedScene = ProjectManager.getInstance().getCurrentProject().getSceneByName(unpackedHiddenSceneName2); assertTrue(unpackedHiddenSceneName2 + " was not unpacked correctly", unpackedScene != null && Utils.isStandardScene(unpackedScene.getProject(), unpackedScene.getName(), getContext())); unpackedSize = folderSize(new File(Utils.buildScenePath(unpackedScene.getProject().getName(), unpackedScene.getName()))); assertEquals("Unpacked Folder has not correct size", original, unpackedSize); } public void testUnpackWithVariables() { Project project = new Project(getContext(), "testProjectForVariables", false); Scene scene2 = new Scene(getContext(), "scene 2", project); Scene scene1 = project.getDefaultScene(); UserVariable var = scene1.getDataContainer().addProjectUserVariable("one"); UserList list = scene1.getDataContainer().addProjectUserList("list"); SetVariableBrick setVariableBrick = new SetVariableBrick(new Formula(1), var); AddItemToUserListBrick userListBrick = new AddItemToUserListBrick(new Formula(2), list); StartScript start = new StartScript(); start.addBrick(setVariableBrick); start.addBrick(userListBrick); scene1.getSpriteList().get(0).addScript(start); FormulaElement variableElement = new FormulaElement(FormulaElement.ElementType.USER_VARIABLE, var.getName(), null); FormulaElement listElement = new FormulaElement(FormulaElement.ElementType.USER_LIST, list.getName(), null); SetSizeToBrick sizeToBrick = new SetSizeToBrick(new Formula(variableElement)); MoveNStepsBrick moveBrick = new MoveNStepsBrick(new Formula(listElement)); StartScript start2 = new StartScript(); start2.addBrick(sizeToBrick); start2.addBrick(moveBrick); scene2.getSpriteList().get(0).addScript(start2); project.addScene(scene2); StorageHandler.getInstance().saveProject(project); BackPackSceneController.getInstance().backpackScene(scene2); UiTestUtils.createEmptyProject(); Scene sceneToUnpack = null; for (Scene scene : BackPackListManager.getInstance().getBackPackedScenes()) { if (scene.getName().equals(scene2.getName())) { sceneToUnpack = scene; } } BackPackSceneController.getInstance().unpackScene(sceneToUnpack); Project current = ProjectManager.getInstance().getCurrentProject(); List<UserList> userLists = current.getProjectLists(); List<UserVariable> userVariables = current.getProjectVariables(); assertEquals("ProjectList Size not correct", 1, userLists.size()); assertEquals("ProjectVariables Size not correct", 1, userVariables.size()); assertEquals("Wrong userList", list.getName(), userLists.get(0).getName()); assertEquals("Wrong userVariable", var.getName(), userVariables.get(0).getName()); } private static long folderSize(File directory) { try { long length = 0; for (File file : directory.listFiles()) { if (file.isFile()) { length += file.length(); } else { length += folderSize(file); } } return length; } catch (Exception e) { return 0; } } }