package com.newsrob.test.unit.ui; import java.util.Date; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import android.test.ActivityInstrumentationTestCase2; import com.newsrob.Entry; import com.newsrob.EntryManager; import com.newsrob.IEntryModelUpdateListener; import com.newsrob.activities.ArticleListActivity; import com.newsrob.jobs.ModelUpdateResult; public class MarkReadUntilHereUITests extends ActivityInstrumentationTestCase2<ArticleListActivity> { private EntryManager entryManager; public MarkReadUntilHereUITests() { super(ArticleListActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); entryManager = EntryManager.getInstance(getActivity()); entryManager.doClearCache(); setMarkAllReadConfirmationThreshold(50); for (String atomId : new String[] { "a1", "a2", "a3", "a4", "a5" }) { Entry e = new Entry(); e.setAtomId(atomId); e.setFeedTitle("feed_title " + atomId); e.setFeedAtomId("feed_atom_id " + atomId); e.setTitle("title " + atomId); e.setUpdated(new Date().getTime() * 1000); entryManager.insert(e); } entryManager.fireModelUpdated(); assertEquals(5, entryManager.getUnreadArticleCount()); assertEquals(5, entryManager.getArticleCount()); } private void setMarkAllReadConfirmationThreshold(int x) { entryManager.getSharedPreferences().edit().putString( "settings_ui_mark_all_read_confirmation_threshold2", String.valueOf(x)).commit(); } @Override protected void tearDown() throws Exception { entryManager.doClearCache(); super.tearDown(); } private void executeMarkReadUntilHereOnCurrentSelection() throws InterruptedException { final CountDownLatch latch = new CountDownLatch(1); entryManager.addListener(new IEntryModelUpdateListener() { @Override public void statusUpdated() { } @Override public void modelUpdated(String atomId) { } @Override public void modelUpdated() { latch.countDown(); } @Override public void modelUpdateStarted(boolean fastSyncOnly) { } @Override public void modelUpdateFinished(ModelUpdateResult result) { } }); getInstrumentation().invokeContextMenuAction(getActivity(), 112, 0); getInstrumentation().waitForIdleSync(); assertTrue(latch.await(3, TimeUnit.SECONDS)); // Scream if timeout } private void clickToggleSortOrder(boolean shouldBeAscending) { if (getActivity().getDbQuery().isSortOrderAscending() == shouldBeAscending) return; getActivity().runOnUiThread(new Runnable() { @Override public void run() { getActivity() .findViewById(com.newsrob.R.id.toggle_order_button) .performClick(); } }); getInstrumentation().waitForIdleSync(); assertEquals(shouldBeAscending, getActivity().getDbQuery() .isSortOrderAscending()); } private void doReadUntilHereWithConfirmationDialog(boolean positive) throws InterruptedException { setMarkAllReadConfirmationThreshold(1); final CountDownLatch latch = new CountDownLatch(1); entryManager.addListener(new IEntryModelUpdateListener() { @Override public void statusUpdated() { } @Override public void modelUpdated(String atomId) { } @Override public void modelUpdated() { latch.countDown(); } @Override public void modelUpdateStarted(boolean fastSyncOnly) { } @Override public void modelUpdateFinished(ModelUpdateResult result) { } }); sendKeys("DPAD_DOWN DPAD_DOWN DPAD_DOWN DPAD_DOWN"); assertEquals(3, getActivity().getListView().getSelectedItemPosition()); getInstrumentation().waitForIdleSync(); getInstrumentation().invokeContextMenuAction(getActivity(), 112, 0); getInstrumentation().waitForIdleSync(); if (positive) sendKeys("DPAD_CENTER"); else sendKeys("DPAD_RIGHT DPAD_RIGHT DPAD_CENTER"); getInstrumentation().waitForIdleSync(); boolean reachedZero = latch.await(3000, TimeUnit.MILLISECONDS); if (positive) assertTrue(reachedZero); // Scream if timeout } /** * As the latch is only counted down when modelUpdated() is called this test * also checks if modelUpdated is called. */ public void testMarkReadUntilHereAscending() throws InterruptedException { clickToggleSortOrder(true); sendKeys("DPAD_DOWN DPAD_DOWN DPAD_DOWN DPAD_DOWN"); assertEquals(3, getActivity().getListView().getSelectedItemPosition()); executeMarkReadUntilHereOnCurrentSelection(); assertEquals(1, entryManager.getUnreadArticleCount()); assertEquals(5, entryManager.getArticleCount()); } public void testMarkReadUntilHereWithConfirmationDialogPositive() throws InterruptedException { doReadUntilHereWithConfirmationDialog(true); assertEquals(1, entryManager.getUnreadArticleCount()); assertEquals(5, entryManager.getArticleCount()); } public void testMarkReadUntilHereWithConfirmationDialogNegative() throws InterruptedException { doReadUntilHereWithConfirmationDialog(false); assertEquals(5, entryManager.getUnreadArticleCount()); assertEquals(5, entryManager.getArticleCount()); } public void testMarkReadUntilHereDescending() throws InterruptedException { clickToggleSortOrder(false); sendKeys("DPAD_DOWN DPAD_DOWN"); assertEquals(1, getActivity().getListView().getSelectedItemPosition()); executeMarkReadUntilHereOnCurrentSelection(); assertEquals(3, entryManager.getUnreadArticleCount()); assertEquals(5, entryManager.getArticleCount()); } }