From 2af1dbf3a6cda76c569e178a6cff77545df2398b Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 22 Aug 2020 19:42:46 -0500 Subject: [PATCH] Reactivate HistoryChart tests; fix IndexOutOfBoundsException --- .../java/org/isoron/uhabits/BaseViewTest.java | 13 +-- .../common/views/HistoryChartTest.java | 96 +++++++++++-------- .../activities/common/views/HistoryChart.java | 18 ++-- 3 files changed, 73 insertions(+), 54 deletions(-) diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java index fcd6ff9f6..d871da334 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java @@ -20,13 +20,11 @@ package org.isoron.uhabits; import android.graphics.*; - -import androidx.annotation.NonNull; -import androidx.test.*; import android.view.*; import android.widget.*; -import androidx.test.platform.app.InstrumentationRegistry; +import androidx.annotation.*; +import androidx.test.platform.app.*; import org.isoron.androidbase.*; import org.isoron.androidbase.utils.*; @@ -35,10 +33,9 @@ import org.isoron.uhabits.widgets.*; import java.io.*; import java.util.*; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.KITKAT; -import static android.os.Build.VERSION_CODES.LOLLIPOP; -import static android.view.View.MeasureSpec.makeMeasureSpec; +import static android.os.Build.VERSION.*; +import static android.os.Build.VERSION_CODES.*; +import static android.view.View.MeasureSpec.*; public class BaseViewTest extends BaseAndroidTest { diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java index d3fef3755..1a0a9b777 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java @@ -19,17 +19,18 @@ package org.isoron.uhabits.activities.common.views; +import androidx.test.ext.junit.runners.*; import androidx.test.filters.*; -import androidx.test.runner.*; - -import androidx.test.ext.junit.runners.AndroidJUnit4; import org.isoron.uhabits.*; import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; +import static org.mockito.Mockito.*; + @RunWith(AndroidJUnit4.class) @MediumTest public class HistoryChartTest extends BaseViewTest @@ -38,6 +39,12 @@ public class HistoryChartTest extends BaseViewTest private HistoryChart chart; + private Habit habit; + + Timestamp today; + + private HistoryChart.Controller controller; + @Override @Before public void setUp() @@ -45,50 +52,59 @@ public class HistoryChartTest extends BaseViewTest super.setUp(); fixtures.purgeHabits(habitList); - Habit habit = fixtures.createLongHabit(); + habit = fixtures.createLongHabit(); + today = new Timestamp(DateUtils.getStartOfToday()); chart = new HistoryChart(targetContext); chart.setCheckmarks(habit.getCheckmarks().getAllValues()); chart.setColor(PaletteUtils.getAndroidTestColor(habit.getColor())); measureView(chart, dpToPixels(400), dpToPixels(200)); + + controller = mock(HistoryChart.Controller.class); + chart.setController(controller); + } + + @Test + public void tapDate_atInvalidLocations() throws Throwable + { + chart.setIsEditable(true); + chart.tap(dpToPixels(118), dpToPixels(13)); // header + chart.tap(dpToPixels(336), dpToPixels(60)); // tomorrow's square + chart.tap(dpToPixels(370), dpToPixels(60)); // right axis + verifyNoMoreInteractions(controller); + } + + @Test + public void tapDate_withEditableView() throws Throwable + { + chart.setIsEditable(true); + + chart.tap(dpToPixels(340), dpToPixels(40)); + verify(controller).onToggleCheckmark(today, Checkmark.SKIPPED); + chart.tap(dpToPixels(340), dpToPixels(40)); + verify(controller).onToggleCheckmark(today, Checkmark.UNCHECKED); + chart.tap(dpToPixels(340), dpToPixels(40)); + verify(controller).onToggleCheckmark(today, Checkmark.CHECKED_EXPLICITLY); + verifyNoMoreInteractions(controller); } -// @Test -// public void tapDate_atInvalidLocations() throws Throwable -// { -// int expectedCheckmarkValues[] = habit.getCheckmarks().getAllValues(); -// -// chart.setIsEditable(true); -// tap(chart, 118, 13); // header -// tap(chart, 336, 60); // tomorrow's square -// tap(chart, 370, 60); // right axis -// waitForAsyncTasks(); -// -// int actualCheckmarkValues[] = habit.getCheckmarks().getAllValues(); -// assertThat(actualCheckmarkValues, equalTo(expectedCheckmarkValues)); -// } -// -// @Test -// public void tapDate_withEditableView() throws Throwable -// { -// chart.setIsEditable(true); -// tap(chart, 340, 40); // today's square -// waitForAsyncTasks(); -// -// long today = DateUtils.getStartOfToday(); -// assertFalse(habit.getRepetitions().containsTimestamp(today)); -// } -// -// @Test -// public void tapDate_withReadOnlyView() throws Throwable -// { -// chart.setIsEditable(false); -// tap(chart, 340, 40); // today's square -// waitForAsyncTasks(); -// -// long today = DateUtils.getStartOfToday(); -// assertTrue(habit.getRepetitions().containsTimestamp(today)); -// } + @Test + public void tapDate_withEmptyHabit() + { + chart.setIsEditable(true); + chart.setCheckmarks(new int[]{}); + chart.tap(dpToPixels(340), dpToPixels(40)); + verify(controller).onToggleCheckmark(today, Checkmark.CHECKED_EXPLICITLY); + verifyNoMoreInteractions(controller); + } + + @Test + public void tapDate_withReadOnlyView() throws Throwable + { + chart.setIsEditable(false); + chart.tap(dpToPixels(340), dpToPixels(40)); + verifyNoMoreInteractions(controller); + } @Test public void testRender() throws Throwable diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java index 97e347e79..71df96c2d 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java @@ -121,11 +121,7 @@ public class HistoryChart extends ScrollableChart @Override public boolean onSingleTapUp(MotionEvent e) { - if (!isEditable) return false; - - performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); float x, y; - try { int pointerId = e.getPointerId(0); @@ -139,20 +135,30 @@ public class HistoryChart extends ScrollableChart // e.getPointerId. return false; } + return tap(x, y); + } + + public boolean tap(float x, float y) + { + if (!isEditable) return false; + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); final Timestamp timestamp = positionToTimestamp(x, y); if (timestamp == null) return false; Timestamp today = DateUtils.getToday(); + int newValue = CHECKED_EXPLICITLY; int offset = timestamp.daysUntil(today); if (offset < checkmarks.length) { - checkmarks[offset] = Repetition.nextToggleValue(checkmarks[offset]); + newValue = Repetition.nextToggleValue(checkmarks[offset]); + checkmarks[offset] = newValue; } - controller.onToggleCheckmark(timestamp, checkmarks[offset]); + controller.onToggleCheckmark(timestamp, newValue); postInvalidate(); return true; + } public void populateWithRandomData()