/* * 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.ui.dialog; import android.app.Activity; import android.media.MediaPlayer; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.common.ScreenModes; import org.catrobat.catroid.common.ScreenValues; import org.catrobat.catroid.common.SoundInfo; 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.PlaySoundBrick; import org.catrobat.catroid.content.bricks.SetSizeToBrick; import org.catrobat.catroid.content.bricks.WaitBrick; import org.catrobat.catroid.io.SoundManager; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.stage.StageActivity; import org.catrobat.catroid.test.utils.Reflection; import org.catrobat.catroid.ui.MainMenuActivity; import org.catrobat.catroid.ui.MyProjectsActivity; import org.catrobat.catroid.ui.ProjectActivity; import org.catrobat.catroid.uitest.util.BaseActivityInstrumentationTestCase; import org.catrobat.catroid.uitest.util.UiTestUtils; import org.catrobat.catroid.utils.UtilUi; import java.io.File; import java.util.ArrayList; import java.util.List; public class StageDialogTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private String testProject = UiTestUtils.PROJECTNAME1; public StageDialogTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); UiTestUtils.prepareStageForTest(); } public void testBackButtonPressedTwice() { Project project = createTestProject(testProject); ProjectManager.getInstance().setProject(project); solo.clickOnText(solo.getString(R.string.main_menu_continue)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); 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.assertCurrentActivity("Program is not in stage activity", ProjectActivity.class); } public void testBackToPreviousActivity() { createAndSaveTestProject(testProject); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); Activity previousActivity = getActivity(); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.goBack(); solo.clickOnButton(solo.getString(R.string.stage_dialog_back)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); assertEquals("Not equal Activities", previousActivity, getActivity()); } public void testPauseOnBackButton() { float defaultScale = 100.0f; float newScale = 50.0f; Project project = new Project(getActivity(), testProject); Sprite sprite = new SingleSprite("testSprite"); Script script = new StartScript(); WaitBrick waitBrick = new WaitBrick(5000); SetSizeToBrick scaleLookBrick = new SetSizeToBrick(newScale); script.addBrick(waitBrick); script.addBrick(scaleLookBrick); sprite.addScript(script); project.getDefaultScene().addSprite(sprite); StorageHandler.getInstance().saveProject(project); ProjectManager.getInstance().setProject(project); solo.clickOnText(solo.getString(R.string.main_menu_continue)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.sleep(1000); assertEquals("Unexpected look size", defaultScale, sprite.look.getSizeInUserInterfaceDimensionUnit()); solo.goBack(); solo.sleep(6000); assertEquals("Unexpected look size", defaultScale, sprite.look.getSizeInUserInterfaceDimensionUnit()); solo.clickOnButton(solo.getString(R.string.stage_dialog_resume)); solo.sleep(6000); assertEquals("Unexpected look size", newScale, sprite.look.getSizeInUserInterfaceDimensionUnit()); } public void testRestartButtonActivityChain() { createAndSaveTestProject(testProject); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); Activity currentActivity = solo.getCurrentActivity(); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.goBack(); solo.sleep(400); solo.clickOnButton(solo.getString(R.string.stage_dialog_restart)); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.assertCurrentActivity("Program is not in stage activity", StageActivity.class); solo.sleep(500); solo.goBack(); solo.sleep(100); solo.clickOnButton(solo.getString(R.string.stage_dialog_back)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); assertEquals("Returned to wrong Activity", currentActivity, solo.getCurrentActivity()); } public void testRestartButtonScriptPosition() { createAndSaveTestProject(testProject); ArrayList<Script> scriptStart = new ArrayList<Script>(); ArrayList<Script> scriptRestart = new ArrayList<Script>(); scriptStart.clear(); scriptRestart.clear(); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.sleep(1000); ProjectManager projectManager = ProjectManager.getInstance(); Project projectStart = projectManager.getCurrentProject(); String projectNameStart = projectStart.getName(); //scriptPositions at start List<Sprite> spriteList = projectStart.getDefaultScene().getSpriteList(); for (int i = 0; i < spriteList.size(); i++) { Sprite sprite = spriteList.get(i); int size = sprite.getNumberOfScripts(); for (int j = 0; j < size; j++) { scriptRestart.add(sprite.getScript(j)); } } spriteList.clear(); solo.clickOnScreen(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT / 2); solo.sleep(200); solo.goBack(); solo.sleep(100); solo.clickOnButton(solo.getString(R.string.stage_dialog_restart)); solo.sleep(300); //scriptPositions in between Project projectRestart = ProjectManager.getInstance().getCurrentProject(); String projectNameRestart = projectRestart.getName(); assertEquals("Wrong project after restart", projectNameStart, projectNameRestart); spriteList = projectRestart.getDefaultScene().getSpriteList(); for (int i = 0; i < spriteList.size(); i++) { Sprite sprite = spriteList.get(i); int size = sprite.getNumberOfScripts(); for (int j = 0; j < size; j++) { scriptStart.add(sprite.getScript(j)); } } for (int i = 0; i < scriptStart.size(); i++) { assertEquals("Script is not at starting position!", scriptRestart.get(i).getClass(), scriptStart.get(i) .getClass()); } } public void testRestartProjectWithSound() { String projectName = UiTestUtils.PROJECTNAME1; //creating sprites for project: Sprite firstSprite = new SingleSprite("sprite1"); Script startScript = new StartScript(); PlaySoundBrick playSoundBrick = new PlaySoundBrick(); startScript.addBrick(playSoundBrick); firstSprite.addScript(startScript); ArrayList<Sprite> spriteList = new ArrayList<Sprite>(); spriteList.add(firstSprite); Project project = UiTestUtils.createProject(projectName, spriteList, getActivity()); File soundFile = UiTestUtils.saveFileToProject(projectName, project.getDefaultScene().getName(), "soundfile.mp3", org.catrobat.catroid.test.R.raw.longsound, getInstrumentation().getContext(), UiTestUtils.FileTypes.SOUND); SoundInfo soundInfo = new SoundInfo(); soundInfo.setSoundFileName(soundFile.getName()); soundInfo.setTitle(soundFile.getName()); playSoundBrick.setSoundInfo(soundInfo); firstSprite.getSoundList().add(soundInfo); StorageHandler.getInstance().saveProject(project); solo.clickOnText(solo.getString(R.string.main_menu_continue)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.sleep(4000); MediaPlayer mediaPlayer = getMediaPlayers().get(0); assertTrue("Sound not playing.", mediaPlayer.isPlaying()); int positionBeforeRestart = mediaPlayer.getCurrentPosition(); solo.goBack(); solo.sleep(500); assertFalse("Sound playing but should be paused.", mediaPlayer.isPlaying()); solo.clickOnButton(solo.getString(R.string.stage_dialog_restart)); solo.sleep(2000); mediaPlayer = getMediaPlayers().get(0); int positionAfterRestart = mediaPlayer.getCurrentPosition(); assertTrue("Sound not playing after stage restart.", mediaPlayer.isPlaying()); assertTrue("Sound did not play from start!", positionBeforeRestart > positionAfterRestart); } public void testAxesOnOff() { createAndSaveTestProject(testProject); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.goBack(); solo.sleep(600); solo.clickOnButton(solo.getString(R.string.stage_dialog_axes_on)); solo.clickOnButton(solo.getString(R.string.stage_dialog_resume)); solo.sleep(100); byte[] redPixel = { (byte) 255, 0, 0, (byte) 255 }; byte[] stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(redPixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, 0, 1, 1); UiTestUtils.compareByteArrays(redPixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(redPixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(redPixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(redPixel, stagePixel); solo.goBack(); solo.clickOnButton(solo.getString(R.string.stage_dialog_axes_off)); solo.clickOnButton(solo.getString(R.string.stage_dialog_resume)); solo.sleep(100); byte[] whitePixel = { (byte) 255, (byte) 255, (byte) 255, (byte) 255 }; stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(whitePixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, 0, 1, 1); UiTestUtils.compareByteArrays(whitePixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(whitePixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(whitePixel, stagePixel); stagePixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(whitePixel, stagePixel); } public void testMaximizeStretch() { Project project = createTestProject(testProject); project.getXmlHeader().virtualScreenWidth = 480; project.getXmlHeader().virtualScreenHeight = 700; project.setDeviceData(getActivity()); StorageHandler.getInstance().saveProject(project); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UtilUi.updateScreenWidthAndHeight(getActivity()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); assertTrue("Stage not resizeable.", ((StageActivity) solo.getCurrentActivity()).getResizePossible()); byte[] whitePixel = { (byte) 255, (byte) 255, (byte) 255, (byte) 255 }; byte[] screenPixel = StageActivity.stageListener.getPixels(0, 0, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, 0, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); solo.goBack(); solo.clickOnView(solo.getView(R.id.stage_dialog_button_maximize)); solo.clickOnView(solo.getView(R.id.stage_dialog_button_continue)); solo.sleep(100); byte[] blackPixel = { 0, 0, 0, (byte) 255 }; screenPixel = StageActivity.stageListener.getPixels(0, 0, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, 0, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); solo.goBack(); solo.clickOnView(solo.getView(R.id.stage_dialog_button_maximize)); solo.clickOnView(solo.getView(R.id.stage_dialog_button_continue)); solo.sleep(100); screenPixel = StageActivity.stageListener.getPixels(0, 0, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, 0, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); solo.goBack(); solo.clickOnView(solo.getView(R.id.stage_dialog_button_maximize)); solo.goBack(); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); assertTrue("Stage not resizeable.", ((StageActivity) solo.getCurrentActivity()).getResizePossible()); screenPixel = StageActivity.stageListener.getPixels(0, 0, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH - 1, 0, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(0, ScreenValues.SCREEN_HEIGHT - 1, 1, 1); UiTestUtils.compareByteArrays(blackPixel, screenPixel); screenPixel = StageActivity.stageListener.getPixels(ScreenValues.SCREEN_WIDTH / 2, ScreenValues.SCREEN_HEIGHT / 2, 1, 1); UiTestUtils.compareByteArrays(whitePixel, screenPixel); } public void testMaximizeStretchRememeberSetting() { Project project = createTestProject(testProject); project.getXmlHeader().virtualScreenWidth = 480; project.getXmlHeader().virtualScreenHeight = 700; project.setDeviceData(getActivity()); StorageHandler.getInstance().saveProject(project); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.waitForFragmentById(R.id.fragment_container); assertTrue("Cannot click project.", UiTestUtils.clickOnTextInList(solo, testProject)); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UtilUi.updateScreenWidthAndHeight(getActivity()); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); assertTrue("Stage not resizeable.", ((StageActivity) solo.getCurrentActivity()).getResizePossible()); solo.sleep(200); solo.goBack(); solo.clickOnView(solo.getView(R.id.stage_dialog_button_continue)); solo.sleep(200); solo.goBack(); solo.goBack(); StorageHandler.getInstance().saveProject(project); solo.sleep(200); assertTrue("Wrong screenMode in xml-file.", ProjectManager.getInstance().getCurrentProject().getScreenMode() == ScreenModes.STRETCH); UiTestUtils.clickOnBottomBar(solo, R.id.button_play); solo.waitForActivity(StageActivity.class.getSimpleName()); solo.sleep(200); solo.goBack(); solo.clickOnView(solo.getView(R.id.stage_dialog_button_maximize)); solo.clickOnView(solo.getView(R.id.stage_dialog_button_continue)); solo.sleep(200); solo.goBack(); solo.goBack(); assertTrue("Wrong screenMode in xml-file.", ProjectManager.getInstance().getCurrentProject().getScreenMode() == ScreenModes.MAXIMIZE); } private Project createTestProject(String projectName) { Project project = new Project(getActivity(), projectName); Sprite firstSprite = new SingleSprite("cat"); Sprite secondSprite = new SingleSprite("dog"); Sprite thirdSprite = new SingleSprite("horse"); Sprite fourthSprite = new SingleSprite("pig"); project.getDefaultScene().addSprite(firstSprite); project.getDefaultScene().addSprite(secondSprite); project.getDefaultScene().addSprite(thirdSprite); project.getDefaultScene().addSprite(fourthSprite); return project; } private Project createAndSaveTestProject(String projectName) { Project project = createTestProject(projectName); StorageHandler.getInstance().saveProject(project); return project; } @SuppressWarnings("unchecked") private List<MediaPlayer> getMediaPlayers() { return (List<MediaPlayer>) Reflection.getPrivateField(SoundManager.getInstance(), "mediaPlayers"); } }