/*
* 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.actions;
import android.test.AndroidTestCase;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.content.BroadcastScript;
import org.catrobat.catroid.content.Project;
import org.catrobat.catroid.content.Scene;
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.BroadcastBrick;
import org.catrobat.catroid.content.bricks.BroadcastWaitBrick;
import org.catrobat.catroid.content.bricks.ChangeXByNBrick;
import org.catrobat.catroid.content.bricks.SetXBrick;
import org.catrobat.catroid.content.bricks.WaitBrick;
import org.catrobat.catroid.uitest.util.UiTestUtils;
import java.util.HashMap;
import java.util.List;
public class BroadcastActionTest extends AndroidTestCase {
public void testBroadcast() {
Sprite sprite = new SingleSprite("testSprite");
Script script = new StartScript();
String message = "simpleTest";
BroadcastBrick broadcastBrick = new BroadcastBrick(message);
script.addBrick(broadcastBrick);
sprite.addScript(script);
BroadcastScript broadcastScript = new BroadcastScript(message);
int testPosition = 100;
SetXBrick testBrick = new SetXBrick(testPosition);
broadcastScript.addBrick(testBrick);
sprite.addScript(broadcastScript);
Project project = new Project(getContext(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
Scene scene = project.getDefaultScene();
scene.addSprite(sprite);
ProjectManager.getInstance().setProject(project);
sprite.createStartScriptActionSequenceAndPutToMap(new HashMap<String, List<String>>());
while (!allActionsOfAllSpritesAreFinished()) {
for (Sprite spriteOfList : ProjectManager.getInstance().getCurrentScene().getSpriteList()) {
spriteOfList.look.act(1.0f);
}
}
assertEquals("Simple broadcast failed", testPosition, (int) sprite.look.getXInUserInterfaceDimensionUnit());
}
public void testBroadcastWait() {
Sprite sprite = new SingleSprite("spriteOne");
Script scriptWait = new StartScript();
String message = "waitTest";
BroadcastWaitBrick broadcastWaitBrick = new BroadcastWaitBrick(message);
int testPosition = 100;
SetXBrick setXBrick = new SetXBrick(testPosition);
scriptWait.addBrick(broadcastWaitBrick);
scriptWait.addBrick(setXBrick);
sprite.addScript(scriptWait);
BroadcastScript broadcastScript = new BroadcastScript(message);
WaitBrick waitBrick = new WaitBrick(500);
int setTestPosition = 20;
SetXBrick setXBrick2 = new SetXBrick(setTestPosition);
broadcastScript.addBrick(waitBrick);
broadcastScript.addBrick(setXBrick2);
sprite.addScript(broadcastScript);
Project project = new Project(getContext(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
Scene scene = project.getDefaultScene();
scene.addSprite(sprite);
ProjectManager.getInstance().setProject(project);
sprite.createStartScriptActionSequenceAndPutToMap(new HashMap<String, List<String>>());
while (!allActionsOfAllSpritesAreFinished()) {
for (Sprite spriteOfList : ProjectManager.getInstance().getCurrentScene().getSpriteList()) {
spriteOfList.look.act(1.0f);
}
}
assertEquals("Broadcast and wait failed", testPosition, (int) sprite.look.getXInUserInterfaceDimensionUnit());
}
public void testWhenScriptRestartingItself() {
Sprite sprite = new SingleSprite("testSprite");
Script script = new StartScript();
String message = "simpleTest";
BroadcastBrick broadcastBrick = new BroadcastBrick(message);
script.addBrick(broadcastBrick);
sprite.addScript(script);
BroadcastScript broadcastScript = new BroadcastScript(message);
final int xMovement = 1;
ChangeXByNBrick changeXByNBrick = new ChangeXByNBrick(xMovement);
broadcastScript.addBrick(changeXByNBrick);
BroadcastBrick broadcastBrickLoop = new BroadcastBrick(message);
broadcastScript.addBrick(broadcastBrickLoop);
WaitBrick wb = new WaitBrick(5);
broadcastScript.addBrick(wb);
sprite.addScript(broadcastScript);
Project project = new Project(getContext(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
project.getDefaultScene().addSprite(sprite);
ProjectManager.getInstance().setProject(project);
sprite.createStartScriptActionSequenceAndPutToMap(new HashMap<String, List<String>>());
int loopCounter = 0;
while (!allActionsOfAllSpritesAreFinished() && loopCounter++ < 20) {
for (Sprite spriteOfList : ProjectManager.getInstance().getCurrentScene().getSpriteList()) {
spriteOfList.look.act(1.0f);
}
}
assertTrue("When script does not restart itself!",
(int) sprite.look.getXInUserInterfaceDimensionUnit() > xMovement);
}
public void testRestartingOfWhenScriptWithBroadcastWaitBrick() {
String messageOne = "messageOne";
String messageTwo = "messageTwo";
final int xMovement = 1;
Sprite sprite = new SingleSprite("cat");
Script startScript = new StartScript();
BroadcastBrick startBroadcastBrick = new BroadcastBrick(messageOne);
startScript.addBrick(startBroadcastBrick);
sprite.addScript(startScript);
BroadcastScript broadcastScriptMessageOne = new BroadcastScript(messageOne);
ChangeXByNBrick changeXByNBrickOne = new ChangeXByNBrick(xMovement);
BroadcastWaitBrick broadcastWaitBrickOne = new BroadcastWaitBrick(messageTwo);
broadcastScriptMessageOne.addBrick(changeXByNBrickOne);
broadcastScriptMessageOne.addBrick(broadcastWaitBrickOne);
sprite.addScript(broadcastScriptMessageOne);
BroadcastScript broadcastScriptMessageTwo = new BroadcastScript(messageTwo);
ChangeXByNBrick changeXByNBrickTwo = new ChangeXByNBrick(xMovement);
BroadcastWaitBrick broadcastWaitBrickTwo = new BroadcastWaitBrick(messageOne);
broadcastScriptMessageTwo.addBrick(changeXByNBrickTwo);
broadcastScriptMessageTwo.addBrick(broadcastWaitBrickTwo);
sprite.addScript(broadcastScriptMessageTwo);
Project project = new Project(getContext(), UiTestUtils.DEFAULT_TEST_PROJECT_NAME);
project.getDefaultScene().addSprite(sprite);
ProjectManager.getInstance().setProject(project);
sprite.createStartScriptActionSequenceAndPutToMap(new HashMap<String, List<String>>());
int loopCounter = 0;
while (!allActionsOfAllSpritesAreFinished() && loopCounter++ < 20) {
for (Sprite spriteOfList : ProjectManager.getInstance().getCurrentScene().getSpriteList()) {
spriteOfList.look.act(1.0f);
}
}
assertTrue("When script does not restart itself when a BroadcastWait is sent! ",
(int) sprite.look.getXInUserInterfaceDimensionUnit() > 5 * xMovement);
}
public boolean allActionsOfAllSpritesAreFinished() {
for (Sprite spriteOfList : ProjectManager.getInstance().getCurrentScene().getSpriteList()) {
if (!spriteOfList.look.getAllActionsAreFinished()) {
return false;
}
}
return true;
}
}