package at.tugraz.examreminder.ui;
import android.os.Build;
import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import at.tugraz.examreminder.R;
import at.tugraz.examreminder.adapter.CheckableCoursesAdapter;
import at.tugraz.examreminder.core.Course;
import at.tugraz.examreminder.core.CourseContainer;
import at.tugraz.examreminder.core.Exam;
import at.tugraz.examreminder.crawler.Crawler;
import at.tugraz.examreminder.crawler.NullCrawler;
import at.tugraz.examreminder.crawler.SimpleMockCrawler;
import at.tugraz.examreminder.service.DailyListener;
import at.tugraz.examreminder.service.UpdateService;
import com.jayway.android.robotium.solo.Solo;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class CoursesTest extends ActivityInstrumentationTestCase2<MainActivity> {
private Solo solo;
public CoursesTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
populateCourseList();
UpdateService.setCrawlerToUse(SimpleMockCrawler.class);
solo = new Solo(getInstrumentation(), getActivity());
DailyListener.setNewPendingIntentAndCancelOld(getActivity(), null); //Cancel schedule
CourseContainer.instance().deleteObservers();
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit(); //Reset default preferences!!
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, true);
}
@Override
protected void tearDown() throws Exception {
UpdateService.setCrawlerToUse(null);
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().clear().commit(); //Reset default preferences!!
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, true);
super.tearDown();
}
public void testDeleteCourses() {
solo.clickOnCheckBox(1);
solo.clickOnCheckBox(3);
solo.clickOnCheckBox(5);
solo.clickOnCheckBox(7);
solo.clickOnView(getActivity().findViewById(R.id.delete));
ListView listView = (ListView)solo.getView(R.id.courses_list);
assertEquals("Listview should only contain 6 courses", 5, listView.getCount());
for(int i=0; i < 9; i++) {
if(i%2 == 0){
assertTrue(solo.searchText("Course #"+i));
}
}
}
public void testAddCourse() {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit()
.putBoolean("pref_use_android_calendar", true)
.putString("pref_android_calendar_to_use", "1")
.commit();
}
UpdateService.setCrawlerToUse(SimpleMockCrawler.class);
solo.clickOnView(getActivity().findViewById(R.id.add));
int oldsize = CourseContainer.instance().size();
solo.clickOnEditText(0);
solo.enterText(0, "Course");
solo.clickOnEditText(0);
solo.sendKey(Solo.ENTER);
solo.waitForText("THE COURSE #2", 1, 5);
solo.clickOnText("THE COURSE #2");
solo.waitForText("Courses", 1, 5);
assertEquals(oldsize+1, CourseContainer.instance().size());
assertTrue(solo.searchText("THE COURSE #2", 1, true));
Exam exam = CourseContainer.instance().get(CourseContainer.instance().size()-1).exams.first();
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
assertFalse("Exam of added course should have a created event", exam.event_id == -1);
}
oldsize = CourseContainer.instance().size();
solo.clickOnView(getActivity().findViewById(R.id.add));
solo.enterText(0, "Course");
solo.clickOnEditText(0);
solo.sendKey(Solo.ENTER);
solo.waitForText("THE COURSE #2", 1, 5);
solo.clickOnText("THE COURSE #2");
assertEquals("You should not be able to add the same course twice", oldsize, CourseContainer.instance().size());
solo.goBack();
solo.goBack();
}
public void testAddCourseCrawlerError() {
UpdateService.setCrawlerToUse(NullCrawler.class);
solo.clickOnView(getActivity().findViewById(R.id.add));
solo.enterText(0, "Course");
solo.clickOnEditText(0);
solo.sendKey(Solo.ENTER);
assertTrue("Error dialog not shown", solo.searchText(solo.getString(R.string.error)));
assertTrue("Error message not shown", solo.searchText(solo.getString(R.string.search_error)));
solo.clickOnButton(0);
assertFalse("Error shows even after clicking ok", solo.searchText(solo.getString(R.string.error)));
solo.goBack();
solo.goBack();
}
public void testAddCourseScreenOriantationChange() {
ListView listView;
solo.clickOnView(getActivity().findViewById(R.id.add));
solo.enterText(0, "Course");
solo.clickOnEditText(0);
solo.sendKey(Solo.ENTER);
solo.waitForText("THE COURSE #2", 1, 5);
listView = (ListView) solo.getView(android.R.id.list);
assertEquals("List view should contain 2 items before doing anything", 2, listView.getCount());
solo.setActivityOrientation(Solo.LANDSCAPE);
solo.sleep(500);
listView = (ListView) solo.getView(android.R.id.list);
solo.sleep(3000);
assertEquals("List view should't change size after oriantation change", 2, listView.getCount());
assertEquals("SearchView should not reset.", "Course", solo.getEditText(0).getText().toString());
solo.goBack();
solo.goBack();
}
public void testEmptyCourseListClick() {
ListView listView = (ListView) solo.getView(R.id.courses_list);
View emptyview = listView.getEmptyView();
assertEquals("EmptyView shoudl not be visible", View.GONE, emptyview.getVisibility());
deleteAllCourses();
assertEquals(0, listView.getCount());
assertEquals("Empty view should be visible", View.VISIBLE, emptyview.getVisibility());
solo.clickOnView(emptyview);
solo.assertCurrentActivity("Current activity shoudl Be the AddCourse Activity", AddCourseActivity.class);
solo.goBack();
}
public void testCourseDetails() {
Course course = CourseContainer.instance().get(0);
course.exams = SimpleMockCrawler.createExams(course);
solo.clickOnText("Course #0");
assertEquals(course.name, ((TextView)solo.getView(R.id.course_name,0)).getText());
View exam_view;
exam_view = solo.getView(R.id.exam_item, 0);
assertEquals("Course #0", ((TextView)exam_view.findViewById(R.id.course_text)).getText());
solo.goBack();
}
private void populateCourseList(){
CourseContainer.instance().clear();
for(int i=0; i < 9; i++){
Course course = new Course();
course.name = "Course #"+i;
course.lecturer = "Our leader";
course.number = "course."+i;
course.term = "SS";
course.type = "VO";
CourseContainer.instance().add(course);
}
}
private void deleteAllCourses() {
for(int i=0; i < 4; i++){
solo.clickOnCheckBox(i);
}
solo.clickOnView(getActivity().findViewById(R.id.delete));
for(int i=0; i < 5; i++){
solo.clickOnCheckBox(i);
}
solo.clickOnView(getActivity().findViewById(R.id.delete));
}
}