/* * 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 jmemorize.core.Card; import jmemorize.core.Category; import jmemorize.core.learn.DefaultLearnSession; import jmemorize.core.learn.LearnSettings; import jmemorize.core.test.stubs.LearnSessionProviderStub; import junit.framework.TestCase; public class LearnSessionShufflingTest extends TestCase { private Category m_category; private DefaultLearnSession m_session; private LearnSettings m_settings; private LearnSessionProviderStub m_provider; protected void setUp() throws Exception { m_category = new Category("testCategory"); m_settings = new LearnSettings(); m_provider = new LearnSessionProviderStub(); } protected void tearDown() throws Exception { } public void testCardOrderWithNoEntropy() { createCards(1, 0, 1, 0, 2); m_settings.setShuffleRatio(0); m_session = createSession(); m_session.startLearning(); assertLevelOfCurrentCard(0); m_session.cardChecked(true, false); assertLevelOfCurrentCard(2); m_session.cardChecked(true, false); assertLevelOfCurrentCard(4); m_session.cardChecked(true, false); assertLevelOfCurrentCard(4); } public void testCardOrderWithPartialEntropy() { createCards(2, 2, 2, 2, 2, 2, 2, 2, 2, 2); m_settings.setShuffleRatio(0.2f); m_session = createSession(); m_session.startLearning(); assertShuffledCount(16, 4); } public void testCardOrderWithPartialEntropy2() { createCards(1, 2, 3, 4, 5, 6, 7, 8, 9); m_settings.setShuffleRatio(0.6f); m_session = createSession(); m_session.startLearning(); assertShuffledCount(18, 27); } public void testCardOrderWithFullEntropy() { createCards(1, 2, 3, 4, 5); m_settings.setShuffleRatio(1.0f); m_session = createSession(); m_session.startLearning(); assertShuffledCount(0, 15); } private void assertShuffledCount(int actualUnshuffled, int actualShuffled) { int unshuffledLevels = 0; int shuffledLevels = 0; for (int i = 0; i < actualUnshuffled + actualShuffled; i++) { int cardLevel = m_session.getCurrentCard().getLevel(); int shuffleLevel = m_session.getCurrentShuffleLevel(); if (cardLevel == shuffleLevel) unshuffledLevels++; else shuffledLevels++; m_session.cardChecked(true, false); } assertEquals(actualShuffled, shuffledLevels); assertEquals(actualUnshuffled, unshuffledLevels); } private void assertLevelOfCurrentCard(int level) { assertEquals(level, m_session.getCurrentCard().getLevel()); } private DefaultLearnSession createSession() { return new DefaultLearnSession(m_category, m_settings, new ArrayList<Card>(), true, true, m_provider); } private void createCards(int ... levels) { for (int i = 0; i < levels.length; i++) { for (int j = 0; j < levels[i]; j++) { Card card = new Card("testFront"+i, "testFlip"+i); m_category.addCard(card, i); } } } }