package com.newsrob.test.unit; import java.util.Date; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import android.test.InstrumentationTestCase; import com.newsrob.DBQuery; import com.newsrob.Entry; import com.newsrob.EntryManager; import com.newsrob.IEntryModelUpdateListener; import com.newsrob.ReadState; import com.newsrob.jobs.ModelUpdateResult; import com.newsrob.test.TestUtil; public class PinTests extends InstrumentationTestCase { private EntryManager entryManager; @Override protected void setUp() throws Exception { super.setUp(); entryManager = EntryManager.getInstance(getInstrumentation() .getTargetContext()); entryManager.doClearCache(); } @Override protected void tearDown() throws Exception { entryManager.doClearCache(); super.tearDown(); } private Entry createArticleWithReadState(ReadState desiredReadState) { Entry e = new Entry(); e.setAtomId("atomid1"); e.setFeedTitle("feed_title"); e.setFeedAtomId("feed_atom_id1"); e.setTitle("title"); e.setUpdated(new Date().getTime() * 1000); e.setReadState(desiredReadState); entryManager.insert(e); return entryManager.findEntryByAtomId("atomid1"); } /** * In this test only it is also validated that the in-memory and on-disk * version of the article are updated. In the other tests only the in-memory * version is validated as this test's subject are the state transitions. * * Also this test contains increasing the read level and then increasing the * unread level again. */ public void testIncreaseReadLevelFromPinned() { Entry article = createArticleWithReadState(ReadState.PINNED); assertFalse(article.isReadStatePending()); entryManager.increaseReadLevel(article); assertEquals(ReadState.READ, article.getReadState()); assertTrue(article.isReadStatePending()); article = entryManager.findEntryByAtomId("atomid1"); assertEquals(ReadState.READ, article.getReadState()); assertTrue(article.isReadStatePending()); // no change when increasing the Read Level again entryManager.increaseReadLevel(article); assertEquals(ReadState.READ, article.getReadState()); assertTrue(article.isReadStatePending()); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.UNREAD, article.getReadState()); assertFalse(article.isReadStatePending()); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertFalse(article.isReadStatePending()); } public void testIncreaseReadLevelFromUnread() { Entry article = createArticleWithReadState(ReadState.UNREAD); entryManager.increaseReadLevel(article); assertEquals(ReadState.READ, article.getReadState()); assertTrue(article.isReadStatePending()); // no change when increasing the read level again entryManager.increaseReadLevel(article); assertEquals(ReadState.READ, article.getReadState()); assertTrue(article.isReadStatePending()); } public void testIncreaseReadLevelFromRead() { Entry article = createArticleWithReadState(ReadState.READ); entryManager.increaseReadLevel(article); assertEquals(ReadState.READ, article.getReadState()); assertFalse(article.isReadStatePending()); } public void testIncreaseUnreadLevelFromPinned() { Entry article = createArticleWithReadState(ReadState.PINNED); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertFalse(article.isReadStatePending()); } public void testIncreaseUnreadLevelFromUnread() { Entry article = createArticleWithReadState(ReadState.UNREAD); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertFalse(article.isReadStatePending()); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertFalse(article.isReadStatePending()); } public void testIncreaseUnreadLevelFromRead() { Entry article = createArticleWithReadState(ReadState.READ); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.UNREAD, article.getReadState()); assertTrue(article.isReadStatePending()); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertTrue(article.isReadStatePending()); entryManager.increaseUnreadLevel(article); assertEquals(ReadState.PINNED, article.getReadState()); assertTrue(article.isReadStatePending()); } private void executeMarkAllRead(DBQuery dbq) 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) { } }); entryManager.requestMarkAllAsRead(dbq); latch.await(3, TimeUnit.SECONDS); } public void testMarkAllReadDoesntMarkPinnedArticlesRead() throws InterruptedException { TestUtil.populateDatabaseWithDataSet1(entryManager); Entry article = entryManager.findEntryByAtomId("atomid5"); entryManager.increaseUnreadLevel(article); article = entryManager.findEntryByAtomId("atomid5"); assertEquals(ReadState.PINNED, article.getReadState()); DBQuery dbq = new DBQuery(entryManager, null, null); executeMarkAllRead(dbq); assertEquals(1, entryManager.getUnreadArticleCount()); } }