/* * 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.ev3; import android.content.Context; import org.catrobat.catroid.R; import org.catrobat.catroid.common.LookData; 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.LegoEv3MotorMoveBrick; import org.catrobat.catroid.content.bricks.LegoEv3PlayToneBrick; import org.catrobat.catroid.content.bricks.SetLookBrick; import org.catrobat.catroid.content.bricks.WaitBrick; import org.catrobat.catroid.devices.mindstorms.ev3.sensors.EV3Sensor; 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.io.File; import java.util.ArrayList; public class LegoEV3SensorInfoTests extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private Context applicationContext; private final String projectNameEv3 = UiTestUtils.PROJECTNAME1; private final String projectNameNoEv3 = UiTestUtils.PROJECTNAME2; private final String spriteName = "testSprite"; private static final int IMAGE_FILE_ID = org.catrobat.catroid.test.R.raw.icon; public LegoEV3SensorInfoTests() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); UiTestUtils.prepareStageForTest(); setSensors(EV3Sensor.Sensor.TOUCH); applicationContext = getInstrumentation().getTargetContext().getApplicationContext(); } private void setSensors(EV3Sensor.Sensor sensor) { SettingsActivity.setLegoMindstormsEV3SensorMapping(this.getInstrumentation().getTargetContext(), new EV3Sensor.Sensor[] { sensor, sensor, sensor, sensor }); } public void testEV3SensorInfoDialog() throws InterruptedException { createBrickTestproject(projectNameEv3); createNoEV3UseTestproject(projectNameNoEv3); boolean ev3BricksEnabledStart = SettingsActivity.isMindstormsEV3SharedPreferenceEnabled(applicationContext); boolean ev3DialogDisabledStart = SettingsActivity.getShowLegoEV3MindstormsSensorInfoDialog(applicationContext); if (!ev3BricksEnabledStart) { solo.clickOnActionBarItem(R.id.settings); String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_ev3_bricks); solo.waitForText(preferenceTitle); solo.clickOnText(preferenceTitle); solo.waitForText(solo.getString(R.string.preference_title_mindstorms_ev3_sensors)); solo.clickOnText(preferenceTitle); solo.goBack(); solo.goBack(); } if (ev3DialogDisabledStart) { solo.clickOnActionBarItem(R.id.settings); String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_ev3_bricks); solo.waitForText(preferenceTitle); solo.clickOnText(preferenceTitle); solo.waitForText(solo.getString(R.string.preference_title_mindstorms_ev3_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(projectNameEv3); assertTrue("EV3 Sensor Dialog not shown for Project with EV3 Brick", solo.waitForText(solo.getString(R.string.lego_ev3_sensor_config_info_title))); assertTrue("Wrong Sensors listed in EV3 Sensor Dialog", solo.searchText(solo.getString(R.string.ev3_sensor_touch), 4)); solo.goBack(); solo.goBack(); setSensors(EV3Sensor.Sensor.COLOR); solo.clickOnText(projectNameEv3); solo.waitForText(solo.getString(R.string.lego_ev3_sensor_config_info_title)); assertTrue("Wrong Sensors listed in EV3 Sensor Dialog", solo.searchText(solo.getString(R.string.ev3_sensor_color), 4)); solo.goBack(); solo.goBack(); solo.clickOnText(projectNameNoEv3); solo.waitForText(solo.getString(R.string.background)); solo.sleep(200); assertFalse("EV3 Sensor Dialog was shown for Project without EV3 elements", solo.searchText(solo.getString(R.string.lego_ev3_sensor_config_info_title))); solo.goBack(); solo.goBack(); solo.clickOnActionBarItem(R.id.settings); String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_ev3_bricks); solo.waitForText(preferenceTitle); solo.clickOnText(preferenceTitle); solo.waitForText(solo.getString(R.string.preference_title_mindstorms_ev3_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(projectNameEv3); solo.waitForText(solo.getString(R.string.spritelist_background_headline)); assertFalse("EV3 Sensor Dialog was shown while disabled in settings", solo.searchText(solo.getString(R.string.lego_ev3_sensor_config_info_title))); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForText(solo.getString(R.string.programs)); solo.clickOnText(projectNameNoEv3); 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_ev3_sensor_touch), 1, true); solo.clickOnText(solo.getString(R.string.ev3_sensor_color)); 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_ev3_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("EV3 Sensor Dialog not shown for Project with EV3 Sensor but no EV3 Brick", solo.waitForText(solo.getString(R.string.lego_ev3_sensor_config_info_title))); } public void testEV3SensorConfigurationDialog() throws InterruptedException { createBrickTestproject(projectNameEv3); boolean ev3BricksEnabledStart = SettingsActivity.isMindstormsEV3SharedPreferenceEnabled(applicationContext); boolean ev3DialogDisabledStart = SettingsActivity.getShowLegoEV3MindstormsSensorInfoDialog(applicationContext); if (!ev3BricksEnabledStart) { solo.clickOnActionBarItem(R.id.settings); String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_ev3_bricks); solo.waitForText(preferenceTitle); solo.clickOnText(preferenceTitle); solo.waitForText(solo.getString(R.string.preference_title_mindstorms_ev3_sensors)); solo.clickOnText(preferenceTitle); solo.goBack(); solo.goBack(); } if (!ev3DialogDisabledStart) { solo.clickOnActionBarItem(R.id.settings); String preferenceTitle = solo.getString(R.string.preference_title_enable_mindstorms_ev3_bricks); solo.waitForText(preferenceTitle); solo.clickOnText(preferenceTitle); solo.waitForText(solo.getString(R.string.preference_title_mindstorms_ev3_sensors)); solo.clickOnText(solo.getString(R.string.preference_disable_nxt_info_dialog)); solo.goBack(); solo.goBack(); } setSensors(EV3Sensor.Sensor.COLOR); 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(projectNameEv3); 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_ev3_sensor_touch), 1, true); solo.clickOnText(solo.getString(R.string.nxt_port_1)); solo.sleep(200); 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_ev3_sensor_touch), 1, true); solo.waitForText(solo.getString(R.string.ev3_sensor_touch)); assertTrue("EV3 Sensor was not replaced.", solo.searchText(solo.getString(R.string.ev3_sensor_touch))); solo.clickOnText(solo.getString(R.string.ev3_sensor_touch), 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_ev3_sensor_color), 1, true); solo.clickOnText(solo.getString(R.string.nxt_port_1)); 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_ev3_sensor_color), 1, true); assertTrue("EV3 Sensor was not replaced.", solo.searchText(solo.getString(R.string.ev3_sensor_touch))); // could depend on screen-resolution! solo.clickOnText(solo.getString(R.string.nxt_port_1)); solo.sleep(200); solo.clickOnText(solo.getString(R.string.yes)); solo.goBack(); solo.sleep(200); 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(); SetLookBrick setLookBrick = new SetLookBrick(); LegoEv3MotorMoveBrick legoMotorActionBrick = new LegoEv3MotorMoveBrick( LegoEv3MotorMoveBrick.Motor.MOTOR_B_C, 100); WaitBrick firstWaitBrick = new WaitBrick(500); LegoEv3PlayToneBrick legoPlayToneBrick = new LegoEv3PlayToneBrick(50, 1.5f, 50); startScript.addBrick(legoMotorActionBrick); startScript.addBrick(firstWaitBrick); startScript.addBrick(legoPlayToneBrick); firstSprite.addScript(startScript); ArrayList<Sprite> spriteList = new ArrayList<>(); spriteList.add(firstSprite); Project project = UiTestUtils.createProject(projectName, spriteList, getActivity()); String imageName = "image"; File image = UiTestUtils.saveFileToProject(projectName, project.getDefaultScene().getName(), imageName, IMAGE_FILE_ID, getInstrumentation() .getContext(), UiTestUtils.FileTypes.IMAGE); LookData lookData = new LookData(); lookData.setLookFilename(image.getName()); lookData.setLookName(imageName); setLookBrick.setLook(lookData); firstSprite.getLookDataList().add(lookData); StorageHandler.getInstance().saveProject(project); } private void createNoEV3UseTestproject(String projectName) { Sprite firstSprite = new SingleSprite(spriteName); Script startScript = new StartScript(); SetLookBrick setLookBrick = new SetLookBrick(); 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()); String imageName = "image"; File image = UiTestUtils.saveFileToProject(projectName, project.getDefaultScene().getName(), imageName, IMAGE_FILE_ID, getInstrumentation() .getContext(), UiTestUtils.FileTypes.IMAGE); LookData lookData = new LookData(); lookData.setLookFilename(image.getName()); lookData.setLookName(imageName); setLookBrick.setLook(lookData); firstSprite.getLookDataList().add(lookData); StorageHandler.getInstance().saveProject(project); } }