package org.liberty.android.fantastischmemo.test.queue; import android.support.test.filters.SmallTest; import org.junit.Test; import org.liberty.android.fantastischmemo.dao.CardDao; import org.liberty.android.fantastischmemo.entity.Card; import org.liberty.android.fantastischmemo.entity.Category; import org.liberty.android.fantastischmemo.entity.LearningData; import org.liberty.android.fantastischmemo.integrationtest.TestHelper; import org.liberty.android.fantastischmemo.queue.LearnQueueManager; import org.liberty.android.fantastischmemo.queue.QueueManager; import org.liberty.android.fantastischmemo.scheduler.Scheduler; import org.liberty.android.fantastischmemo.test.AbstractExistingDBTest; import java.util.Date; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class LearnQueuingManagerTest extends AbstractExistingDBTest { @SmallTest @Test public void testGetNewCardQueuingWithCategory() throws Exception { CardDao cardDao = helper.getCardDao(); Card c10 = cardDao.queryForId(10); assertNotNull(c10); Category cat = new Category(); cat.setName("tt"); c10.setCategory(cat); cardDao.update(c10); QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(10) .setFilterCategory(cat) .setCacheSize(50) .build(); Card cqueue = queueManager.dequeue(); assertEquals(10, (int)cqueue.getId()); queueManager.release(); } @SmallTest @Test public void testGetNewCardQueuingWithoutCategory() throws Exception { QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(10) .setFilterCategory(null) .setCacheSize(50) .build(); Card cqueue = queueManager.dequeue(); assertEquals(1, (int)cqueue.getId()); queueManager.release(); } @SmallTest @Test public void testQueuingPosition() throws Exception { QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(10) .setFilterCategory(null) .setCacheSize(50) .build(); Card cqueue = queueManager.dequeuePosition(5); assertEquals(5, (int)cqueue.getId()); queueManager.release(); } @SmallTest @Test public void testUpdate1() throws Exception { Scheduler mockScheduler = mock(Scheduler.class); QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(3) .setFilterCategory(null) .setScheduler(mockScheduler) .setCacheSize(50) .build(); Card c1 = queueManager.dequeue(); queueManager.remove(c1); assertEquals(1, (int)c1.getId()); when(mockScheduler.isCardLearned(c1.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c1); queueManager.update(c1); Card c2 = queueManager.dequeue(); queueManager.remove(c2); assertEquals(2, (int)c2.getId()); when(mockScheduler.isCardLearned(c2.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c2); queueManager.update(c2); Card c3 = queueManager.dequeue(); queueManager.remove(c3); assertEquals(3, (int)c3.getId()); when(mockScheduler.isCardLearned(c3.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c3); queueManager.update(c3); Card c4 = queueManager.dequeue(); queueManager.remove(c4); assertEquals(4, (int)c4.getId()); when(mockScheduler.isCardLearned(c4.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c4); queueManager.update(c4); Card c2Again = queueManager.dequeue(); queueManager.remove(c2Again); assertEquals(2, (int)c2Again.getId()); when(mockScheduler.isCardLearned(c2Again.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c2Again); queueManager.update(c2Again); Card c3Again = queueManager.dequeue(); queueManager.remove(c3Again); assertEquals(3, (int)c3Again.getId()); when(mockScheduler.isCardLearned(c3Again.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c3Again); queueManager.update(c3Again); Card c5 = queueManager.dequeue(); queueManager.remove(c5); assertEquals(5, (int)c5.getId()); when(mockScheduler.isCardLearned(c5.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c5); queueManager.update(c5); queueManager.release(); } @SmallTest @Test public void testUpdate2() throws Exception { Scheduler mockScheduler = mock(Scheduler.class); QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(3) .setFilterCategory(null) .setScheduler(mockScheduler) .setCacheSize(50) .build(); Card c1 = queueManager.dequeue(); queueManager.remove(c1); assertEquals(1, (int)c1.getId()); when(mockScheduler.isCardLearned(c1.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c1); queueManager.update(c1); Card c2 = queueManager.dequeue(); queueManager.remove(c2); assertEquals(2, (int)c2.getId()); when(mockScheduler.isCardLearned(c2.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c2); queueManager.update(c2); Card c3 = queueManager.dequeue(); queueManager.remove(c3); assertEquals(3, (int)c3.getId()); when(mockScheduler.isCardLearned(c3.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c3); queueManager.update(c3); Card c1Again = queueManager.dequeue(); queueManager.remove(c1Again); assertEquals(1, (int)c1Again.getId()); when(mockScheduler.isCardLearned(c1Again.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c1Again); queueManager.update(c1Again); Card c4 = queueManager.dequeue(); queueManager.remove(c4); assertEquals(4, (int)c4.getId()); when(mockScheduler.isCardLearned(c4.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c4); queueManager.update(c4); Card c3Again = queueManager.dequeue(); queueManager.remove(c3Again); assertEquals(3, (int)c3Again.getId()); when(mockScheduler.isCardLearned(c3Again.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c3Again); queueManager.update(c3Again); Card c5 = queueManager.dequeue(); queueManager.remove(c5); assertEquals(5, (int)c5.getId()); when(mockScheduler.isCardLearned(c5.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c5); queueManager.update(c5); queueManager.release(); } @SmallTest @Test public void testUpdate3() throws Exception { Scheduler mockScheduler = mock(Scheduler.class); QueueManager queueManager = new LearnQueueManager.Builder(getContext(), TestHelper.SAMPLE_DB_PATH) .setLearnQueueSize(10) .setFilterCategory(null) .setScheduler(mockScheduler) .setCacheSize(11) .build(); for (int i = 1; i <= 10; i++) { Card c = queueManager.dequeue(); queueManager.remove(c); assertEquals(i, (int)c.getId()); if (i == 1 || i == 3) { when(mockScheduler.isCardLearned(c.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c); } else { when(mockScheduler.isCardLearned(c.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c); } queueManager.update(c); } Card c1 = queueManager.dequeue(); queueManager.remove(c1); assertEquals(1, (int)c1.getId()); when(mockScheduler.isCardLearned(c1.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c1); queueManager.update(c1); Card c11 = queueManager.dequeue(); queueManager.remove(c11); assertEquals(11, (int)c11.getId()); when(mockScheduler.isCardLearned(c11.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c11); queueManager.update(c11); Card c3 = queueManager.dequeue(); queueManager.remove(c3); assertEquals(3, (int)c3.getId()); when(mockScheduler.isCardLearned(c3.getLearningData())) .thenReturn(false); updateFailureCardLearningData(c3); queueManager.update(c3); Card c12 = queueManager.dequeue(); queueManager.remove(c12); assertEquals(12, (int)c12.getId()); when(mockScheduler.isCardLearned(c12.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c12); queueManager.update(c12); Card c13 = queueManager.dequeue(); queueManager.remove(c13); assertEquals(13, (int)c13.getId()); when(mockScheduler.isCardLearned(c13.getLearningData())) .thenReturn(true); updateSucceedCardLearningData(c13); queueManager.update(c13); queueManager.release(); } private void updateSucceedCardLearningData(Card card) { LearningData ld = card.getLearningData(); ld.setAcqReps(1); ld.setNextLearnDate(new Date(new Date().getTime() + 100000000)); ld.setGrade(5); } private void updateFailureCardLearningData(Card card) { LearningData ld = card.getLearningData(); ld.setAcqReps(1); // Make sure to review ld.setNextLearnDate(new Date(new Date().getTime() - 1)); ld.setGrade(0); } }