From d2791b046a28c232573f4d55fbeca5a6912dd635 Mon Sep 17 00:00:00 2001
From: Lars Henriksen <LarsHenriksen@get2net.dk>
Date: Wed, 27 May 2020 21:49:36 +0200
Subject: Update import of basic recurrence rules

Conversion of COUNT to UNTIL was a simple calculation which assumed one
repetiton per period (day, week, month or year); it does not take exception
days and invalid dates into account. Solved by a new function which returns the
n'th occurrence of a recurrence rule.

In calcurse UNTIL is interpreted as a day (DATE), in RFC 5545 as a time of day
(DATE-TIME). This has implications when a recurrence rule has an occurrence on
the UNTIL day, see comment in ical.c

An "Import:" note is added when a multi-day event is imported and turned into a
calcurse all-day event.

Icalendar quotes in comments have been updated to RFC 5545.

Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 test/data/ical-003.ical | 27 +++++++++++++++++
 test/data/ical-009.ical | 11 +++++++
 test/ical-003.sh        | 77 +++++++++++++++++++++++++++++++++++++++++++++++--
 test/ical-005.sh        |  2 ++
 test/ical-009.sh        | 10 ++++---
 5 files changed, 121 insertions(+), 6 deletions(-)

(limited to 'test')

diff --git a/test/data/ical-003.ical b/test/data/ical-003.ical
index 599d24f..d715009 100644
--- a/test/data/ical-003.ical
+++ b/test/data/ical-003.ical
@@ -22,4 +22,31 @@ EXDATE:20000215T000000
 EXDATE:20000223T000000
 SUMMARY:Recurring appointment
 END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200526T120000
+DURATION:PT1H17M0S
+RRULE:FREQ=DAILY;UNTIL=20200529T130000
+SUMMARY: until May 29 2020\, 13:00
+END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200526T120000
+DURATION:PT1H17M0S
+RRULE:FREQ=DAILY;UNTIL=20200529T110000
+SUMMARY: until May 29 2020\, 11:00
+END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200531T214500
+DURATION:PT15M0S
+RRULE:FREQ=MONTHLY;COUNT=10
+EXDATE:20200731T214500,20210131T214500
+SUMMARY:monthly on 31th\, count 10\, exceptions 31/7/2020 and 31/1/2021
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:
+UID:
+DTSTART;VALUE=DATE:20200502
+DTEND;VALUE=DATE:20200504
+DESCRIPTION:The first weekend in May is a two-day event.
+SUMMARY:First weekend in May
+END:VEVENT
 END:VCALENDAR
diff --git a/test/data/ical-009.ical b/test/data/ical-009.ical
index 1828417..b5a6575 100644
--- a/test/data/ical-009.ical
+++ b/test/data/ical-009.ical
@@ -111,6 +111,17 @@ RRULE:FREQ=MONTHLY;UNTIL=20201030
 EXDATE;VALUE=DATE:20200606T120000Z
 SUMMARY:Invalid EXDATE value
 END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200527T163000
+DTEND:20200528T163000
+DURATION:P1D
+SUMMARY:Both end time and duration
+END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200527T163000
+DTEND:20200526T163000
+SUMMARY:End time before start
+END:VEVENT
 BEGIN:VTODO
 SUMMARY:finally\, missing end of item
 END:VCALENDAR
diff --git a/test/ical-003.sh b/test/ical-003.sh
index a0734ce..69cb4c3 100755
--- a/test/ical-003.sh
+++ b/test/ical-003.sh
@@ -1,4 +1,5 @@
 #!/bin/sh
+# Recurrence rules.
 
 . "${TEST_INIT:-./test-init.sh}"
 
@@ -7,11 +8,13 @@ if [ "$1" = 'actual' ]; then
   cp "$DATA_DIR/conf" .calcurse || exit 1
   "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-003.ical"
   "$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r365
