/* * 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.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.preference.PreferenceManager; import android.util.Log; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import com.robotium.solo.Solo; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.common.Constants; import org.catrobat.catroid.common.DefaultProjectHandler; 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.ComeToFrontBrick; import org.catrobat.catroid.content.bricks.HideBrick; import org.catrobat.catroid.content.bricks.PlaceAtBrick; import org.catrobat.catroid.content.bricks.SetLookBrick; import org.catrobat.catroid.content.bricks.SetSizeToBrick; import org.catrobat.catroid.content.bricks.ShowBrick; import org.catrobat.catroid.exceptions.CompatibilityProjectException; import org.catrobat.catroid.exceptions.ProjectException; import org.catrobat.catroid.io.StorageHandler; 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.UtilFile; import org.catrobat.catroid.utils.Utils; import java.io.File; import java.io.IOException; public class MainMenuActivityTest extends BaseActivityInstrumentationTestCase<MainMenuActivity> { private static final String TAG = MainMenuActivityTest.class.getSimpleName(); private String testProject = UiTestUtils.PROJECTNAME1; private String testProject2 = UiTestUtils.PROJECTNAME2; private String testProject3 = UiTestUtils.PROJECTNAME3; private String projectNameWithNormalAndSpecialChars = UiTestUtils.NORMAL_AND_SPECIAL_CHAR_PROJECT_NAME; private String projectNameWithNormalAndSpecialChars2 = UiTestUtils.NORMAL_AND_SPECIAL_CHAR_PROJECT_NAME2; private String projectNameJustSpecialChars = UiTestUtils.JUST_SPECIAL_CHAR_PROJECT_NAME; private String projectNameJustSpecialChars2 = UiTestUtils.JUST_SPECIAL_CHAR_PROJECT_NAME2; private String projectNameJustOneDot = UiTestUtils.JUST_ONE_DOT_PROJECT_NAME; private String projectNameJustTwoDots = UiTestUtils.JUST_TWO_DOTS_PROJECT_NAME; private static final float CATROBAT_LANGUAGE_VERSION_TOO_LOW = 0.0f; public MainMenuActivityTest() { super(MainMenuActivity.class); } @Override public void tearDown() throws Exception { UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameWithNormalAndSpecialChars))); UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameWithNormalAndSpecialChars2))); UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameJustSpecialChars))); UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameJustSpecialChars2))); UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameJustOneDot))); UtilFile.deleteDirectory(new File(Utils.buildProjectPath(projectNameJustTwoDots))); super.tearDown(); } public void testCreateNewProject() { File directory = new File(Constants.DEFAULT_ROOT + "/" + testProject); UtilFile.deleteDirectory(directory); assertFalse("testProject was not deleted!", directory.exists()); String hintNewProjectText = solo.getString(R.string.new_project_dialog_hint); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.waitForText(hintNewProjectText); EditText addNewProjectEditText = solo.getEditText(0); //check if hint is set assertEquals("Not the proper hint set", hintNewProjectText, addNewProjectEditText.getHint()); assertEquals("There should no text be set", "", addNewProjectEditText.getText().toString()); solo.clearEditText(0); solo.enterText(0, testProject); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Constants.DEFAULT_ROOT + "/" + testProject + "/" + Constants.PROJECTCODE_NAME); assertTrue(testProject + " was not created!", file.exists()); solo.goBack(); assertFalse("New project dialog shouldn't show up again!", solo.searchText(solo.getString(R.string.new_project_dialog_title))); } public void testCreateNewProjectErrors() { solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, ""); Button okButton = solo.getButton(getActivity().getString(R.string.ok)); assertFalse("New project ok button is enabled!", okButton.isEnabled()); solo.clickOnButton(getActivity().getString(R.string.ok)); File directory = new File(Constants.DEFAULT_ROOT + "/" + testProject); directory.mkdirs(); solo.sleep(50); solo.clearEditText(0); solo.enterText(0, testProject); solo.clickOnButton(getActivity().getString(R.string.ok)); assertTrue("No error message was displayed upon creating a project with the same name twice.", solo.searchText(solo.getString(R.string.error_project_exists))); solo.clickOnButton(0); directory = new File(Utils.buildProjectPath(projectNameWithNormalAndSpecialChars2 + "_TWO")); directory.mkdirs(); String name = projectNameWithNormalAndSpecialChars2 + "_TWO"; solo.sleep(50); solo.clearEditText(0); solo.enterText(0, name); solo.clickOnButton(getActivity().getString(R.string.ok)); assertTrue("No error message was displayed upon creating a project with the same name twice.", solo.searchText(solo.getString(R.string.error_project_exists))); solo.clickOnButton(solo.getString(R.string.close)); UtilFile.deleteDirectory(directory); } public void testCreateNewProjectWithNormalAndSpecialChars() { String directoryPath = Utils.buildProjectPath(projectNameWithNormalAndSpecialChars); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameWithNormalAndSpecialChars); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file with normal and special characters was not created!", file.exists()); } public void testCreateNewProjectsWithNormalAndSpecialCharsTwo() { String directoryPath = Utils.buildProjectPath(projectNameWithNormalAndSpecialChars2); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameWithNormalAndSpecialChars2); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file with special characters two was not created!", file.exists()); } public void testCreateNewProjectsJustSpecialChars() { String directoryPath = Utils.buildProjectPath(projectNameJustSpecialChars); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameJustSpecialChars); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file with just special characters was not created!", file.exists()); } public void testCreateNewProjectsJustSpecialCharsTwo() { String directoryPath = Utils.buildProjectPath(projectNameJustSpecialChars2); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameJustSpecialChars2); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file with just special characters two was not created!", file.exists()); } public void testCreateNewProjectJustOneDot() { String directoryPath = Utils.buildProjectPath(projectNameJustOneDot); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameJustOneDot); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file just one dot was not created!", file.exists()); } public void testCreateNewProjectJustTwoDots() { String directoryPath = Utils.buildProjectPath(projectNameJustTwoDots); File directory = new File(directoryPath); UtilFile.deleteDirectory(directory); solo.clickOnButton(solo.getString(R.string.main_menu_new)); solo.clearEditText(0); solo.enterText(0, projectNameJustTwoDots); String buttonOKText = solo.getString(R.string.ok); solo.waitForText(buttonOKText); solo.clickOnText(buttonOKText); assertTrue("dialog not loaded in 5 seconds", solo.waitForText(solo.getString(R.string.project_orientation_title), 0, 5000)); solo.clickOnButton(buttonOKText); solo.waitForActivity(ProjectActivity.class.getSimpleName()); File file = new File(Utils.buildPath(directoryPath, Constants.PROJECTCODE_NAME)); assertTrue("Project file just two dots was not created!", file.exists()); } public void testOrientation() throws NameNotFoundException { /// Method 1: Assert it is currently in portrait mode. assertEquals("MainMenuActivity not in Portrait mode!", Configuration.ORIENTATION_PORTRAIT, getActivity() .getResources().getConfiguration().orientation); /// Method 2: Retrieve info about Activity as collected from AndroidManifest.xml // https://developer.android.com/reference/android/content/pm/ActivityInfo.html PackageManager packageManager = getActivity().getPackageManager(); ActivityInfo activityInfo = packageManager.getActivityInfo(getActivity().getComponentName(), PackageManager.GET_META_DATA); // Note that the activity is _indeed_ rotated on your device/emulator! // Robotium can _force_ the activity to be in landscapeMode mode (and so could we, programmatically) solo.setActivityOrientation(Solo.LANDSCAPE); assertEquals(MainMenuActivity.class.getSimpleName() + " not set to be in portrait mode in AndroidManifest.xml!", ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, activityInfo.screenOrientation); } public void testBottombarElementsVisibilty() { assertFalse("Add button is visible", solo.searchButton(solo.getString(R.id.button_add))); assertFalse("Play button is visible", solo.searchButton(solo.getString(R.id.button_play))); } public void testLoadProject() { File directory = new File(Constants.DEFAULT_ROOT + "/" + testProject2); UtilFile.deleteDirectory(directory); assertFalse(testProject2 + " was not deleted!", directory.exists()); createTestProject(testProject2); solo.sleep(200); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); assertTrue("MyProjectsActivity not shown", solo.waitForActivity(MyProjectsActivity.class.getSimpleName())); solo.clickOnText(testProject2); assertTrue("ProjectActivity not shown", solo.waitForActivity(ProjectActivity.class.getSimpleName())); assertTrue("SpritesListFragment not shown", solo.waitForFragmentById(R.id.fragment_container)); ListView spritesList = (ListView) solo.getCurrentActivity().findViewById(android.R.id.list); Sprite first = (Sprite) spritesList.getItemAtPosition(1); assertEquals("Sprite at index 1 is not \"cat\"!", "cat", first.getName()); Sprite second = (Sprite) spritesList.getItemAtPosition(2); assertEquals("Sprite at index 2 is not \"dog\"!", "dog", second.getName()); Sprite third = (Sprite) spritesList.getItemAtPosition(3); assertEquals("Sprite at index 3 is not \"horse\"!", "horse", third.getName()); Sprite fourth = (Sprite) spritesList.getItemAtPosition(4); assertEquals("Sprite at index 4 is not \"pig\"!", "pig", fourth.getName()); } public void testResume() { File directory = new File(Constants.DEFAULT_ROOT + "/" + testProject3); UtilFile.deleteDirectory(directory); assertFalse(testProject3 + " was not deleted!", directory.exists()); createTestProject(testProject3); solo.sleep(200); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); assertTrue("MyProjectsActivity not shown", solo.waitForActivity(MyProjectsActivity.class.getSimpleName())); solo.clickOnText(testProject3); assertTrue("ProjectActivity not shown", solo.waitForActivity(ProjectActivity.class.getSimpleName())); solo.goBack(); assertTrue("MyProjectsActivity not shown", solo.waitForActivity(MyProjectsActivity.class.getSimpleName())); solo.goBack(); assertTrue("MainMenuActivity not shown", solo.waitForActivity(MainMenuActivity.class.getSimpleName())); solo.clickOnText(solo.getString(R.string.main_menu_continue)); assertTrue("ProjectActivity not shown", solo.waitForActivity(ProjectActivity.class.getSimpleName())); ListView spritesList = (ListView) solo.getCurrentActivity().findViewById(android.R.id.list); Sprite first = (Sprite) spritesList.getItemAtPosition(1); assertEquals("Sprite at index 1 is not \"cat\"!", "cat", first.getName()); Sprite second = (Sprite) spritesList.getItemAtPosition(2); assertEquals("Sprite at index 2 is not \"dog\"!", "dog", second.getName()); Sprite third = (Sprite) spritesList.getItemAtPosition(3); assertEquals("Sprite at index 3 is not \"horse\"!", "horse", third.getName()); Sprite fourth = (Sprite) spritesList.getItemAtPosition(4); assertEquals("Sprite at index 4 is not \"pig\"!", "pig", fourth.getName()); } public void testRateAppMenuExists() { solo.sendKey(Solo.MENU); assertTrue("App rating menu not found in overflow menu!", solo.searchText(solo.getString(R.string.main_menu_rate_app))); solo.goBack(); } public void testScratchConverterMenuExists() { solo.sendKey(Solo.MENU); assertTrue("Scratch Converter menu item not found in overflow menu!", solo.searchText(solo.getString(R.string.main_menu_scratch_converter))); solo.goBack(); } public void testShouldDisplayDialogIfVersionNumberTooLow() throws Throwable { solo.waitForActivity(MainMenuActivity.class.getSimpleName()); boolean result = UiTestUtils .createTestProjectOnLocalStorageWithCatrobatLanguageVersion(CATROBAT_LANGUAGE_VERSION_TOO_LOW); assertTrue("Could not create test project.", result); runTestOnUiThread(new Runnable() { public void run() { try { ProjectManager.getInstance().loadProject(UiTestUtils.DEFAULT_TEST_PROJECT_NAME, getActivity()); fail("Load project didn't fail"); } catch (CompatibilityProjectException compatibilityException) { Utils.showErrorDialog(getActivity(), R.string.error_project_compatability); } catch (ProjectException projectException) { fail("Incompatible project not identified"); } } }); solo.getText(solo.getString(R.string.error_project_compatability), true); solo.clickOnButton(0); solo.waitForDialogToClose(500); } public void createTestProject(String projectName) { int xPosition = 457; int yPosition = 598; double size = 0.8; 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"); Script testScript = new StartScript(); Script otherScript = new StartScript(); HideBrick hideBrick = new HideBrick(); ShowBrick showBrick = new ShowBrick(); SetSizeToBrick setSizeToBrick = new SetSizeToBrick(size); ComeToFrontBrick comeToFrontBrick = new ComeToFrontBrick(); PlaceAtBrick placeAtBrick = new PlaceAtBrick(xPosition, yPosition); // adding Bricks: ---------------- testScript.addBrick(hideBrick); testScript.addBrick(showBrick); testScript.addBrick(setSizeToBrick); testScript.addBrick(comeToFrontBrick); otherScript.addBrick(placeAtBrick); // secondSprite // ------------------------------- firstSprite.addScript(testScript); secondSprite.addScript(otherScript); project.getDefaultScene().addSprite(firstSprite); project.getDefaultScene().addSprite(secondSprite); project.getDefaultScene().addSprite(thirdSprite); project.getDefaultScene().addSprite(fourthSprite); ProjectManager.getInstance().setProject(project); StorageHandler.getInstance().saveProject(project); } public void testOverrideMyFirstProject() { String standardProjectName = solo.getString(R.string.default_project_name); File directory = new File(Constants.DEFAULT_ROOT + "/" + standardProjectName); UtilFile.deleteDirectory(directory); assertFalse(standardProjectName + " was not deleted!", directory.exists()); Project standardProject = null; try { standardProject = DefaultProjectHandler.createAndSaveDefaultProject(standardProjectName, getInstrumentation().getTargetContext()); } catch (IOException e) { fail("Could not create standard project " + standardProjectName); Log.e(TAG, "Could not create standard Project: " + Log.getStackTraceString(e)); } if (standardProject == null) { fail("Could not create standard project"); } ProjectManager.getInstance().setProject(standardProject); StorageHandler.getInstance().saveProject(standardProject); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); solo.sleep(300); solo.clickOnButton(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); Sprite backgroundSprite = standardProject.getDefaultScene().getSpriteList().get(0); Script startingScript = backgroundSprite.getScript(0); assertEquals("Number of bricks in background sprite was wrong", 7, backgroundSprite.getNumberOfBricks()); startingScript.addBrick(new SetLookBrick()); startingScript.addBrick(new SetLookBrick()); startingScript.addBrick(new SetLookBrick()); assertEquals("Number of bricks in background sprite was wrong after adding three new bricks", 10, backgroundSprite.getNumberOfBricks()); ProjectManager.getInstance().setCurrentSprite(backgroundSprite); ProjectManager.getInstance().setCurrentScript(startingScript); StorageHandler.getInstance().saveProject(standardProject); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); solo.sleep(300); SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getInstrumentation() .getTargetContext()); assertEquals("Standard project was not set in shared preferences", standardProjectName, defaultSharedPreferences.getString(Constants.PREF_PROJECTNAME_KEY, null)); Utils.saveToPreferences(getInstrumentation().getTargetContext(), Constants.PREF_PROJECTNAME_KEY, null); assertEquals("Standard project was not reset to null in shared preferences", null, defaultSharedPreferences.getString(Constants.PREF_PROJECTNAME_KEY, null)); Intent intent = new Intent(solo.getCurrentActivity(), ProjectActivity.class); ProjectManager.getInstance().setProject(null); solo.getCurrentActivity().startActivity(intent); solo.waitForActivity(ProjectActivity.class.getSimpleName()); UiTestUtils.waitForText(solo, solo.getString(R.string.default_project_background_name)); assertEquals("Number of bricks in background sprite was wrong - standard project was overwritten", 10, ProjectManager.getInstance().getCurrentProject().getDefaultScene().getSpriteList().get(0).getNumberOfBricks()); } public void testProjectNameVisible() { createTestProject(testProject); createTestProject(testProject2); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); UiTestUtils.clickOnExactText(solo, testProject); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); assertTrue("The name of the current testProject is not displayed on the continue button", solo.getButton(0) .getText().toString().endsWith(testProject)); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.clickOnText(testProject2, 1, true); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); assertTrue("The name of the current testProject2 is not displayed on the continue button", solo.getButton(0) .getText().toString().endsWith(testProject2)); } public void testProjectNameWithNormalAndSpecialCharsVisible() { createTestProject(projectNameJustSpecialChars); createTestProject(projectNameWithNormalAndSpecialChars2); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); UiTestUtils.clickOnExactText(solo, projectNameJustSpecialChars); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); assertTrue("The name of the current projectNameJustSpecialChars is not displayed on the continue button", solo .getButton(0).getText().toString().endsWith(projectNameJustSpecialChars)); assertTrue("The name of the current projectNameJustSpecialChars is not displayed on the continue button", solo.searchText(projectNameJustSpecialChars)); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); UiTestUtils.clickOnExactText(solo, projectNameWithNormalAndSpecialChars2); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); assertTrue( "The name of the current projectNameWithNormalAndSpecialChars2 is not displayed on the continue button", solo.getButton(0).getText().toString().endsWith(projectNameWithNormalAndSpecialChars2)); } public void testProjectNameWithDotsVisible() { createTestProject(projectNameJustOneDot); createTestProject(projectNameJustTwoDots); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); UiTestUtils.clickOnExactText(solo, projectNameJustOneDot); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); solo.sleep(800); assertTrue("The name of the current projectNameJustOneDot is not displayed on the continue button", solo .getButton(0).getText().toString().endsWith(projectNameJustOneDot)); solo.sleep(400); assertTrue("The name of the current projectNameJustOneDot is not displayed on the continue button", solo.searchText(projectNameJustOneDot)); solo.clickOnText(solo.getString(R.string.main_menu_programs)); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); UiTestUtils.clickOnExactText(solo, projectNameJustTwoDots); solo.waitForFragmentById(R.id.fragment_container); solo.goBack(); solo.waitForActivity(MyProjectsActivity.class.getSimpleName()); solo.goBack(); solo.waitForActivity(MainMenuActivity.class.getSimpleName()); solo.sleep(800); assertTrue("The name of the current projectNameJustTwoDots is not displayed on the continue button", solo .getButton(0).getText().toString().endsWith(projectNameJustTwoDots)); } }