/* * 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.activity; import android.app.Activity; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.ActivityInstrumentationTestCase2; import android.view.View; import android.widget.AdapterView.OnItemClickListener; import com.robotium.solo.Solo; import junit.framework.TestSuite; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.common.Constants; import org.catrobat.catroid.common.LookData; 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.ProgramMenuActivity; import org.catrobat.catroid.ui.ProjectActivity; import org.catrobat.catroid.ui.ScriptActivity; import org.catrobat.catroid.ui.adapter.BrickAdapter; import org.catrobat.catroid.ui.dialogs.NewProjectDialog; import org.catrobat.catroid.ui.dialogs.NewSpriteDialog; import org.catrobat.catroid.ui.dialogs.SignInDialog; import org.catrobat.catroid.ui.fragment.BrickCategoryFragment; import org.catrobat.catroid.ui.fragment.LookFragment; import org.catrobat.catroid.ui.fragment.ScriptFragment; import org.catrobat.catroid.ui.fragment.SoundFragment; import org.catrobat.catroid.uitest.util.UiTestUtils; import java.io.File; import java.util.List; public class DoubleClickOpensViewOnceTest extends TestSuite { private static final int SOLO_WAIT_FOR_VIEW_TIMEOUT = 3000; public static TestSuite suite() { TestSuite suite = new TestSuite(DoubleClickOpensViewOnceTest.class.getName()); suite.addTestSuite(MainMenuDoubleClickOpensViewOnceTest.class); suite.addTestSuite(MyProjectsDoubleClickOpensViewOnceTest.class); suite.addTestSuite(ProgramMenuActivityDoubleClickOpensViewOnceTest.class); suite.addTestSuite(ProjectActivityDoubleClickOpensViewOnceTest.class); suite.addTestSuite(ScriptActivityDoubleClickOpensViewOnceTest.class); suite.addTestSuite(ScriptFragmentDoubleClickOpensViewOnceTest.class); suite.addTestSuite(LookFragmentDoubleClickOpensViewOnceTest.class); return suite; } private abstract static class OnClickCommand { public void runOnUiThread(Activity activity) { activity.runOnUiThread(new Runnable() { public void run() { OnClickCommand.this.execute(); } }); } protected abstract void execute(); } private static class ActivityInstrumentationTestBase<T extends Activity> extends ActivityInstrumentationTestCase2<T> { public Solo solo; public ActivityInstrumentationTestBase(Class<T> clazz) { super(clazz); } @Override public void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); prefs.edit().putString(Constants.TOKEN, "0").commit(); } @Override public void tearDown() throws Exception { solo.finishOpenedActivities(); super.tearDown(); solo = null; } public void checkDoubleClickOpensViewOnce(OnClickCommand clickCommand, int buttonId, int openedViewId) { checkDoubleClickOpensViewOnce(clickCommand, buttonId, openedViewId, false); } public void checkDoubleClickOpensViewOnce(OnClickCommand clickCommand, int buttonId, int openedViewId, boolean isKeyboardVisible) { View button = findView(buttonId); simulateDoubleClick(clickCommand); waitForView(openedViewId); goBack(isKeyboardVisible); waitForView(button); } public void checkDoubleClickOpensViewOnceFragment(OnClickCommand clickCommand, int buttonId, String openedFragmentTag) { checkDoubleClickOpensViewOnceFragment(clickCommand, buttonId, openedFragmentTag, false); } public void checkDoubleClickOpensViewOnceFragment(OnClickCommand clickCommand, int buttonId, String openedFragmentTag, boolean isKeyboardVisible) { View button = findView(buttonId); simulateDoubleClick(clickCommand); waitForFragment(openedFragmentTag); goBack(isKeyboardVisible); waitForView(button); } public void checkDoubleClickOpensViewOnceActivity(OnClickCommand clickCommand, int buttonId, String openedActivityTag) { checkDoubleClickOpensViewOnceActivity(clickCommand, buttonId, openedActivityTag, false); } public void checkDoubleClickOpensViewOnceActivity(OnClickCommand clickCommand, int buttonId, String openedActivityTag, boolean isKeyboardVisible) { View button = findView(buttonId); simulateDoubleClick(clickCommand); waitForActivity(openedActivityTag); goBack(isKeyboardVisible); waitForView(button); } public void checkDoubleClickOpensViewOnce(OnClickCommand clickCommand, int buttonId, String text) { checkDoubleClickOpensViewOnce(clickCommand, buttonId, text, false); } public void checkDoubleClickOpensViewOnce(OnClickCommand clickCommand, int buttonId, String text, boolean isKeyboardVisible) { View button = findView(buttonId); simulateDoubleClick(clickCommand); waitForText(text); goBack(isKeyboardVisible); waitForView(button); } private View findView(int id) { View button = solo.getCurrentActivity().findViewById(id); assertNotNull("Button not found", button); return button; } private void simulateDoubleClick(OnClickCommand clickCommand) { Activity activity = solo.getCurrentActivity(); clickCommand.runOnUiThread(activity); clickCommand.runOnUiThread(activity); } private void goBack(boolean isKeyboardVisible) { solo.goBack(); if (isKeyboardVisible) { solo.goBack(); } } private void waitForView(int id) { if (!solo.waitForFragmentById(id, SOLO_WAIT_FOR_VIEW_TIMEOUT)) { fail("Couldn't find opened view after clicking on button"); } } private void waitForFragment(String tag) { if (!solo.waitForFragmentByTag(tag, SOLO_WAIT_FOR_VIEW_TIMEOUT)) { fail("Couldn't find opened view after clicking on button"); } } private void waitForActivity(String tag) { if (!solo.waitForActivity(tag, SOLO_WAIT_FOR_VIEW_TIMEOUT)) { fail("Couldn't find opened view after clicking on button"); } } private void waitForView(View view) { if (!solo.waitForView(view, SOLO_WAIT_FOR_VIEW_TIMEOUT, true)) { fail("Didn't return to view which contains the button (" + solo.getCurrentViews() + ")"); } if (!solo.getCurrentActivity().hasWindowFocus()) { fail("Activity didn't gain focus"); } } private void waitForText(String text) { if (!solo.waitForText(text)) { fail("Didn't find text " + text); } } } public static class MainMenuDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<MainMenuActivity> { private MainMenuActivity activity; public MainMenuDoubleClickOpensViewOnceTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { super.setUp(); activity = (MainMenuActivity) solo.getCurrentActivity(); } @Override public void tearDown() throws Exception { super.tearDown(); activity = null; } public void testMainMenuButtonContinue() { checkDoubleClickOpensViewOnce(new OnClickCommand() { @Override public void execute() { activity.handleContinueButton(); } }, R.id.main_menu_button_continue, R.id.fragment_container); } public void testMainMenuButtonNew() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleNewButton(null); } }, R.id.main_menu_button_new, NewProjectDialog.DIALOG_FRAGMENT_TAG, true); } public void testMainMenuButtonMyProjects() { checkDoubleClickOpensViewOnce(new OnClickCommand() { @Override public void execute() { activity.handleProgramsButton(null); } }, R.id.main_menu_button_programs, R.id.fragment_container); } public void testMainMenuButtonUpload() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleUploadButton(null); } }, R.id.main_menu_button_upload, SignInDialog.DIALOG_FRAGMENT_TAG, true); } } public static class MyProjectsDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<MyProjectsActivity> { private MyProjectsActivity activity; public MyProjectsDoubleClickOpensViewOnceTest() { super(MyProjectsActivity.class); } @Override public void setUp() throws Exception { super.setUp(); activity = (MyProjectsActivity) solo.getCurrentActivity(); } @Override public void tearDown() throws Exception { super.tearDown(); activity = null; } public void testMyProjectsAddButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleAddButton(null); } }, R.id.button_add, NewProjectDialog.DIALOG_FRAGMENT_TAG, true); } } public static class ProgramMenuActivityDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<ProgramMenuActivity> { private ProgramMenuActivity activity; public ProgramMenuActivityDoubleClickOpensViewOnceTest() { super(ProgramMenuActivity.class); } @Override public void setUp() throws Exception { UiTestUtils.createTestProject(); super.setUp(); activity = (ProgramMenuActivity) solo.getCurrentActivity(); } @Override public void tearDown() throws Exception { super.tearDown(); UiTestUtils.clearAllUtilTestProjects(); activity = null; } public void testProgramMenuPlayButton() { checkDoubleClickOpensViewOnceActivity(new OnClickCommand() { @Override public void execute() { activity.handlePlayButton(null); } }, R.id.button_play, StageActivity.TAG, true); } public void testProgramMenuScriptsButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleScriptsButton(null); } }, R.id.program_menu_button_scripts, ScriptFragment.TAG); } public void testProgramMenuLooksButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleLooksButton(null); } }, R.id.program_menu_button_looks, LookFragment.TAG); } public void testProgramMenuSoundsButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleSoundsButton(null); } }, R.id.program_menu_button_sounds, SoundFragment.TAG); } } public static class ProjectActivityDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<ProjectActivity> { private ProjectActivity activity; public ProjectActivityDoubleClickOpensViewOnceTest() { super(ProjectActivity.class); } @Override public void setUp() throws Exception { UiTestUtils.createTestProject(); super.setUp(); activity = (ProjectActivity) solo.getCurrentActivity(); } @Override public void tearDown() throws Exception { super.tearDown(); UiTestUtils.clearAllUtilTestProjects(); activity = null; } public void testProjectAddButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleAddButton(null); } }, R.id.button_add, NewSpriteDialog.DIALOG_FRAGMENT_TAG, true); } public void testProjectPlayButton() { checkDoubleClickOpensViewOnceActivity(new OnClickCommand() { @Override public void execute() { activity.handlePlayButton(null); } }, R.id.button_play, StageActivity.TAG, true); } } public static class ScriptActivityDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<ScriptActivity> { private ScriptActivity activity; public ScriptActivityDoubleClickOpensViewOnceTest() { super(ScriptActivity.class); } @Override public void setUp() throws Exception { UiTestUtils.createTestProject(); super.setUp(); activity = (ScriptActivity) solo.getCurrentActivity(); } @Override public void tearDown() throws Exception { super.tearDown(); UiTestUtils.clearAllUtilTestProjects(); activity = null; } public void testProjectAddButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { activity.handleAddButton(null); } }, R.id.button_add, ScriptFragment.TAG); } public void testProjectPlayButton() { checkDoubleClickOpensViewOnceActivity(new OnClickCommand() { @Override public void execute() { activity.handlePlayButton(null); } }, R.id.button_play, StageActivity.TAG, true); } } public static class ScriptFragmentDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<MainMenuActivity> { private ScriptFragment fragment; public ScriptFragmentDoubleClickOpensViewOnceTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { UiTestUtils.createTestProject(); super.setUp(); UiTestUtils.getIntoScriptActivityFromMainMenu(solo); fragment = (ScriptFragment) Reflection.getPrivateField(solo.getCurrentActivity(), "currentFragment"); } @Override public void tearDown() throws Exception { super.tearDown(); UiTestUtils.clearAllUtilTestProjects(); fragment = null; } public void testScriptFragmentAddButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { fragment.handleAddButton(); } }, R.id.fragment_container, ScriptFragment.TAG); } public void testBrickAdapterOnItemClick() { final View brickView = solo.getView(R.id.brick_hide_layout); ScriptActivity activity = (ScriptActivity) solo.getCurrentActivity(); ScriptFragment scriptFragment = (ScriptFragment) activity.getFragment(ScriptActivity.FRAGMENT_SCRIPTS); final BrickAdapter brickAdapter = scriptFragment.getAdapter(); checkDoubleClickOpensViewOnce(new OnClickCommand() { @Override protected void execute() { brickAdapter.onClick(brickView); } }, R.id.brick_hide_layout, getActivity().getApplicationContext().getText(R.string.brick_context_dialog_delete_brick).toString()); } public void testBrickCategoryFragmentOnItemClick() { View addButton = solo.getView(R.id.button_add); solo.clickOnView(addButton); solo.waitForFragmentByTag(BrickCategoryFragment.BRICK_CATEGORY_FRAGMENT_TAG); ScriptActivity activity = (ScriptActivity) solo.getCurrentActivity(); BrickCategoryFragment brickCategoryFragment = (BrickCategoryFragment) activity.getFragmentManager() .findFragmentByTag(BrickCategoryFragment.BRICK_CATEGORY_FRAGMENT_TAG); solo.sleep(250); final OnItemClickListener onItemClickListener = brickCategoryFragment.getListView() .getOnItemClickListener(); checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override protected void execute() { onItemClickListener.onItemClick(null, null, 0, 0); } }, brickCategoryFragment.getId(), BrickCategoryFragment.BRICK_CATEGORY_FRAGMENT_TAG); } } public static class LookFragmentDoubleClickOpensViewOnceTest extends ActivityInstrumentationTestBase<MainMenuActivity> { private static final int RESOURCE_IMAGE = org.catrobat.catroid.test.R.drawable.catroid_sunglasses; private static final String FIRST_TEST_LOOK_NAME = "lookNameTest"; private LookFragment fragment; public LookFragmentDoubleClickOpensViewOnceTest() { super(MainMenuActivity.class); } @Override public void setUp() throws Exception { UiTestUtils.createTestProject(); File imageFile = UiTestUtils.saveFileToProject(UiTestUtils.DEFAULT_TEST_PROJECT_NAME, ProjectManager.getInstance().getCurrentScene().getName(), "catroid_sunglasses.png", RESOURCE_IMAGE, getInstrumentation().getContext(), UiTestUtils.FileTypes.IMAGE); List<LookData> lookDataList = ProjectManager.getInstance().getCurrentSprite().getLookDataList(); LookData lookData = new LookData(); lookData.setLookFilename(imageFile.getName()); lookData.setLookName(FIRST_TEST_LOOK_NAME); lookDataList.add(lookData); super.setUp(); UiTestUtils.getIntoLooksFromMainMenu(solo, true); fragment = (LookFragment) Reflection.getPrivateField(solo.getCurrentActivity(), "currentFragment"); } @Override public void tearDown() throws Exception { super.tearDown(); UiTestUtils.clearAllUtilTestProjects(); fragment = null; } public void testLookFragmentAddButton() { checkDoubleClickOpensViewOnceFragment(new OnClickCommand() { @Override public void execute() { fragment.handleAddButton(); } }, R.id.fragment_container, LookFragment.TAG); } } }