/** * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2014 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.html5player.client.scripts; import java.util.ArrayList; import org.catrobat.html5player.client.Scene; import org.catrobat.html5player.client.Sprite; import org.catrobat.html5player.client.Stage; import org.catrobat.html5player.client.bricks.Brick; import org.catrobat.html5player.client.bricks.ForeverBrick; import org.catrobat.html5player.client.bricks.LoopEndBrick; import org.catrobat.html5player.client.bricks.LoopEndlessBrick; import org.catrobat.html5player.client.bricks.NextLookBrick; import org.catrobat.html5player.client.bricks.RepeatBrick; import org.catrobat.html5player.client.bricks.SetLookBrick; //import org.catrobat.html5player.client.bricks.WaitBrick; import org.catrobat.html5player.client.common.LookData; import org.catrobat.html5player.client.formulaeditor.Formula; //import org.catrobat.html5player.client.threading.CatScheduler; //import org.catrobat.html5player.client.threading.CatThread; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.junit.client.GWTTestCase; //import com.google.gwt.user.client.Timer; public class StartScriptTest extends GWTTestCase { //private Sprite sprite_ = null; //for asynchronous testing private Stage stage; private Scene scene; private int canvasCoordinateSpaceWidth = 100; private int canvasCoordinateSpaceHeight = 100; public StartScriptTest() { stage = Stage.getInstance(); scene = Scene.get(); } @Override public String getModuleName() { return "org.catrobat.html5player.html5player"; } public void gwtSetUp() { scene.createScene(canvasCoordinateSpaceWidth, canvasCoordinateSpaceHeight); Canvas canvas = scene.getCanvas(); stage.setCanvas(canvas); } public void gwtTearDown() { stage.setCanvas(null); stage.getSpriteManager().reset(); //important //sprite_ = null; } //-------------------------------------------------------------------------- /** * Helper * @param name of Look * @return LookData for costume */ private LookData createCostumeData(String name) { LookData data = new LookData(); data.setName(name); return data; } //-------------------------------------------------------------------------- /** * */ public void testNewScriptNoBrickList() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); assertEquals(spriteName, startScript.getSprite().getName()); assertEquals("StartScript", startScript.getType()); assertTrue(startScript.getBrickList().isEmpty()); } /** * */ public void testNewScriptWithBrickList() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); SetLookBrick setBrick = new SetLookBrick(spriteName, "costumeName"); NextLookBrick nextBrick = new NextLookBrick(spriteName); ArrayList<Brick> brickList = new ArrayList<Brick>(); brickList.add(setBrick); brickList.add(nextBrick); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName, brickList); assertEquals(spriteName, startScript.getSprite().getName()); assertEquals("StartScript", startScript.getType()); assertEquals(2, startScript.getBrickList().size()); } /** * */ public void testAddBrickGetBrick() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); SetLookBrick setBrick = new SetLookBrick(spriteName, "costumeName"); NextLookBrick nextBrick = new NextLookBrick(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.addBrick(setBrick); int position = 0; startScript.addBrick(nextBrick, position); assertEquals(2, startScript.getBrickList().size()); assertTrue(startScript.getBrick(position) instanceof NextLookBrick); assertTrue(startScript.getBrick(position+1) instanceof SetLookBrick); startScript.addBrick(null); assertEquals(2, startScript.getBrickList().size()); startScript.addBrick(null, position); assertEquals(2, startScript.getBrickList().size()); assertTrue(startScript.getBrick(position) instanceof NextLookBrick); } /** * */ public void testAddBrickMultipleTimes() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); SetLookBrick setBrick = new SetLookBrick(spriteName, "costumeName"); NextLookBrick nextBrick = new NextLookBrick(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.addBrick(setBrick); startScript.addBrick(nextBrick); startScript.addBrick(nextBrick); assertEquals(3, startScript.getBrickList().size()); assertTrue(startScript.getBrick(0) instanceof SetLookBrick); assertTrue(startScript.getBrick(1) instanceof NextLookBrick); assertTrue(startScript.getBrick(2) instanceof NextLookBrick); } /** * */ public void testDeleteBrick() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); SetLookBrick setBrick = new SetLookBrick(spriteName, "costumeName"); NextLookBrick nextBrick = new NextLookBrick(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.addBrick(setBrick); int position = 0; startScript.addBrick(nextBrick, position); assertEquals(2, startScript.getBrickList().size()); assertTrue(startScript.getBrick(position) instanceof NextLookBrick); assertTrue(startScript.getBrick(position+1) instanceof SetLookBrick); startScript.deleteBrick(position); assertEquals(1, startScript.getBrickList().size()); assertTrue(startScript.getBrick(position) instanceof SetLookBrick); startScript.deleteBrick(position); assertTrue(startScript.getBrickList().isEmpty()); } /** * */ public void testRun() { String costumeName1 = "costume1"; String costumeName2 = "costume2"; String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); sprite.addLookData(createCostumeData(costumeName1)); sprite.addLookData(createCostumeData(costumeName2)); //hide costume, so drawSprite() in redrawScreen() does nothing sprite.getLook().hide(); // stage.getSpriteManager().addSprite(sprite); SetLookBrick setBrick = new SetLookBrick(spriteName, costumeName1); NextLookBrick nextBrick = new NextLookBrick(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.addBrick(setBrick); startScript.addBrick(nextBrick); startScript.run(); startScript.run(); assertEquals(costumeName2, sprite.getLook().getLookData().getName()); } /** * */ public void testRunWithNoBricks() { String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); stage.getSpriteManager().addSprite(sprite); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.run(); assertNull(sprite.getLook().getLookData()); } // /** // * // */ // public void testRunPauseManualResume() { // String costumeName1 = "costume1"; // String costumeName2 = "costume2"; // String spriteName = "Sprite"; // // Sprite sprite = new Sprite(spriteName); // // sprite.addCostumeData(createCostumeData(costumeName1)); // sprite.addCostumeData(createCostumeData(costumeName2)); // // //hide costume, so drawSprite() in redrawScreen() does nothing // sprite.getCostume().hide(); // // // // stage.getSpriteManager().addSprite(sprite); // // SetCostumeBrick2 setBrick = new SetCostumeBrick2(spriteName, costumeName1); // NextLookBrick nextBrick = new NextLookBrick(spriteName); // // String scriptName = "StartScript"; // StartScript startScript = new StartScript(sprite, scriptName); // // startScript.addBrick(setBrick); // startScript.addBrick(nextBrick); // // //run script as a thread // CatThread thread = new CatThread("thread", startScript); // CatScheduler.get().schedule(thread); // // CatScheduler.get().execute(); // // //pause // startScript.pause(1000); // // CatScheduler.get().execute(); // CatScheduler.get().execute(); // // assertEquals(costumeName1, sprite.getCostume().getCostumeData().getName()); // // //resume // startScript.resume(); // // CatScheduler.get().execute(); // // assertEquals(costumeName2, sprite.getCostume().getCostumeData().getName()); // } // // /** // * // */ // public void testRunPauseResume() { // String costumeName1 = "costume1"; // String costumeName2 = "costume2"; // String spriteName = "Sprite"; // // sprite_ = new Sprite(spriteName); // // sprite_.addCostumeData(createCostumeData(costumeName1)); // sprite_.addCostumeData(createCostumeData(costumeName2)); // // //hide costume, so drawSprite() in redrawScreen() does nothing // sprite_.getCostume().hide(); // // // // stage.getSpriteManager().addSprite(sprite_); // // SetCostumeBrick2 setBrick = new SetCostumeBrick2(spriteName, costumeName1); // NextLookBrick nextBrick = new NextLookBrick(spriteName); // // String scriptName = "StartScript"; // StartScript startScript = new StartScript(sprite_, scriptName); // // startScript.addBrick(setBrick); // startScript.addBrick(nextBrick); // // //run script as a thread // CatThread thread = new CatThread("thread", startScript); // CatScheduler.get().schedule(thread); // // CatScheduler.get().execute(); // // //pause // startScript.pause(500); // // CatScheduler.get().execute(); // CatScheduler.get().execute(); // // assertEquals(costumeName1, sprite_.getCostume().getCostumeData().getName()); // // Timer timer = new Timer() { // public void run() { // // CatScheduler.get().execute(); // // assertEquals("costume2", sprite_.getCostume().getCostumeData().getName()); // // // tell the test system the test is now done // finishTest(); // } // }; // // // Set a delay period significantly longer than the // // event is expected to take // delayTestFinish(1000); // // // Schedule the event and return control to the test system // timer.schedule(600); // } /** * */ public void testSetCurrentBrickIndex() { String costumeName1 = "costume1"; String costumeName2 = "costume2"; String spriteName = "Sprite"; Sprite sprite = new Sprite(spriteName); sprite.addLookData(createCostumeData(costumeName1)); sprite.addLookData(createCostumeData(costumeName2)); //hide costume, so drawSprite() in redrawScreen() does nothing sprite.getLook().hide(); // stage.getSpriteManager().addSprite(sprite); SetLookBrick setBrick = new SetLookBrick(spriteName, costumeName1); SetLookBrick setBrick2 = new SetLookBrick(spriteName, costumeName2); NextLookBrick nextBrick = new NextLookBrick(spriteName); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); startScript.addBrick(setBrick); startScript.addBrick(setBrick2); startScript.addBrick(nextBrick); int currentBrickIndex = 1; startScript.setCurrentBrick(currentBrickIndex); assertEquals(currentBrickIndex, startScript.getCurrentBrick()); startScript.run(); startScript.run(); assertEquals(costumeName1, sprite.getLook().getLookData().getName()); } /** * */ public void testGetLastRepeatBrickWithoutLoopEndBrick() { String spriteName = "Sprite"; Sprite sprite = stage.getSpriteManager().getSprite(spriteName, true); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); sprite.addScript(startScript); Formula timesToRepeatOuter = new Formula(3); RepeatBrick repeatBrickOuter = new RepeatBrick(spriteName, timesToRepeatOuter); Formula timesToRepeatInner = new Formula(1); RepeatBrick repeatBrickInner = new RepeatBrick(spriteName, timesToRepeatInner); startScript.addBrick(repeatBrickOuter); startScript.addBrick(repeatBrickInner); assertEquals(repeatBrickInner, startScript.getLastRepeatBrickWithoutLoopEndBrick()); LoopEndBrick loopEndBrickInner = new LoopEndBrick(spriteName, startScript.getLastRepeatBrickWithoutLoopEndBrick()); startScript.getLastRepeatBrickWithoutLoopEndBrick().setLoopEndBrick(loopEndBrickInner); assertEquals(repeatBrickOuter, startScript.getLastRepeatBrickWithoutLoopEndBrick()); LoopEndBrick loopEndBrickOuter = new LoopEndBrick(spriteName, startScript.getLastRepeatBrickWithoutLoopEndBrick()); startScript.getLastRepeatBrickWithoutLoopEndBrick().setLoopEndBrick(loopEndBrickOuter); assertEquals(loopEndBrickOuter, repeatBrickOuter.getLoopEndBrick()); assertEquals(loopEndBrickInner, repeatBrickInner.getLoopEndBrick()); } /** * */ public void testGetLastForeverBrickWithoutLoopEndlessBrick() { String spriteName = "Sprite"; Sprite sprite = stage.getSpriteManager().getSprite(spriteName, true); String scriptName = "StartScript"; StartScript startScript = new StartScript(sprite, scriptName); sprite.addScript(startScript); ForeverBrick foreverBrickOuter = new ForeverBrick(spriteName); ForeverBrick foreverBrickInner = new ForeverBrick(spriteName); startScript.addBrick(foreverBrickOuter); startScript.addBrick(foreverBrickInner); assertEquals(foreverBrickInner, startScript.getLastForeverBrickWithoutLoopEndlessBrick()); LoopEndlessBrick loopEndlessBrickInner = new LoopEndlessBrick(spriteName, startScript.getLastForeverBrickWithoutLoopEndlessBrick()); startScript.getLastForeverBrickWithoutLoopEndlessBrick().setLoopEndlessBrick(loopEndlessBrickInner); assertEquals(foreverBrickOuter, startScript.getLastForeverBrickWithoutLoopEndlessBrick()); LoopEndlessBrick loopEndlessBrickOuter = new LoopEndlessBrick(spriteName, startScript.getLastForeverBrickWithoutLoopEndlessBrick()); startScript.getLastForeverBrickWithoutLoopEndlessBrick().setLoopEndlessBrick(loopEndlessBrickOuter); assertEquals(loopEndlessBrickOuter, foreverBrickOuter.getLoopEndlessBrick()); assertEquals(loopEndlessBrickInner, foreverBrickInner.getLoopEndlessBrick()); } }