[california] Add midnight, noon to details parser, fix date overflow w/ quick add



commit bfc398561d04a2a3395261a422fd30840d71553b
Author: Jim Nelson <jim yorba org>
Date:   Mon Apr 28 16:55:51 2014 -0700

    Add midnight, noon to details parser, fix date overflow w/ quick add
    
    If quick-adding an event that crosses midnight, ensure the end date
    is adjusted to account for it.

 src/calendar/calendar-wall-time.vala        |   11 +++++++++
 src/calendar/calendar.vala                  |    6 +++++
 src/component/component-details-parser.vala |    4 +++
 src/tests/tests-quick-add.vala              |   30 +++++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 0 deletions(-)
---
diff --git a/src/calendar/calendar-wall-time.vala b/src/calendar/calendar-wall-time.vala
index 6ff682c..495fafb 100644
--- a/src/calendar/calendar-wall-time.vala
+++ b/src/calendar/calendar-wall-time.vala
@@ -149,6 +149,17 @@ public class WallTime : BaseObject, Gee.Comparable<WallTime>, Gee.Hashable<WallT
         if (String.is_empty(token))
             return null;
         
+        // look for words that mean specific times
+        if (token == MIDNIGHT.casefold()) {
+            strictly_parsed = true;
+            
+            return new WallTime(0, 0, 0);
+        } else if (token == NOON.casefold()) {
+            strictly_parsed = true;
+            
+            return new WallTime(12, 0, 0);
+        }
+        
         // look for meridiem tacked on to end
         bool pm = false;
         bool meridiem_unknown = false;
diff --git a/src/calendar/calendar.vala b/src/calendar/calendar.vala
index 112066e..b4edb9d 100644
--- a/src/calendar/calendar.vala
+++ b/src/calendar/calendar.vala
@@ -39,6 +39,9 @@ private static unowned string FMT_12HOUR_MIN_SEC_MERIDIEM;
 private static unowned string FMT_24HOUR_MIN;
 private static unowned string FMT_24HOUR_MIN_SEC;
 
+private unowned string MIDNIGHT;
+private unowned string NOON;
+
 private string[] UNIT_DAYS;
 private string[] UNIT_HOURS;
 private string[] UNIT_MINS;
@@ -154,6 +157,9 @@ public void init() throws Error {
     if (language_env != null)
         Environment.set_variable("LANGUAGE", language_env, true);
     
+    MIDNIGHT = _("midnight");
+    NOON = _("noon");
+    
     // This init() throws an IOError, so perform before others to prevent unnecessary unwinding
     System.preinit();
     
diff --git a/src/component/component-details-parser.vala b/src/component/component-details-parser.vala
index 2811fb5..c396141 100644
--- a/src/component/component-details-parser.vala
+++ b/src/component/component-details-parser.vala
@@ -193,6 +193,10 @@ public class DetailsParser : BaseObject {
             assert(start_date != null);
             assert(end_date != null);
             
+            // look for midnight crossings
+            if (start_time.compare_to(end_time) > 0)
+                end_date = end_date.next();
+            
             event.set_event_exact_time_span(new Calendar.ExactTimeSpan(
                 new Calendar.ExactTime(Calendar.System.timezone, start_date, start_time),
                 new Calendar.ExactTime(Calendar.System.timezone, end_date, end_time)
diff --git a/src/tests/tests-quick-add.vala b/src/tests/tests-quick-add.vala
index c65302a..57ff4c2 100644
--- a/src/tests/tests-quick-add.vala
+++ b/src/tests/tests-quick-add.vala
@@ -18,6 +18,8 @@ private class QuickAdd : UnitTest.Harness {
         add_case("with-delay-and-duration", with_delay_and_duration);
         add_case("indeterminate-time", indeterminate_time);
         add_case("dialog-example", dialog_example);
+        add_case("noon", noon);
+        add_case("midnight", midnight);
     }
     
     protected override void setup() throws Error {
@@ -137,6 +139,34 @@ private class QuickAdd : UnitTest.Harness {
             && parser.event.exact_time_span.start_exact_time.equal_to(time)
             && parser.event.exact_time_span.end_exact_time.equal_to(time.adjust_time(1, 
Calendar.TimeUnit.HOUR));
     }
+    
+    private bool noon() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(
+            "Lunch noon to 1:30pm", null);
+        
+        Calendar.ExactTime start = new Calendar.ExactTime(Calendar.Timezone.local, Calendar.System.today,
+            new Calendar.WallTime(12, 0, 0));
+        Calendar.ExactTime end = new Calendar.ExactTime(Calendar.Timezone.local, Calendar.System.today,
+            new Calendar.WallTime(13, 30, 0));
+        
+        return parser.event.summary == "Lunch"
+            && parser.event.exact_time_span.start_exact_time.equal_to(start)
+            && parser.event.exact_time_span.end_exact_time.equal_to(end);
+    }
+    
+    private bool midnight() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(
+            "Dinner 11pm to midnight", null);
+        
+        Calendar.ExactTime start = new Calendar.ExactTime(Calendar.Timezone.local, Calendar.System.today,
+            new Calendar.WallTime(23, 0, 0));
+        Calendar.ExactTime end = new Calendar.ExactTime(Calendar.Timezone.local, 
Calendar.System.today.adjust(1, Calendar.DateUnit.DAY),
+            new Calendar.WallTime(0, 0, 0));
+        
+        return parser.event.summary == "Dinner"
+            && parser.event.exact_time_span.start_exact_time.equal_to(start)
+            && parser.event.exact_time_span.end_exact_time.equal_to(end);
+    }
 }
 
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]