[california] Permit am/pm as separate token in Quick Add: Bug #731634



commit 0ee60b1358831b6dbf5a5183005c6bd4bfc9fa27
Author: Jim Nelson <jim yorba org>
Date:   Wed Jun 18 19:25:25 2014 -0700

    Permit am/pm as separate token in Quick Add: Bug #731634

 src/component/component-details-parser.vala |   21 ++++++++++++++++++++-
 src/tests/tests-quick-add.vala              |   24 ++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletions(-)
---
diff --git a/src/component/component-details-parser.vala b/src/component/component-details-parser.vala
index e5ad17b..6a25eac 100644
--- a/src/component/component-details-parser.vala
+++ b/src/component/component-details-parser.vala
@@ -296,8 +296,27 @@ public class DetailsParser : BaseObject {
         if (date != null && add_date(date))
             return true;
         
+        // store locally so it can be modified w/o risk (tokens may be reused)
+        string specifier_casefolded = specifier.casefolded;
+        
+        // if meridiem found in next token, append to specifier for WallTime.parse()
+        bool found_meridiem = false;
+        stack.mark();
+        {
+            Token? meridiem = stack.pop();
+            if (meridiem != null
+                && (meridiem.casefolded == Calendar.FMT_AM.casefold() || meridiem.casefolded == 
Calendar.FMT_PM.casefold())) {
+                specifier_casefolded += meridiem.casefolded;
+                found_meridiem = true;
+            }
+        }
+        
+        // swallow meridiem if being used for WallTime.parse()
+        if (!found_meridiem)
+            stack.restore();
+        
         bool strictly_parsed;
-        Calendar.WallTime? wall_time = Calendar.WallTime.parse(specifier.casefolded,
+        Calendar.WallTime? wall_time = Calendar.WallTime.parse(specifier_casefolded,
             out strictly_parsed);
         if (wall_time != null && !strictly_parsed && strict)
             return false;
diff --git a/src/tests/tests-quick-add.vala b/src/tests/tests-quick-add.vala
index 78f1147..e24e58c 100644
--- a/src/tests/tests-quick-add.vala
+++ b/src/tests/tests-quick-add.vala
@@ -25,6 +25,8 @@ private class QuickAdd : UnitTest.Harness {
         add_case("zero-hour", zero_hour);
         add_case("oh-twenty-four-hours", oh_twenty_four_hours);
         add_case("midnight-to-one", midnight_to_one);
+        add_case("separate-am", separate_am);
+        add_case("separate-pm", separate_pm);
     }
     
     protected override void setup() throws Error {
@@ -237,6 +239,28 @@ private class QuickAdd : UnitTest.Harness {
             && parser.event.exact_time_span.start_exact_time.equal_to(start)
             && parser.event.exact_time_span.end_exact_time.equal_to(end);
     }
+    
+    private bool separate_am() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(
+            "Dinner at 1 pm with Denny", null);
+        
+        Calendar.ExactTime start = new Calendar.ExactTime(Calendar.Timezone.local, Calendar.System.today,
+            new Calendar.WallTime(13, 0, 0));
+        
+        return parser.event.summary == "Dinner with Denny"
+            && parser.event.exact_time_span.start_exact_time.equal_to(start);
+    }
+    
+    private bool separate_pm() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(
+            "Dinner at 11 am", null);
+        
+        Calendar.ExactTime start = new Calendar.ExactTime(Calendar.Timezone.local, Calendar.System.today,
+            new Calendar.WallTime(11, 0, 0));
+        
+        return parser.event.summary == "Dinner"
+            && parser.event.exact_time_span.start_exact_time.equal_to(start);
+    }
 }
 
 }


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