/* * jMemorize - Learning made easy (and fun) - A Leitner flashcards tool * Copyright(C) 2004-2008 Riad Djemili and contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package jmemorize.core.test; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import jmemorize.core.Card; import jmemorize.core.Category; import jmemorize.core.learn.DefaultLearnSession; import jmemorize.core.learn.LearnSession; import jmemorize.core.learn.LearnSettings; import jmemorize.core.test.stubs.LearnSessionProviderStub; import junit.framework.TestCase; public class LearnSessionTest extends TestCase { private Category m_category; private LearnSession m_session; private LearnSettings m_settings; private LearnSessionProviderStub m_provider; private Card m_card0; private Card m_card1; private Card m_card2; protected void setUp() throws Exception { m_card0 = new Card("front0", "flip0"); m_card1 = new Card("front1", "flip1"); m_card2 = new Card("front2", "flip2"); m_category = new Category("testCategory"); m_category.addCard(m_card0); m_category.addCard(m_card1); m_category.addCard(m_card2); m_settings = new LearnSettings(); m_settings.setShuffleRatio(0); m_provider = new LearnSessionProviderStub(); m_session = createSession(); } public void testEndCallsProvider() { assertFalse(m_provider.isSessionEnded()); m_session.startLearning(); assertFalse(m_provider.isSessionEnded()); m_session.endLearning(); assertTrue(m_provider.isSessionEnded()); } public void testHasStartDate() { assertNull(m_session.getStart()); m_session.startLearning(); assertNotNull(m_session.getStart()); } public void testHasEndDateAfterLessonEndOnly() { m_session.startLearning(); assertNull(m_session.getEnd()); m_session.endLearning(); assertNotNull(m_session.getEnd()); } public void testGetCardsBeforeLessonStart() { TestHelper.assertSet(new Card[]{m_card0, m_card1, m_card2}, m_session.getCardsLeft()); } // public void testGetPassedNoShuffle() // { // // force set card test dates so none are the same // Date date = new Date(); // long t = date.getTime(); // m_card0.setDateTouched(date); // m_card1.setDateTouched(new Date(t+1)); // m_card2.setDateTouched(new Date(t+2)); // // // create a new session so that the eq. classes get setup correctly // m_session = createSession(); // m_session.startLearning(); // // m_session.cardSkipped(); // card 0 skipped // m_session.cardChecked(true, false); // card 1 passed // m_session.cardChecked(false, false); // card 2 failed // m_session.cardChecked(true, false); // card 0 passed // // TestHelper.assertSet(new Card[]{m_card1, m_card0}, m_session.getPassedCards()); // } public void testGetPassedWithShuffle() { m_session.startLearning(); Card card0 = m_session.getCurrentCard(); m_session.cardSkipped(); // card 0 skipped Card card1 = m_session.getCurrentCard(); m_session.cardChecked(true, false); // card 1 passed m_session.cardChecked(false, false); // card 2 failed while (m_session.getCurrentCard() != card0) { m_session.cardChecked(false, false); // card 2 failed } m_session.cardChecked(true, false); // card 0 passed TestHelper.assertSet(new Card[]{card1, card0}, m_session.getPassedCards()); } public void testRemoveFromSkippedIfPassedOrFailed() { m_session.startLearning(); m_session.cardSkipped(); // card 0 skipped m_session.cardSkipped(); // card 1 skipped m_session.cardSkipped(); // card 2 skipped for (int i = 0; i < 3; i++) { Card card = m_session.getCurrentCard(); if (card == m_card0) { m_session.cardChecked(true, false); // card 0 passed } else if (card == m_card1) { m_session.cardSkipped(); // card 1 skipped } else { m_session.cardChecked(false, false); // card 2 unlearned } } TestHelper.assertSet(new Card[]{m_card0}, m_session.getPassedCards()); TestHelper.assertSet(new Card[]{m_card1}, m_session.getSkippedCards()); assertEquals(0, m_session.getFailedCards().size()); } public void testGetSkipped() { m_session.startLearning(); m_session.cardChecked(true, false); // card 0 passed Card card0 = m_session.getCurrentCard(); m_session.cardSkipped(); // card 1 skipped m_session.cardChecked(false, false); // card 2 failed TestHelper.assertSet(new Card[]{card0}, m_session.getSkippedCards()); } public void testSkippedUnlearnedCardsAreReshownAfterExpiredCards() { Category.raiseCardLevel(m_card1, new Date(), new Date()); m_session = createSession(); m_session.startLearning(); m_session.cardSkipped(); // card 0 skipped m_session.cardSkipped(); // card 2 skipped assertEquals(m_card1, m_session.getCurrentCard()); } public void testFailedUnlearnedCardsAreReshownAfterExpiredCards() { Category.raiseCardLevel(m_card1, new Date(), new Date()); m_session = createSession(); m_session.startLearning(); m_session.cardChecked(false, false); // card 0 failed m_session.cardChecked(false, false); // card 2 failed assertEquals(m_card1, m_session.getCurrentCard()); } public void testGetFailed() { Category.raiseCardLevel(m_card0, new Date(), new Date()); Category.raiseCardLevel(m_card1, new Date(), new Date()); m_session = createSession(); m_session.startLearning(); m_session.cardChecked(false, false); // card 0 failed Card card = m_session.getCurrentCard(); m_session.cardChecked(false, false); // card 1 failed m_session.cardChecked(true, false); // card 2 passed TestHelper.assertSet(new Card[]{card}, m_session.getFailedCards()); } public void testGetFailedAndLearnedUnlearnedIsNotRelearned() { Category.raiseCardLevel(m_card0, new Date(), createDate(1)); Category.raiseCardLevel(m_card1, new Date(), createDate(1)); m_session = createSession(); m_settings.setRetestFailedCards(true); m_session.startLearning(); m_session.cardChecked(false, false); // unlearned m_card2 failed m_session.cardChecked(true, false); // unlearned m_card2 passed TestHelper.assertSet(new Card[]{m_card2}, m_session.getPassedCards()); TestHelper.assertSet(new Card[]{}, m_session.getFailedCards()); TestHelper.assertSet(new Card[]{}, m_session.getRelearnedCards()); } public void testGetRelearned2() { Category.raiseCardLevel(m_card2, new Date(), new Date()); m_session = createSession(); m_settings.setRetestFailedCards(true); m_session.startLearning(); m_session.cardChecked(true, false); // card 0 (level 0) passed m_session.cardChecked(true, false); // card 1 (level 0) passed m_session.cardChecked(false, false); // card 2 (level 1) failed m_session.cardChecked(true, false); // card 2 (level 0) passed TestHelper.assertSet(new Card[]{m_card0, m_card1}, m_session.getPassedCards()); TestHelper.assertSet(new Card[]{m_card2}, m_session.getRelearnedCards()); } public void testMoveCardDuringSession() { Category newCategory = new Category("outside of learn category"); m_category.addCategoryChild(newCategory); m_settings.setGroupByCategory(true); m_session = createSession(); m_session.startLearning(); Card card0 = m_session.getCurrentCard(); int oldLevel = card0.getLevel(); Category.moveCard(card0, newCategory); assertSame(card0, m_session.getCurrentCard()); m_session.cardChecked(true, false); assertEquals(oldLevel + 1, card0.getLevel()); assertNotSame(card0, m_session.getCurrentCard()); m_session.cardChecked(true, false); m_session.cardChecked(true, false); assertTrue(m_session.isQuit()); } private static Date createDate(int monthDiff) { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, monthDiff); return calendar.getTime(); } private DefaultLearnSession createSession() { return new DefaultLearnSession(m_category, m_settings, new ArrayList<Card>(), true, true, m_provider); } }