/**
* 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.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 WhenScriptTest extends GWTTestCase {
// private Sprite sprite_ = null; //for asynchronous testing
private Stage stage;
private Scene scene;
private int canvasCoordinateSpaceWidth = 100;
private int canvasCoordinateSpaceHeight = 100;
public WhenScriptTest() {
stage = Stage.getInstance();
scene = Scene.get();
}
@Override
public String getModuleName() {
return "org.catrobat.html5player.html5player";
}
public void gwtSetUp() {
// Canvas canvas = Canvas.createIfSupported();
// canvas.setCoordinateSpaceWidth(canvasCoordinateSpaceWidth);
// canvas.setCoordinateSpaceHeight(canvasCoordinateSpaceHeight);
scene.createScene(canvasCoordinateSpaceWidth,
canvasCoordinateSpaceHeight);
Canvas canvas = scene.getCanvas();
stage.setCanvas(canvas);
}
public void gwtTearDown() {
stage.setCanvas(null);
stage.getSpriteManager().reset(); // important
// sprite_ = null;
CatScheduler.get().clear();
}
// --------------------------------------------------------------------------
/**
* 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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
assertEquals(spriteName, whenScript.getSprite().getName());
assertEquals("TouchScript", whenScript.getType());
assertTrue(whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName, brickList);
assertEquals(spriteName, whenScript.getSprite().getName());
assertEquals("TouchScript", whenScript.getType());
assertEquals(2, whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
int position = 0;
whenScript.addBrick(nextBrick, position);
assertEquals(2, whenScript.getBrickList().size());
assertTrue(whenScript.getBrick(position) instanceof NextLookBrick);
assertTrue(whenScript.getBrick(position + 1) instanceof SetLookBrick);
whenScript.addBrick(null);
assertEquals(2, whenScript.getBrickList().size());
whenScript.addBrick(null, position);
assertEquals(2, whenScript.getBrickList().size());
assertTrue(whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
whenScript.addBrick(nextBrick);
whenScript.addBrick(nextBrick);
assertEquals(3, whenScript.getBrickList().size());
assertTrue(whenScript.getBrick(0) instanceof SetLookBrick);
assertTrue(whenScript.getBrick(1) instanceof NextLookBrick);
assertTrue(whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
int position = 0;
whenScript.addBrick(nextBrick, position);
assertEquals(2, whenScript.getBrickList().size());
assertTrue(whenScript.getBrick(position) instanceof NextLookBrick);
assertTrue(whenScript.getBrick(position + 1) instanceof SetLookBrick);
whenScript.deleteBrick(position);
assertEquals(1, whenScript.getBrickList().size());
assertTrue(whenScript.getBrick(position) instanceof SetLookBrick);
whenScript.deleteBrick(position);
assertTrue(whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
whenScript.addBrick(nextBrick);
// costume should change
whenScript.run();
whenScript.run();
assertEquals(costumeName2, sprite.getLook().getLookData().getName());
}
/**
*
*/
public void testRunWithNoBricks() {
String spriteName = "Sprite";
Sprite sprite = new Sprite(spriteName);
stage.getSpriteManager().addSprite(sprite);
String scriptName = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.run();
assertNull(sprite.getLook().getLookData());
}
/**
*
*/
public void testResetWhenScript() {
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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
whenScript.addBrick(nextBrick);
// run script as a thread
CatThread thread = new CatThread("thread", whenScript);
CatScheduler.get().schedule(thread);
// costume should change
CatScheduler.get().execute();
CatScheduler.get().execute();
assertEquals(costumeName2, sprite.getLook().getLookData().getName());
whenScript.resetWhenScript();
whenScript.deleteBrick(1); // delete NextLookBrick
// run script again as a thread
CatThread thread2 = new CatThread("thread", whenScript);
CatScheduler.get().schedule(thread2);
// costume should change
CatScheduler.get().execute();
assertEquals(costumeName1, sprite.getLook().getLookData().getName());
}
// /**
// *
// */
// 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 = "WhenScript";
// WhenScript whenScript = new WhenScript(sprite, scriptName);
//
// whenScript.addBrick(setBrick);
// whenScript.addBrick(nextBrick);
//
// //run script as a thread
// CatThread thread = new CatThread("thread", whenScript);
// CatScheduler.get().schedule(thread);
//
// CatScheduler.get().execute();
//
// //pause
// whenScript.pause(1000);
//
// CatScheduler.get().execute();
// CatScheduler.get().execute();
//
// assertEquals(costumeName1,
// sprite.getCostume().getCostumeData().getName());
//
// //resume
// whenScript.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 = "WhenScript";
// WhenScript whenScript = new WhenScript(sprite_, scriptName);
//
// whenScript.addBrick(setBrick);
// whenScript.addBrick(nextBrick);
//
// //run script as a thread
// CatThread thread = new CatThread("thread", whenScript);
// CatScheduler.get().schedule(thread);
//
// CatScheduler.get().execute();
//
// //pause
// whenScript.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 = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
whenScript.addBrick(setBrick);
whenScript.addBrick(setBrick2);
whenScript.addBrick(nextBrick);
int currentBrickIndex = 1;
whenScript.setCurrentBrick(currentBrickIndex);
assertEquals(currentBrickIndex, whenScript.getCurrentBrick());
whenScript.run();
whenScript.run();
assertEquals(costumeName1, sprite.getLook().getLookData().getName());
}
/**
*
*/
public void testGetLastRepeatBrickWithoutLoopEndBrick() {
String spriteName = "Sprite";
Sprite sprite = stage.getSpriteManager().getSprite(spriteName, true);
String scriptName = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
sprite.addScript(whenScript);
Formula timesToRepeatOuter = new Formula(3);
RepeatBrick repeatBrickOuter = new RepeatBrick(spriteName, timesToRepeatOuter);
Formula timesToRepeatInner = new Formula(1);
RepeatBrick repeatBrickInner = new RepeatBrick(spriteName, timesToRepeatInner);
whenScript.addBrick(repeatBrickOuter);
whenScript.addBrick(repeatBrickInner);
assertEquals(repeatBrickInner,
whenScript.getLastRepeatBrickWithoutLoopEndBrick());
LoopEndBrick loopEndBrickInner = new LoopEndBrick(spriteName,
whenScript.getLastRepeatBrickWithoutLoopEndBrick());
whenScript.getLastRepeatBrickWithoutLoopEndBrick().setLoopEndBrick(
loopEndBrickInner);
assertEquals(repeatBrickOuter,
whenScript.getLastRepeatBrickWithoutLoopEndBrick());
LoopEndBrick loopEndBrickOuter = new LoopEndBrick(spriteName,
whenScript.getLastRepeatBrickWithoutLoopEndBrick());
whenScript.getLastRepeatBrickWithoutLoopEndBrick().setLoopEndBrick(
loopEndBrickOuter);
assertEquals(loopEndBrickOuter, repeatBrickOuter.getLoopEndBrick());
assertEquals(loopEndBrickInner, repeatBrickInner.getLoopEndBrick());
}
/**
*
*/
public void testGetLastForeverBrickWithoutLoopEndBrick() {
String spriteName = "Sprite";
Sprite sprite = stage.getSpriteManager().getSprite(spriteName, true);
String scriptName = "WhenScript";
WhenScript whenScript = new WhenScript(sprite, scriptName);
sprite.addScript(whenScript);
ForeverBrick foreverBrickOuter = new ForeverBrick(spriteName);
ForeverBrick foreverBrickInner = new ForeverBrick(spriteName);
whenScript.addBrick(foreverBrickOuter);
whenScript.addBrick(foreverBrickInner);
assertEquals(foreverBrickInner, whenScript.getLastForeverBrickWithoutLoopEndlessBrick());
LoopEndlessBrick loopEndlessBrickInner = new LoopEndlessBrick(spriteName, whenScript.getLastForeverBrickWithoutLoopEndlessBrick());
whenScript.getLastForeverBrickWithoutLoopEndlessBrick().setLoopEndlessBrick(loopEndlessBrickInner);
assertEquals(foreverBrickOuter, whenScript.getLastForeverBrickWithoutLoopEndlessBrick());
LoopEndlessBrick loopEndlessBrickOuter = new LoopEndlessBrick(spriteName, whenScript.getLastForeverBrickWithoutLoopEndlessBrick());
whenScript.getLastForeverBrickWithoutLoopEndlessBrick().setLoopEndlessBrick(loopEndlessBrickOuter);
assertEquals(loopEndlessBrickOuter, foreverBrickOuter.getLoopEndlessBrick());
assertEquals(loopEndlessBrickInner, foreverBrickInner.getLoopEndlessBrick());
}
}