diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-10-02 19:26:40 +0200 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2023-10-02 19:28:44 +0200 |
commit | 712654d4c023a2ab13190c6905d313e0ba897965 (patch) | |
tree | b8505b420d6621022fa6a46271340071d8881322 /tests/unit/vcomponent | |
parent | Made displayln into a library export. (diff) | |
download | calp-712654d4c023a2ab13190c6905d313e0ba897965.tar.gz calp-712654d4c023a2ab13190c6905d313e0ba897965.tar.xz |
Rewrite test running system.
Diffstat (limited to 'tests/unit/vcomponent')
-rw-r--r-- | tests/unit/vcomponent/annoying-events.scm | 68 | ||||
-rw-r--r-- | tests/unit/vcomponent/create.scm | 69 | ||||
-rw-r--r-- | tests/unit/vcomponent/param.scm | 69 | ||||
-rw-r--r-- | tests/unit/vcomponent/recurrence-advanced.scm | 1555 | ||||
-rw-r--r-- | tests/unit/vcomponent/recurrence-simple.scm | 324 | ||||
-rw-r--r-- | tests/unit/vcomponent/rrule-serialization.scm | 77 | ||||
-rw-r--r-- | tests/unit/vcomponent/vcomponent-control.scm | 36 | ||||
-rw-r--r-- | tests/unit/vcomponent/vcomponent-datetime.scm | 44 | ||||
-rw-r--r-- | tests/unit/vcomponent/vcomponent-formats-common-types.scm | 140 | ||||
-rw-r--r-- | tests/unit/vcomponent/vcomponent.scm | 105 |
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)) |