aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/vcomponent
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/vcomponent')
-rw-r--r--tests/unit/vcomponent/annoying-events.scm68
-rw-r--r--tests/unit/vcomponent/create.scm69
-rw-r--r--tests/unit/vcomponent/param.scm69
-rw-r--r--tests/unit/vcomponent/recurrence-advanced.scm1555
-rw-r--r--tests/unit/vcomponent/recurrence-simple.scm324
-rw-r--r--tests/unit/vcomponent/rrule-serialization.scm77
-rw-r--r--tests/unit/vcomponent/vcomponent-control.scm36
-rw-r--r--tests/unit/vcomponent/vcomponent-datetime.scm44
-rw-r--r--tests/unit/vcomponent/vcomponent-formats-common-types.scm140
-rw-r--r--tests/unit/vcomponent/vcomponent.scm105
10 files changed, 2487 insertions, 0 deletions
diff --git a/tests/unit/vcomponent/annoying-events.scm b/tests/unit/vcomponent/annoying-events.scm
new file mode 100644
index 00000000..0fa81adb
--- /dev/null
+++ b/tests/unit/vcomponent/annoying-events.scm
@@ -0,0 +1,68 @@
+(define-module (test annoying-events)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((srfi srfi-41 util)
+ :select (filter-sorted-stream))
+ :use-module ((srfi srfi-41)
+ :select (stream
+ stream->list
+ stream-filter
+ stream-take-while))
+ :use-module ((vcomponent datetime) :select (event-overlaps?))
+ :use-module ((datetime) :select (date date+ date<))
+ :use-module ((hnh util) :select (set!))
+ :use-module (vcomponent create)
+ :use-module (vcomponent base))
+
+
+(define start (date year: 2021 month: 11 day: 01))
+
+(define end (date+ start (date day: 8)))
+
+(define ev-set
+ (stream
+ (vevent ; should be part of the result
+ summary: "A"
+ dtstart: (date year: 2021 month: 10 day: 01)
+ dtend: (date year: 2021 month: 12 day: 01))
+ (vevent ; should NOT be part of the result
+ summary: "B"
+ dtstart: (date year: 2021 month: 10 day: 10)
+ dtend: (date year: 2021 month: 10 day: 11))
+ (vevent ; should also be part of the result
+ summary: "C"
+ dtstart: (date year: 2021 month: 11 day: 02)
+ dtend: (date year: 2021 month: 11 day: 03))))
+
+;; (if (and (date< (prop ev 'DTSTART) start-date)
+;; (date<= (prop ev 'DTEND) end-date))
+;; ;; event will be picked, but next event might have
+;; (and (date< start-date (prop ev 'DTSTART))
+;; (date< end-date (prop ev 'DTEND)))
+;; ;; meaning that it wont be added, stopping filter-sorted-stream
+;; )
+
+;; The naïve way to get all events in an interval. Misses C due to B being "in the way"
+
+(test-equal "incorrect handling of non-contigious"
+ '("A" #; "C")
+ (map (extract 'SUMMARY)
+ (stream->list
+ (filter-sorted-stream
+ (lambda (ev) (event-overlaps? ev start (date+ start (date day: 8))))
+ ev-set))))
+
+(test-equal "correct handling of non-contigious"
+ '("A" "C")
+ (map (extract 'SUMMARY)
+ (stream->list
+ (stream-filter
+ (lambda (ev) (event-overlaps? ev start end))
+ (stream-take-while
+ (lambda (ev) (date< (prop ev 'DTSTART) end))
+ ev-set)))))
+
+
+
+'((vcomponent base)
+ (vcomponent datetime))
diff --git a/tests/unit/vcomponent/create.scm b/tests/unit/vcomponent/create.scm
new file mode 100644
index 00000000..caf2d33c
--- /dev/null
+++ b/tests/unit/vcomponent/create.scm
@@ -0,0 +1,69 @@
+(define-module (test create)
+ :use-module ((srfi srfi-1) :select (every))
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent create)
+ :select (vcomponent
+ with-parameters
+ as-list))
+ :use-module ((vcomponent)
+ :select (children properties type prop prop* param vline?)))
+
+;; vevent, vcalendar, vtimezone, standard, and daylight all trivial
+;; and therefore not tested
+
+(test-group "Empty component"
+ (let ((ev (vcomponent 'TEST)))
+ (test-equal 'TEST (type ev))
+ (test-equal '() (children ev))
+ (test-equal '() (properties ev))))
+
+(test-group "Component with properties, but no children"
+ (let ((ev (vcomponent 'TEST
+ prop: "value")))
+ (test-equal '(PROP) (map car (properties ev)))
+ (test-equal "value" (prop ev 'PROP))))
+
+(test-group "Component with children, but no properties"
+ (let* ((child (vcomponent 'CHILD))
+ (ev (vcomponent 'TEST
+ (list child))))
+ (test-equal '() (properties ev))
+ (test-equal 1 (length (children ev)))
+ ; (test-eq child (car (children ev)))
+ ))
+
+(test-group "Component with both children and properties"
+ (let* ((child (vcomponent 'CHILD))
+ (ev (vcomponent 'TEST
+ prop: "VALUE"
+ (list child))))
+ (test-equal '(PROP) (map car (properties ev)))
+ (test-equal "VALUE" (prop ev 'PROP))
+ (test-equal 1 (length (children ev)))
+ ; (test-eq child (car (children ev)))
+ ))
+
+(test-group "Component with no children, where last elements value is a list"
+ (let ((ev (vcomponent 'TEST prop: (list 1 2 3))))
+ (test-equal '() (children ev))
+ (test-equal '(PROP) (map car (properties ev)))
+ (test-equal '(1 2 3) (prop ev 'PROP))))
+
+(test-group "With parameters"
+ (let ((ev (vcomponent 'TEST
+ prop: (with-parameters param: 1 2))))
+ (test-equal 2 (prop ev 'PROP))
+ (test-equal '(1) (param (prop* ev 'PROP) 'PARAM))))
+
+(test-group "As list"
+ (let ((ev (vcomponent 'TEST
+ prop: (as-list (list 1 2 3)))))
+ (test-equal '(1 2 3) (prop ev 'PROP))
+ (test-equal 3 (length (prop* ev 'PROP)))
+ (test-assert (every vline? (prop* ev 'PROP)))))
+
+;; (test-group "Parameters and lists" )
+
+
+'((vcomponent create))
diff --git a/tests/unit/vcomponent/param.scm b/tests/unit/vcomponent/param.scm
new file mode 100644
index 00000000..9611fd8a
--- /dev/null
+++ b/tests/unit/vcomponent/param.scm
@@ -0,0 +1,69 @@
+;;; Commentary:
+;; Checks that parameters (1) are correctly parsed and stored.
+;; (1): 'A', and 'B' in the line "KEY;A=1;B=2:Some text"
+;;; Code:
+
+(define-module (test param)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-64 test-error)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent base)
+ :select (param prop* parameters prop vline?))
+ :use-module ((vcomponent formats ical parse)
+ :select (parse-calendar))
+ :use-module ((vcomponent) :select (vcomponent properties set-properties))
+ :use-module ((hnh util) :select (sort* set!))
+ :use-module ((ice-9 ports) :select (call-with-input-string))
+ :use-module ((vcomponent formats xcal output)
+ :select (vcomponent->sxcal))
+ )
+
+;; TODO clean up this whole test
+
+;; TODO possibly change parsing
+
+(define v
+ (car
+ (call-with-input-string
+ "BEGIN:DUMMY
+X-KEY;A=1;B=2:Some text
+END:DUMMY"
+ parse-calendar)))
+
+(test-equal '("1") (param (prop* v 'X-KEY) 'A))
+
+(test-equal '("2") (param (prop* v 'X-KEY) 'B))
+
+(test-equal #f (param (prop* v 'X-KEY) 'C))
+
+
+(test-group "Properties"
+ (let ((p (properties v)))
+ (test-assert (list? p))
+ (test-eqv 1 (length p))
+ (test-eq 'X-KEY (caar p))
+ (test-assert (vline? (cadar p)))))
+
+
+
+;; TODO possibly move this.
+;; Checks that a warning is properly raised for
+;; unkonwn keys (without an X-prefix)
+(test-error "Ensure parse-calendar warns on unknown keys"
+ 'warning
+ (call-with-input-string
+ "BEGIN:DUMMY
+KEY:Some Text
+END:DUMMY"
+ parse-calendar))
+
+;; Similar thing happens for sxcal, but during serialization instead
+(let ((component (set-properties (vcomponent type: 'DUMMY)
+ (cons 'KEY "Anything"))))
+
+ (test-error
+ 'warning
+ (vcomponent->sxcal component)))
+
+'((vcomponent base)
+ (vcomponent formats xcal output))
diff --git a/tests/unit/vcomponent/recurrence-advanced.scm b/tests/unit/vcomponent/recurrence-advanced.scm
new file mode 100644
index 00000000..1bd4311a
--- /dev/null
+++ b/tests/unit/vcomponent/recurrence-advanced.scm
@@ -0,0 +1,1555 @@
+;;; Commentary:
+;; Tests of recurrence rule generation with focus on correct instances
+;; being generated. For tests of basic recurrence functionallity, see
+;; recurrence-simple.scm.
+;;
+;; This file also tests format-recurrence-rule, which checks that human
+;; readable representations of the RRULES work.
+;;
+;; Also contains the tests for EXDATE.
+;;
+;; Most examples copied from RFC5545, some home written.
+;;; Code:
+
+(define-module (test recurrence-advanced)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent recurrence)
+ :select (make-recur-rule))
+ :use-module ((vcomponent recurrence generate)
+ :select (generate-recurrence-set))
+ :use-module ((vcomponent recurrence display)
+ :select (format-recurrence-rule))
+ :use-module ((vcomponent recurrence internal)
+ :select (count until))
+ :use-module ((vcomponent base)
+ :select (prop prop* extract))
+ :use-module (vcomponent create)
+ :use-module ((datetime)
+ :select (parse-ics-datetime
+ datetime
+ datetime-date
+ time
+ date
+ jan feb mar apr may jun jul aug sep oct nov dec
+ mon tue wed thu fri sat sun
+ datetime->string))
+ :use-module ((hnh util) :select (-> set!))
+ :use-module ((srfi srfi-41) :select (stream->list))
+ :use-module ((srfi srfi-88) :select (keyword->string)))
+
+(test-expect-fail "REC: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
+
+(test-expect-fail "STR: The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months")
+
+(test-expect-fail "REC: The second-to-last weekday of the month")
+
+(test-expect-fail "STR: The second-to-last weekday of the month")
+
+;; TODO this test is really slow, figure out why (takes approx. 25s to run)
+(test-skip "REC: Every day in January, for 3 years (alt 2)")
+
+(define (run-test comp)
+ (test-equal
+ (string-append "REC: " (prop comp 'SUMMARY))
+ (prop comp 'X-SET)
+ (let ((r (generate-recurrence-set comp)))
+ (map (extract 'DTSTART)
+ (if (or (until (prop comp 'RRULE))
+ (count (prop comp 'RRULE)))
+ (stream->list r)
+ (stream->list 20 r)))))
+ (test-equal
+ (string-append "STR: " (prop comp 'SUMMARY))
+ (prop comp 'X-SUMMARY)
+ ;; TODO setting language='en causes messages to be in english, but date
+ ;; strings still format LC_TIME (which I have set to swedish)...
+ ;; TODO possibly test with other languages
+ (format-recurrence-rule (prop comp 'RRULE) 'sv)))
+
+(map run-test
+ (list (vevent
+ summary:
+ "Daily for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ count: 10)
+ x-summary:
+ "dagligen, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Daily until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "dagligen, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other day - forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ interval: 2)
+ x-summary:
+ "varannan dag"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 10 days, 5 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ interval: 10
+ count: 5)
+ x-summary:
+ "var tionde dag, totalt 5 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 12 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every day in January, for 3 years (alt 1)"
+ dtstart:
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ until: (datetime year: 2000 month: 01 day: 31 hour: 14 minute: 00 second: 00 tz: "UTC")
+ bymonth: (list jan)
+ byday: (list sun mon tue wed thu fri sat))
+ x-summary:
+ "varje lördag, fredag, torsdag, onsdag, tisdag, måndag & söndag i januari, årligen, till och med den 31 januari, 2000 kl. 14:00"
+ x-set:
+ (list (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every day in January, for 3 years (alt 2)"
+ dtstart:
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ until: (datetime year: 2000 month: 01 day: 31 hour: 14 minute: 00 second: 00 tz: "UTC")
+ bymonth: 1)
+ x-summary:
+ "dagligen, till och med den 31 januari, 2000 kl. 14:00"
+ x-set:
+ (list (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ count: 10)
+ x-summary:
+ "varje vecka, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "varje vecka, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week - forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ wkst: sun)
+ x-summary:
+ "varannan vecka"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 26 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly on Tuesday and Thursday for five weeks (alt 1)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ until: (datetime year: 1997 month: 10 day: 07 hour: 00 minute: 00 second: 00 tz: "UTC")
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varje tisdag & torsdag, till och med den 07 oktober, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Weekly on Tuesday and Thursday for five weeks (alt 2)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ count: 10
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varje tisdag & torsdag, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week on Monday, Wednesday, and Friday until December 24, 1997, starting on Monday, September 1, 1997:"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC")
+ wkst: sun
+ byday: (list mon wed fri))
+ x-summary:
+ "varannan måndag, onsdag & fredag, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other week on Tuesday and Thursday, for 8 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 8
+ wkst: sun
+ byday: (list tue thu))
+ x-summary:
+ "varannan tisdag & torsdag, totalt 8 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first Friday for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ byday: (list (cons 1 fri)))
+ x-summary:
+ "första fredagen varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 05 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first Friday until December 24, 1997"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ until: (datetime year: 1997 month: 12 day: 24 hour: 00 minute: 00 second: 00 tz: "UTC")
+ byday: (list (cons 1 fri)))
+ x-summary:
+ "första fredagen varje månad, till och med den 24 december, 1997 kl. 0:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 05 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other month on the first and last Sunday of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 2
+ count: 10
+ byday: (list (cons 1 sun)
+ (cons -1 sun)))
+ x-summary:
+ "första söndagen samt sista söndagen varannan månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the second-to-last Monday of the month for 6 months"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 6
+ byday: (list (cons -2 mon)))
+ x-summary:
+ "näst sista måndagen varje månad, totalt 6 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 22 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the third-to-the-last day of the month, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ bymonthday: (list -3))
+ x-summary:
+ "den tredje sista varje månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 08 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 09 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 10 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 12 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 04 day: 28 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the 2nd and 15th of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ bymonthday: (list 2 15))
+ x-summary:
+ "den andre & femtonde varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 15 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monthly on the first and last day of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 10
+ bymonthday: (list 1 -1))
+ x-summary:
+ "den förste & sista varje månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 01 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 18 months on the 10th thru 15th of the month for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 18
+ count: 10
+ bymonthday: (list 10 11 12 13 14 15))
+ x-summary:
+ "den tionde, elfte, tolfte, trettonde, fjortonde & femtonde var artonde månad, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Tuesday, every other month"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ interval: 2
+ byday: (list tue))
+ x-summary:
+ "varje tisdag varannan månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 12 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Yearly in June and July for 10 occurrences:\n: Since none of the BYDAY, BYMONTHDAY, or BYYEARDAY\nonents are specified, the day is gotten from \"DTSTART\""
+ dtstart:
+ (datetime year: 1997 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ count: 10
+ bymonth: (list 6 7))
+ x-summary:
+ "juni & juli, årligen, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 06 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every other year on January, February, and March for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 2
+ count: 10
+ bymonth: (list jan feb mar))
+ x-summary:
+ "januari, februari & mars vartannat år, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 02 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 03 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every third year on the 1st, 100th, and 200th day for 10 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 3
+ count: 10
+ byyearday: (list 1 100 200))
+ x-summary:
+ "dag 1, 100 & 200 vart tredje år, totalt 10 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 04 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 04 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 07 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 01 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 04 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 07 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 01 day: 01 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 20th Monday of the year, forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byday: (list (cons 20 mon)))
+ x-summary:
+ "tjugonde måndagen, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2010 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2011 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2013 month: 05 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 2014 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2015 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 05 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monday of week number 20 (where the default start of the week is Monday), forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byweekno: (list 20)
+ byday: (list mon))
+ x-summary:
+ "varje måndag v.20, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2010 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2011 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2013 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2014 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2015 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 05 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Thursday in March, forever"
+ dtstart:
+ (datetime year: 1997 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ bymonth: (list mar)
+ byday: (list thu))
+ x-summary:
+ "varje torsdag i mars, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 03 day: 20 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 03 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 23 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 03 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 01 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 03 day: 22 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Thursday, but only during June, July, and August, forever"
+ dtstart:
+ (datetime year: 1997 month: 06 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byday: (list thu)
+ bymonth: (list 6 7 8))
+ x-summary:
+ "varje torsdag i juni, juli & augusti, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 06 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 06 day: 26 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 24 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 07 day: 31 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 21 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 28 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 25 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 16 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Friday the 13th, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ exdate:
+ (as-list
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)))
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list fri)
+ bymonthday: (list 13))
+ x-summary:
+ "varje fredag den trettonde varje månad"
+ x-set:
+ (list (datetime year: 1998 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2009 month: 03 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The first Saturday that follows the first Sunday of the month, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list sat)
+ bymonthday: (list 7 8 9 10 11 12 13))
+ x-summary:
+ "varje lördag den sjunde, åttonde, nionde, tionde, elfte, tolfte & trettonde varje månad"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 02 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 04 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 07 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 08 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 09 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 10 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 12 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 09 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 04 day: 10 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 4 years, the first Tuesday after a Monday in November,\nver (U.S. Presidential Election day)"
+ dtstart:
+ (datetime year: 1996 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ interval: 4
+ bymonth: (list nov)
+ byday: (list tue)
+ bymonthday: (list 2 3 4 5 6 7 8))
+ x-summary:
+ "varje tisdag den andre, tredje, fjärde, femte, sjätte, sjunde eller åttonde i november vart fjärde år"
+ x-set:
+ (list (datetime year: 1996 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2008 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2012 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2016 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2020 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2024 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2028 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2032 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2036 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2040 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2044 month: 11 day: 08 hour: 09 minute: 00 second: 00)
+ (datetime year: 2048 month: 11 day: 03 hour: 09 minute: 00 second: 00)
+ (datetime year: 2052 month: 11 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 2056 month: 11 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 2060 month: 11 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 2064 month: 11 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 2068 month: 11 day: 06 hour: 09 minute: 00 second: 00)
+ (datetime year: 2072 month: 11 day: 08 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The third instance into the month of one of Tuesday, Wednesday, or Thursday, for the next 3 months"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ count: 3
+ byday: (list tue wed thu)
+ bysetpos: (list 3))
+ x-summary:
+ "NOT YET IMPLEMENTED"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 04 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 07 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 06 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "The second-to-last weekday of the month"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list mon tue wed thu fri)
+ bysetpos: (list -2))
+ x-summary:
+ "NOT YET IMPLEMENTED"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 29 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 10 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 11 day: 27 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 12 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 01 day: 29 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 3 hours from 9:00 AM to 5:00 PM on a specific day"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'HOURLY
+ interval: 3
+ until: (datetime year: 1997 month: 09 day: 02 hour: 17 minute: 00 second: 00 tz: "UTC"))
+ x-summary:
+ "var tredje timme, till och med den 02 september, 1997 kl. 17:00"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every 15 minutes for 6 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 15
+ count: 6)
+ x-summary:
+ "varje kvart, totalt 6 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 15 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 30 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 45 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 15 second: 00)))
+ (vevent
+ summary:
+ "Every hour and a half for 4 occurrences"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 90
+ count: 4)
+ x-summary:
+ "var sjätte kvart, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 30 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 30 second: 00)))
+ (vevent
+ summary:
+ "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 1)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'DAILY
+ byhour: (list 9 10 11 12 13 14 15 16)
+ byminute: (list 0 20 40))
+ x-summary:
+ "dagligen kl. 09:00, 09:20, 09:40, 10:00, 10:20, 10:40, 11:00, 11:20, 11:40, 12:00, 12:20, 12:40, 13:00, 13:20, 13:40, 14:00, 14:20, 14:40, 15:00, 15:20, 15:40, 16:00, 16:20 & 16:40"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 20 second: 00)))
+ (vevent
+ summary:
+ "Every 20 minutes from 9:00 AM to 4:40 PM every day (alt 2)"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MINUTELY
+ interval: 20
+ byhour: (list 9 10 11 12 13 14 15 16))
+ x-summary:
+ "var tjugonde minut kl. 9, 10, 11, 12, 13, 14, 15 & 16"
+ x-set:
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 10 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 11 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 12 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 13 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 20 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 14 minute: 40 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 00 second: 00)
+ (datetime year: 1997 month: 09 day: 02 hour: 15 minute: 20 second: 00)))
+ (vevent
+ summary:
+ "An example where the days generated makes a difference because of WKST"
+ dtstart:
+ (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 4
+ byday: (list tue sun)
+ wkst: mon)
+ x-summary:
+ "varannan tisdag & söndag, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 24 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "changing only WKST from MO to SU, yields different results.."
+ dtstart:
+ (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'WEEKLY
+ interval: 2
+ count: 4
+ byday: (list tue sun)
+ wkst: sun)
+ x-summary:
+ "varannan tisdag & söndag, totalt 4 gånger"
+ x-set:
+ (list (datetime year: 1997 month: 08 day: 05 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 08 day: 31 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "An example where an invalid date (i.e., February 30) is ignored"
+ dtstart:
+ (datetime year: 2007 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ bymonthday: (list 15 30)
+ count: 5)
+ x-summary:
+ "den femtonde & tretionde varje månad, totalt 5 gånger"
+ x-set:
+ (list (datetime year: 2007 month: 01 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 01 day: 30 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 02 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 03 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2007 month: 03 day: 30 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Every Friday & Wednesday the 13th, forever"
+ dtstart:
+ (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)
+ exdate:
+ (as-list
+ (list (datetime year: 1997 month: 09 day: 02 hour: 09 minute: 00 second: 00)))
+ rrule:
+ (make-recur-rule
+ freq: 'MONTHLY
+ byday: (list fri wed)
+ bymonthday: (list 13))
+ x-summary:
+ "varje onsdag & fredag den trettonde varje månad"
+ x-set:
+ (list (datetime year: 1998 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 01 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 08 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 10 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 04 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 07 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 02 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 03 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 09 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 11 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 12 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 06 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 08 day: 13 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary:
+ "Monday & Wednesday of week number 20 (where the default start of the week is Monday), forever"
+ dtstart:
+ (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ rrule:
+ (make-recur-rule
+ freq: 'YEARLY
+ byweekno: (list 20)
+ byday: (list mon wed))
+ x-summary:
+ "varje onsdag & måndag v.20, årligen"
+ x-set:
+ (list (datetime year: 1997 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 1997 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 11 hour: 09 minute: 00 second: 00)
+ (datetime year: 1998 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 1999 month: 05 day: 19 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2000 month: 05 day: 17 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2001 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 13 hour: 09 minute: 00 second: 00)
+ (datetime year: 2002 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2003 month: 05 day: 14 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 10 hour: 09 minute: 00 second: 00)
+ (datetime year: 2004 month: 05 day: 12 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 16 hour: 09 minute: 00 second: 00)
+ (datetime year: 2005 month: 05 day: 18 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 15 hour: 09 minute: 00 second: 00)
+ (datetime year: 2006 month: 05 day: 17 hour: 09 minute: 00 second: 00)))
+ (vevent
+ summary: "Each second, for ever"
+ dtstart: (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'SECONDLY)
+ x-summary: "varje sekund"
+ x-set: (list (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 01)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 02)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 03)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 04)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 05)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 06)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 07)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 08)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 09)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 10)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 11)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 12)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 13)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 14)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 15)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 16)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 17)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 18)
+ (datetime year: 2020 month: 10 day: 10 hour: 10 minute: 00 second: 19)))
+ ;; Exdates are applied after rrule's, meaning that less than count
+ ;; instances may be present.
+ (vevent
+ summary: "Exdates are applied AFTER rrule's"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ exdate: (as-list (list (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ ;; (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00) ; skipped by exdate
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ ))
+ (vevent
+ summary: "RDATE:s add to the recurrence rule"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ rdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00) ; added by rdate
+ )
+ )
+ (vevent
+ summary: "RDATE:s add to the recurrence rule"
+ dtstart: (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ rrule: (make-recur-rule freq: 'DAILY count: 5)
+ exdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ rdate: (as-list (list (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00)))
+ x-summary: "dagligen, totalt 5 gånger"
+ x-set: (list (datetime year: 2022 month: 06 day: 10 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 11 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 12 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 13 hour: 10 minute: 00 second: 00)
+ (datetime year: 2022 month: 06 day: 14 hour: 10 minute: 00 second: 00)
+ ;; (datetime year: 2022 month: 06 day: 20 hour: 10 minute: 00 second: 00) ; added by rdate, removed by exdate
+ ))
+ ;; TODO rdate with different timezone than dtstart
+ ;; TODO rdate with period
+ ))
+
+
+
+'((vcomponent recurrence)
+ (vcomponent recurrence generate)
+ (vcomponent recurrence display)
+ (vcomponent recurrence internal))
diff --git a/tests/unit/vcomponent/recurrence-simple.scm b/tests/unit/vcomponent/recurrence-simple.scm
new file mode 100644
index 00000000..31a74989
--- /dev/null
+++ b/tests/unit/vcomponent/recurrence-simple.scm
@@ -0,0 +1,324 @@
+;;; Commentary:
+;; Simples tests of recurrence system, ensuring that all parsers and
+;; basic generators work. Some more fully-featured tests are here, but
+;; most are instead in recurrence-advanced.scm.
+;;; Code:
+
+(define-module (test recurrence-simple)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-64 test-error)
+ :use-module (srfi srfi-88)
+ :use-module ((srfi srfi-41)
+ :select (stream-take stream-map stream->list stream-car))
+ :use-module ((datetime) :select (day-stream mon))
+ :use-module ((vcomponent base) :select (extract prop))
+ :use-module ((sxml namespaced) :select (sxml->namespaced-sxml))
+ :use-module ((calp namespaces) :select (xcal))
+ :use-module ((hnh util) :select (->))
+ :use-module ((hnh util exceptions)
+ :select (warnings-are-errors warning-handler))
+ :use-module ((vcomponent formats ical parse)
+ :select (parse-calendar))
+ :use-module ((vcomponent formats xcal parse)
+ :select (sxcal->vcomponent))
+ :use-module ((vcomponent recurrence)
+ :select (parse-recurrence-rule
+ make-recur-rule
+ generate-recurrence-set)))
+
+;; TODO evaluate format for direct events
+
+;;; Test that basic parsing or recurrence rules work.
+
+(test-equal (make-recur-rule freq: 'HOURLY wkst: mon interval: 1)
+ (parse-recurrence-rule "FREQ=HOURLY"))
+
+(test-equal (make-recur-rule freq: 'HOURLY count: 3 interval: 1 wkst: mon)
+ (parse-recurrence-rule "FREQ=HOURLY;COUNT=3"))
+
+;;; Test that recurrence rule parsing fails where appropriate
+
+(parameterize ((warnings-are-errors #t)
+ (warning-handler (lambda _ "")))
+ (test-error "Invalid FREQ"
+ 'warning
+ (parse-recurrence-rule "FREQ=ERR;COUNT=3"))
+ (test-error "Negative COUNT"
+ 'warning
+ (parse-recurrence-rule "FREQ=HOURLY;COUNT=-1"))
+ (test-error "Invalid COUNT"
+ 'wrong-type-arg
+ (parse-recurrence-rule "FREQ=HOURLY;COUNT=err")))
+
+;;; Test that basic recurrence works
+;;; also see the neighbour test file recurrence.scm for more tests.
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;VALUE=DATE:20190302
+RRULE:FREQ=DAILY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "Generate at all"
+ (stream-car (generate-recurrence-set ev)))
+
+(test-assert "Generate some"
+ (stream->list
+ (stream-take 5 (generate-recurrence-set ev))))
+
+(test-equal "Generate First"
+ (stream->list
+ 5
+ (stream-map
+ (extract 'DTSTART)
+ (generate-recurrence-set ev)))
+ (stream->list 5 (day-stream (prop ev 'DTSTART))))
+
+;; We run the exact same thing a secound time, since I had an error with
+;; that during development.
+
+(test-equal "Generate Again"
+ (stream->list
+ (stream-take
+ 5
+ (stream-map
+ (extract 'DTSTART)
+ (generate-recurrence-set ev))))
+ (stream->list
+ (stream-take 5 (day-stream (prop ev 'DTSTART)))))
+
+(test-assert "Test 1" #t)
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART:20190302T100000
+RRULE:FREQ=DAILY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "Test 2" #t)
+
+(test-assert "daily 10:00"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART:20190302T100000
+DTEND:20190302T120000
+RRULE:FREQ=DAILY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "daily 10-12"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART:20190302T100000
+DTEND:20190302T120000
+RRULE:FREQ=WEEKLY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "weekly 10-12"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;TZID=Europe/Stockholm:20190302T100000
+DTEND;TZID=Europe/Stockholm:20190302T120000
+RRULE:FREQ=WEEKLY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "weekly TZ 10-12"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;TZID=Europe/Stockholm:20190302T100000
+DTEND;TZID=Europe/Stockholm:20190302T120000
+RRULE:FREQ=WEEKLY
+SEQUENCE:1
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "weekly TZ SEQUENCE 10-12"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;TZID=Europe/Stockholm:20190302T100000
+RRULE:FREQ=WEEKLY
+DTEND;TZID=Europe/Stockholm:20190302T120000
+SEQUENCE:1
+LOCATION:Here
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "weekly TZ SEQUENCE LOCATION 10-12"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART:20180117T170000
+RRULE:FREQ=WEEKLY
+LOCATION:~
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "Just location"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;TZID=Europe/Stockholm:20180117T170000
+DTEND;TZID=Europe/Stockholm:20180117T200000
+RRULE:FREQ=WEEKLY
+END:VEVENT"
+ parse-calendar)))
+
+(test-assert "Same times"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (car
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART;TZID=Europe/Stockholm:20180117T170000
+RRULE:FREQ=WEEKLY
+DTEND;TZID=Europe/Stockholm:20180117T200000
+SEQUENCE:1
+LOCATION:~
+END:VEVENT"
+ parse-calendar)))
+
+;; errer in dtend ?
+
+(test-assert "Full test"
+ (stream-car (generate-recurrence-set ev)))
+
+;;; Tests that exceptions (in the recurrence-id meaning)
+;;; in recurrence sets are handled correctly.
+;;; TODO Is however far from done.
+
+(define uid (symbol->string (gensym "areallyuniqueid")))
+
+;; TODO standardize vcomponents for tests as xcal, for example:
+`(vcalendar
+ (children
+ (vevent
+ (properties
+ (summary
+ (text "Changing type on Recurrence-id."))
+ (uid (text ,uid))
+ (dtstart (date "20090127"))))
+ (vevent
+ (properties
+ (summary
+ (text "Changing type on Recurrence-id."))
+ (uid (text ,uid))
+ (dtstart
+ (params (TZID "Europe/Stockholm"))
+ (date-time "20100127T120000"))
+ (recurrence-id (date "20100127"))
+ (summary
+ "This instance only has a time component")))))
+
+(define ev
+ (call-with-input-string
+ (format
+ #f
+ "BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Changing type on Recurrence-id.
+UID:~a
+DTSTART;VALUE=DATE:20090127
+END:VEVENT
+BEGIN:VEVENT
+UID:~a
+SUMMARY:Changing type on Recurrence-id.
+DTSTART;TZID=Europe/Stockholm:20100127T120000
+RECURRENCE-ID;VALUE=DATE:20100127
+SUMMARY:This instance only has a time component
+END:VEVENT
+END:VCALENDAR"
+ uid
+ uid)
+ parse-calendar))
+
+(test-assert "Changing type on Recurrence id."
+ (stream->list 10 (generate-recurrence-set ev)))
+
+;;; Earlier I failed to actually parse the recurrence parts, in short, 1 ≠ "1".
+
+(test-assert "Test that xcal recur rules are parseable"
+ ((@@ (vcomponent formats xcal parse) handle-value)
+ 'recur
+ 'props-are-unused-for-recur
+ '((freq "WEEKLY") (interval "1") (wkst "MO"))))
+
+(define ev
+ (-> '(vevent
+ (properties
+ (summary (text "reptest"))
+ (dtend (date-time "2021-01-13T02:00:00"))
+ (dtstart (date-time "2021-01-13T01:00:00"))
+ (uid (text "RNW198S6QANQPV1C4FDNFH6ER1VZX6KXEYNB"))
+ (rrule (recur (freq "WEEKLY")
+ (interval "1")
+ (wkst "MO")))
+ (dtstamp (date-time "2021-01-13T01:42:20Z"))
+ (sequence (integer "0")))
+ (components))
+ (sxml->namespaced-sxml `((#f . ,xcal)))
+ sxcal->vcomponent))
+
+(test-assert
+ "Check that recurrence rule commint from xcal also works"
+ (generate-recurrence-set ev))
+
+
+;;; TODO test here, for byday parsing, and multiple byday instances in one recur element
+;;; TODO which should also test serializing and deserializing to xcal.
+;;; For example, the following rules specify every workday
+
+;; BEGIN:VCALENDAR
+;; PRODID:-//hugo//calp 0.6.1//EN
+;; VERSION:2.0
+;; CALSCALE:GREGORIAN
+;; BEGIN:VEVENT
+;; SUMMARY:Lunch
+;; DTSTART:20211129T133000
+;; DTEND:20211129T150000
+;; LAST-MODIFIED:20211204T220944Z
+;; UID:3d82c73c-6cdb-4799-beba-5f1d20d55347
+;; RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR
+;; END:VEVENT
+;; END:VCALENDAR
+
+;; TODO add remaining rules
+
+
+'((vcomponent recurrence)
+ (vcomponent formats ical parse)
+ (vcomponent formats xcal parse))
diff --git a/tests/unit/vcomponent/rrule-serialization.scm b/tests/unit/vcomponent/rrule-serialization.scm
new file mode 100644
index 00000000..540c5bd2
--- /dev/null
+++ b/tests/unit/vcomponent/rrule-serialization.scm
@@ -0,0 +1,77 @@
+(define-module (test rrule-serialization)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent recurrence internal)
+ :select (recur-rule->rrule-string
+ recur-rule->rrule-sxml
+ byday))
+ :use-module ((vcomponent recurrence parse)
+ :select (parse-recurrence-rule))
+ :use-module ((ice-9 peg) :select (keyword-flatten)))
+
+(test-equal
+ "Parse of week day"
+ '(#f . 3)
+ ((@@ (vcomponent recurrence parse) parse-day-spec)
+ "WE"))
+
+(test-equal
+ "Parse of week day with positive offset"
+ '(1 . 3)
+ ((@@ (vcomponent recurrence parse) parse-day-spec)
+ "1WE"))
+
+(test-equal
+ "Parse of week day with positive offset (and plus)"
+ '(2 . 3)
+ ((@@ (vcomponent recurrence parse) parse-day-spec)
+ "+2WE"))
+
+(test-equal
+ "Parse of week day with negative offset"
+ '(-3 . 3)
+ ((@@ (vcomponent recurrence parse) parse-day-spec)
+ "-3WE"))
+
+
+;; numeric prefixes in the BYDAY list is only valid when
+;; FREQ={MONTHLY,YEARLY}, but that should be handled in a
+;; later stage since we are just testing the parser here.
+;; (p. 41)
+
+
+(define field->string
+ (@@ (vcomponent recurrence internal)
+ field->string))
+
+(let ((rule (parse-recurrence-rule "BYDAY=MO,TU,WE")))
+ (test-equal
+ "Direct return of parsed value"
+ "MO,TU,WE"
+ (field->string 'byday (byday rule)))
+ (test-equal
+ "Direct return, but as SXML"
+ '((byday "MO") (byday "TU") (byday "WE"))
+ (filter
+ (lambda (pair) (eq? 'byday (car pair)))
+ (keyword-flatten
+ '(interval byday wkst)
+ (recur-rule->rrule-sxml rule)))))
+
+(let ((rule (parse-recurrence-rule "BYDAY=+1MO,1TU,-2FR")))
+ (test-equal
+ "Direct return of parsed value"
+ "1MO,1TU,-2FR"
+ (field->string 'byday (byday rule)))
+ (test-equal
+ "Direct return, but as SXML"
+ '((byday "1MO") (byday "1TU") (byday "-2FR"))
+ (filter
+ (lambda (pair) (eq? 'byday (car pair)))
+ (keyword-flatten
+ '(interval byday wkst)
+ (recur-rule->rrule-sxml rule)))))
+
+
+'((vcomponent recurrence internal)
+ (vcomponent recurrence parse))
diff --git a/tests/unit/vcomponent/vcomponent-control.scm b/tests/unit/vcomponent/vcomponent-control.scm
new file mode 100644
index 00000000..7ebafa3d
--- /dev/null
+++ b/tests/unit/vcomponent/vcomponent-control.scm
@@ -0,0 +1,36 @@
+;;; Commentary:
+;; Tests that with-replaced-properties work.
+;;; Code:
+
+(define-module (test vcomponent-control)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module (vcomponent create)
+ :use-module ((vcomponent util control)
+ :select (with-replaced-properties))
+ :use-module ((vcomponent formats ical parse)
+ :select (parse-calendar))
+ :use-module ((vcomponent base) :select (prop)))
+
+(define ev (vcomponent 'DUMMY x-key: "value"))
+
+(test-group "With replaced properties"
+ ;; Test that temoraries are set and restored
+ (test-equal "value" (prop ev 'X-KEY))
+
+ (with-replaced-properties
+ (ev (X-KEY "other"))
+ (test-equal "other" (prop ev 'X-KEY)))
+
+ (test-equal "value" (prop ev 'X-KEY)))
+
+;; Test that they are restored on non-local exit
+(test-group "With replaced properties when throwing"
+ (catch #t
+ (lambda ()
+ (with-replaced-properties
+ (ev (X-KEY "other"))
+ (throw 'any)))
+ (lambda _ (test-equal "value" (prop ev 'X-KEY)))))
+
+'((vcomponent util control))
diff --git a/tests/unit/vcomponent/vcomponent-datetime.scm b/tests/unit/vcomponent/vcomponent-datetime.scm
new file mode 100644
index 00000000..80fee259
--- /dev/null
+++ b/tests/unit/vcomponent/vcomponent-datetime.scm
@@ -0,0 +1,44 @@
+;;; Commentary:
+;; Tests that event-clamping (checking how long part of an event
+;; overlaps another time span) works.
+;;; Code:
+
+(define-module (test vcomponent-datetime)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module ((datetime) :select (date time datetime))
+ :use-module ((vcomponent datetime) :select (event-length/clamped))
+ :use-module ((vcomponent create) :select (vevent)))
+
+(define ev
+ (vevent
+ dtstart: (datetime year: 2020 month: 03 day: 29 hour: 17 minute: 00 second: 00)
+ dtend: (datetime year: 2020 month: 04 day: 01 hour: 10 minute: 00 second: 00)))
+
+
+;; |-----------------| test interval
+;; |----------| event interval
+
+(test-equal
+ "Correct clamping"
+ (datetime time: (time hour: 7)) ; 2020-03-29T17:00 - 2020-03-30T00:00
+ (event-length/clamped
+ (date year: 2020 month: 03 day: 23) ; a time way before the start of the event
+ (date year: 2020 month: 03 day: 29) ; a time slightly after the end of the event
+ ev))
+
+(define utc-ev
+ (vevent
+ dtstart: (datetime year: 2020 month: 03 day: 29 hour: 15 minute: 00 second: 00 tz: "UTC")
+ dtend: (datetime year: 2020 month: 04 day: 01 hour: 08 minute: 00 second: 00 tz: "UTC")))
+
+(test-equal
+ "Correct clamping UTC"
+ (datetime time: (time hour: 7))
+ (event-length/clamped
+ (date year: 2020 month: 03 day: 23)
+ (date year: 2020 month: 03 day: 29)
+ ev))
+
+
+'((vcomponent datetime))
diff --git a/tests/unit/vcomponent/vcomponent-formats-common-types.scm b/tests/unit/vcomponent/vcomponent-formats-common-types.scm
new file mode 100644
index 00000000..1d7c77cf
--- /dev/null
+++ b/tests/unit/vcomponent/vcomponent-formats-common-types.scm
@@ -0,0 +1,140 @@
+(define-module (test vcomponent-formats-common-types)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-64 test-error)
+ :use-module (srfi srfi-88)
+ :use-module ((vcomponent formats common types)
+ :select (get-parser))
+ :use-module ((datetime) :select (date time datetime)))
+
+
+
+(define parse-binary (get-parser 'BINARY))
+;; TODO
+
+
+
+(define parse-boolean (get-parser 'BOOLEAN))
+
+(test-equal #t (parse-boolean #f "TRUE"))
+(test-equal #f (parse-boolean #f "FALSE"))
+
+(test-error 'warning (parse-boolean #f "ANYTHING ELSE"))
+
+
+
+(define parse-cal-address
+ (get-parser 'CAL-ADDRESS))
+
+(test-equal "Test uri is passthrough"
+ 74 (parse-cal-address #f 74))
+
+
+
+(define parse-date (get-parser 'DATE))
+
+(test-equal
+ (date year: 2021 month: 12 day: 02)
+ (parse-date #f "20211202"))
+;; TODO negative test here
+
+(define parse-datetime (get-parser 'DATE-TIME))
+
+(test-equal
+ (datetime year: 2021 month: 12 day: 02 hour: 10 minute: 20 second: 30)
+ (parse-datetime
+ (make-hash-table)
+ "20211202T102030"))
+
+;; TODO tests with timezones here
+;; TODO test -X-HNH-ORIGINAL here
+
+;; TODO negative test here
+
+
+
+(define parse-duration (get-parser 'DURATION))
+
+;; assume someone else tests this one
+;; (test-eq (@ (vcomponent duration) parse-duration)
+;; parse-duration)
+
+
+
+(define parse-float (get-parser 'FLOAT))
+
+(test-equal 1.0 (parse-float #f "1.0"))
+(test-equal 1 (parse-float #f "1"))
+(test-equal 1/2 (parse-float #f "1/2"))
+
+;; TODO negative test here?
+
+
+
+(define parse-integer (get-parser 'INTEGER))
+
+(test-equal
+ "parse integer"
+ 123456
+ (parse-integer #f "123456"))
+
+(test-equal
+ "parse bigint"
+ 123451234512345123456666123456
+ (parse-integer
+ #f
+ "123451234512345123456666123456"))
+
+;; TODO is this expected behaivour?
+(test-error 'warning (parse-integer #f "failure"))
+
+(test-error
+ "Non-integers aren't integers"
+ 'warning
+ (parse-integer #f "1.1"))
+
+(test-equal
+ "But exact floats are"
+ 1.0
+ (parse-integer #f "1.0"))
+
+
+
+(define parse-period (get-parser 'PERIOD))
+
+;; TODO
+
+
+
+(define parse-recur (get-parser 'RECUR))
+
+;; (test-eq (@ (vcomponent recurrence parse) parse-recurrence-rule))
+
+
+
+(define parse-text (get-parser 'TEXT))
+
+;; TODO
+
+
+
+(define parse-time (get-parser 'TIME))
+
+(test-equal
+ (time hour: 10 minute: 20 second: 30)
+ (parse-time #f "102030"))
+;; TODO negative test here
+
+
+
+(define parse-uri (get-parser 'URI))
+
+(test-equal "Test uri is passthrough" 74 (parse-uri #f 74))
+
+
+
+(define parse-utc-offset
+ (get-parser 'UTC-OFFSET))
+
+;; TODO
+
+'((vcomponent formats common types))
diff --git a/tests/unit/vcomponent/vcomponent.scm b/tests/unit/vcomponent/vcomponent.scm
new file mode 100644
index 00000000..ebd0b1ff
--- /dev/null
+++ b/tests/unit/vcomponent/vcomponent.scm
@@ -0,0 +1,105 @@
+;;; Commentary:
+;; Test base functionallity of vcomponent structures.
+;;; Code:
+
+(define-module (test vcomponent)
+ :use-module (srfi srfi-17)
+ :use-module (srfi srfi-64)
+ :use-module (srfi srfi-88)
+ :use-module (hnh util table)
+ :use-module (datetime)
+ :use-module (vcomponent base))
+
+
+
+
+(define ev
+ (prop (vcomponent type: 'DUMMY)
+ 'X-KEY "value"))
+
+(test-eqv "Non-existant properties return #f"
+ #f (prop ev 'MISSING))
+
+(test-assert "Existing property is non-false"
+ (prop ev 'X-KEY))
+
+(test-equal "Getting value of existing property"
+ "value" (prop ev 'X-KEY))
+
+(define calendar (add-child (vcomponent type: 'VCALENDAR)
+ ev))
+
+(test-equal 1 (length (children calendar)))
+
+;;; TODO remove child
+;; (abandon! calendar ev)
+;; (test-equal 0 (length (children calendar)))
+
+
+
+(define vline*
+ (vline
+ key: 'DTSTART
+ vline-value: (date year: 2020 month: 01 day: 02)
+ vline-parameters: (alist->table
+ '((VALUE . "DATE")))
+ vline-source: "DTSTART;VALUE=DATE:2020-01-02"))
+
+(test-group "vline"
+ (test-assert "Type check works as expected"
+ (vline? vline*)))
+
+(define vcomponent*
+ (vcomponent type: 'VEVENT))
+
+(test-assert "Type check works as expected"
+ (vcomponent? vcomponent*))
+
+(define child
+ (vcomponent type: 'CHILD))
+
+
+(test-eqv
+ "An added component extends length"
+ 1 (length (children (add-child vcomponent* child))))
+
+(test-eqv
+ "But the source isn't modified"
+ 0 (length (children vcomponent*)))
+
+(test-equal "Setting property"
+ (list (list 'KEY (vline key: 'KEY vline-value: "Value")))
+ (properties
+ (prop vcomponent* 'KEY "Value")))
+
+(let ((vl (vline key: 'KEY vline-value: "Value")))
+ (test-equal "Setting property vline"
+ (list (list 'KEY vl))
+ (properties
+ (prop* vcomponent* 'KEY vl))))
+
+(test-equal "Set properties test"
+ '(K1 K2)
+ (map car
+ (properties
+ (apply set-properties
+ vcomponent*
+ `((K1 . "V1")
+ (K2 . "V2"))))))
+
+;; remove-property
+
+;; extract extract*
+
+
+;; remove-parameter
+;; value
+;; param
+
+;; parameters
+;; properties
+
+;; x-property?
+;; internal-field?
+
+'((vcomponent base))