diff --git a/android/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java b/android/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java deleted file mode 100644 index 05363a0eb..000000000 --- a/android/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2017 Álinson Santos Xavier - * - * 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 . - */ - -package org.isoron.uhabits.receivers; - -import org.isoron.uhabits.*; -import org.isoron.uhabits.core.commands.*; -import org.isoron.uhabits.core.models.*; -import org.isoron.uhabits.core.preferences.*; -import org.isoron.uhabits.core.ui.*; -import org.isoron.uhabits.core.ui.widgets.*; -import org.isoron.uhabits.core.utils.*; -import org.junit.*; - -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.core.IsEqual.*; -import static org.isoron.uhabits.core.models.Checkmark.*; -import static org.mockito.Mockito.*; - -public class WidgetControllerTest extends BaseAndroidJVMTest -{ - private WidgetBehavior controller; - - private CommandRunner commandRunner; - - private Habit habit; - - private Timestamp today; - - private NotificationTray notificationTray; - - private Preferences preferences; - - @Override - public void setUp() - { - super.setUp(); - - today = DateUtils.getToday(); - habit = fixtures.createEmptyHabit(); - commandRunner = mock(CommandRunner.class); - notificationTray = mock(NotificationTray.class); - preferences = mock(Preferences.class); - controller = - new WidgetBehavior(habitList, commandRunner, notificationTray, preferences); - } - - @Test - public void testOnAddRepetition_whenChecked() throws Exception - { - habit.getRepetitions().setValue(today, YES_MANUAL); - int todayValue = habit.getCheckmarks().getTodayValue(); - assertThat(todayValue, equalTo(YES_MANUAL)); - controller.onAddRepetition(habit, today); - verifyZeroInteractions(commandRunner); - } - - @Test - public void testOnAddRepetition_whenUnchecked() throws Exception - { - int todayValue = habit.getCheckmarks().getTodayValue(); - assertThat(todayValue, equalTo(NO)); - controller.onAddRepetition(habit, today); - verify(commandRunner).execute(any(), isNull()); - verify(notificationTray).cancel(habit); - } - - @Test - public void testOnRemoveRepetition_whenChecked() throws Exception - { - habit.getRepetitions().setValue(today, YES_MANUAL); - int todayValue = habit.getCheckmarks().getTodayValue(); - assertThat(todayValue, equalTo(YES_MANUAL)); - controller.onRemoveRepetition(habit, today); - verify(commandRunner).execute(any(), isNull()); - } - - @Test - public void testOnRemoveRepetition_whenUnchecked() throws Exception - { - int todayValue = habit.getCheckmarks().getTodayValue(); - assertThat(todayValue, equalTo(NO)); - controller.onRemoveRepetition(habit, today); - verifyZeroInteractions(commandRunner); - } - - @Test - public void testOnToggleRepetition() throws Exception - { - controller.onToggleRepetition(habit, today); - verify(commandRunner).execute(any(), isNull()); - } -} \ No newline at end of file diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java index 0c534cd5b..fae0b53d4 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java @@ -29,6 +29,8 @@ import org.jetbrains.annotations.*; import javax.inject.*; +import static org.isoron.uhabits.core.models.Checkmark.*; + public class WidgetBehavior { private HabitList habitList; @@ -57,57 +59,42 @@ public class WidgetBehavior public void onAddRepetition(@NonNull Habit habit, Timestamp timestamp) { notificationTray.cancel(habit); - Repetition rep = habit.getRepetitions().getByTimestamp(timestamp); - if (rep != null) return; - performToggle(habit, timestamp, Checkmark.YES_MANUAL); + setValue(habit, timestamp, YES_MANUAL); } public void onRemoveRepetition(@NonNull Habit habit, Timestamp timestamp) { notificationTray.cancel(habit); - Repetition rep = habit.getRepetitions().getByTimestamp(timestamp); - if (rep == null) return; - performToggle(habit, timestamp, Checkmark.NO); + setValue(habit, timestamp, NO); } public void onToggleRepetition(@NonNull Habit habit, Timestamp timestamp) { - Repetition previous = habit.getRepetitions().getByTimestamp(timestamp); - if(previous == null) - { - performToggle(habit, timestamp, Checkmark.YES_MANUAL); - } + int currentValue = habit.getRepetitions().getValue(timestamp); + int newValue; + if(preferences.isSkipEnabled()) + newValue = Repetition.nextToggleValueWithSkip(currentValue); else - { - int value; - if(preferences.isSkipEnabled()) - value = Repetition.nextToggleValueWithSkip(previous.getValue()); - else - value = Repetition.nextToggleValueWithoutSkip(previous.getValue()); - performToggle(habit, timestamp, value); - } - } - - private void performToggle(@NonNull Habit habit, Timestamp timestamp, int value) - { - commandRunner.execute( - new CreateRepetitionCommand(habitList, habit, timestamp, value), - habit.getId()); - } - - public void setNumericValue(@NonNull Habit habit, Timestamp timestamp, int newValue) { - commandRunner.execute( - new CreateRepetitionCommand(habitList, habit, timestamp, newValue), - habit.getId()); + newValue = Repetition.nextToggleValueWithoutSkip(currentValue); + setValue(habit, timestamp, newValue); + notificationTray.cancel(habit); } public void onIncrement(@NotNull Habit habit, @NotNull Timestamp timestamp, int amount) { int currentValue = habit.getCheckmarks().getValues(timestamp, timestamp)[0]; - setNumericValue(habit, timestamp, currentValue + amount); + setValue(habit, timestamp, currentValue + amount); + notificationTray.cancel(habit); } public void onDecrement(@NotNull Habit habit, @NotNull Timestamp timestamp, int amount) { int currentValue = habit.getCheckmarks().getValues(timestamp, timestamp)[0]; - setNumericValue(habit, timestamp, currentValue - amount); + setValue(habit, timestamp, currentValue - amount); + notificationTray.cancel(habit); + } + + public void setValue(@NonNull Habit habit, Timestamp timestamp, int newValue) { + commandRunner.execute( + new CreateRepetitionCommand(habitList, habit, timestamp, newValue), + habit.getId()); } } diff --git a/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java new file mode 100644 index 000000000..eea405019 --- /dev/null +++ b/android/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/widgets/WidgetBehaviorTest.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2016-2020 Álinson Santos Xavier + * + * 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 . + */ + +package org.isoron.uhabits.core.ui.widgets; + +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; +import org.junit.*; + +import java.util.*; + +import static org.isoron.uhabits.core.models.Checkmark.*; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class WidgetBehaviorTest extends BaseUnitTest +{ + private NotificationTray notificationTray; + + private CommandRunner commandRunner; + + private Preferences preferences; + + private WidgetBehavior behavior; + + private Habit habit; + + private Timestamp timestamp = new Timestamp(0L); + + @Before + @Override + public void setUp() throws Exception + { + super.setUp(); + habit = fixtures.createEmptyHabit(); + commandRunner = mock(CommandRunner.class); + notificationTray = mock(NotificationTray.class); + preferences = mock(Preferences.class); + behavior = new WidgetBehavior(habitList, commandRunner, notificationTray, preferences); + } + + @Test + public void testOnAddRepetition() + { + behavior.onAddRepetition(habit, timestamp); + verify(commandRunner).execute( + new CreateRepetitionCommand(habitList, habit, timestamp, YES_MANUAL), + habit.id); + verify(notificationTray).cancel(habit); + verifyZeroInteractions(preferences); + } + + @Test + public void testOnRemoveRepetition() + { + behavior.onRemoveRepetition(habit, timestamp); + verify(commandRunner).execute( + new CreateRepetitionCommand(habitList, habit, timestamp, NO), + habit.id); + verify(notificationTray).cancel(habit); + verifyZeroInteractions(preferences); + } + + @Test + public void testOnToggleRepetition() + { + for (boolean skipEnabled : Arrays.asList(true, false)) + for (int currentValue : Arrays.asList(NO, YES_MANUAL, YES_AUTO, SKIP)) + { + when(preferences.isSkipEnabled()).thenReturn(skipEnabled); + + int nextValue; + if(skipEnabled) nextValue = Repetition.nextToggleValueWithSkip(currentValue); + else nextValue = Repetition.nextToggleValueWithoutSkip(currentValue); + + habit.getRepetitions().setValue(timestamp, currentValue); + behavior.onToggleRepetition(habit, timestamp); + verify(preferences).isSkipEnabled(); + verify(commandRunner).execute( + new CreateRepetitionCommand(habitList, habit, timestamp, nextValue), + habit.id); + verify(notificationTray).cancel(habit); + reset(preferences, commandRunner, notificationTray); + } + } + + @Test + public void testOnIncrement() + { + habit = fixtures.createNumericalHabit(); + habit.getRepetitions().setValue(timestamp, 500); + + behavior.onIncrement(habit, timestamp, 100); + verify(commandRunner).execute( + new CreateRepetitionCommand(habitList, habit, timestamp, 600), + habit.id); + verify(notificationTray).cancel(habit); + verifyZeroInteractions(preferences); + } + + @Test + public void testOnDecrement() + { + habit = fixtures.createNumericalHabit(); + habit.getRepetitions().setValue(timestamp, 500); + + behavior.onDecrement(habit, timestamp, 100); + verify(commandRunner).execute( + new CreateRepetitionCommand(habitList, habit, timestamp, 400), + habit.id); + verify(notificationTray).cancel(habit); + verifyZeroInteractions(preferences); + } +}