/* * 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.project; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.test.InstrumentationTestCase; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.common.LookData; 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.ComeToFrontBrick; import org.catrobat.catroid.content.bricks.HideBrick; 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.PlaceAtBrick; import org.catrobat.catroid.content.bricks.SetLookBrick; import org.catrobat.catroid.content.bricks.SetSizeToBrick; import org.catrobat.catroid.content.bricks.ShowBrick; import org.catrobat.catroid.exceptions.ProjectException; import org.catrobat.catroid.formulaeditor.BaseDataContainer; import org.catrobat.catroid.formulaeditor.DataContainer; import org.catrobat.catroid.formulaeditor.UserVariable; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.test.utils.Reflection; import org.catrobat.catroid.test.utils.TestUtils; import org.catrobat.catroid.utils.Utils; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; public class ProjectManagerTest extends InstrumentationTestCase { private String projectNameOne = "Ulumulu"; private String spriteNameOne = "Zuul"; private String spriteNameTwo = "Zuuul"; private Script testScript; private Script otherScript; @Override public void setUp() throws Exception { TestUtils.clearProject(projectNameOne); TestUtils.clearProject("oldProject"); TestUtils.clearProject("newProject"); super.setUp(); } @Override public void tearDown() throws Exception { TestUtils.clearProject(projectNameOne); TestUtils.clearProject("oldProject"); TestUtils.clearProject("newProject"); super.tearDown(); } public void testBasicFunctions() throws NameNotFoundException, IOException { ProjectManager projectManager = ProjectManager.getInstance(); assertNull("there is a current sprite set", projectManager.getCurrentSprite()); assertNull("there is a current script set", projectManager.getCurrentScript()); Context context = getInstrumentation().getContext().createPackageContext( getInstrumentation().getTargetContext().getPackageName(), Context.CONTEXT_IGNORE_SECURITY); projectManager.initializeNewProject(projectNameOne, context, false, false, false); assertNotNull("no current project set", projectManager.getCurrentProject()); assertEquals("The Projectname is not " + projectNameOne, projectNameOne, projectManager.getCurrentProject() .getName()); int spriteCount = projectManager.getCurrentScene().getSpriteList().size(); assertEquals("New project has wrong number of sprites", 4, spriteCount); Sprite bird = projectManager.getCurrentScene().getSpriteList().get(projectManager.getCurrentScene() .getSpriteList().size() - 1); assertEquals("Catroid sprite has wrong number of scripts", 3, bird.getNumberOfScripts()); Sprite sprite = new SingleSprite(spriteNameOne); projectManager.addSprite(sprite); projectManager.setCurrentSprite(sprite); assertNotNull("No current sprite set", projectManager.getCurrentSprite()); assertEquals("The Spritename is not " + spriteNameOne, spriteNameOne, projectManager.getCurrentSprite() .getName()); Script startScript = new StartScript(); projectManager.addScript(startScript); projectManager.setCurrentScript(startScript); assertNotNull("no current script set", projectManager.getCurrentScript()); try { ProjectManager.getInstance().loadProject(projectNameOne, context); assertTrue("Load project worked correctly", true); } catch (ProjectException projectException) { fail("Project is not loaded successfully"); } assertNotNull("no current project set", projectManager.getCurrentProject()); assertEquals("The Projectname is not " + projectNameOne, projectNameOne, projectManager.getCurrentProject() .getName()); assertNull("there is a current sprite set", projectManager.getCurrentSprite()); assertNull("there is a current script set", projectManager.getCurrentScript()); Sprite sprite2 = new SingleSprite(spriteNameTwo); projectManager.addSprite(sprite2); assertTrue("Sprite not in current Project", projectManager.getCurrentScene().getSpriteList() .contains(sprite2)); projectManager.setCurrentSprite(sprite2); Script script2 = new StartScript(); projectManager.addScript(script2); assertTrue("Script not in current Sprite", projectManager.getCurrentSprite().getScriptIndex(script2) != -1); projectManager.setCurrentScript(script2); SetLookBrick setLookBrick = new SetLookBrick(); projectManager.getCurrentScript().addBrick(setLookBrick); assertTrue("Brick not in current Script", projectManager.getCurrentScript().getBrickList().contains(setLookBrick)); } public void testEmptyProject() throws NameNotFoundException, IOException { ProjectManager projectManager = ProjectManager.getInstance(); Context context = getInstrumentation().getContext().createPackageContext( getInstrumentation().getTargetContext().getPackageName(), Context.CONTEXT_IGNORE_SECURITY); projectManager.initializeNewProject(projectNameOne, context, true, false, false); Project currentProject = projectManager.getCurrentProject(); assertNotNull("no current project set", currentProject); assertEquals("Wrong project name", projectNameOne, currentProject.getName()); assertEquals("Wrong number of sprites", 1, currentProject.getDefaultScene().getSpriteList().size()); DataContainer variablesContainer = currentProject.getDefaultScene().getDataContainer(); @SuppressWarnings("unchecked") List<UserVariable> userVariableList = variablesContainer.getProjectVariables(); @SuppressWarnings("unchecked") Map<Sprite, List<UserVariable>> spriteVariablesMap = (Map<Sprite, List<UserVariable>>) Reflection .getPrivateField(BaseDataContainer.class, variablesContainer, "spriteVariables"); assertEquals("Wrong number of variables", 0, userVariableList.size()); assertEquals("Wrong number of variables", 0, spriteVariablesMap.size()); Sprite background = currentProject.getDefaultScene().getSpriteList().get(0); assertEquals("Wrong sprite name", context.getString(R.string.background), background.getName()); assertEquals("Script list not empty", 0, background.getNumberOfScripts()); assertEquals("Brick list not empty", 0, background.getNumberOfBricks()); assertEquals("Look data not empty", 0, background.getLookDataList().size()); assertEquals("Sound list not empty", 0, background.getSoundList().size()); } public void testNestingBrickReferences() throws Throwable { ProjectManager projectManager = ProjectManager.getInstance(); TestUtils.createTestProjectWithWrongIfClauseReferences(); projectManager.checkNestingBrickReferences(true, false); List<Brick> newBrickList = projectManager.getCurrentScene().getSpriteList().get(0).getScript(0) .getBrickList(); assertEquals("Wrong reference", newBrickList.get(2), ((IfLogicBeginBrick) newBrickList.get(0)).getIfElseBrick()); assertEquals("Wrong reference", newBrickList.get(9), ((IfLogicBeginBrick) newBrickList.get(0)).getIfEndBrick()); assertEquals("Wrong reference", newBrickList.get(0), ((IfLogicElseBrick) newBrickList.get(2)).getIfBeginBrick()); assertEquals("Wrong reference", newBrickList.get(9), ((IfLogicElseBrick) newBrickList.get(2)).getIfEndBrick()); assertEquals("Wrong reference", newBrickList.get(6), ((IfLogicBeginBrick) newBrickList.get(4)).getIfElseBrick()); assertEquals("Wrong reference", newBrickList.get(8), ((IfLogicBeginBrick) newBrickList.get(4)).getIfEndBrick()); assertEquals("Wrong reference", newBrickList.get(4), ((IfLogicElseBrick) newBrickList.get(6)).getIfBeginBrick()); assertEquals("Wrong reference", newBrickList.get(8), ((IfLogicElseBrick) newBrickList.get(6)).getIfEndBrick()); assertEquals("Wrong reference", newBrickList.get(4), ((IfLogicEndBrick) newBrickList.get(8)).getIfBeginBrick()); assertEquals("Wrong reference", newBrickList.get(6), ((IfLogicEndBrick) newBrickList.get(8)).getIfElseBrick()); assertEquals("Wrong reference", newBrickList.get(0), ((IfLogicEndBrick) newBrickList.get(9)).getIfBeginBrick()); assertEquals("Wrong reference", newBrickList.get(2), ((IfLogicEndBrick) newBrickList.get(9)).getIfElseBrick()); } public Project createTestProject(String projectName) throws IOException { StorageHandler storageHandler = StorageHandler.getInstance(); int xPosition = 457; int yPosition = 598; double size = 0.8; Project project = new Project(getInstrumentation().getTargetContext(), projectName); storageHandler.saveProject(project); ProjectManager.getInstance().setProject(project); Sprite firstSprite = new SingleSprite("cat"); Sprite secondSprite = new SingleSprite("dog"); Sprite thirdSprite = new SingleSprite("horse"); Sprite fourthSprite = new SingleSprite("pig"); testScript = new StartScript(); otherScript = new StartScript(); HideBrick hideBrick = new HideBrick(); ShowBrick showBrick = new ShowBrick(); SetLookBrick lookBrick = new SetLookBrick(); File image = TestUtils.saveFileToProject(projectName, project.getDefaultScene().getName(), "image.png", org.catrobat.catroid.test.R.raw.icon, getInstrumentation().getContext(), 0); LookData lookData = new LookData(); lookData.setLookFilename(image.getName()); lookData.setLookName("name"); lookBrick.setLook(lookData); SetSizeToBrick setSizeToBrick = new SetSizeToBrick(size); ComeToFrontBrick comeToFrontBrick = new ComeToFrontBrick(); PlaceAtBrick placeAtBrick = new PlaceAtBrick(xPosition, yPosition); testScript.addBrick(hideBrick); testScript.addBrick(showBrick); testScript.addBrick(setSizeToBrick); testScript.addBrick(comeToFrontBrick); otherScript.addBrick(placeAtBrick); firstSprite.addScript(testScript); secondSprite.addScript(otherScript); project.getDefaultScene().addSprite(firstSprite); project.getDefaultScene().addSprite(secondSprite); project.getDefaultScene().addSprite(thirdSprite); project.getDefaultScene().addSprite(fourthSprite); ProjectManager.getInstance().getFileChecksumContainer() .addChecksum(Utils.md5Checksum(image), image.getAbsolutePath()); storageHandler.saveProject(project); return project; } }