diff options
Diffstat (limited to '')
-rw-r--r-- | tests/unit/formats/README.md | 14 | ||||
-rw-r--r-- | tests/unit/formats/run.scm | 130 | ||||
-rw-r--r-- | tests/unit/formats/target.ics | 18 | ||||
-rw-r--r-- | tests/unit/formats/target.sxml | 32 | ||||
-rw-r--r-- | tests/unit/formats/target.xml | 68 |
5 files changed, 262 insertions, 0 deletions
diff --git a/tests/unit/formats/README.md b/tests/unit/formats/README.md new file mode 100644 index 00000000..c41a0c58 --- /dev/null +++ b/tests/unit/formats/README.md @@ -0,0 +1,14 @@ +Data format tests +================= + +These aren't really unit tests, but run fine through the same +framework. + +The file [`run.scm`](run.scm) contains a reference calendar (or +"master record") component which should contain all weird cases which +may be encountered. It then tries to serialize this component to all +registered serialization formats (iCalendar, xCalendar, ...) and +checks it against a pre vetted reference file. + +It then takes the serialized form and parses it back into a Guile data +structure, and checks it against the "master record". diff --git a/tests/unit/formats/run.scm b/tests/unit/formats/run.scm new file mode 100644 index 00000000..5ec277ca --- /dev/null +++ b/tests/unit/formats/run.scm @@ -0,0 +1,130 @@ +(define-module (test formats run) + :use-module (srfi srfi-64) + :use-module (srfi srfi-88) + :use-module ((hnh util) :select (->)) + :use-module (hnh util path) + :use-module ((ice-9 rdelim) :select (read-string)) + :use-module (ice-9 pretty-print) + :use-module (rnrs io ports) + :use-module (datetime) + :use-module (vcomponent create) + :use-module ((vcomponent formats ical) :prefix #{ics:}#) + :use-module ((vcomponent formats xcal) :prefix #{xcs:}#) + :use-module ((vcomponent formats sxcal) :prefix #{sxcs:}#) + :use-module (sxml namespaced) + :use-module ((calp namespaces) :select (xcal)) + :use-module (hnh test xmllint) + + ;; Requirements for the reference component + :use-module ((hnh util) :select (->)) + :use-module (datetime) + :use-module (vcomponent create) + :use-module (rnrs io ports) + ) + +;;; Reference component. This component should be built to +;;; contain all weird cases which may be encountered. +(define ev + (vcalendar + calscale: "GREGORIAN" + ;; method: "" + prodid: "-//CALP-TEST//x.y" + version: "2.0" + (list + (vevent + attach: (with-parameters fmttype: "text/plain" + encoding: "BASE64" + value: "BINARY" + (-> "\n" + (string->bytevector + (make-transcoder (utf-8-codec))))) + ;; categories: '("a" "b") + class: 'PUBLIC + comment: "A comment" + description: "Descrition of the event" + description: (with-parameters language: "sv" "Beskrivning av händelsen") + ;; geo: (make-geo 10 20) + location: "Room 5" + priority: 5 + ;; resources: + status: 'CANCELLED + summary: "Event summary" + completed: (datetime year: 2023 month: may day: 10 hour: 10 minute: 20) + dtstart: (datetime year: 2023 month: may day: 1) + uid: "e4e812b8-dbb9-438d-ba56-ab58321fe4e1" + ;; dtend: (date year: 2023 month: may day: 5) + ;; TODO duration (on another component) + ;; freebusy: + ;; trasp: 'TRANSPARENT + )))) + + + +(define* (run-test name reference + key: + serialize + parse) + + ;; Assert serialize is set + + (define target + (call-with-input-file (path-append (dirname (current-filename)) + reference) + read-string)) + + (define serialized-component + (call-with-output-string + (lambda (port) (serialize ev port)))) + + (test-equal (string-append "serialise " name) + target serialized-component) + + (when parse + (test-equal (string-append "parse " name) + (list ev) + (call-with-input-string serialized-component parse)))) + + + +;;; Currently many of these have some extra baggage in their +;;; serialise or parse forms. This should be kept to a minimum, +;;; to ensure that all implementations are compatible. +;;; However, reflowing data for better diffs is acceptable. + +(test-group "iCalendar" + (run-test + "iCalendar" "target.ics" + serialize: ics:serialize + parse: ics:deserialize)) + +(test-group "sxCalendar" + (run-test + "sxCalendar" "target.sxml" + serialize: + (lambda (ev p) + (pretty-print + (namespaced-sxml->sxml + ((@@ (vcomponent formats sxcal) serialize/object) ev) + `((,xcal . xcal))) + p)))) + +(test-group "xCalendar" + (run-test + "xCalendar" "target.xml" + serialize: (lambda (ev p) + (-> (call-with-output-string + (lambda (port) (xcs:serialize ev port))) + xmllint + (display p))))) + + + +'((vcomponent formats xcal) + (vcomponent formats xcal output) + (vcomponent formats xcal parse) + (vcomponent formats xcal types) + + (vcomponent formats ical) + (vcomponent formats ical output) + (vcomponent formats ical parse) + (vcomponent formats ical types)) diff --git a/tests/unit/formats/target.ics b/tests/unit/formats/target.ics new file mode 100644 index 00000000..0255432a --- /dev/null +++ b/tests/unit/formats/target.ics @@ -0,0 +1,18 @@ +BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//CALP-TEST//x.y
+VERSION:2.0
+BEGIN:VEVENT
+ATTACH;ENCODING=BASE64;FMTTYPE=text/plain;VALUE=BINARY:Cg==
+CLASS:PUBLIC
+COMMENT:A comment
+COMPLETED:20230510T102000
+DESCRIPTION;LANGUAGE=sv:Beskrivning av händelsen
+DTSTART:20230501T000000
+LOCATION:Room 5
+PRIORITY:5
+STATUS:CANCELLED
+SUMMARY:Event summary
+UID:e4e812b8-dbb9-438d-ba56-ab58321fe4e1
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/unit/formats/target.sxml b/tests/unit/formats/target.sxml new file mode 100644 index 00000000..1f9e4a1e --- /dev/null +++ b/tests/unit/formats/target.sxml @@ -0,0 +1,32 @@ +(*TOP* (xcal:vcalendar + (@ (xmlns:xcal + "urn:ietf:params:xml:ns:icalendar-2.0")) + (xcal:properties + (xcal:calscale (xcal:text "GREGORIAN")) + (xcal:prodid (xcal:text "-//CALP-TEST//x.y")) + (xcal:version (xcal:text "2.0"))) + (xcal:components + (xcal:vevent + (xcal:properties + (xcal:attach + (xcal:parameters + (xcal:encoding (xcal:text "BASE64")) + (xcal:fmttype (xcal:text "text/plain"))) + (xcal:binary "Cg==")) + (xcal:class (xcal:text "PUBLIC")) + (xcal:comment (xcal:text "A comment")) + (xcal:completed + (xcal:date-time "2023-05-10T10:20:00")) + (xcal:description + (xcal:parameters + (xcal:language (xcal:text "sv"))) + (xcal:text "Beskrivning av händelsen")) + (xcal:dtstart + (xcal:date-time "2023-05-01T00:00:00")) + (xcal:location (xcal:text "Room 5")) + (xcal:priority (xcal:integer "5")) + (xcal:status (xcal:text "CANCELLED")) + (xcal:summary (xcal:text "Event summary")) + (xcal:uid + (xcal:text + "e4e812b8-dbb9-438d-ba56-ab58321fe4e1"))))))) diff --git a/tests/unit/formats/target.xml b/tests/unit/formats/target.xml new file mode 100644 index 00000000..e6c98f44 --- /dev/null +++ b/tests/unit/formats/target.xml @@ -0,0 +1,68 @@ +<?xml version="1.0"?> +<xcal:icalendar xmlns:xcal="urn:ietf:params:xml:ns:icalendar-2.0"> + <xcal:vcalendar> + <xcal:properties> + <xcal:calscale> + <xcal:text>GREGORIAN</xcal:text> + </xcal:calscale> + <xcal:prodid> + <xcal:text>-//CALP-TEST//x.y</xcal:text> + </xcal:prodid> + <xcal:version> + <xcal:text>2.0</xcal:text> + </xcal:version> + </xcal:properties> + <xcal:components> + <xcal:vevent> + <xcal:properties> + <xcal:attach> + <xcal:parameters> + <xcal:encoding> + <xcal:text>BASE64</xcal:text> + </xcal:encoding> + <xcal:fmttype> + <xcal:text>text/plain</xcal:text> + </xcal:fmttype> + </xcal:parameters> + <xcal:binary>Cg==</xcal:binary> + </xcal:attach> + <xcal:class> + <xcal:text>PUBLIC</xcal:text> + </xcal:class> + <xcal:comment> + <xcal:text>A comment</xcal:text> + </xcal:comment> + <xcal:completed> + <xcal:date-time>2023-05-10T10:20:00</xcal:date-time> + </xcal:completed> + <xcal:description> + <xcal:parameters> + <xcal:language> + <xcal:text>sv</xcal:text> + </xcal:language> + </xcal:parameters> + <xcal:text>Beskrivning av händelsen</xcal:text> + </xcal:description> + <xcal:dtstart> + <xcal:date-time>2023-05-01T00:00:00</xcal:date-time> + </xcal:dtstart> + <xcal:location> + <xcal:text>Room 5</xcal:text> + </xcal:location> + <xcal:priority> + <xcal:integer>5</xcal:integer> + </xcal:priority> + <xcal:status> + <xcal:text>CANCELLED</xcal:text> + </xcal:status> + <xcal:summary> + <xcal:text>Event summary</xcal:text> + </xcal:summary> + <xcal:uid> + <xcal:text>e4e812b8-dbb9-438d-ba56-ab58321fe4e1</xcal:text> + </xcal:uid> + </xcal:properties> + </xcal:vevent> + </xcal:components> + </xcal:vcalendar> +</xcal:icalendar> |