/*
* 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.uitest.stage;
import android.widget.EditText;
import android.widget.ListView;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.content.BroadcastScript;
import org.catrobat.catroid.content.Script;
import org.catrobat.catroid.content.SingleSprite;
import org.catrobat.catroid.content.Sprite;
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.SetVariableBrick;
import org.catrobat.catroid.content.bricks.UserVariableBrick;
import org.catrobat.catroid.formulaeditor.UserVariable;
import org.catrobat.catroid.stage.StageActivity;
import org.catrobat.catroid.test.utils.Reflection;
import org.catrobat.catroid.ui.MainMenuActivity;
import org.catrobat.catroid.ui.ScriptActivity;
import org.catrobat.catroid.ui.dialogs.NewDataDialog;
import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase;
import org.catrobat.catroid.uitest.util.UiTestUtils;
public class BroadCastReceiverRegressionTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> {
public BroadCastReceiverRegressionTest() {
super(MainMenuActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
UiTestUtils.prepareStageForTest();
}
public void testReceiversWorkMoreThanOnce() {
UiTestUtils.createEmptyProject();
Sprite sprite = ProjectManager.getInstance().getCurrentProject().getDefaultScene().getSpriteList().get(0);
Script script = sprite.getScript(0);
final String testMessage = "RegressionTest#105";
BroadcastBrick broadcastBrick = new BroadcastBrick(testMessage);
script.addBrick(broadcastBrick);
BroadcastScript broadcastScript = new BroadcastScript(testMessage);
final int xMovement = 100;
ChangeXByNBrick changeXByNBrick = new ChangeXByNBrick(xMovement);
broadcastScript.addBrick(changeXByNBrick);
sprite.addScript(broadcastScript);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(2000);
assertEquals("Broadcast was not executed!", xMovement, (int) sprite.look.getXInUserInterfaceDimensionUnit());
solo.goBack();
solo.goBack();
solo.waitForActivity(ScriptActivity.class.getSimpleName());
// This is where the magic happens. We try to execute the program again, Broadcasts should still work.
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(2000);
assertEquals("Broadcast didn't work a second time!", xMovement,
(int) sprite.look.getXInUserInterfaceDimensionUnit());
}
public void testWhenScriptRestartingItself() {
UiTestUtils.createEmptyProject();
Sprite sprite = ProjectManager.getInstance().getCurrentProject().getDefaultScene().getSpriteList().get(0);
Script script = sprite.getScript(0);
final String testMessage = "RegressionTest#875";
BroadcastBrick broadcastBrick = new BroadcastBrick(testMessage);
script.addBrick(broadcastBrick);
BroadcastScript broadcastScript = new BroadcastScript(testMessage);
final int xMovement = 1;
ChangeXByNBrick changeXByNBrick = new ChangeXByNBrick(xMovement);
broadcastScript.addBrick(changeXByNBrick);
BroadcastBrick broadcastBrickLoop = new BroadcastBrick(testMessage);
broadcastScript.addBrick(broadcastBrickLoop);
sprite.addScript(broadcastScript);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(2000);
assertTrue("When script does not restart itself!",
(int) sprite.look.getXInUserInterfaceDimensionUnit() > xMovement);
}
public void testRestartingOfWhenScriptWithBroadcastWaitBrick() {
UiTestUtils.createEmptyProject();
String messageOne = "messageOne";
String messageTwo = "messageTwo";
final int xMovement = 1;
Sprite sprite = ProjectManager.getInstance().getCurrentProject().getDefaultScene().getSpriteList().get(0);
Script startScript = sprite.getScript(0);
BroadcastBrick startBroadcastBrick = new BroadcastBrick(messageOne);
startScript.addBrick(startBroadcastBrick);
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);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(3000);
assertTrue("When script does not restart itself when a BroadcastWait is sent!",
(int) sprite.look.getXInUserInterfaceDimensionUnit() > 5 * xMovement);
}
public void testRestartingSendBroadcastAfterBroadcastAndWait() {
String message = "increase variable value";
String variableName = "test variable";
SetVariableBrick setVariableBrick = UiTestUtils.createSendBroadcastAfterBroadcastAndWaitProject(message);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
createUserVariable(variableName);
switchToScriptFragmentOfAnotherSprite("sprite1");
switchToScriptFragmentOfAnotherSprite("sprite2");
switchToScriptFragmentOfAnotherSprite("sprite3");
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(3000);
UserVariable userVariable = (UserVariable) Reflection.getPrivateField(UserVariableBrick.class, setVariableBrick, "userVariable");
assertNotNull("UserVariable is null", userVariable);
double expectedValue = 2111.0f;
assertEquals("Broadcast script of sprite 3 does not restart itself when a BroadcastWait is sent!", expectedValue, userVariable.getValue());
}
public void testRestartingSendBroadcastInBroadcastAndWait() {
String message1 = "message1";
String message2 = "message2";
double degreesToTurn = 15.0f;
Sprite secondSprite = new SingleSprite("sprite2");
Sprite thirdSprite = new SingleSprite("sprite3");
int initialRotation = UiTestUtils.createSendBroadcastInBroadcastAndWaitProject(message1, message2, degreesToTurn, secondSprite, thirdSprite);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(3000);
assertEquals("Second Broadcast Script does not restart itself!", (int) ((initialRotation - 3 * degreesToTurn) % 360),
(int) secondSprite.look.getRotation());
assertEquals("Third Broadcast Script does not restart itself!", (int) ((initialRotation + 3 * degreesToTurn) % 360),
(int) thirdSprite.look.getRotation());
}
public void testCorrectRestartingOfBroadcastsWithSameActionStringsWithinOneSprite() {
String message = "message";
String variableName = "test variable";
SetVariableBrick setVariableBrick = UiTestUtils.createSameActionsBroadcastProject(message);
UiTestUtils.getIntoScriptActivityFromMainMenu(solo);
createUserVariable(variableName);
switchToScriptFragmentOfAnotherSprite("sprite1");
switchToScriptFragmentOfAnotherSprite("sprite2");
switchToScriptFragmentOfAnotherSprite("sprite3");
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(3000);
UserVariable userVariable = (UserVariable) Reflection.getPrivateField(UserVariableBrick.class, setVariableBrick, "userVariable");
assertNotNull("UserVariable is null", userVariable);
double expectedValue = 20.0f;
assertEquals("Actions of identical action strings were not restarted!", expectedValue, userVariable.getValue());
}
public void switchToScriptFragmentOfAnotherSprite(String spriteName) {
solo.goBack();
solo.goBack();
solo.clickOnText(spriteName);
solo.clickOnText(solo.getString(R.string.scripts));
solo.waitForActivity(ScriptActivity.class.getSimpleName());
solo.waitForView(ListView.class);
solo.sleep(200);
}
private void createUserVariable(String variableName) {
solo.clickOnText(getInstrumentation().getTargetContext().getString(
R.string.brick_variable_spinner_create_new_variable));
assertTrue("NewVariableDialog not visible", solo.waitForFragmentByTag(NewDataDialog.DIALOG_FRAGMENT_TAG));
EditText editText = (EditText) solo.getView(R.id.dialog_formula_editor_data_name_edit_text);
solo.enterText(editText, variableName);
solo.clickOnButton(solo.getString(R.string.ok));
assertTrue("ScriptFragment not visible", solo.waitForText(solo.getString(R.string.brick_set_variable)));
assertTrue("Created ProjectVariable not set on first position in spinner", solo.searchText(variableName));
}
}