/*
* 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.devices.mindstorms.nxt;
import android.content.Context;
import org.catrobat.catroid.R;
import org.catrobat.catroid.content.Project;
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.LegoNxtMotorMoveBrick;
import org.catrobat.catroid.content.bricks.LegoNxtPlayToneBrick;
import org.catrobat.catroid.content.bricks.WaitBrick;
import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTSensor;
import org.catrobat.catroid.io.StorageHandler;
import org.catrobat.catroid.ui.MainMenuActivity;
import org.catrobat.catroid.ui.MyProjectsActivity;
import org.catrobat.catroid.ui.SettingsActivity;
import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase;
import org.catrobat.catroid.uitest.util.UiTestUtils;
import java.util.ArrayList;
public class LegoNXTSensorInfoTests extends BaseActivityInstrumentationTestCase<MainMenuActivity> {
private Context applicationContext;
private final String projectNameNxt = UiTestUtils.PROJECTNAME1;
private final String projectNameNoNxt = UiTestUtils.PROJECTNAME2;
private final String spriteName = "testSprite";
public LegoNXTSensorInfoTests() {
super(MainMenuActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
UiTestUtils.prepareStageForTest();
setSensors(NXTSensor.Sensor.TOUCH);
applicationContext = getInstrumentation().getTargetContext().getApplicationContext();
}
private void setSensors(NXTSensor.Sensor sensor) {
SettingsActivity.setLegoMindstormsNXTSensorMapping(this.getInstrumentation().getTargetContext(),
new NXTSensor.Sensor[] { sensor, sensor, sensor, sensor });
}
public void testNXTSensorInfoDialog() throws InterruptedException {
createBrickTestproject(projectNameNxt);
createNoNXTUseTestproject(projectNameNoNxt);
boolean nxtBricksEnabledStart = SettingsActivity.isMindstormsNXTSharedPreferenceEnabled(applicationContext);
boolean nxtDialogDisabledStart = SettingsActivity.getShowLegoNXTMindstormsSensorInfoDialog(applicationContext);
if (!nxtBricksEnabledStart) {
solo.clickOnActionBarItem(R.id.settings);
String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_nxt_bricks);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(preferenceTitle);
solo.goBack();
solo.goBack();
}
if (nxtDialogDisabledStart) {
solo.clickOnActionBarItem(R.id.settings);
String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_nxt_bricks);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(solo.getString(R.string.preference_disable_nxt_info_dialog));
solo.goBack();
solo.goBack();
}
solo.waitForText(solo.getString(R.string.main_menu_programs));
solo.clickOnText(solo.getString(R.string.main_menu_programs));
solo.waitForActivity(MyProjectsActivity.class.getSimpleName());
solo.waitForText(solo.getString(R.string.programs));
solo.clickOnText(projectNameNxt);
assertTrue("NXT Sensor Dialog not shown for Project with NXT Brick",
solo.waitForText(solo.getString(R.string.lego_nxt_sensor_config_info_title)));
assertTrue("Wrong Sensors listed in NXT Sensor Dialog",
solo.searchText(solo.getString(R.string.nxt_sensor_touch), 4));
solo.goBack();
solo.goBack();
setSensors(NXTSensor.Sensor.LIGHT_INACTIVE);
solo.clickOnText(projectNameNxt);
solo.waitForText(solo.getString(R.string.lego_nxt_sensor_config_info_title));
assertTrue("Wrong Sensors listed in NXT Sensor Dialog",
solo.searchText(solo.getString(R.string.nxt_sensor_light), 4));
solo.goBack();
solo.goBack();
solo.clickOnText(projectNameNoNxt);
solo.waitForText(solo.getString(R.string.background));
solo.sleep(200);
assertFalse("NXT Sensor Dialog was shown for Project without NXT elements",
solo.searchText(solo.getString(R.string.lego_nxt_sensor_config_info_title)));
solo.goBack();
solo.goBack();
solo.clickOnActionBarItem(R.id.settings);
String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_nxt_bricks);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(solo.getString(R.string.preference_disable_nxt_info_dialog));
solo.goBack();
solo.goBack();
solo.waitForText(solo.getString(R.string.main_menu_programs));
solo.clickOnText(solo.getString(R.string.main_menu_programs));
solo.waitForActivity(MyProjectsActivity.class.getSimpleName());
solo.waitForText(solo.getString(R.string.programs));
solo.clickOnText(projectNameNxt);
solo.waitForText(solo.getString(R.string.spritelist_background_headline));
assertFalse("NXT Sensor Dialog was shown while disabled in settings",
solo.searchText(solo.getString(R.string.lego_nxt_sensor_config_info_title)));
solo.goBack();
solo.waitForActivity(MyProjectsActivity.class.getSimpleName());
solo.waitForText(solo.getString(R.string.programs));
solo.clickOnText(projectNameNoNxt);
solo.clickOnText(spriteName);
solo.waitForText(solo.getString(R.string.scripts));
solo.clickOnText(solo.getString(R.string.scripts));
solo.waitForText(solo.getString(R.string.brick_wait));
solo.clickOnText(solo.getString(R.string.brick_wait));
solo.waitForText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.clickOnText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_device));
solo.sleep(300);
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_sensor_lego_nxt_touch), 1, true);
solo.clickOnText(solo.getString(R.string.nxt_sensor_light));
solo.clickOnText(solo.getString(R.string.yes));
solo.clickOnText(solo.getString(R.string.ok));
solo.goBack();
solo.goBack();
solo.goBack();
solo.clickOnActionBarItem(R.id.settings);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(solo.getString(R.string.preference_disable_nxt_info_dialog));
solo.goBack();
solo.goBack();
solo.goBack();
assertTrue("not in main menu2", solo.waitForText(solo.getString(R.string.main_menu_continue)));
solo.waitForText(solo.getString(R.string.main_menu_continue));
solo.waitForActivity(MainMenuActivity.class.getSimpleName());
solo.clickOnText(solo.getString(R.string.main_menu_continue));
assertTrue("NXT Sensor Dialog not shown for Project with NXT Sensor but no NXT Brick",
solo.waitForText(solo.getString(R.string.lego_nxt_sensor_config_info_title)));
}
public void testNXTSensorConfigurationDialog() throws InterruptedException {
createBrickTestproject(projectNameNxt);
boolean nxtBricksEnabledStart = SettingsActivity.isMindstormsNXTSharedPreferenceEnabled(applicationContext);
boolean nxtDialogDisabledStart = SettingsActivity.getShowLegoNXTMindstormsSensorInfoDialog(applicationContext);
if (!nxtBricksEnabledStart) {
solo.clickOnActionBarItem(R.id.settings);
String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_nxt_bricks);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(preferenceTitle);
solo.goBack();
solo.goBack();
}
if (!nxtDialogDisabledStart) {
solo.clickOnActionBarItem(R.id.settings);
String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_nxt_bricks);
solo.waitForText(preferenceTitle);
solo.clickOnText(preferenceTitle);
solo.waitForText(solo.getString(R.string.preference_title_mindstorms_nxt_sensors));
solo.clickOnText(solo.getString(R.string.preference_disable_nxt_info_dialog));
solo.goBack();
solo.goBack();
}
setSensors(NXTSensor.Sensor.LIGHT_ACTIVE);
solo.waitForActivity(MyProjectsActivity.class.getSimpleName());
solo.waitForText(solo.getString(R.string.main_menu_programs));
solo.clickOnText(solo.getString(R.string.main_menu_programs));
solo.waitForActivity(MyProjectsActivity.class.getSimpleName());
solo.waitForText(solo.getString(R.string.programs));
solo.clickOnText(projectNameNxt);
solo.clickOnText(spriteName);
solo.waitForText(solo.getString(R.string.scripts));
solo.clickOnText(solo.getString(R.string.scripts));
solo.waitForText(solo.getString(R.string.brick_wait));
solo.clickOnText(solo.getString(R.string.brick_wait));
solo.waitForText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.clickOnText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_device));
solo.sleep(200);
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_sensor_lego_nxt_ultrasonic), 1, true);
solo.clickOnText(solo.getString(R.string.nxt_sensor_light));
solo.clickOnText(solo.getString(R.string.yes));
// Next sensor no replace because set the same sensor
solo.clickOnText(solo.getString(R.string.formula_editor_device));
solo.sleep(200);
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_sensor_lego_nxt_ultrasonic), 1, true);
solo.waitForText(solo.getString(R.string.nxt_sensor_ultrasonic));
assertTrue("NXT Sensor was not replaced.",
solo.searchText(solo.getString(R.string.nxt_sensor_ultrasonic)));
solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic), 2);
assertFalse("Replace dialog shown spuriously.",
solo.searchText(solo.getString(R.string.yes)));
// Next sensor not replaced
solo.sleep(200);
solo.clickOnText(solo.getString(R.string.formula_editor_device));
solo.sleep(200);
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_sensor_lego_nxt_light), 1, true);
solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic));
solo.clickOnText(solo.getString(R.string.no));
solo.goBack();
solo.clickOnText(solo.getString(R.string.no));
// Look if ultrasonic sensor ist still mapped
solo.waitForText(solo.getString(R.string.brick_wait));
solo.clickOnText(solo.getString(R.string.brick_wait));
solo.waitForText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.clickOnText(solo.getString(R.string.brick_context_dialog_formula_edit_brick));
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_device));
solo.sleep(200);
solo.waitForText(solo.getString(R.string.formula_editor_device));
solo.clickOnText(solo.getString(R.string.formula_editor_sensor_lego_nxt_light), 1, true);
assertTrue("NXT Sensor was not replaced.",
solo.searchText(solo.getString(R.string.nxt_sensor_ultrasonic)));
solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic));
solo.clickOnText(solo.getString(R.string.yes));
solo.goBack();
solo.clickOnText(solo.getString(R.string.yes));
solo.goBack();
solo.goBack();
solo.goBack();
solo.goBack();
assertTrue("not in main menu2", solo.waitForText(solo.getString(R.string.main_menu_continue)));
}
private void createBrickTestproject(String projectName) {
Sprite firstSprite = new SingleSprite(spriteName);
Script startScript = new StartScript();
LegoNxtMotorMoveBrick legoMotorActionBrick = new LegoNxtMotorMoveBrick(
LegoNxtMotorMoveBrick.Motor.MOTOR_B_C, 100);
WaitBrick firstWaitBrick = new WaitBrick(500);
LegoNxtPlayToneBrick legoPlayToneBrick = new LegoNxtPlayToneBrick(50, 1.5f);
startScript.addBrick(legoMotorActionBrick);
startScript.addBrick(firstWaitBrick);
startScript.addBrick(legoPlayToneBrick);
firstSprite.addScript(startScript);
ArrayList<Sprite> spriteList = new ArrayList<Sprite>();
spriteList.add(firstSprite);
Project project = UiTestUtils.createProject(projectName, spriteList, getActivity());
StorageHandler.getInstance().saveProject(project);
}
private void createNoNXTUseTestproject(String projectName) {
Sprite firstSprite = new SingleSprite(spriteName);
Script startScript = new StartScript();
WaitBrick firstWaitBrick = new WaitBrick(123);
startScript.addBrick(firstWaitBrick);
firstSprite.addScript(startScript);
ArrayList<Sprite> spriteList = new ArrayList<Sprite>();
spriteList.add(firstSprite);
Project project = UiTestUtils.createProject(projectName, spriteList, getActivity());
StorageHandler.getInstance().saveProject(project);
}
}