From 49d99258dfbb4dae8c33d58c957ee965ca198de3 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 31 Dec 2013 17:02:54 -0600 Subject: [PATCH] Add joda time and unit tests * Add datetime tests * Add repeat tests * Disable instrumentTest on travis build * Update project properties --- .travis.yml | 2 +- android-aac-enc/project.properties | 2 +- api/build.gradle | 2 + api/project.properties | 2 +- .../todoroo/andlib/utility/DateUtilities.java | 6 +- .../java/org/tasks/date/DateTimeUtils.java | 9 ++ astrid/proguard.cfg | 1 + astrid/project.properties | 2 +- .../repeats/RepeatTaskCompleteListener.java | 5 +- .../andlib/utility/DateUtilitiesTest.java | 34 ++++++ .../com/todoroo/astrid/data/TaskTest.java | 100 ++++++++++++++++++ .../RepeatTaskCompleteListenerTest.java | 53 ++++++++++ astrid/src/test/java/org/tasks/Freeze.java | 24 +++++ astrid/src/test/java/org/tasks/Snippet.java | 4 + lint.xml | 1 + 15 files changed, 238 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/org/tasks/date/DateTimeUtils.java create mode 100644 astrid/src/test/java/com/todoroo/astrid/data/TaskTest.java create mode 100644 astrid/src/test/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListenerTest.java create mode 100644 astrid/src/test/java/org/tasks/Freeze.java create mode 100644 astrid/src/test/java/org/tasks/Snippet.java diff --git a/.travis.yml b/.travis.yml index 38f74ab4e..df13a89a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,4 +40,4 @@ before_script: script: - ./gradlew test --stacktrace --info - - ./gradlew :astrid:connectedInstrumentTest --stacktrace --info + # - ./gradlew :astrid:connectedInstrumentTest --stacktrace --info diff --git a/android-aac-enc/project.properties b/android-aac-enc/project.properties index 7002f279d..8e4bc5fdc 100644 --- a/android-aac-enc/project.properties +++ b/android-aac-enc/project.properties @@ -8,5 +8,5 @@ # project structure. # Project target. -target=android-18 +target=android-19 android.library=true diff --git a/api/build.gradle b/api/build.gradle index c56ec4b92..1b4fd1fd0 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -30,4 +30,6 @@ android { dependencies { compile 'com.android.support:support-v4:18.0.0' + + compile group: 'joda-time', name: 'joda-time', version: '2.3', transitive: false } diff --git a/api/project.properties b/api/project.properties index 6905bdf0a..c57400d00 100644 --- a/api/project.properties +++ b/api/project.properties @@ -9,4 +9,4 @@ android.library=true # Project target. -target=android-18 +target=android-19 diff --git a/api/src/main/java/com/todoroo/andlib/utility/DateUtilities.java b/api/src/main/java/com/todoroo/andlib/utility/DateUtilities.java index 921cf757c..83e49b122 100644 --- a/api/src/main/java/com/todoroo/andlib/utility/DateUtilities.java +++ b/api/src/main/java/com/todoroo/andlib/utility/DateUtilities.java @@ -18,6 +18,8 @@ import java.util.Calendar; import java.util.Date; import java.util.Locale; +import static org.tasks.date.DateTimeUtils.currentTimeMillis; + public class DateUtilities { @@ -50,12 +52,12 @@ public class DateUtilities { /** Returns unixtime for current time */ public static long now() { - return System.currentTimeMillis(); + return currentTimeMillis(); } /** Returns unixtime one month from now */ public static long oneMonthFromNow() { - Date date = new Date(); + Date date = new Date(now()); date.setMonth(date.getMonth() + 1); return date.getTime(); } diff --git a/api/src/main/java/org/tasks/date/DateTimeUtils.java b/api/src/main/java/org/tasks/date/DateTimeUtils.java new file mode 100644 index 000000000..973626f99 --- /dev/null +++ b/api/src/main/java/org/tasks/date/DateTimeUtils.java @@ -0,0 +1,9 @@ +package org.tasks.date; + +public class DateTimeUtils { + + public static long currentTimeMillis() { + return org.joda.time.DateTimeUtils.currentTimeMillis(); + } + +} diff --git a/astrid/proguard.cfg b/astrid/proguard.cfg index f532fdab1..5948ae993 100644 --- a/astrid/proguard.cfg +++ b/astrid/proguard.cfg @@ -22,6 +22,7 @@ -keep class com.google.gson.stream.JsonWriter { public void setLenient(boolean); } +-keep class org.joda.** # ignore reflection-based access from google libraries -dontwarn com.google.** diff --git a/astrid/project.properties b/astrid/project.properties index 1e91dc057..3e8134ff4 100644 --- a/astrid/project.properties +++ b/astrid/project.properties @@ -10,7 +10,7 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-18 +target=android-19 apk-configurations= android.library.reference.1=../api android.library.reference.2=../android-aac-enc diff --git a/astrid/src/main/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java b/astrid/src/main/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java index 380c20ccc..e32e384d5 100644 --- a/astrid/src/main/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java +++ b/astrid/src/main/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListener.java @@ -280,7 +280,7 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { } } - private static long handleSubdayRepeat(Date startDate, RRule rrule) { + static long handleSubdayRepeat(Date startDate, RRule rrule) { long millis; switch(rrule.getFreq()) { case HOURLY: @@ -293,8 +293,7 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver { throw new RuntimeException("Error handing subday repeat: " + rrule.getFreq()); //$NON-NLS-1$ } long newDueDate = startDate.getTime() + millis * rrule.getInterval(); - return Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, - newDueDate); + return Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, newDueDate); } } diff --git a/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java b/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java index bbfb30d21..537795cb1 100644 --- a/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java +++ b/astrid/src/test/java/com/todoroo/andlib/utility/DateUtilitiesTest.java @@ -7,17 +7,21 @@ package com.todoroo.andlib.utility; import com.todoroo.andlib.test.TodorooRobolectricTestCase; +import org.joda.time.DateTime; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.tasks.Snippet; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; +import static com.todoroo.andlib.utility.DateUtilities.oneMonthFromNow; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import static org.tasks.Freeze.freezeAt; @RunWith(RobolectricTestRunner.class) public class DateUtilitiesTest extends TodorooRobolectricTestCase { @@ -115,4 +119,34 @@ public class DateUtilitiesTest extends TodorooRobolectricTestCase { assertEquals(0, cal.get(Calendar.MINUTE)); assertEquals(0, cal.get(Calendar.SECOND)); } + + @Test + public void oneMonthFromEndOfDecember() { + DateTime now = new DateTime(2013, 12, 31, 16, 31, 20, 597); + final long expected = new DateTime(2014, 1, 31, 16, 31, 20, 597).getMillis(); + + freezeAt(now).thawAfter(new Snippet() {{ + assertEquals(expected, oneMonthFromNow()); + }}); + } + + @Test + public void oneMonthFromEndOfJanuary() { + DateTime now = new DateTime(2014, 1, 31, 12, 54, 33, 175); + final long expected = new DateTime(2014, 3, 3, 12, 54, 33, 175).getMillis(); + + freezeAt(now).thawAfter(new Snippet() {{ + assertEquals(expected, oneMonthFromNow()); + }}); + } + + @Test + public void oneMonthFromEndOfFebruary() { + DateTime now = new DateTime(2014, 2, 28, 9, 19, 7, 990); + final long expected = new DateTime(2014, 3, 28, 9, 19, 7, 990).getMillis(); + + freezeAt(now).thawAfter(new Snippet() {{ + assertEquals(expected, oneMonthFromNow()); + }}); + } } diff --git a/astrid/src/test/java/com/todoroo/astrid/data/TaskTest.java b/astrid/src/test/java/com/todoroo/astrid/data/TaskTest.java new file mode 100644 index 000000000..a2f0c9959 --- /dev/null +++ b/astrid/src/test/java/com/todoroo/astrid/data/TaskTest.java @@ -0,0 +1,100 @@ +package com.todoroo.astrid.data; + +import org.joda.time.DateTime; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import static com.todoroo.astrid.data.Task.URGENCY_DAY_AFTER; +import static com.todoroo.astrid.data.Task.URGENCY_IN_TWO_WEEKS; +import static com.todoroo.astrid.data.Task.URGENCY_NEXT_MONTH; +import static com.todoroo.astrid.data.Task.URGENCY_NEXT_WEEK; +import static com.todoroo.astrid.data.Task.URGENCY_NONE; +import static com.todoroo.astrid.data.Task.URGENCY_SPECIFIC_DAY; +import static com.todoroo.astrid.data.Task.URGENCY_SPECIFIC_DAY_TIME; +import static com.todoroo.astrid.data.Task.URGENCY_TODAY; +import static com.todoroo.astrid.data.Task.URGENCY_TOMORROW; +import static com.todoroo.astrid.data.Task.createDueDate; +import static org.junit.Assert.assertEquals; +import static org.tasks.Freeze.freezeAt; +import static org.tasks.Freeze.thaw; + +@RunWith(RobolectricTestRunner.class) +public class TaskTest { + + private static final DateTime now = new DateTime(2013, 12, 31, 16, 10, 53, 452); + private static final DateTime specificDueDate = new DateTime(2014, 3, 17, 9, 54, 27, 959); + + @Before + public void before() { + freezeAt(now); + } + + @After + public void after() { + thaw(); + } + + @Test + public void createDueDateNoUrgency() { + assertEquals(0, createDueDate(URGENCY_NONE, 1L)); + } + + @Test + public void createDueDateToday() { + long expected = new DateTime(2013, 12, 31, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_TODAY, -1L)); + } + + @Test + public void createDueDateTomorrow() { + long expected = new DateTime(2014, 1, 1, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_TOMORROW, -1L)); + } + + @Test + public void createDueDateDayAfter() { + long expected = new DateTime(2014, 1, 2, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_DAY_AFTER, -1L)); + } + + @Test + public void createDueDateNextWeek() { + long expected = new DateTime(2014, 1, 7, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_NEXT_WEEK, -1L)); + } + + @Test + public void createDueDateInTwoWeeks() { + long expected = new DateTime(2014, 1, 14, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_IN_TWO_WEEKS, -1L)); + } + + @Test + public void createDueDateNextMonth() { + long expected = new DateTime(2014, 1, 31, 12, 0, 0, 0).getMillis(); + assertEquals(expected, createDueDate(URGENCY_NEXT_MONTH, -1L)); + } + + @Test + public void removeTimeForSpecificDay() { + long expected = specificDueDate + .withHourOfDay(12) + .withMinuteOfHour(0) + .withSecondOfMinute(0) + .withMillisOfSecond(0) + .getMillis(); + assertEquals(expected, createDueDate(URGENCY_SPECIFIC_DAY, specificDueDate.getMillis())); + } + + @Test + public void removeSecondsForSpecificTime() { + long expected = specificDueDate + .withSecondOfMinute(1) + .withMillisOfSecond(0) + .getMillis(); + assertEquals(expected, createDueDate(URGENCY_SPECIFIC_DAY_TIME, specificDueDate.getMillis())); + } +} diff --git a/astrid/src/test/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListenerTest.java b/astrid/src/test/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListenerTest.java new file mode 100644 index 000000000..356c48539 --- /dev/null +++ b/astrid/src/test/java/com/todoroo/astrid/repeats/RepeatTaskCompleteListenerTest.java @@ -0,0 +1,53 @@ +package com.todoroo.astrid.repeats; + +import com.google.ical.values.Frequency; +import com.google.ical.values.RRule; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.Date; + +import static com.todoroo.astrid.repeats.RepeatTaskCompleteListener.handleSubdayRepeat; +import static org.junit.Assert.assertEquals; + +@RunWith(RobolectricTestRunner.class) +public class RepeatTaskCompleteListenerTest { + private static final Date start = new Date(113, 11, 31, 8, 31, 59); + + @Test + public void repeatEveryMinute() { + assertEquals( + new Date(113, 11, 31, 8, 32, 1).getTime(), // astrid always sets seconds to one + handleSubdayRepeat(start, newRule(1, Frequency.MINUTELY))); + } + + @Test + public void repeatEveryOtherMinute() { + assertEquals( + new Date(113, 11, 31, 8, 33, 1).getTime(), + handleSubdayRepeat(start, newRule(2, Frequency.MINUTELY))); + } + + @Test + public void repeatEveryHour() { + assertEquals( + new Date(113, 11, 31, 9, 31, 1).getTime(), + handleSubdayRepeat(start, newRule(1, Frequency.HOURLY))); + } + + @Test + public void repeatEveryOtherHour() { + assertEquals( + new Date(113, 11, 31, 10, 31, 1).getTime(), + handleSubdayRepeat(start, newRule(2, Frequency.HOURLY))); + } + + private RRule newRule(int interval, Frequency frequency) { + RRule rule = new RRule(); + rule.setInterval(interval); + rule.setFreq(frequency); + return rule; + } +} diff --git a/astrid/src/test/java/org/tasks/Freeze.java b/astrid/src/test/java/org/tasks/Freeze.java new file mode 100644 index 000000000..be6da8789 --- /dev/null +++ b/astrid/src/test/java/org/tasks/Freeze.java @@ -0,0 +1,24 @@ +package org.tasks; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeUtils; + +public class Freeze { + + public static Freeze freezeAt(DateTime dateTime) { + return freezeAt(dateTime.getMillis()); + } + + public static Freeze freezeAt(long millis) { + DateTimeUtils.setCurrentMillisFixed(millis); + return new Freeze(); + } + + public static void thaw() { + DateTimeUtils.setCurrentMillisSystem(); + } + + public void thawAfter(Snippet snippet) { + thaw(); + } +} \ No newline at end of file diff --git a/astrid/src/test/java/org/tasks/Snippet.java b/astrid/src/test/java/org/tasks/Snippet.java new file mode 100644 index 000000000..841c5aedb --- /dev/null +++ b/astrid/src/test/java/org/tasks/Snippet.java @@ -0,0 +1,4 @@ +package org.tasks; + +public class Snippet { +} diff --git a/lint.xml b/lint.xml index 9f18e0fa0..0722840be 100644 --- a/lint.xml +++ b/lint.xml @@ -2,4 +2,5 @@ +