aboutsummaryrefslogtreecommitdiff
path: root/tests/recurrence-simple.scm
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2021-01-14 00:08:20 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2021-01-14 00:08:20 +0100
commitc41eeaf08e9a546c71a50eec754296ee98b208ed (patch)
treeb8203159d5b5bfc01a90e9ec75fa80eda854158c /tests/recurrence-simple.scm
parentMerge several recurrence test files. (diff)
downloadcalp-c41eeaf08e9a546c71a50eec754296ee98b208ed.tar.gz
calp-c41eeaf08e9a546c71a50eec754296ee98b208ed.tar.xz
Rename recurrence files.
Diffstat (limited to 'tests/recurrence-simple.scm')
-rw-r--r--tests/recurrence-simple.scm242
1 files changed, 242 insertions, 0 deletions
diff --git a/tests/recurrence-simple.scm b/tests/recurrence-simple.scm
new file mode 100644
index 00000000..8d930ad1
--- /dev/null
+++ b/tests/recurrence-simple.scm
@@ -0,0 +1,242 @@
+;;; Commentary:
+;; Basic tests that recurrence rule parsing works.
+;; Including that it fails on invalid output.
+;;
+;;
+;; General tests of "generate-recurrence-set".
+;;; Code:
+
+(((srfi srfi-41) stream-take stream-map stream->list stream-car)
+ ((datetime) day-stream mon)
+ ((vcomponent base) extract prop)
+
+ ((calp util exceptions) warnings-are-errors warning-handler)
+ ((guile) format)
+
+ ((vcomponent) parse-calendar)
+ ((vcomponent recurrence)
+ parse-recurrence-rule
+ make-recur-rule
+ generate-recurrence-set))
+
+;;; 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 identity)) ; silence warnings
+ (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-argument
+ (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
+ (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)))))
+
+
+(define ev
+ (call-with-input-string
+ "BEGIN:VEVENT
+DTSTART:20190302T100000
+RRULE:FREQ=DAILY
+END:VEVENT"
+ parse-calendar) )
+
+(test-assert "daily 10:00"
+ (stream-car (generate-recurrence-set ev)))
+
+(define ev
+ (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
+ (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
+ (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
+ (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
+ (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
+ (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
+ (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
+ (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)))