From 6ccfb53329b471db4cf7c7284b1fc36ad9ee2367 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Tue, 30 May 2017 08:19:28 -0400 Subject: [PATCH] Add missing tests for RepetitionList and Habit --- .../org/isoron/uhabits/HabitFixtures.java | 4 +- .../uhabits/io/HabitBullCSVImporter.java | 2 +- .../isoron/uhabits/io/RewireDBImporter.java | 2 +- .../isoron/uhabits/io/TickmateDBImporter.java | 2 +- .../receivers/WidgetControllerTest.java | 4 +- .../commands/ToggleRepetitionCommand.java | 2 +- .../org/isoron/uhabits/core/models/Habit.java | 8 ++- .../uhabits/core/models/RepetitionList.java | 17 ++++++- .../uhabits/core/test/HabitFixtures.java | 4 +- .../isoron/uhabits/core/models/HabitTest.java | 50 +++++++++++++++++++ .../core/models/RepetitionListTest.java | 48 ++++++++++++------ .../uhabits/core/models/ScoreListTest.java | 2 +- 12 files changed, 118 insertions(+), 27 deletions(-) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java index b8641c46e..3c475a0a0 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java @@ -73,7 +73,7 @@ public class HabitFixtures 81, 83, 89, 90, 91, 95, 102, 103, 108, 109, 120}; for (int mark : marks) - habit.getRepetitions().toggleTimestamp(today - mark * day); + habit.getRepetitions().toggle(today - mark * day); return habit; } @@ -108,7 +108,7 @@ public class HabitFixtures long timestamp = DateUtils.getStartOfToday(); for (boolean c : LONG_HABIT_CHECKS) { - if (c) habit.getRepetitions().toggleTimestamp(timestamp); + if (c) habit.getRepetitions().toggle(timestamp); timestamp -= DateUtils.millisecondsInOneDay; } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java index 891d5bbc9..cbfa366c5 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java @@ -108,7 +108,7 @@ public class HabitBullCSVImporter extends AbstractImporter } if(!h.getRepetitions().containsTimestamp(timestamp)) - h.getRepetitions().toggleTimestamp(timestamp); + h.getRepetitions().toggle(timestamp); } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java index 7082ed1bd..11104c9fa 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java @@ -101,7 +101,7 @@ public class RewireDBImporter extends AbstractImporter GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); cal.set(year, month - 1, day); - habit.getRepetitions().toggleTimestamp(cal.getTimeInMillis()); + habit.getRepetitions().toggle(cal.getTimeInMillis()); } while (c.moveToNext()); } finally diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java index 73a8ba6a0..fc7e7e05b 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java @@ -100,7 +100,7 @@ public class TickmateDBImporter extends AbstractImporter GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); cal.set(year, month, day); - habit.getRepetitions().toggleTimestamp(cal.getTimeInMillis()); + habit.getRepetitions().toggle(cal.getTimeInMillis()); } while (c.moveToNext()); } finally diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java index 3e988fef6..5cbb3a1a4 100644 --- a/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java @@ -59,7 +59,7 @@ public class WidgetControllerTest extends BaseAndroidUnitTest @Test public void testOnAddRepetition_whenChecked() throws Exception { - habit.getRepetitions().toggleTimestamp(today); + habit.getRepetitions().toggle(today); int todayValue = habit.getCheckmarks().getTodayValue(); assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); controller.onAddRepetition(habit, today); @@ -79,7 +79,7 @@ public class WidgetControllerTest extends BaseAndroidUnitTest @Test public void testOnRemoveRepetition_whenChecked() throws Exception { - habit.getRepetitions().toggleTimestamp(today); + habit.getRepetitions().toggle(today); int todayValue = habit.getCheckmarks().getTodayValue(); assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); controller.onRemoveRepetition(habit, today); diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java index b2d2a0722..bc9e4b391 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java @@ -43,7 +43,7 @@ public class ToggleRepetitionCommand extends Command @Override public void execute() { - habit.getRepetitions().toggleTimestamp(timestamp); + habit.getRepetitions().toggle(timestamp); } @NonNull diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java index 0afcacb34..15c0aba07 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java @@ -322,7 +322,13 @@ public class Habit public synchronized boolean isCompletedToday() { int todayCheckmark = getCheckmarks().getTodayValue(); - if (isNumerical()) return todayCheckmark >= data.targetValue; + if (isNumerical()) + { + if(getTargetType() == AT_LEAST) + return todayCheckmark >= data.targetValue; + else + return todayCheckmark <= data.targetValue; + } else return (todayCheckmark != UNCHECKED); } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java index 8d237221f..db1346cb7 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java @@ -107,6 +107,7 @@ public abstract class RepetitionList */ @Nullable public abstract Repetition getOldest(); + @Nullable /** * Returns the newest repetition in the list. @@ -184,8 +185,11 @@ public abstract class RepetitionList * @return the repetition that has been added or removed. */ @NonNull - public Repetition toggleTimestamp(long timestamp) + public Repetition toggle(long timestamp) { + if(habit.isNumerical()) + throw new IllegalStateException("habit must NOT be numerical"); + timestamp = DateUtils.getStartOfDay(timestamp); Repetition rep = getByTimestamp(timestamp); @@ -207,4 +211,15 @@ public abstract class RepetitionList */ @NonNull public abstract long getTotalCount(); + + public void toggle(long timestamp, int value) + { + if(!habit.isNumerical()) + throw new IllegalStateException("habit must be numerical"); + + Repetition rep = getByTimestamp(timestamp); + if(rep != null) remove(rep); + add(new Repetition(timestamp, value)); + habit.invalidateNewerThan(timestamp); + } } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java index 6c6ac612c..c5450fcb3 100644 --- a/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java @@ -58,7 +58,7 @@ public class HabitFixtures 81, 83, 89, 90, 91, 95, 102, 103, 108, 109, 120}; for (int mark : marks) - habit.getRepetitions().toggleTimestamp(today - mark * day); + habit.getRepetitions().toggle(today - mark * day); return habit; } @@ -98,7 +98,7 @@ public class HabitFixtures long timestamp = DateUtils.getStartOfToday(); for (boolean c : NON_DAILY_HABIT_CHECKS) { - if (c) habit.getRepetitions().toggleTimestamp(timestamp); + if (c) habit.getRepetitions().toggle(timestamp); timestamp -= DateUtils.millisecondsInOneDay; } diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java index 95d57f6d5..6b5343827 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java @@ -21,12 +21,17 @@ package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; import org.junit.*; +import org.junit.rules.*; import static org.hamcrest.CoreMatchers.*; +import static org.isoron.uhabits.core.utils.DateUtils.*; import static org.junit.Assert.*; public class HabitTest extends BaseUnitTest { + @Rule + public final ExpectedException exception = ExpectedException.none(); + @Override public void setUp() { @@ -76,4 +81,49 @@ public class HabitTest extends BaseUnitTest h.clearReminder(); assertThat(h.hasReminder(), is(false)); } + + @Test + public void test_isCompleted() throws Exception + { + Habit h = modelFactory.buildHabit(); + assertFalse(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday()); + assertTrue(h.isCompletedToday()); + } + + @Test + public void test_isCompleted_numerical() throws Exception + { + Habit h = modelFactory.buildHabit(); + h.setType(Habit.NUMBER_HABIT); + h.setTargetType(Habit.AT_LEAST); + h.setTargetValue(100.0); + assertFalse(h.isCompletedToday()); + + h.getRepetitions().toggle(getStartOfToday(), 200); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 100); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 50); + assertFalse(h.isCompletedToday()); + + h.setTargetType(Habit.AT_MOST); + h.getRepetitions().toggle(getStartOfToday(), 200); + assertFalse(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 100); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 50); + assertTrue(h.isCompletedToday()); + } + + @Test + public void testURI() throws Exception + { + assertTrue(habitList.isEmpty()); + Habit h = modelFactory.buildHabit(); + habitList.add(h); + assertThat(h.getId(), equalTo(0L)); + assertThat(h.getUriString(), + equalTo("content://org.isoron.uhabits/habit/0")); + } } \ No newline at end of file diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java index fe456e761..68a089730 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java @@ -27,9 +27,12 @@ import org.junit.*; import java.util.*; -import static org.hamcrest.MatcherAssert.*; +import static junit.framework.TestCase.assertFalse; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.*; import static org.hamcrest.core.IsEqual.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.*; public class RepetitionListTest extends BaseUnitTest @@ -58,14 +61,15 @@ public class RepetitionListTest extends BaseUnitTest today = DateUtils.getStartOfToday(); day = DateUtils.millisecondsInOneDay; - reps.toggleTimestamp(today - 3 * day); - reps.toggleTimestamp(today - 2 * day); - reps.toggleTimestamp(today); - reps.toggleTimestamp(today - 7 * day); - reps.toggleTimestamp(today - 5 * day); + reps.toggle(today - 3 * day); + reps.toggle(today - 2 * day); + reps.toggle(today); + reps.toggle(today - 7 * day); + reps.toggle(today - 5 * day); listener = mock(ModelObservable.Listener.class); reps.getObservable().addListener(listener); + reset(listener); } @Override @@ -130,7 +134,7 @@ public class RepetitionListTest extends BaseUnitTest weekdayCount[month][week]++; monthCount[month]++; } - reps.toggleTimestamp(day.getTimeInMillis()); + reps.toggle(day.getTimeInMillis()); } } @@ -155,17 +159,33 @@ public class RepetitionListTest extends BaseUnitTest } @Test - public void test_toggleTimestamp() + public void test_toggle() { - assertThat(reps.containsTimestamp(today), equalTo(true)); - reps.toggleTimestamp(today); - assertThat(reps.containsTimestamp(today), equalTo(false)); + assertTrue(reps.containsTimestamp(today)); + reps.toggle(today); + assertFalse(reps.containsTimestamp(today)); + verify(listener).onModelChange(); + reset(listener); + + assertFalse(reps.containsTimestamp(today - day)); + reps.toggle(today - day); + assertTrue(reps.containsTimestamp(today - day)); verify(listener).onModelChange(); reset(listener); - assertThat(reps.containsTimestamp(today - day), equalTo(false)); - reps.toggleTimestamp(today - day); - assertThat(reps.containsTimestamp(today - day), equalTo(true)); + habit.setType(Habit.NUMBER_HABIT); + reps.toggle(today, 100); + Repetition check = reps.getByTimestamp(today); + assertNotNull(check); + assertThat(check.getValue(), equalTo(100)); verify(listener).onModelChange(); + reset(listener); + + reps.toggle(today, 500); + check = reps.getByTimestamp(today); + assertNotNull(check); + assertThat(check.getValue(), equalTo(500)); + verify(listener, times(2)).onModelChange(); + reset(listener); } } \ No newline at end of file diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java index 2ad2c2893..44d5214d3 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java @@ -205,6 +205,6 @@ public class ScoreListTest extends BaseUnitTest long day = DateUtils.millisecondsInOneDay; for (int i = from; i < to; i++) - reps.toggleTimestamp(today - i * day); + reps.toggle(today - i * day); } }