[california/wip/725785-create-recurring: 15/16] Further tests and fixes for recurring w/ end dates



commit 8ac1876dc10f197e9ce3b2b11ef7ecd8ff97b47f
Author: Jim Nelson <jim yorba org>
Date:   Tue Jun 24 17:52:41 2014 -0700

    Further tests and fixes for recurring w/ end dates

 src/component/component-details-parser.vala |    4 +-
 src/tests/tests-quick-add-recurring.vala    |   74 +++++++++++++++++++++++++++
 src/tests/tests-quick-add.vala              |   24 +++++++++
 src/tests/tests-string.vala                 |   18 +++++++
 src/tests/tests.vala                        |    4 ++
 src/util/util-string.vala                   |    4 +-
 6 files changed, 126 insertions(+), 2 deletions(-)
---
diff --git a/src/component/component-details-parser.vala b/src/component/component-details-parser.vala
index 35e8639..0c067a6 100644
--- a/src/component/component-details-parser.vala
+++ b/src/component/component-details-parser.vala
@@ -767,8 +767,10 @@ public class DetailsParser : BaseObject {
     private bool add_date(Calendar.Date date) {
         if (start_date == null)
             start_date = date;
-        else if (end_date == null)
+        else if (end_date == null && rrule == null)
             end_date = date;
+        else if (rrule != null && rrule.until_date == null)
+            rrule.set_recurrence_end_date(date);
         else
             return false;
         
diff --git a/src/tests/tests-quick-add-recurring.vala b/src/tests/tests-quick-add-recurring.vala
index ac0d7a7..3c94ee9 100644
--- a/src/tests/tests-quick-add-recurring.vala
+++ b/src/tests/tests-quick-add-recurring.vala
@@ -23,6 +23,7 @@ private class QuickAddRecurring : UnitTest.Harness {
         
         // DAILY tests
         add_case("every-day", every_day);
+        add_case("all-day", all_day);
         add_case("daily", daily);
         add_case("every-day-10-days", every_day_10_days);
         add_case("every-2-days", every_2_days);
@@ -33,6 +34,8 @@ private class QuickAddRecurring : UnitTest.Harness {
         // WEEKLY
         add_case("every-tuesday", every_tuesday);
         add_case("every-friday", every_friday);
+        add_case("every-saturday-until", every_saturday_until);
+        add_case("all-day-saturday-until", all_day_saturday_until);
         add_case("weekly-meeting-monday", weekly_meeting_monday);
         add_case("weekly-meeting-tuesday", weekly_meeting_tuesday);
         add_case("tuesday_weekly", tuesday_weekly);
@@ -46,6 +49,7 @@ private class QuickAddRecurring : UnitTest.Harness {
         
         // MONTHLY
         add_case("every-first-tuesday", every_first_tuesday);
+        add_case("every-first-tuesday-for-3-weeks", every_first_tuesday_for_3_weeks);
         add_case("every-sixth-tuesday", every_sixth_tuesday);
         
         // YEARLY
@@ -185,6 +189,22 @@ private class QuickAddRecurring : UnitTest.Harness {
             && event.exact_time_span.start_exact_time.to_wall_time().equal_to(new Calendar.WallTime(10, 0, 
0));
     }
     
+    // Checks that an RRULE was generated,
+    // the summary is       meeting at work
+    // the location is      work
+    // is all day
+    private bool multiday(string details, out Component.Event event, out string? dump) {
+        Component.DetailsParser parser = new Component.DetailsParser(details, null);
+        event = parser.event;
+        
+        dump = "%s\n%s".printf(details, event.source);
+        
+        return event.rrule != null
+            && event.summary == "meeting at work"
+            && event.location == "work"
+            && event.is_all_day;
+    }
+    
     //
     // DAILY
     //
@@ -197,6 +217,14 @@ private class QuickAddRecurring : UnitTest.Harness {
             && !event.rrule.has_duration;
     }
     
+    private bool all_day(out string? dump) throws Error {
+        Component.Event event;
+        return multiday("meeting at work every day", out event, out dump)
+            && event.rrule.is_daily
+            && event.rrule.interval == 1
+            && !event.rrule.has_duration;
+    }
+    
     private bool daily(out string? dump) throws Error {
         Component.Event event;
         return basic("meeting at work daily at 10am", out event, out dump)
@@ -297,6 +325,38 @@ private class QuickAddRecurring : UnitTest.Harness {
             && check_byrule_day(event, by_days);
     }
     
+    private bool every_saturday_until(out string? dump) throws Error {
+        Gee.Map<Calendar.DayOfWeek?, int> by_days = iterate<Calendar.DayOfWeek?>(
+            Calendar.DayOfWeek.SAT).to_hash_map_as_keys<int>(dow => 0);
+        
+        Component.Event event;
+        return basic("meeting at work at 10am every saturday until dec 31", out event, out dump)
+            && event.rrule.is_weekly
+            && event.rrule.interval == 1
+            && event.rrule.until_date != null
+            && event.rrule.until_date.equal_to(new Calendar.Date(Calendar.DayOfMonth.for(31),
+                Calendar.Month.DEC, Calendar.System.today.year))
+            && event.exact_time_span.start_date.day_of_week.equal_to(Calendar.DayOfWeek.SAT)
+            && check_byrule_day(event, by_days)
+            && event.exact_time_span.end_date.equal_to(event.exact_time_span.start_date);
+    }
+    
+    private bool all_day_saturday_until(out string? dump) throws Error {
+        Gee.Map<Calendar.DayOfWeek?, int> by_days = iterate<Calendar.DayOfWeek?>(
+            Calendar.DayOfWeek.SAT).to_hash_map_as_keys<int>(dow => 0);
+        
+        Component.Event event;
+        return multiday("meeting at work every saturday until dec 31", out event, out dump)
+            && event.rrule.is_weekly
+            && event.rrule.interval == 1
+            && event.rrule.until_date != null
+            && event.rrule.until_date.equal_to(new Calendar.Date(Calendar.DayOfMonth.for(31),
+                Calendar.Month.DEC, Calendar.System.today.year))
+            && event.date_span.start_date.day_of_week.equal_to(Calendar.DayOfWeek.SAT)
+            && check_byrule_day(event, by_days)
+            && event.date_span.end_date.equal_to(event.date_span.start_date);
+    }
+    
     private bool weekly_meeting_monday(out string? dump) throws Error {
         Gee.Map<Calendar.DayOfWeek?, int> by_days = iterate<Calendar.DayOfWeek?>(
             Calendar.DayOfWeek.MON).to_hash_map_as_keys<int>(dow => 0);
@@ -449,6 +509,20 @@ private class QuickAddRecurring : UnitTest.Harness {
             && check_byrule_day(event, by_days);
     }
     
+    private bool every_first_tuesday_for_3_weeks(out string? dump) throws Error {
+        Gee.Map<Calendar.DayOfWeek?, int> by_days = iterate<Calendar.DayOfWeek?>(
+            Calendar.DayOfWeek.TUE).to_hash_map_as_keys<int>(dow => 1);
+        
+        Component.Event event;
+        return basic("meeting at work at 10am every 1st tuesday for 3 weeks", out event, out dump)
+            && event.rrule.is_monthly
+            && event.rrule.interval == 1
+            && event.rrule.count == 3
+            && event.exact_time_span.start_date.day_of_week.equal_to(Calendar.DayOfWeek.TUE)
+            && event.exact_time_span.start_date.day_of_month.value <= 7
+            && check_byrule_day(event, by_days);
+    }
+    
     // bad input
     private bool every_sixth_tuesday(out string? dump) throws Error {
         Component.DetailsParser parser = new Component.DetailsParser(
diff --git a/src/tests/tests-quick-add.vala b/src/tests/tests-quick-add.vala
index b111d41..c01ca84 100644
--- a/src/tests/tests-quick-add.vala
+++ b/src/tests/tests-quick-add.vala
@@ -8,7 +8,10 @@ namespace California.Tests {
 
 private class QuickAdd : UnitTest.Harness {
     public QuickAdd() {
+        add_case("null", null_details);
+        add_case("blank", blank);
         add_case("summary", summary);
+        add_case("summary-with-blanks", summary_with_blanks);
         add_case("summary-location", summary_location);
         add_case("with-12hr-time", with_12hr_time);
         add_case("with-24hr-time", with_24hr_time);
@@ -41,6 +44,18 @@ private class QuickAdd : UnitTest.Harness {
         Calendar.terminate();
     }
     
+    private bool null_details() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(null, null);
+        
+        return !parser.event.is_valid();
+    }
+    
+    private bool blank() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser(" ", null);
+        
+        return !parser.event.is_valid();
+    }
+    
     private bool summary() throws Error {
         Component.DetailsParser parser = new Component.DetailsParser("meet with Alice", null);
         
@@ -50,6 +65,15 @@ private class QuickAdd : UnitTest.Harness {
             && parser.event.date_span == null;
     }
     
+    private bool summary_with_blanks() throws Error {
+        Component.DetailsParser parser = new Component.DetailsParser("   meet  with   Alice    ", null);
+        
+        return parser.event.summary == "meet with Alice"
+            && parser.event.location == null
+            && parser.event.exact_time_span == null
+            && parser.event.date_span == null;
+    }
+    
     private bool summary_location() throws Error {
         Component.DetailsParser parser = new Component.DetailsParser("meet with Alice at Bob's", null);
         
diff --git a/src/tests/tests-string.vala b/src/tests/tests-string.vala
index 436cf81..e1bc457 100644
--- a/src/tests/tests-string.vala
+++ b/src/tests/tests-string.vala
@@ -11,6 +11,8 @@ private class String : UnitTest.Harness {
         add_case("strip-zeroes-space", strip_zeroes_space);
         add_case("strip-zeroes-slash", strip_zeroes_slash);
         add_case("strip-zeroes-multiple", strip_zeroes_multiple);
+        add_case("reduce-whitespace", reduce_whitespace);
+        add_case("reduce-nonspace-whitespace", reduce_nonspace_whitespace);
     }
     
     protected override void setup() throws Error {
@@ -38,6 +40,22 @@ private class String : UnitTest.Harness {
         
         return result == "1/2/3/4";
     }
+    
+    private bool test_reduce_whitespace(string instr, string expected, out string? dump) throws Error {
+        string result = California.String.reduce_whitespace(instr);
+        
+        dump = "\"%s\" => \"%s\", expected \"%s\"".printf(instr, result, expected);
+        
+        return result == expected;
+    }
+    
+    private bool reduce_whitespace(out string? dump) throws Error {
+        return test_reduce_whitespace("  a  b  c  ", "a b c", out dump);
+    }
+    
+    private bool reduce_nonspace_whitespace(out string? dump) throws Error {
+        return test_reduce_whitespace("\t\ta\n\nb\r\rc\t\t", "a\nb\rc", out dump);
+    }
 }
 
 }
diff --git a/src/tests/tests.vala b/src/tests/tests.vala
index 22b3579..b8dd74c 100644
--- a/src/tests/tests.vala
+++ b/src/tests/tests.vala
@@ -7,6 +7,10 @@
 namespace California.Tests {
 
 public int run(string[] args) {
+    // make warnings and criticals fatal to catch during tests
+    GLib.Log.set_always_fatal(
+        LogLevelFlags.LEVEL_WARNING | LogLevelFlags.LEVEL_ERROR | LogLevelFlags.LEVEL_CRITICAL);
+    
     UnitTest.Harness.register(new String());
     UnitTest.Harness.register(new CalendarDate());
     UnitTest.Harness.register(new CalendarMonthSpan());
diff --git a/src/util/util-string.vala b/src/util/util-string.vala
index 05b9c33..b4ca45e 100644
--- a/src/util/util-string.vala
+++ b/src/util/util-string.vala
@@ -49,7 +49,9 @@ public string reduce_whitespace(string str) {
         last_ch = ch;
     }
     
-    return builder.str;
+    // due to get_next_char()'s interface, don't know when char is last, so it's possible for trailing
+    // whitespace to exist
+    return builder.str.chomp();
 }
 
 /**


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