[california/wip/725785-create-recurring: 15/16] Further tests and fixes for recurring w/ end dates
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [california/wip/725785-create-recurring: 15/16] Further tests and fixes for recurring w/ end dates
- Date: Wed, 25 Jun 2014 02:13:08 +0000 (UTC)
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]