/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker 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 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker 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, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.activities.habits.list.model;
import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.utils.*;
import org.junit.*;
import java.util.*;
import static junit.framework.Assert.*;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.IsEqual.*;
import static org.mockito.Mockito.*;
public class HabitCardListCacheTest extends BaseUnitTest
{
private HabitCardListCache cache;
private HabitCardListCache.Listener listener;
private CommandRunner commandRunner;
@Override
public void setUp()
{
super.setUp();
for (int i = 0; i < 10; i++)
{
if (i == 3) habitList.add(fixtures.createLongHabit());
else habitList.add(fixtures.createShortHabit());
}
SingleThreadTaskRunner taskRunner = new SingleThreadTaskRunner();
commandRunner = new CommandRunner(taskRunner);
cache = new HabitCardListCache(habitList, commandRunner, taskRunner);
cache.setCheckmarkCount(10);
cache.refreshAllHabits();
cache.onAttached();
listener = mock(HabitCardListCache.Listener.class);
cache.setListener(listener);
}
@Override
public void tearDown()
{
cache.onDetached();
super.tearDown();
}
@Test
public void testCommandListener_all()
{
assertThat(cache.getHabitCount(), equalTo(10));
Habit h = habitList.getByPosition(0);
commandRunner.execute(
new DeleteHabitsCommand(habitList, Collections.singletonList(h)),
null);
verify(listener).onItemRemoved(0);
verify(listener).onRefreshFinished();
assertThat(cache.getHabitCount(), equalTo(9));
}
@Test
public void testCommandListener_single()
{
Habit h2 = habitList.getByPosition(2);
long today = DateUtils.getStartOfToday();
commandRunner.execute(new ToggleRepetitionCommand(h2, today),
h2.getId());
verify(listener).onItemChanged(2);
verify(listener).onRefreshFinished();
verifyNoMoreInteractions(listener);
}
@Test
public void testGet()
{
assertThat(cache.getHabitCount(), equalTo(10));
Habit h = habitList.getByPosition(3);
assertNotNull(h.getId());
int score = h.getScores().getTodayValue();
assertThat(cache.getHabitByPosition(3), equalTo(h));
assertThat(cache.getScore(h.getId()), equalTo(score));
long today = DateUtils.getStartOfToday();
long day = DateUtils.millisecondsInOneDay;
int[] actualCheckmarks = cache.getCheckmarks(h.getId());
int[] expectedCheckmarks =
h.getCheckmarks().getValues(today - 9 * day, today);
assertThat(actualCheckmarks, equalTo(expectedCheckmarks));
}
@Test
public void testRemoval()
{
removeHabitAt(0);
removeHabitAt(3);
cache.refreshAllHabits();
verify(listener).onItemRemoved(0);
verify(listener).onItemRemoved(3);
verify(listener).onRefreshFinished();
assertThat(cache.getHabitCount(), equalTo(8));
}
@Test
public void testRefreshWithNoChanges()
{
cache.refreshAllHabits();
verify(listener).onRefreshFinished();
verifyNoMoreInteractions(listener);
}
@Test
public void testReorder_onCache()
{
Habit h2 = cache.getHabitByPosition(2);
Habit h3 = cache.getHabitByPosition(3);
Habit h7 = cache.getHabitByPosition(7);
cache.reorder(2, 7);
assertThat(cache.getHabitByPosition(2), equalTo(h3));
assertThat(cache.getHabitByPosition(7), equalTo(h2));
assertThat(cache.getHabitByPosition(6), equalTo(h7));
verify(listener).onItemMoved(2, 7);
verifyNoMoreInteractions(listener);
}
@Test
public void testReorder_onList()
{
Habit h2 = habitList.getByPosition(2);
Habit h3 = habitList.getByPosition(3);
Habit h7 = habitList.getByPosition(7);
assertThat(cache.getHabitByPosition(2), equalTo(h2));
assertThat(cache.getHabitByPosition(7), equalTo(h7));
reset(listener);
habitList.reorder(h2, h7);
cache.refreshAllHabits();
assertThat(cache.getHabitByPosition(2), equalTo(h3));
assertThat(cache.getHabitByPosition(7), equalTo(h2));
assertThat(cache.getHabitByPosition(6), equalTo(h7));
verify(listener).onItemMoved(3, 2);
verify(listener).onItemMoved(4, 3);
verify(listener).onItemMoved(5, 4);
verify(listener).onItemMoved(6, 5);
verify(listener).onItemMoved(7, 6);
verify(listener).onRefreshFinished();
verifyNoMoreInteractions(listener);
}
protected void removeHabitAt(int position)
{
Habit h = habitList.getByPosition(position);
assertNotNull(h);
habitList.remove(h);
}
}