/*
* 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 LearnSessionLargeTest extends TestCase
{
private Category m_category;
private LearnSession m_session;
private LearnSettings m_settings;
private LearnSessionProviderStub m_provider;
private int m_unlearnedCount;
private int m_learnedCount;
private int m_expiredCount;
private int m_selectedCount;
private final static Date LAST_TEST = createDate(-1);
private final static Date EXPIRATION = createDate(-5);
private final static Date FUTURE = createDate(5);
protected void setUp() throws Exception
{
m_category = new Category("testCategory");
m_settings = new LearnSettings();
m_settings.setShuffleRatio(0);
m_provider = new LearnSessionProviderStub();
m_unlearnedCount = 0;
m_learnedCount = 0;
m_expiredCount = 0;
m_selectedCount = 0;
}
public void testSessionWithLearned()
{
addUnlearned(50);
startSession();
learn(50);
assertSummary(true, 50, 0, 0, 0);
}
public void testSessionWithLearnedAndFailedAndLearned()
{
addUnlearned(50);
m_settings.setRetestFailedCards(true);
startSession();
learn(20);
fail(15);
learn(30);
assertSummary(true, 50, 0, 0, 0);
}
public void testSessionWithLearnedAndFailedAndLearned2()
{
addUnlearned(50);
m_settings.setRetestFailedCards(false);
startSession();
learn(20);
fail(15);
learn(15);
assertSummary(true, 35, 0, 0, 0);
}
public void testSessionWithSkipped()
{
addUnlearned(50);
startSession();
skip(50);
assertSummary(false, 0, 0, 50, 0);
}
public void testSessionWithSkipped2()
{
addUnlearned(50);
startSession();
skip(80);
assertSummary(false, 0, 0, 50, 0);
}
public void testSessionWithSkippedAndLearned()
{
addUnlearned(50);
startSession();
skip(50);
learn(25);
assertSummary(false, 25, 0, 25, 0);
}
public void testSessionWithFailed()
{
addExpired(10, 1);
addExpired(15, 2);
addExpired(25, 5);
startSession();
fail(10);
assertSummary(false, 0, 10, 0, 0);
}
public void testSessionWithFailed2()
{
addExpired(10, 1);
addExpired(15, 2);
addExpired(25, 5);
m_settings.setRetestFailedCards(false);
startSession();
fail(50);
assertSummary(true, 0, 50, 0, 0);
}
public void testSessionWithFailed3()
{
addExpired(35, 3);
addExpired(35, 4);
m_settings.setRetestFailedCards(true);
startSession();
fail(100);
assertSummary(false, 0, 70, 0, 0);
}
public void testSessionWithFailedAndLearned()
{
addExpired(10, 1);
addExpired(15, 2);
addExpired(25, 5);
startSession();
fail(10);
learn(30);
assertSummary(false, 30, 10, 0, 0);
}
public void testSessionWithFailedAndLearned2()
{
addExpired(10, 1);
addExpired(15, 2);
addExpired(25, 5);
m_settings.setRetestFailedCards(true);
startSession();
fail(50);
learn(30);
assertSummary(false, 0, 20, 0, 30);
}
public void testSessionWithFailedAndLearned3()
{
addUnlearned(5);
addLearned(100, 7);
addExpired(20, 2);
m_settings.setShuffleRatio(0);
m_settings.setRetestFailedCards(true);
startSession();
fail(25);
learn(25);
assertSummary(true, 5, 0, 0, 20);
}
private static Date createDate(int monthDiff)
{
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, monthDiff);
return calendar.getTime();
}
private void startSession()
{
m_session = new DefaultLearnSession(m_category, m_settings,
new ArrayList<Card>(), true, true, m_provider);
m_session.startLearning();
}
private void assertSummary(boolean isEnded, int passed, int failed,
int skipped, int relearned)
{
String actual = createSummaryString(
m_provider.isSessionEnded(),
m_session.getPassedCards().size(),
m_session.getFailedCards().size(),
m_session.getSkippedCards().size(),
m_session.getRelearnedCards().size());
String expected = createSummaryString(
isEnded,
passed,
failed,
skipped,
relearned);
assertEquals(expected, actual);
}
private String createSummaryString(boolean isEnded, int passed, int failed,
int skipped, int relearned)
{
StringBuffer sb = new StringBuffer();
sb.append(isEnded ? "+ " : "- ");
sb.append(String.format("% 3d", passed));
sb.append("p ");
sb.append(String.format("% 3d", failed));
sb.append("f ");
sb.append(String.format("% 3d", skipped));
sb.append("s ");
sb.append(String.format("% 3d", relearned));
sb.append("r");
return sb.toString();
}
private void learn(int count)
{
for (int i = 0; i < count; i++)
m_session.cardChecked(true, false);
}
private void fail(int count)
{
for (int i = 0; i < count; i++)
m_session.cardChecked(false, false);
}
private void skip(int count)
{
for (int i = 0; i < count; i++)
m_session.cardSkipped();
}
private void addUnlearned(int count)
{
for (int i = 0; i < count; i++)
{
Card card = new Card("unlearned"+m_unlearnedCount, "back");
m_category.addCard(card);
m_unlearnedCount++;
}
}
private void addLearned(int count, int level)
{
for (int i = 0; i < count; i++)
{
Card card = new Card("learned"+m_learnedCount, "back");
card.setDateTested(LAST_TEST);
card.setDateExpired(FUTURE);
m_category.addCard(card, level);
m_learnedCount++;
}
}
private void addExpired(int count, int level)
{
for (int i = 0; i < count; i++)
{
Card card = new Card("expired"+m_expiredCount, "back");
card.setDateTested(LAST_TEST);
card.setDateExpired(EXPIRATION);
m_category.addCard(card, level);
m_expiredCount++;
}
}
}