/* * 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 android.widget.ListView; import org.catrobat.catroid.R; import org.catrobat.catroid.common.LookData; import org.catrobat.catroid.common.bluetooth.ConnectionDataLogger; 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.SetLookBrick; import org.catrobat.catroid.content.bricks.WaitBrick; import org.catrobat.catroid.devices.mindstorms.nxt.LegoNXT; import org.catrobat.catroid.devices.mindstorms.nxt.LegoNXTImpl; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTI2CUltraSonicSensor; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTLightSensor; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTSensor; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTSoundSensor; import org.catrobat.catroid.devices.mindstorms.nxt.sensors.NXTTouchSensor; 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 LegoNXTPreferencesTests extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private Context applicationContext; private final String spriteName = "testSprite"; private final String projectName = UiTestUtils.PROJECTNAME1; private static final int IMAGE_FILE_ID = org.catrobat.catroid.test.R.raw.icon; public LegoNXTPreferencesTests() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); UiTestUtils.prepareStageForTest(); applicationContext = getInstrumentation().getTargetContext().getApplicationContext(); SettingsActivity.disableLegoNXTMindstormsSensorInfoDialog(applicationContext); } public void testNXTAllBricksAvailable() throws InterruptedException { boolean nxtBricksEnabledStart = SettingsActivity.isMindstormsNXTSharedPreferenceEnabled(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(); } solo.waitForText(solo.getString(R.string.main_menu_new)); solo.clickOnText(solo.getString(R.string.main_menu_new)); solo.enterText(0, "testNXTAllBricksAvailable"); solo.waitForText(solo.getString(R.string.ok)); solo.clickOnText(solo.getString(R.string.ok)); solo.waitForText(solo.getString(R.string.ok)); solo.clickOnText(solo.getString(R.string.ok)); solo.waitForText(solo.getString(R.string.background)); solo.clickOnText(solo.getString(R.string.background)); solo.waitForText(solo.getString(R.string.scripts)); solo.clickOnText(solo.getString(R.string.scripts)); UiTestUtils.clickOnBottomBar(solo, R.id.button_add); solo.sleep(200); ListView fragmentListView = solo.getCurrentViews(ListView.class).get( solo.getCurrentViews(ListView.class).size() - 1); solo.sleep(200); solo.scrollListToBottom(fragmentListView); solo.waitForText(solo.getString(R.string.category_lego_nxt)); solo.clickOnText(solo.getString(R.string.category_lego_nxt)); solo.sleep(300); assertTrue("NXT turn motor brick not available!", solo.searchText(solo.getString(R.string.nxt_brick_motor_turn_angle))); assertTrue("NXT stop motor brick not available!", solo.searchText(solo.getString(R.string.nxt_motor_stop))); assertTrue("NXT move motor brick not available!", solo.searchText(solo.getString(R.string.nxt_brick_motor_move))); assertTrue("NXT play tone brick not available!", solo.searchText(solo.getString(R.string.nxt_play_tone))); } public void testNXTSensorsSetCorrectly() throws InterruptedException { createTestproject(projectName); SettingsActivity.setLegoMindstormsNXTSensorChooserEnabled(applicationContext, true); LegoNXT nxt = new LegoNXTImpl(applicationContext); ConnectionDataLogger logger = ConnectionDataLogger.createLocalConnectionLogger(); nxt.setConnection(logger.getConnectionProxy()); boolean nxtBricksEnabledStart = SettingsActivity.isMindstormsNXTSharedPreferenceEnabled(applicationContext); 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(projectName); NXTSensor.Sensor[] sensorMapping = new NXTSensor.Sensor[4]; sensorMapping[0] = NXTSensor.Sensor.SOUND; sensorMapping[1] = NXTSensor.Sensor.SOUND; sensorMapping[2] = NXTSensor.Sensor.SOUND; sensorMapping[3] = NXTSensor.Sensor.SOUND; SettingsActivity.setLegoMindstormsNXTSensorMapping(applicationContext, sensorMapping); 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)); if (!nxtBricksEnabledStart) { solo.clickOnText(preferenceTitle); } solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_1)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_light)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_2)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_touch)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_3)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_touch)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_4)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic)); solo.goBack(); solo.goBack(); SettingsActivity.setLegoMindstormsNXTSensorChooserEnabled(applicationContext, true); NXTSensor.Sensor sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_1); assertEquals("NXT sensor 1 not set correctly!", NXTSensor.Sensor.LIGHT_INACTIVE, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_2); assertEquals("NXT sensor 2 not set correctly!", NXTSensor.Sensor.TOUCH, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_3); assertEquals("NXT sensor 3 not set correctly!", NXTSensor.Sensor.TOUCH, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_4); assertEquals("NXT sensor 4 not set correctly!", NXTSensor.Sensor.ULTRASONIC, sensor); nxt.initialise(); assertNotNull("Sensor 1 not initialized correctly", nxt.getSensor1()); assertTrue("Sensor 1 is of wrong instance, SensorFactory may has an error", nxt.getSensor1() instanceof NXTLightSensor); assertNotNull("Sensor 2 not initialized correctly", nxt.getSensor2()); assertTrue("Sensor 2 is of wrong instance, SensorFactory may has an error", nxt.getSensor2() instanceof NXTTouchSensor); assertNotNull("Sensor 3 not initialized correctly", nxt.getSensor3()); assertTrue("Sensor 3 is of wrong instance, SensorFactory may has an error", nxt.getSensor3() instanceof NXTTouchSensor); assertNotNull("Sensor 4 not initialized correctly", nxt.getSensor4()); assertTrue("Sensor 4 is of wrong instance, SensorFactory may has an error", nxt.getSensor4() instanceof NXTI2CUltraSonicSensor); 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.nxt_choose_sensor_1)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_touch)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_2)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_sound)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_3)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_light)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_4)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic)); solo.goBack(); solo.goBack(); solo.sleep(500); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_1); assertEquals("NXT sensor 1 not set correctly!", NXTSensor.Sensor.TOUCH, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_2); assertEquals("NXT sensor 2 not set correctly!", NXTSensor.Sensor.SOUND, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_3); assertEquals("NXT sensor 3 not set correctly!", NXTSensor.Sensor.LIGHT_INACTIVE, sensor); sensor = SettingsActivity.getLegoMindstormsNXTSensorMapping(applicationContext, SettingsActivity.NXT_SENSOR_4); assertEquals("NXT sensor 4 not set correctly!", NXTSensor.Sensor.ULTRASONIC, sensor); assertNotNull("Sensor 1 not reinitialized correctly", nxt.getSensor1()); assertTrue("Sensor 1 is of wrong instance now, SensorFactory may has an error", nxt.getSensor1() instanceof NXTTouchSensor); assertNotNull("Sensor 2 not reinitialized correctly", nxt.getSensor2()); assertTrue("Sensor 2 is of wrong instance now, SensorFactory may has an error", nxt.getSensor2() instanceof NXTSoundSensor); assertNotNull("Sensor 3 not reinitialized correctly", nxt.getSensor3()); assertTrue("Sensor 3 is of wrong instance now, SensorFactory may has an error", nxt.getSensor3() instanceof NXTLightSensor); assertNotNull("Sensor 4 not reinitialized correctly", nxt.getSensor4()); assertTrue("Sensor 4 is of wrong instance now, SensorFactory may has an error", nxt.getSensor4() instanceof NXTI2CUltraSonicSensor); nxt.disconnect(); logger.disconnectAndDestroy(); } public void testNXTSensorsAvailable() throws InterruptedException { boolean nxtBricksEnabledStart = SettingsActivity.isMindstormsNXTSharedPreferenceEnabled(applicationContext); SettingsActivity.setLegoMindstormsNXTSensorChooserEnabled(applicationContext, true); 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)); if (!nxtBricksEnabledStart) { solo.clickOnText(preferenceTitle); } solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_1)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_touch)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_2)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_sound)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_3)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_light)); solo.clickOnText(solo.getString(R.string.nxt_choose_sensor_4)); solo.waitForText(solo.getString(R.string.nxt_no_sensor)); solo.clickOnText(solo.getString(R.string.nxt_sensor_ultrasonic)); solo.goBack(); solo.goBack(); solo.waitForText(solo.getString(R.string.main_menu_new)); solo.clickOnText(solo.getString(R.string.main_menu_new)); solo.enterText(0, "testNXTSensorsAvailable"); solo.waitForText(solo.getString(R.string.ok)); solo.clickOnText(solo.getString(R.string.ok)); solo.waitForText(solo.getString(R.string.ok)); solo.clickOnText(solo.getString(R.string.ok)); solo.waitForText(solo.getString(R.string.background)); solo.clickOnText(solo.getString(R.string.background)); solo.waitForText(solo.getString(R.string.scripts)); solo.clickOnText(solo.getString(R.string.scripts)); UiTestUtils.clickOnBottomBar(solo, R.id.button_add); solo.sleep(200); ListView fragmentListView = solo.getCurrentViews(ListView.class).get( solo.getCurrentViews(ListView.class).size() - 1); solo.sleep(200); solo.scrollListToBottom(fragmentListView); solo.waitForText(solo.getString(R.string.category_lego_nxt)); solo.clickOnText(solo.getString(R.string.category_lego_nxt)); solo.waitForText(solo.getString(R.string.nxt_play_tone)); solo.clickOnText(solo.getString(R.string.nxt_play_tone)); solo.sleep(300); solo.clickOnView(solo.getViews().get(0)); solo.sleep(300); solo.clickOnText("1"); solo.waitForText(solo.getString(R.string.formula_editor_device)); solo.clickOnText(solo.getString(R.string.formula_editor_device)); solo.sleep(300); assertTrue("NXT sensor light not available!", solo.searchText(solo.getString(R.string .formula_editor_sensor_lego_nxt_light))); assertTrue("NXT sensor light active not available!", solo.searchText(solo.getString(R.string .formula_editor_sensor_lego_nxt_light_active))); assertTrue("NXT sensor sound not available!", solo.searchText(solo.getString(R.string .formula_editor_sensor_lego_nxt_sound))); assertTrue("NXT sensor touch not available!", solo.searchText(solo.getString(R.string .formula_editor_sensor_lego_nxt_touch))); assertTrue("NXT sensor ultrasonic not available!", solo.searchText(solo.getString(R.string .formula_editor_sensor_lego_nxt_ultrasonic))); } private void createTestproject(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<>(); 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); } }