import ca.ualberta.cs.cmput301t03app.R; import ca.ualberta.cs.cmput301t03app.adapters.MainListAdapter; import ca.ualberta.cs.cmput301t03app.controllers.PostController; import ca.ualberta.cs.cmput301t03app.datamanagers.ServerDataManager; import ca.ualberta.cs.cmput301t03app.models.Question; import ca.ualberta.cs.cmput301t03app.views.MainActivity; import ca.ualberta.cs.cmput301t03app.views.ViewQuestion; import android.app.AlertDialog; import android.app.Instrumentation; import android.app.Instrumentation.ActivityMonitor; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.test.ActivityInstrumentationTestCase2; import android.test.UiThreadTest; import android.test.ViewAsserts; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; /** * This tests the MainActivity User Interface * it uses the buttons and views to add questions and view questions. * @category Integration/System Testing */ public class MainActivityUITest extends ActivityInstrumentationTestCase2<MainActivity>{ Instrumentation instrumentation; MainActivity activity; ListView listview; ActivityMonitor monitor; //this monitors any newly opened activities public MainActivityUITest() { super(MainActivity.class); } /** * This sets up all the required fields for this test */ public void setUp() throws Exception{ super.setUp(); this.activity = (MainActivity) getActivity(); this.instrumentation = getInstrumentation(); this.listview = ((ListView) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_list)); } /** * Testing to see if dialog box pops up and is visible on the screen * when the "Ask question" button is clicked. * */ @UiThreadTest public void testmakeQuestionDialogBox(){ assertNotNull(activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button));//making sure that button is visible on screen ((Button) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)).performClick(); AlertDialog dialog = activity.getDialog(); // I create getLastDialog method in MyActivity class. Its return last created AlertDialog assertTrue("The dialog is not showing up when button is clicked",dialog.isShowing()); } /**Testing that when the dialog pops up to add a question * and you enter information, but click cancel there should be * no added question to the listView * @throws InterruptedException * */ public void testAddnoQuestion() throws InterruptedException{ //testing if clicking cancel works if adding a question activity = (MainActivity) getActivity(); assertNotNull("The button is null when returned",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); MainListAdapter adapter = activity.getAdapter(); Thread.sleep(2000); int oldCount = adapter.getCount(); getInstrumentation().runOnMainSync(new Runnable(){ //clicking on an item automatically @Override public void run() { assertNotNull("the button is null when returned",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); ((Button) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)).performClick(); AlertDialog dialog = activity.getDialog(); //grabbing the dialog box that opens up when button clicked EditText questionTitle = (EditText) //grabbing all edit texts in teh dialog box dialog.findViewById(R.id.questionTitle); EditText questionBody = (EditText) dialog.findViewById(R.id.questionBody); EditText userName = (EditText) dialog.findViewById(R.id.UsernameRespondTextView); questionTitle.setText("This is a test question title that should not show up"); //setting them up with arguments questionBody.setText("This is a test question body that should not show up"); userName.setText("me"); dialog.getButton( DialogInterface.BUTTON_NEGATIVE).performClick(); } }); instrumentation.waitForIdleSync(); MainListAdapter adapter1 = activity.getAdapter(); int newCount = adapter1.getCount(); assertEquals("The question was added to the list and shouldn't have been", oldCount, newCount); } /** * Testing adding 2 Questions * at a time will not break the adapter * @throws InterruptedException */ public void testAdd1Question() throws InterruptedException{ //testing if adding 1 question works activity = (MainActivity) getActivity(); assertNotNull("button not null",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); Thread.sleep(50000); MainListAdapter adapter = activity.getAdapter(); int oldCount = adapter.getCount(); getInstrumentation().runOnMainSync(new Runnable(){ //clicking on an item automatically @Override public void run() { assertNotNull("The button returned null when called",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); ((Button) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)).performClick(); AlertDialog dialog = activity.getDialog(); //grabbing the dialog box that opens up when button clicked EditText questionTitle = (EditText) //grabbing all edit texts in teh dialog box dialog.findViewById(R.id.questionTitle); EditText questionBody = (EditText) dialog.findViewById(R.id.questionBody); EditText userName = (EditText) dialog.findViewById(R.id.UsernameRespondTextView); questionTitle.setText("This is a test question title when a question should be added"); //setting them up with arguments questionBody.setText("This is a test question body when a question should be added"); userName.setText("me"); dialog.getButton( DialogInterface.BUTTON_POSITIVE).performClick(); assertNotNull("The button returned null when called",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); } }); instrumentation.waitForIdleSync(); MainListAdapter adapter1 = activity.getAdapter(); int newCount = adapter1.getCount(); assertEquals("new question added", oldCount+1, newCount); ServerDataManager sdm = new ServerDataManager(); PostController pc = new PostController(getInstrumentation() .getTargetContext()); Question qCheck=pc.getQuestionsInstance().get(0); assertEquals("The question just added has the correct information", "This is a test question title when a question should be added", qCheck.getSubject() ); int size = pc.getQuestionsInstance().size(); sdm.deleteQuestion(pc.getQuestionsInstance().get(0).getId()); } /** * Testing adding 30 questions * will not break the adapter and should work * @throws InterruptedException */ public void testAdd30Question() throws InterruptedException{ //testing if adding 1 question works activity = (MainActivity) getActivity(); assertNotNull("button not null",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); MainListAdapter adapter = activity.getAdapter(); Thread.sleep(10000); int oldCount = adapter.getCount(); //assertTrue("oldcount is not 10",oldCount==10); getInstrumentation().runOnMainSync(new Runnable(){ //clicking on an item automatically @Override public void run() { assertNotNull("this should be a button",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); ((Button) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)).performClick(); AlertDialog dialog = activity.getDialog(); //grabbing the dialog box that opens up when button clicked EditText questionTitle = (EditText) //grabbing all edit texts in teh dialog box dialog.findViewById(R.id.questionTitle); EditText questionBody = (EditText) dialog.findViewById(R.id.questionBody); EditText userName = (EditText) dialog.findViewById(R.id.UsernameRespondTextView); for(int i=1; i <= 30; i++){ assertNotNull("this should be a button",activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)); ((Button) activity.findViewById(ca.ualberta.cs.cmput301t03app.R.id.activity_main_question_button)).performClick(); questionTitle.setText("This is a test question title when a question should be added"); //setting them up with arguments questionBody.setText("This is a test question body when a question should be added"); userName.setText("me"); dialog.getButton( DialogInterface.BUTTON_POSITIVE).performClick(); }} }); instrumentation.waitForIdleSync(); MainListAdapter adapter1 = activity.getAdapter(); int newCount = adapter1.getCount(); assertEquals("new question added", oldCount+30, newCount); PostController pc = new PostController(getInstrumentation() .getTargetContext()); ServerDataManager sdm = new ServerDataManager(); int size = pc.getQuestionsInstance().size(); for (int i = 0; i<size; i++){ sdm.deleteQuestion(pc.getQuestionsInstance().get(i).getId()); } } /** * Making sure ListView is showing up on the screen * and not null */ public void testListView(){ //testing that the listview is actually visible on the screen ListView questionList; questionList = (ListView) activity.findViewById(R.id.activity_main_question_list); assertNotNull("ListView not created for question view", questionList); Intent intent = new Intent(); setActivityIntent(intent); View view = (View) this.activity.getWindow().getDecorView(); ViewAsserts.assertOnScreen(view, listview); } /** * Testing that when an question is clicked in the ListView it opens up a new activity with the * correct question being shown in the new activity. * @throws InterruptedException */ public void testzQuestionDetailClick() throws InterruptedException{ ActivityMonitor activityMonitor = getInstrumentation().addMonitor(ViewQuestion.class.getName(), null, false); assertNotNull("The listView is null",listview); //creating a new question here instrumentation.waitForIdleSync(); Thread.sleep(5000); PostController pc = new PostController(activity); int i = pc.getQuestionsInstance().size(); final int lastquestionindex = i-1; getInstrumentation().runOnMainSync(new Runnable(){ //clicking on an item automatically @Override public void run() { listview.performItemClick(listview.getAdapter().getView(lastquestionindex,null,null), lastquestionindex, listview.getAdapter().getItemId(lastquestionindex)); //clicking on second item on list } }); instrumentation.waitForIdleSync(); ViewQuestion newActivity = (ViewQuestion) instrumentation.waitForMonitorWithTimeout(activityMonitor, 5); assertNotNull(newActivity); //check that new activity has been opened Bundle extras = newActivity.getIntent().getExtras(); String question_id = extras.getString("question_id"); String title = pc.getQuestion(question_id).getSubject(); String testTitle = pc.getQuestionsInstance().get(lastquestionindex).getSubject(); assertEquals("Correct Question not being added to view", title, testTitle);//checking correct question sent newActivity.finish(); //close activity //viewActivityUItest should be testing that the intent that has been passed to this new activity is correct } }