/*
* 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.util.Log;
import android.widget.ListView;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.content.SingleSprite;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.content.StartScript;
import org.catrobat.catroid.content.bricks.GoNStepsBackBrick;
import org.catrobat.catroid.content.bricks.PointInDirectionBrick;
import org.catrobat.catroid.content.bricks.SetBrightnessBrick;
import org.catrobat.catroid.content.bricks.SetSizeToBrick;
import org.catrobat.catroid.content.bricks.SetTransparencyBrick;
import org.catrobat.catroid.content.bricks.SetXBrick;
import org.catrobat.catroid.content.bricks.SetYBrick;
import org.catrobat.catroid.formulaeditor.Formula;
import org.catrobat.catroid.formulaeditor.FormulaElement;
import org.catrobat.catroid.formulaeditor.InternFormulaParser;
import org.catrobat.catroid.formulaeditor.InternToken;
import org.catrobat.catroid.formulaeditor.InternTokenType;
import org.catrobat.catroid.formulaeditor.InterpretationException;
import org.catrobat.catroid.formulaeditor.Sensors;
import org.catrobat.catroid.stage.StageActivity;
import org.catrobat.catroid.ui.MainMenuActivity;
import org.catrobat.catroid.ui.ProjectActivity;
import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase;
import org.catrobat.catroid.uitest.util.UiTestUtils;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ObjectVariableTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> {
private Sprite sprite;
private static final double DELTA = 0.01d;
private static final double SPRITE_X_POSITION_INITIAL = 0.0d;
private static final double SPRITE_Y_POSITION_INITIAL = 0.0d;
private static final double SPRITE_TRANSPARENCY_INITIAL = 0.0d;
private static final double SPRITE_BRIGHTNESS_INITIAL = 100.0d;
private static final double SPRITE_SIZE_INITIAL = 100.0d;
private static final double SPRITE_DIRECTION_INITIAL = 90.0d;
private static final int NUMBER_OF_SPRITES_INITIAL = -1;
private static final double SPRITE_X_POSITION = 30.0d;
private static final double SPRITE_Y_POSITION = 50.0d;
private static final double SPRITE_TRANSPARENCY = 0.8d;
private static final double SPRITE_BRIGHTNESS = 0.7d;
private static final double SPRITE_SIZE = 90.0d;
private static final double SPRITE_DIRECTION = 42.0d;
private static final int SPRITE_LAYER_CHANGE = 2;
private static final int NUMBER_OF_SPRITES = 5;
public ObjectVariableTest() {
super(MainMenuActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
createProject();
UiTestUtils.prepareStageForTest();
}
public Double interpretSensor(Sensors sensor) {
List<InternToken> internTokenList = new LinkedList<InternToken>();
internTokenList.add(new InternToken(InternTokenType.SENSOR, sensor.name()));
InternFormulaParser internParser = new InternFormulaParser(internTokenList);
FormulaElement parseTree = internParser.parseFormula();
Formula sensorFormula = new Formula(parseTree);
try {
return sensorFormula.interpretDouble(sprite);
} catch (InterpretationException interpretationException) {
Log.d(getClass().getSimpleName(), "Formula interpretation for Sensor failed.", interpretationException);
}
return Double.NaN;
}
public void testLookSensorValueInStage() {
solo.waitForActivity(MainMenuActivity.class.getSimpleName());
String continueString = solo.getString(R.string.main_menu_continue);
solo.waitForText(continueString);
solo.clickOnButton(continueString);
solo.waitForActivity(ProjectActivity.class.getSimpleName());
solo.waitForView(ListView.class);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(2000);
assertEquals("Variable shows false x position", SPRITE_X_POSITION, interpretSensor(Sensors.OBJECT_X), DELTA);
assertEquals("Variable shows false y position", SPRITE_Y_POSITION, interpretSensor(Sensors.OBJECT_Y), DELTA);
assertEquals("Variable shows false transparency", SPRITE_TRANSPARENCY, interpretSensor(Sensors.OBJECT_TRANSPARENCY), DELTA);
assertEquals("Variable shows false brightness", SPRITE_BRIGHTNESS, interpretSensor(Sensors.OBJECT_BRIGHTNESS), DELTA);
assertEquals("Variable shows false size", SPRITE_SIZE, interpretSensor(Sensors.OBJECT_SIZE), DELTA);
assertEquals("Variable shows false direction", SPRITE_DIRECTION, interpretSensor(Sensors.OBJECT_ROTATION), DELTA);
assertEquals("Variable shows false z index", NUMBER_OF_SPRITES - SPRITE_LAYER_CHANGE, interpretSensor(Sensors.OBJECT_LAYER), DELTA);
}
public void testLookSensorValueBeforeAndAfterStage() {
assertEquals("Variable shows false x position before stage", SPRITE_X_POSITION_INITIAL,
interpretSensor(Sensors.OBJECT_X), DELTA);
assertEquals("Variable shows false y position before stage", SPRITE_Y_POSITION_INITIAL,
interpretSensor(Sensors.OBJECT_Y), DELTA);
assertEquals("Variable shows false transparency before stage", SPRITE_TRANSPARENCY_INITIAL,
interpretSensor(Sensors.OBJECT_TRANSPARENCY), DELTA);
assertEquals("Variable shows false brightness before stage", SPRITE_BRIGHTNESS_INITIAL,
interpretSensor(Sensors.OBJECT_BRIGHTNESS), DELTA);
assertEquals("Variable shows false size before stage", SPRITE_SIZE_INITIAL,
interpretSensor(Sensors.OBJECT_SIZE), DELTA);
assertEquals("Variable shows false direction before stage", SPRITE_DIRECTION_INITIAL,
interpretSensor(Sensors.OBJECT_ROTATION), DELTA);
assertEquals("Variable shows false z index before stage", NUMBER_OF_SPRITES_INITIAL,
interpretSensor(Sensors.OBJECT_LAYER), DELTA);
solo.waitForActivity(MainMenuActivity.class.getSimpleName());
String continueString = solo.getString(R.string.main_menu_continue);
solo.waitForText(continueString);
solo.clickOnButton(continueString);
solo.waitForActivity(ProjectActivity.class.getSimpleName());
solo.waitForView(ListView.class);
UiTestUtils.clickOnBottomBar(solo, R.id.button_play);
solo.waitForActivity(StageActivity.class.getSimpleName());
solo.sleep(1000);
solo.goBack();
solo.goBack();
solo.waitForActivity(ProjectActivity.class.getSimpleName());
solo.waitForView(ListView.class);
assertEquals("Variable shows false x position after Stage", SPRITE_X_POSITION,
interpretSensor(Sensors.OBJECT_X), DELTA);
assertEquals("Variable shows false y position after Stage", SPRITE_Y_POSITION,
interpretSensor(Sensors.OBJECT_Y), DELTA);
assertEquals("Variable shows false transparency after Stage", SPRITE_TRANSPARENCY,
interpretSensor(Sensors.OBJECT_TRANSPARENCY), DELTA);
assertEquals("Variable shows false brightness after Stage", SPRITE_BRIGHTNESS,
interpretSensor(Sensors.OBJECT_BRIGHTNESS), DELTA);
assertEquals("Variable shows false size after Stage", SPRITE_SIZE,
interpretSensor(Sensors.OBJECT_SIZE), DELTA);
assertEquals("Variable shows false direction after Stage", SPRITE_DIRECTION,
interpretSensor(Sensors.OBJECT_ROTATION), DELTA);
assertEquals("Variable shows false z index after Stage", NUMBER_OF_SPRITES - SPRITE_LAYER_CHANGE,
interpretSensor(Sensors.OBJECT_LAYER), DELTA);
}
private void createProject() {
ArrayList<Sprite> spriteList = new ArrayList<Sprite>();
spriteList.add(new SingleSprite("background"));
spriteList.add(new SingleSprite("sprite1"));
spriteList.add(new SingleSprite("sprite2"));
spriteList.add(new SingleSprite("sprite3"));
spriteList.add(new SingleSprite("sprite4"));
sprite = new SingleSprite("sprite5");
StartScript startScript = new StartScript();
SetXBrick setXBrick = new SetXBrick((int) SPRITE_X_POSITION);
startScript.addBrick(setXBrick);
sprite.addScript(startScript);
SetYBrick setYBrick = new SetYBrick((int) SPRITE_Y_POSITION);
startScript.addBrick(setYBrick);
sprite.addScript(startScript);
SetTransparencyBrick setTransparencyBrick = new SetTransparencyBrick(SPRITE_TRANSPARENCY);
startScript.addBrick(setTransparencyBrick);
sprite.addScript(startScript);
SetBrightnessBrick setBrightnessBrick = new SetBrightnessBrick(SPRITE_BRIGHTNESS);
startScript.addBrick(setBrightnessBrick);
sprite.addScript(startScript);
SetSizeToBrick setSizeToBrick = new SetSizeToBrick(SPRITE_SIZE);
startScript.addBrick(setSizeToBrick);
sprite.addScript(startScript);
PointInDirectionBrick pointInDirectionBrick = new PointInDirectionBrick(SPRITE_DIRECTION);
startScript.addBrick(pointInDirectionBrick);
sprite.addScript(startScript);
GoNStepsBackBrick goNStepsBackBrick = new GoNStepsBackBrick(SPRITE_LAYER_CHANGE);
startScript.addBrick(goNStepsBackBrick);
sprite.addScript(startScript);
spriteList.add(sprite);
UiTestUtils.createProject(UiTestUtils.DEFAULT_TEST_PROJECT_NAME, spriteList, null);
ProjectManager.getInstance().setCurrentSprite(sprite);
}
}