+  "$CALCURSE" -D "$PWD/.calcurse" -s05/01/2020 --to 01/01/2022
+  cat "$PWD/.calcurse/notes"/*
   rm -rf .calcurse || exit 1
 elif [ "$1" = 'expected' ]; then
   cat <<EOD
-Import process report: 0025 lines read
-3 apps / 0 events / 0 todos / 0 skipped
+Import process report: 0052 lines read
+6 apps / 1 event / 0 todos / 0 skipped
 01/01/00:
  - 00:00 -> 01:30
 	Recurring appointment
@@ -131,6 +134,76 @@ Import process report: 0025 lines read
 02/29/00:
  - 00:00 -> 01:30
 	Recurring appointment
+05/02/20:
+ * First weekend in May
+
+05/03/20:
+ * First weekend in May
+
+05/26/20:
+ - 12:00 -> 13:17
+	 until May 29 2020, 11:00
+ - 12:00 -> 13:17
+	 until May 29 2020, 13:00
+
+05/27/20:
+ - 12:00 -> 13:17
+	 until May 29 2020, 11:00
+ - 12:00 -> 13:17
+	 until May 29 2020, 13:00
+
+05/28/20:
+ - 12:00 -> 13:17
+	 until May 29 2020, 11:00
+ - 12:00 -> 13:17
+	 until May 29 2020, 13:00
+
+05/29/20:
+ - 12:00 -> 13:17
+	 until May 29 2020, 13:00
+
+05/31/20:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+08/31/20:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+10/31/20:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+12/31/20:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+03/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+05/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+07/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+08/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+10/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+
+12/31/21:
+ - 21:45 -> 22:00
+	monthly on 31th, count 10, exceptions 31/7/2020 and 31/1/2021
+The first weekend in May is a two-day event.
+-- 
+Import: multi-day event changed to one-day event
 EOD
 else
   ./run-test "$0"
diff --git a/test/ical-005.sh b/test/ical-005.sh
index f23fe65..a73b90f 100755
--- a/test/ical-005.sh
+++ b/test/ical-005.sh
@@ -7,6 +7,7 @@ if [ "$1" = 'actual' ]; then
   cp "$DATA_DIR/conf" .calcurse || exit 1
   "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-005.ical"
   "$CALCURSE" -D "$PWD/.calcurse" -s10/03/2013 -r3
+  cat "$PWD/.calcurse/notes"/*
   rm -rf .calcurse || exit 1
 elif [ "$1" = 'expected' ]; then
   cat <<EOD
@@ -20,6 +21,7 @@ Import process report: 0023 lines read
 
 10/04/13:
  * Two days
+Import: multi-day event changed to one-day event
 EOD
 else
   ./run-test "$0"
diff --git a/test/ical-009.sh b/test/ical-009.sh
index c8c1c9c..f397044 100755
--- a/test/ical-009.sh
+++ b/test/ical-009.sh
@@ -17,10 +17,10 @@ if [ "$1" = 'actual' ]; then
   rm -rf .calcurse || exit 1
 elif [ "$1" = 'expected' ]; then
   cat <<EOD
-Import process report: 0116 lines read
-2 apps / 0 events / 1 todo / 18 skipped
+Import process report: 0127 lines read
+2 apps / 0 events / 1 todo / 20 skipped
 VEVENT [12]: invalid or malformed event start time.
-VEVENT [17]: recurrence frequency not recognized.
+VEVENT [17]: rrule frequency not supported.
 VEVENT [23]: malformed summary line.
 VTODO [28]: item priority is invalid (must be between 0 and 9).
 VEVENT [32]: malformed exceptions line.
@@ -36,7 +36,9 @@ VEVENT [89]: invalid end time value type.
 VEVENT [94]: invalid until format.
 VEVENT [100]: invalid exception date value type.
 VEVENT [107]: invalid exception.
-VTODO [114]: The ical file seems to be malformed. The end of item was not found.
+VEVENT [114]: either end or duration.
+VEVENT [120]: end must be later than start.
+VTODO [125]: The ical file seems to be malformed. The end of item was not found.
 101
 EOD
 else
-- 
cgit v1.2.3-70-g09d2