mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 17:24:23 +00:00
This is a fix for Bug#74994 that replaces the existing support in icalendar.el. It implements a full parser, recurrence rule and time zone calculations, diary import and export, and a major mode with syntax highlighting for iCalendar data. It obsoletes most of the code in icalendar.el. In addition to Bug#74994, the proposal to update Emacs' iCalendar support was discussed on emacs-devel in this thread: https://lists.gnu.org/archive/html/emacs-devel/2024-10/msg00425.html icalendar.el pre-dates the current standard (RFC5545), contains numerous bugs, is not well documented, and could not easily be updated or extended; starting fresh was the simplest path to creating an iCalendar library that other Emacs applications and packages can rely on. It was decided to leave icalendar.el's code in place for posterity, but declare it obsolete. Most of the changes in icalendar.el simply consist of such declarations. The old To Do list has also been deleted. A few changes in icalendar.el, however, consist of new code for library-wide functions and options, especially error handling. In particular: * lisp/calendar/icalendar.el: Log iCalendar library errors in a single buffer. (icalendar-errors-mode): New mode for it. (icalendar-uid-format): Change the default value to "%h", a hash value (for privacy). (icalendar-make-uid): New function, to replace 'icalendar--create-uid'. (icalendar-debug-level, icalendar-vcalendar-prodid): New option. (icalendar-vcalendar-version): New constant. * lisp/calendar/icalendar.el (icalendar-import-format) (icalendar-import-format-summary, icalendar-import-format-description) (icalendar-import-format-location, icalendar-import-format-organizer) (icalendar-import-format-url, icalendar-import-format-uid) (icalendar-import-format-status, icalendar-import-format-class) (icalendar-recurring-start-year, icalendar-export-hidden-diary-entries) (icalendar-export-sexp-enumerate-all, icalendar-export-alarms, icalendar-debug, icalendar--weekday-array, icalendar--dmsg) (icalendar--get-unfolded-buffer icalendar--clean-up-line-endings) (icalendar--rris, icalendar--read-element) (icalendar--get-event-property, icalendar--get-event-properties) (icalendar--get-event-property-attributes) (icalendar--get-children, icalendar--all-events, icalendar--split-value) (icalendar--convert-tz-offset, icalendar--parse-vtimezone) (icalendar--get-most-recent-observance) (icalendar--convert-all-timezones, icalendar--find-time-zone) (icalendar--decode-isodatetime) (icalendar--decode-isoduration, icalendar--add-decoded-times) (icalendar--datetime-to-american-date) (icalendar--datetime-to-european-date, icalendar--datetime-to-iso-date) (icalendar--datetime-to-diary-date, icalendar--datetime-to-colontime) (icalendar--get-month-number, icalendar--get-weekday-number) (icalendar--get-weekday-numbers, icalendar--get-weekday-abbrev) (icalendar--date-to-isodate, icalendar--datestring-to-isodate) (icalendar--diarytime-to-isotime, icalendar--convert-string-for-export) (icalendar--convert-string-for-import, icalendar-export-file) (icalendar-export-region, icalendar--create-uid) (icalendar--parse-summary-and-rest, icalendar--create-ical-alarm) (icalendar--do-create-ical-alarm, icalendar--convert-ordinary-to-ical) (icalendar-first-weekday-of-year, icalendar--convert-weekly-to-ical) (icalendar--convert-yearly-to-ical, icalendar--convert-sexp-to-ical) (icalendar--convert-block-to-ical, icalendar--convert-float-to-ical) (icalendar--convert-date-to-ical, icalendar--convert-cyclic-to-ical) (icalendar--convert-anniversary-to-ical, icalendar-import-file) (icalendar-import-buffer, icalendar--format-ical-event) (icalendar--convert-to-ical, icalendar--convert-ical-to-diary) (icalendar--convert-recurring-to-diary) (icalendar--convert-non-recurring-all-day-to-diary) (icalendar--convert-non-recurring-not-all-day-to-diary) (icalendar--add-diary-entry, icalendar-import-format-sample): Mark them as obsolete. In addition to the changes above, the new iCalendar library consists of the following: * lisp/calendar/diary-icalendar.el: * lisp/calendar/icalendar-ast.el: * lisp/calendar/icalendar-macs.el: * lisp/calendar/icalendar-mode.el: * lisp/calendar/icalendar-parser.el: * lisp/calendar/icalendar-recur.el: * lisp/calendar/icalendar-utils.el: New files A few changes were made to existing files dealing with the calendar and diary: * lisp/calendar/calendar.el (calendar-date-from-day-of-year): New function, extracted from calendar-goto-day-of-year. * lisp/calendar/cal-move.el (calendar-goto-day-of-year): Use it. * lisp/calendar/cal-dst.el (calendar-dst-find-data): Improve docstring. * lisp/calendar/calendar.el (diary-date-insertion-form): New option. (diary-american-date-insertion-form, diary-european-date-insertion-form) (diary-iso-date-insertion-form): New constants. * lisp/calendar/diary-lib.el (diary-insert-entry): Use the new 'diary-date-insertion-form' option. (diary-time-regexp): Add FIXME to an existing comment. The user-facing aspects of the above changes are documented in the Emacs manual and the NEWS file: * doc/emacs/calendar.texi (Diary Conversion): Update manual section to describe the new importer and exporter. * doc/emacs/emacs.texi (Detailed node listing): Update to include the new nodes in docs/emacs/calendar.texi. * etc/NEWS: Briefly describe the new library, major mode, and options. The remainder of the changes apply to test files. The following changes introduce new test files related to the new diary importer and exporter: * test/lisp/calendar/diary-icalendar-tests.el (Diary import and export): Tests for diary-icalendar. In addition to new tests for the exporter, the existing import tests for icalendar.el have been ported here; these use the existing iCalendar files in test/lisp/calendar/icalendar-resources. (A few new input .ics files have also been added to this directory; see below.) * test/lisp/calendar/diary-icalendar-resources: New directory containing expected outputs for the import tests in diary-icalendar-tests.el. (These have the same or similar names to the output files for the old importer, in test/lisp/calendar/icalendar-resources, but different contents. Thus they live in a new directory.) * test/lisp/calendar/icalendar-resources/import-legacy-function.ics: New input file to test backward compatibility of the new importer with a function as the value of 'icalendar-import-format', now obsolete. * test/lisp/calendar/icalendar-resources/import-legacy-vars.ics: New input file to test backward compatibility of the new importer with values for options provided by icalendar.el which are now obsolete. * test/lisp/calendar/icalendar-resources/import-with-attachment.ics: New input file to test import of base64-encoded attachments. * icalendar-resources/import-time-format-12hr-blank.ics: New input file to test import with a custom value of 'diary-icalendar-time-format'. Two other new test files provide unit tests for the main functions of the library: * test/lisp/calendar/icalendar-parser-tests.el (Parser): Tests for icalendar-parser. Most of these are derived from examples in RFC5545, to ensure the parser implements the standard. * test/lisp/calendar/icalendar-recur-tests.el (Recurrence rules): Tests for icalendar-recur. Most of these are derived from examples in RFC5545, to ensure the recurrence rule interpreter implements the standard. A few of the existing test files for icalendar.el have also been modified. Besides the specific changes mentioned below, the modified .ics files also now use CR-LF line endings, as required by RFC5545: * test/lisp/calendar/icalendar-tests.el (icalendar-deftest-obsolete): New macro. * test/lisp/calendar/icalendar-resources/import-non-recurring-all-day.ics: Correct a malformed VALUE parameter. * test/lisp/calendar/icalendar-resources/import-rrule-anniversary.ics: Correct representation of a recurring event. * test/lisp/calendar/icalendar-resources/import-rrule-daily-with-exceptions.ics: Add a required VALUE parameter. * test/lisp/calendar/icalendar-resources/import-rrule-daily.ics: * test/lisp/calendar/icalendar-resources/import-rrule-monthly-no-end.ics: * test/lisp/calendar/icalendar-resources/import-rrule-monthly-with-end.ics: * test/lisp/calendar/icalendar-resources/import-rrule-weekly.ics: Correct a malformed RRULE property.
2032 lines
60 KiB
EmacsLisp
2032 lines
60 KiB
EmacsLisp
;;; tests/icalendar-parser.el --- Tests for icalendar-parser -*- lexical-binding: t; -*-
|
||
;; Copyright (C) 2025 Free Software Foundation, Inc.
|
||
|
||
;; This file is part of GNU Emacs.
|
||
|
||
;; GNU Emacs is free software: you can redistribute it and/or modify
|
||
;; it under the terms of the GNU General Public License as published by
|
||
;; the Free Software Foundation, either version 3 of the License, or
|
||
;; (at your option) any later version.
|
||
|
||
;; GNU Emacs is distributed in the hope that it will be useful,
|
||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
;; GNU General Public License for more details.
|
||
|
||
;; You should have received a copy of the GNU General Public License
|
||
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||
|
||
;;; Code:
|
||
|
||
(eval-when-compile (require 'cl-lib))
|
||
(eval-when-compile (require 'icalendar-macs))
|
||
(require 'ert)
|
||
(require 'ert-x)
|
||
(require 'icalendar-parser)
|
||
(require 'icalendar-utils)
|
||
|
||
(cl-defmacro ipt:parse/print-test (string &key expected parser type printer source)
|
||
"Create a test which parses STRING, prints the resulting parse
|
||
tree, and compares the printed version with STRING (or with
|
||
EXPECTED, if given). If they are the same, the test passes.
|
||
PARSER and PRINTER should be the parser and printer functions
|
||
appropriate to STRING. TYPE, if given, should be the type of
|
||
object PARSER is expected to parse; it will be passed as PARSER's
|
||
first argument. SOURCE should be a symbol; it is used to name the
|
||
test."
|
||
(let ((parser-form
|
||
(if type
|
||
`(funcall (function ,parser) (quote ,type) (point-max))
|
||
`(funcall (function ,parser) (point-max)))))
|
||
`(ert-deftest ,(intern (concat "ipt:parse/print-" (symbol-name source))) ()
|
||
,(format "Parse and reprint example from `%s'; pass if they match" source)
|
||
(let* ((parse-buf (get-buffer-create "*iCalendar Parse Test*"))
|
||
(print-buf (get-buffer-create "*iCalendar Print Test*"))
|
||
(unparsed ,string)
|
||
(expected (or ,expected unparsed))
|
||
(printed nil))
|
||
(set-buffer parse-buf)
|
||
(erase-buffer)
|
||
(insert unparsed)
|
||
(goto-char (point-min))
|
||
(let ((parsed ,parser-form))
|
||
(should (icalendar-ast-node-valid-p parsed))
|
||
(set-buffer print-buf)
|
||
(erase-buffer)
|
||
(insert (funcall (function ,printer) parsed))
|
||
;; this may need adjusting if printers become coding-system aware:
|
||
(decode-coding-region (point-min) (point-max) 'utf-8-dos)
|
||
(setq printed (buffer-substring-no-properties (point-min) (point-max)))
|
||
(should (equal expected printed)))))))
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.1.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RDATE;VALUE=DATE:19970304,19970504,19970704,19970904\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.1.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH:http://example.com/public/quarterly-report.doc\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.1.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. The original contains invalid base64 data; it was
|
||
;; missing the final "=", as noted in errata ID 5602.
|
||
;; The decoded string should read:
|
||
;; The quick brown fox jumps over the lazy dog.
|
||
"ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4=\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.1.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"DESCRIPTION;ALTREP=\"cid:part1.0001@example.org\":The Fall'98 Wild Wizards Conference - - Las Vegas\\, NV\\, USA\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DESCRIPTION;ALTREP=\"CID:part3.msg.970415T083000@example.com\": Project XYZ Review Meeting will include the following agenda items: (a) Market Overview\\, (b) Finances\\, (c) Project Management\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;CN=\"John Smith\":mailto:jsmith@example.com\n"
|
||
;; CN param value does not require quotes, so they're missing when
|
||
;; re-printed:
|
||
:expected "ORGANIZER;CN=John Smith:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;CUTYPE=GROUP:mailto:ietf-calsch@example.org\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;DELEGATED-FROM=\"mailto:jsmith@example.com\":mailto:jdoe@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;DELEGATED-TO=\"mailto:jdoe@example.com\",\"mailto:jqpublic@example.com\":mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;DIR=\"ldap://example.com:6666/o=ABC%20Industries,c=US???(cn=Jim%20Dolittle)\":mailto:jimdo@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4=\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.7/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH;FMTTYPE=application/msword:ftp://example.com/pub/docs/agenda.doc\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.8/1)
|
||
|
||
(ipt:parse/print-test
|
||
"FREEBUSY;FBTYPE=BUSY:19980415T133000Z/19980415T170000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.9/1)
|
||
|
||
(ipt:parse/print-test
|
||
"SUMMARY;LANGUAGE=en-US:Company Holiday Party\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.10/1)
|
||
|
||
(ipt:parse/print-test
|
||
"LOCATION;LANGUAGE=en:Germany\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.10/2)
|
||
|
||
(ipt:parse/print-test
|
||
"LOCATION;LANGUAGE=no:Tyskland\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.10/3)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;MEMBER=\"mailto:ietf-calsch@example.org\":mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.11/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;MEMBER=\"mailto:projectA@example.com\",\"mailto:projectB@example.com\":mailto:janedoe@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.11/2)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;PARTSTAT=DECLINED:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.12/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RECURRENCE-ID;RANGE=THISANDFUTURE:19980401T133000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.13/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TRIGGER;RELATED=END:PT5M\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.14/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RELATED-TO;RELTYPE=SIBLING:19960401-080045-4000F192713@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.15/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=CHAIR:mailto:mrbig@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.16/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.17/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;SENT-BY=\"mailto:sray@example.com\":mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.18/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTSTART;TZID=America/New_York:19980119T020000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.19/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTEND;TZID=America/New_York:19980119T030000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.2.19/2)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH;FMTTYPE=image/vnd.microsoft.icon;ENCODING=BASE64;VALUE=BINARY:AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgIAAAICAgADAwMAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAAAAAABNEMQAAAAAAAkQgAAAAAAJEREQgAAACECQ0QgEgAAQxQzM0E0AABERCRCREQAADRDJEJEQwAAAhA0QwEQAAAAAEREAAAAAAAAREQAAAAAAAAkQgAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.3.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TRUE"
|
||
:type icalendar-boolean
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"mailto:jane_doe@example.com"
|
||
:type icalendar-cal-address
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"19970714"
|
||
:type icalendar-date
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; 'Floating' time:
|
||
"19980118T230000"
|
||
:type icalendar-date-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; UTC time:
|
||
"19980119T070000Z"
|
||
:type icalendar-date-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.5/2)
|
||
|
||
(ipt:parse/print-test
|
||
;; Leap second (seconds = 60)
|
||
"19970630T235960Z"
|
||
:type icalendar-date-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.5/3)
|
||
|
||
(ipt:parse/print-test
|
||
;; Local time:
|
||
"DTSTART:19970714T133000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.3.5/4)
|
||
|
||
(ipt:parse/print-test
|
||
;; UTC time:
|
||
"DTSTART:19970714T173000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.3.5/5)
|
||
|
||
(ipt:parse/print-test
|
||
;; Local time with TZ identifier:
|
||
"DTSTART;TZID=America/New_York:19970714T133000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.3.5/6)
|
||
|
||
(ipt:parse/print-test
|
||
"P15DT5H0M20S"
|
||
:expected "P15DT5H20S"
|
||
:type icalendar-dur-value
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"P7W"
|
||
:type icalendar-dur-value
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.6/2)
|
||
|
||
(ipt:parse/print-test
|
||
"1000000.0000001"
|
||
:type icalendar-float
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.7/1)
|
||
|
||
(ipt:parse/print-test
|
||
"1.333"
|
||
:type icalendar-float
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.7/2)
|
||
|
||
(ipt:parse/print-test
|
||
"-3.14"
|
||
:type icalendar-float
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.7/3)
|
||
|
||
(ipt:parse/print-test
|
||
"1234567890"
|
||
:type icalendar-integer
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.8/1)
|
||
|
||
(ipt:parse/print-test
|
||
"-1234567890"
|
||
:type icalendar-integer
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.8/2)
|
||
|
||
(ipt:parse/print-test
|
||
"+1234567890"
|
||
;; "+" sign isn't required, so it's not re-printed:
|
||
:expected "1234567890"
|
||
:type icalendar-integer
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.8/3)
|
||
|
||
(ipt:parse/print-test
|
||
"432109876"
|
||
:type icalendar-integer
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.8/4)
|
||
|
||
(ipt:parse/print-test
|
||
"19970101T180000Z/19970102T070000Z"
|
||
:type icalendar-period
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.9/1)
|
||
|
||
(ipt:parse/print-test
|
||
"19970101T180000Z/PT5H30M"
|
||
:type icalendar-period
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.9/2)
|
||
|
||
(ipt:parse/print-test
|
||
"FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1"
|
||
:type icalendar-recur
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.10/1)
|
||
|
||
(ipt:parse/print-test
|
||
"FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30"
|
||
:type icalendar-recur
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.10/2)
|
||
|
||
(ipt:parse/print-test
|
||
"FREQ=DAILY;COUNT=10;INTERVAL=2"
|
||
:type icalendar-recur
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.10/3)
|
||
|
||
(ipt:parse/print-test
|
||
"Project XYZ Final Review\\nConference Room - 3B\\nCome Prepared."
|
||
:type icalendar-text
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.11/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; Local time:
|
||
"230000"
|
||
:type icalendar-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.12/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; UTC time:
|
||
"070000Z"
|
||
:type icalendar-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.12/2)
|
||
|
||
(ipt:parse/print-test
|
||
;; Local time:
|
||
"083000"
|
||
:type icalendar-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.12/3)
|
||
|
||
(ipt:parse/print-test
|
||
;; UTC time:
|
||
"133000Z"
|
||
:type icalendar-time
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.12/4)
|
||
|
||
(ipt:parse/print-test
|
||
;; Local time with TZ identifier:
|
||
"SOMETIMEPROP;TZID=America/New_York;VALUE=TIME:083000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.3.12/5)
|
||
|
||
(ipt:parse/print-test
|
||
"http://example.com/my-report.txt"
|
||
:type icalendar-uri
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.13/1)
|
||
|
||
(ipt:parse/print-test
|
||
"-0500"
|
||
:type icalendar-utc-offset
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc5545-sec3.3.14/1)
|
||
|
||
(ipt:parse/print-test
|
||
"+0100"
|
||
:type icalendar-utc-offset
|
||
:parser icalendar-parse-value-node
|
||
:printer icalendar-print-value-node
|
||
:source rfc55453.3.14/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
|
||
BEGIN:VEVENT
|
||
UID:19970610T172345Z-AF23B2@example.com
|
||
DTSTAMP:19970610T172345Z
|
||
DTSTART:19970714T170000Z
|
||
DTEND:19970715T040000Z
|
||
SUMMARY:Bastille Day Party
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec3.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTSTART:19960415T133000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VEVENT
|
||
UID:19970901T130000Z-123401@example.com
|
||
DTSTAMP:19970901T130000Z
|
||
DTSTART:19970903T163000Z
|
||
DTEND:19970903T190000Z
|
||
SUMMARY:Annual Employee Review
|
||
CLASS:PRIVATE
|
||
CATEGORIES:BUSINESS,HUMAN RESOURCES
|
||
END:VEVENT
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VEVENT
|
||
UID:19970901T130000Z-123402@example.com
|
||
DTSTAMP:19970901T130000Z
|
||
DTSTART:19970401T163000Z
|
||
DTEND:19970402T010000Z
|
||
SUMMARY:Laurel is in sensitivity awareness class.
|
||
CLASS:PUBLIC
|
||
CATEGORIES:BUSINESS,HUMAN RESOURCES
|
||
TRANSP:TRANSPARENT
|
||
END:VEVENT
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VEVENT
|
||
UID:19970901T130000Z-123403@example.com
|
||
DTSTAMP:19970901T130000Z
|
||
DTSTART;VALUE=DATE:19971102
|
||
SUMMARY:Our Blissful Anniversary
|
||
TRANSP:TRANSPARENT
|
||
CLASS:CONFIDENTIAL
|
||
CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
|
||
RRULE:FREQ=YEARLY
|
||
END:VEVENT
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.1/3)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VEVENT
|
||
UID:20070423T123432Z-541111@example.com
|
||
DTSTAMP:20070423T123432Z
|
||
DTSTART;VALUE=DATE:20070628
|
||
DTEND;VALUE=DATE:20070709
|
||
SUMMARY:Festival International de Jazz de Montreal
|
||
TRANSP:TRANSPARENT
|
||
END:VEVENT
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.1/4)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTODO
|
||
UID:20070313T123432Z-456553@example.com
|
||
DTSTAMP:20070313T123432Z
|
||
DUE;VALUE=DATE:20070501
|
||
SUMMARY:Submit Quebec Income Tax Return for 2006
|
||
CLASS:CONFIDENTIAL
|
||
CATEGORIES:FAMILY,FINANCE
|
||
STATUS:NEEDS-ACTION
|
||
END:VTODO
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTODO
|
||
UID:20070514T103211Z-123404@example.com
|
||
DTSTAMP:20070514T103211Z
|
||
DTSTART:20070514T110000Z
|
||
DUE:20070709T130000Z
|
||
COMPLETED:20070707T100000Z
|
||
SUMMARY:Submit Revised Internet-Draft
|
||
PRIORITY:1
|
||
STATUS:NEEDS-ACTION
|
||
END:VTODO
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VJOURNAL
|
||
UID:19970901T130000Z-123405@example.com
|
||
DTSTAMP:19970901T130000Z
|
||
DTSTART;VALUE=DATE:19970317
|
||
SUMMARY:Staff meeting minutes
|
||
DESCRIPTION:1. Staff meeting: Participants include Joe\\,Lisa\\, and Bob. Aurora project plans were reviewed. There is currently no budget reserves for this project. Lisa will escalate to management. Next meeting on Tuesday.\\n 2. Telephone Conference: ABC Corp. sales representative called to discuss new printer. Promised to get us a demo by Friday.\\n3. Henry Miller (Handsoff Insurance): Car was totaled by tree. Is looking into a loaner car. 555-2323 (tel).
|
||
END:VJOURNAL
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VFREEBUSY
|
||
UID:19970901T082949Z-FA43EF@example.com
|
||
ORGANIZER:mailto:jane_doe@example.com
|
||
ATTENDEE:mailto:john_public@example.com
|
||
DTSTART:19971015T050000Z
|
||
DTEND:19971016T050000Z
|
||
DTSTAMP:19970901T083000Z
|
||
END:VFREEBUSY
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VFREEBUSY
|
||
UID:19970901T095957Z-76A912@example.com
|
||
ORGANIZER:mailto:jane_doe@example.com
|
||
ATTENDEE:mailto:john_public@example.com
|
||
DTSTAMP:19970901T100000Z
|
||
FREEBUSY:19971015T050000Z/PT8H30M,19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
|
||
URL:http://example.com/pub/busy/jpublic-01.ifb
|
||
COMMENT:This iCalendar file contains busy time information for the next three months.
|
||
END:VFREEBUSY
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.4/2)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. Original has invalid value in ORGANIZER
|
||
"BEGIN:VFREEBUSY
|
||
UID:19970901T115957Z-76A912@example.com
|
||
DTSTAMP:19970901T120000Z
|
||
ORGANIZER:mailto:jsmith@example.com
|
||
DTSTART:19980313T141711Z
|
||
DTEND:19980410T141711Z
|
||
FREEBUSY:19980314T233000Z/19980315T003000Z
|
||
FREEBUSY:19980316T153000Z/19980316T163000Z
|
||
FREEBUSY:19980318T030000Z/19980318T040000Z
|
||
URL:http://www.example.com/calendar/busytime/jsmith.ifb
|
||
END:VFREEBUSY
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.4/3)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTIMEZONE
|
||
TZID:America/New_York
|
||
LAST-MODIFIED:20050809T050000Z
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19670430T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19730429T070000Z
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:STANDARD
|
||
DTSTART:19671029T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20061029T060000Z
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19740106T020000
|
||
RDATE:19750223T020000
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19760425T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19860427T070000Z
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19870405T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=20060402T070000Z
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:20070311T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:STANDARD
|
||
DTSTART:20071104T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
END:VTIMEZONE
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTIMEZONE
|
||
TZID:America/New_York
|
||
LAST-MODIFIED:20050809T050000Z
|
||
BEGIN:STANDARD
|
||
DTSTART:20071104T020000
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:20070311T020000
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
END:VTIMEZONE
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.5/2)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTIMEZONE
|
||
TZID:America/New_York
|
||
LAST-MODIFIED:20050809T050000Z
|
||
TZURL:http://zones.example.com/tz/America-New_York.ics
|
||
BEGIN:STANDARD
|
||
DTSTART:20071104T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:20070311T020000
|
||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
END:VTIMEZONE
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.5/3)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTIMEZONE
|
||
TZID:Fictitious
|
||
LAST-MODIFIED:19870101T000000Z
|
||
BEGIN:STANDARD
|
||
DTSTART:19671029T020000
|
||
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19870405T020000
|
||
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
END:VTIMEZONE
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.5/4)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VTIMEZONE
|
||
TZID:Fictitious
|
||
LAST-MODIFIED:19870101T000000Z
|
||
BEGIN:STANDARD
|
||
DTSTART:19671029T020000
|
||
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19870405T020000
|
||
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19990424T020000
|
||
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
END:VTIMEZONE
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.5/5)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VALARM
|
||
TRIGGER;VALUE=DATE-TIME:19970317T133000Z
|
||
REPEAT:4
|
||
DURATION:PT15M
|
||
ACTION:AUDIO
|
||
ATTACH;FMTTYPE=audio/basic:ftp://example.com/pub/sounds/bell-01.aud
|
||
END:VALARM
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VALARM
|
||
TRIGGER:-PT30M
|
||
REPEAT:2
|
||
DURATION:PT15M
|
||
ACTION:DISPLAY
|
||
DESCRIPTION:Breakfast meeting with executive\\nteam at 8:30 AM EST.
|
||
END:VALARM
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.6/2)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VALARM
|
||
TRIGGER;RELATED=END:-P2D
|
||
ACTION:EMAIL
|
||
ATTENDEE:mailto:john_doe@example.com
|
||
SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
|
||
DESCRIPTION:A draft agenda needs to be sent out to the attendees to the weekly managers meeting (MGR-LIST). Attached is a pointer the document template for the agenda file.
|
||
ATTACH;FMTTYPE=application/msword:http://example.com/templates/agenda.doc
|
||
END:VALARM
|
||
"
|
||
:parser icalendar-parse-component
|
||
:printer icalendar-print-component-node
|
||
:source rfc5545-sec3.6.6/3)
|
||
|
||
(ipt:parse/print-test
|
||
"CALSCALE:GREGORIAN\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.7.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"METHOD:REQUEST\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.7.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"PRODID:-//ABC Corporation//NONSGML My Product//EN\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.7.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"VERSION:2.0\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.7./1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH:CID:jsmith.part3.960817T083000.xyzMail@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/reports/r-960812.ps\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"CATEGORIES:APPOINTMENT,EDUCATION\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"CATEGORIES:MEETING\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"CLASS:PUBLIC\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"COMMENT:The meeting really needs to include both ourselves and the customer. We can't hold this meeting without them. As a matter of fact\\, the venue for the meeting ought to be at their site. - - John\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DESCRIPTION:Meeting to provide technical review for \"Phoenix\" design.\\nHappy Face Conference Room. Phoenix design team MUST attend this meeting.\\nRSVP to team leader.\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"GEO:37.386013;-122.082932\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"LOCATION:Conference Room - F123\\, Bldg. 002\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.7/1)
|
||
|
||
(ipt:parse/print-test
|
||
"LOCATION;ALTREP=\"http://xyzcorp.com/conf-rooms/f123.vcf\":Conference Room - F123\\, Bldg. 002\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.7/2)
|
||
|
||
(ipt:parse/print-test
|
||
"PERCENT-COMPLETE:39\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.8/1)
|
||
|
||
(ipt:parse/print-test
|
||
"PRIORITY:1\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.9/1)
|
||
|
||
(ipt:parse/print-test
|
||
"PRIORITY:2\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.9/2)
|
||
|
||
(ipt:parse/print-test
|
||
"PRIORITY:0\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.9/3)
|
||
|
||
(ipt:parse/print-test
|
||
"RESOURCES:EASEL,PROJECTOR,VCR\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.10/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RESOURCES;LANGUAGE=fr:Nettoyeur haute pression\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.10/2)
|
||
|
||
(ipt:parse/print-test
|
||
"STATUS:TENTATIVE\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.11/1)
|
||
|
||
(ipt:parse/print-test
|
||
"STATUS:NEEDS-ACTION\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.11/2)
|
||
|
||
(ipt:parse/print-test
|
||
"STATUS:DRAFT\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.11/3)
|
||
|
||
(ipt:parse/print-test
|
||
"SUMMARY:Department Party\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.1.12/1)
|
||
|
||
(ipt:parse/print-test
|
||
"COMPLETED:19960401T150000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTEND:19960401T150000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTEND;VALUE=DATE:19980704\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"DUE:19980430T000000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTSTART:19980118T073000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DURATION:PT1H0M0S\n"
|
||
;; 0M and 0S are not re-printed because they don't contribute to the duration:
|
||
:expected "DURATION:PT1H\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DURATION:PT15M\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.5/2)
|
||
|
||
(ipt:parse/print-test
|
||
"FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:19970308T160000Z/PT8H30M\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.6/2)
|
||
|
||
(ipt:parse/print-test
|
||
"FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H,19970308T230000Z/19970309T000000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.6/3)
|
||
|
||
(ipt:parse/print-test
|
||
"TRANSP:TRANSPARENT\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.7/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TRANSP:OPAQUE\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.2.7/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TZID:America/New_York\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TZID:America/New_York\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TZID:/example.org/America/New_York\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.1/3)
|
||
|
||
(ipt:parse/print-test
|
||
"TZNAME:EST\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TZNAME;LANGUAGE=fr-CA:HNE\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TZOFFSETFROM:-0500\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TZOFFSETFROM:+1345\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TZOFFSETTO:-0400\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TZOFFSETTO:+1245\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.4/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TZURL:http://timezones.example.org/tz/America-Los_Angeles.ics\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.3.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;MEMBER=\"mailto:DEV-GROUP@example.com\":mailto:joecool@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;DELEGATED-FROM=\"mailto:immud@example.com\":mailto:ildoit@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Henry Cabot:mailto:hcabot@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/3)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=REQ-PARTICIPANT;DELEGATED-FROM=\"mailto:bob@example.com\";PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:jdoe@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/4)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;CN=John Smith;DIR=\"ldap://example.com:6666/o=ABC%20Industries,c=US???(cn=Jim%20Dolittle)\":mailto:jimdo@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/5)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;DELEGATED-FROM=\"mailto:iamboss@example.com\";CN=Henry Cabot:mailto:hcabot@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/6)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=NON-PARTICIPANT;PARTSTAT=DELEGATED;DELEGATED-TO=\"mailto:hcabot@example.com\";CN=The Big Cheese:mailto:iamboss@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/7)
|
||
|
||
(ipt:parse/print-test
|
||
"ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:jdoe@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/8)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. Original lacks quotes around SENT-BY address.
|
||
"ATTENDEE;SENT-BY=\"mailto:jan_doe@example.com\";CN=John Smith:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.1/9)
|
||
|
||
(ipt:parse/print-test
|
||
"CONTACT:Jim Dolittle\\, ABC Industries\\, +1-919-555-1234\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. Original contained unallowed backslash in ldap: URI
|
||
"CONTACT;ALTREP=\"ldap://example.com:6666/o=ABC%20Industries,c=US???(cn=Jim%20Dolittle)\":Jim Dolittle\\, ABC Industries\\,+1-919-555-1234\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"CONTACT;ALTREP=\"CID:part3.msg970930T083000SILVER@example.com\":Jim Dolittle\\, ABC Industries\\, +1-919-555-1234\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.2/3)
|
||
|
||
(ipt:parse/print-test
|
||
"CONTACT;ALTREP=\"http://example.com/pdi/jdoe.vcf\":Jim Dolittle\\, ABC Industries\\, +1-919-555-1234\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.2/4)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;CN=John Smith:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;CN=JohnSmith;DIR=\"ldap://example.com:6666/o=DC%20Associates,c=US???(cn=John%20Smith)\":mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"ORGANIZER;SENT-BY=\"mailto:jane_doe@example.com\":mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.3/3)
|
||
|
||
(ipt:parse/print-test
|
||
"RECURRENCE-ID;VALUE=DATE:19960401\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RECURRENCE-ID;RANGE=THISANDFUTURE:19960120T120000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.4/2)
|
||
|
||
(ipt:parse/print-test
|
||
"RELATED-TO:jsmith.part7.19960817T083000.xyzMail@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.5/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RELATED-TO:19960401-080045-4000F192713-0052@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.5/2)
|
||
|
||
(ipt:parse/print-test
|
||
"URL:http://example.com/pub/calendars/jsmith/mytime.ics\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.6/1)
|
||
|
||
(ipt:parse/print-test
|
||
"UID:19960401T080045Z-4000F192713-0052@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.4.7/1)
|
||
|
||
(ipt:parse/print-test
|
||
"EXDATE:19960402T010000Z,19960403T010000Z,19960404T010000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RDATE:19970714T123000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RDATE;TZID=America/New_York:19970714T083000\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.2/2)
|
||
|
||
(ipt:parse/print-test
|
||
"RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,19960404T010000Z/PT3H\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.2/3)
|
||
|
||
(ipt:parse/print-test
|
||
"RDATE;VALUE=DATE:19970101,19970120,19970217,19970421,19970526,19970704,19970901,19971014,19971128,19971129,19971225\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.2/4)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;COUNT=10\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;UNTIL=19971224T000000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;INTERVAL=2\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/3)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/4)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;UNTIL=20000131T140000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/5)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/6)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;COUNT=10\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/7)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/8)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/9)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/10)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/11)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/12)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/13)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/14)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/15)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/16)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/17)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;BYMONTHDAY=-3\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/18)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/19)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/20)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/21)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/22)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/23)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/24)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/25)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;BYDAY=20MO\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/26)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/27)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/28)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/29)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/30)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/31)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/32)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/33)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/34)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/35)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/36)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/37)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/38)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/39)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/40)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/41)
|
||
|
||
(ipt:parse/print-test
|
||
"RRULE:FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.5.3/42)
|
||
|
||
(ipt:parse/print-test
|
||
"ACTION:AUDIO\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"ACTION:DISPLAY\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"REPEAT:4\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TRIGGER:-PT15M\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"TRIGGER;RELATED=END:PT5M\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"TRIGGER;VALUE=DATE-TIME:19980101T050000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.6.3/3)
|
||
|
||
(ipt:parse/print-test
|
||
"CREATED:19960329T133000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.7.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"DTSTAMP:19971210T080000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.7.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"LAST-MODIFIED:19960817T133000Z\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.7.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"SEQUENCE:0\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.7.4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"SEQUENCE:2\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.7.4/2)
|
||
|
||
(ipt:parse/print-test
|
||
"DRESSCODE:CASUAL\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.1/1)
|
||
|
||
(ipt:parse/print-test
|
||
"NON-SMOKING;VALUE=BOOLEAN:TRUE\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.1/2)
|
||
|
||
(ipt:parse/print-test
|
||
"X-ABC-MMSUBJ;VALUE=URI;FMTTYPE=audio/basic:http://www.example.org/mysubj.au\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.2/1)
|
||
|
||
(ipt:parse/print-test
|
||
"REQUEST-STATUS:2.0;Success\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.3/1)
|
||
|
||
(ipt:parse/print-test
|
||
"REQUEST-STATUS:3.1;Invalid property value;DTSTART:96-Apr-01\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.3/2)
|
||
|
||
(ipt:parse/print-test
|
||
"REQUEST-STATUS:2.8; Success\\, repeating event ignored. Scheduled as a single event.;RRULE:FREQ=WEEKLY\\;INTERVAL=2\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.3/3)
|
||
|
||
(ipt:parse/print-test
|
||
"REQUEST-STATUS:4.1;Event conflict. Date-time is busy.\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.3/4)
|
||
|
||
(ipt:parse/print-test
|
||
"REQUEST-STATUS:3.7;Invalid calendar user;ATTENDEE:mailto:jsmith@example.com\n"
|
||
:parser icalendar-parse-property
|
||
:printer icalendar-print-property-node
|
||
:source rfc5545-sec3.8.8.3/5)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VCALENDAR
|
||
PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN
|
||
VERSION:2.0
|
||
BEGIN:VEVENT
|
||
DTSTAMP:19960704T120000Z
|
||
UID:uid1@example.com
|
||
ORGANIZER:mailto:jsmith@example.com
|
||
DTSTART:19960918T143000Z
|
||
DTEND:19960920T220000Z
|
||
STATUS:CONFIRMED
|
||
CATEGORIES:CONFERENCE
|
||
SUMMARY:Networld+Interop Conference
|
||
DESCRIPTION:Networld+Interop Conference and Exhibit\\nAtlanta World Congress Center\\nAtlanta\\, Georgia
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/1)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VCALENDAR
|
||
PRODID:-//RDU Software//NONSGML HandCal//EN
|
||
VERSION:2.0
|
||
BEGIN:VTIMEZONE
|
||
TZID:America/New_York
|
||
BEGIN:STANDARD
|
||
DTSTART:19981025T020000
|
||
TZOFFSETFROM:-0400
|
||
TZOFFSETTO:-0500
|
||
TZNAME:EST
|
||
END:STANDARD
|
||
BEGIN:DAYLIGHT
|
||
DTSTART:19990404T020000
|
||
TZOFFSETFROM:-0500
|
||
TZOFFSETTO:-0400
|
||
TZNAME:EDT
|
||
END:DAYLIGHT
|
||
END:VTIMEZONE
|
||
BEGIN:VEVENT
|
||
DTSTAMP:19980309T231000Z
|
||
UID:guid-1.example.com
|
||
ORGANIZER:mailto:mrbig@example.com
|
||
ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:mailto:employee-A@example.com
|
||
DESCRIPTION:Project XYZ Review Meeting
|
||
CATEGORIES:MEETING
|
||
CLASS:PUBLIC
|
||
CREATED:19980309T130000Z
|
||
SUMMARY:XYZ Project Review
|
||
DTSTART;TZID=America/New_York:19980312T083000
|
||
DTEND;TZID=America/New_York:19980312T093000
|
||
LOCATION:1CP Conference Room 4350
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/2)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VCALENDAR
|
||
METHOD:xyz
|
||
VERSION:2.0
|
||
PRODID:-//ABC Corporation//NONSGML My Product//EN
|
||
BEGIN:VEVENT
|
||
DTSTAMP:19970324T120000Z
|
||
SEQUENCE:0
|
||
UID:uid3@example.com
|
||
ORGANIZER:mailto:jdoe@example.com
|
||
ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com
|
||
DTSTART:19970324T123000Z
|
||
DTEND:19970324T210000Z
|
||
CATEGORIES:MEETING,PROJECT
|
||
CLASS:PUBLIC
|
||
SUMMARY:Calendaring Interoperability Planning Meeting
|
||
DESCRIPTION:Discuss how we can test c&s interoperability\\nusing iCalendar and other IETF standards.
|
||
LOCATION:LDB Lobby
|
||
ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/conf/bkgrnd.ps
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/3)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. The TRIGGER property originally did not specify
|
||
;; VALUE=DATE-TIME, which is required since it is not the default type.
|
||
;; See https://www.rfc-editor.org/errata/eid2039
|
||
"BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
PRODID:-//ABC Corporation//NONSGML My Product//EN
|
||
BEGIN:VTODO
|
||
DTSTAMP:19980130T134500Z
|
||
SEQUENCE:2
|
||
UID:uid4@example.com
|
||
ORGANIZER:mailto:unclesam@example.com
|
||
ATTENDEE;PARTSTAT=ACCEPTED:mailto:jqpublic@example.com
|
||
DUE:19980415T000000
|
||
STATUS:NEEDS-ACTION
|
||
SUMMARY:Submit Income Taxes
|
||
BEGIN:VALARM
|
||
ACTION:AUDIO
|
||
TRIGGER;VALUE=DATE-TIME:19980403T120000Z
|
||
ATTACH;FMTTYPE=audio/basic:http://example.com/pub/audio-files/ssbanner.aud
|
||
REPEAT:4
|
||
DURATION:PT1H
|
||
END:VALARM
|
||
END:VTODO
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/4)
|
||
|
||
(ipt:parse/print-test
|
||
"BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
PRODID:-//ABC Corporation//NONSGML My Product//EN
|
||
BEGIN:VJOURNAL
|
||
DTSTAMP:19970324T120000Z
|
||
UID:uid5@example.com
|
||
ORGANIZER:mailto:jsmith@example.com
|
||
STATUS:DRAFT
|
||
CLASS:PUBLIC
|
||
CATEGORIES:Project Report,XYZ,Weekly Meeting
|
||
DESCRIPTION:Project xyz Review Meeting Minutes\\nAgenda\\n1. Review of project version 1.0 requirements.\\n2.Definitionof project processes.\\n3. Review of project schedule.\\nParticipants: John Smith\\, Jane Doe\\, Jim Dandy\\n-It was decided that the requirements need to be signed off byproduct marketing.\\n-P roject processes were accepted.\\n-Project schedule needs to account for scheduled holidaysand employee vacation time. Check with HR for specificdates.\\n-New schedule will be distributed by Friday.\\n-Next weeks meeting is cancelled. No meeting until 3/23.
|
||
END:VJOURNAL
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/5)
|
||
|
||
(ipt:parse/print-test
|
||
;; Corrected. Original text in the standard is missing UID and DTSTAMP.
|
||
;; See https://www.rfc-editor.org/errata/eid4149
|
||
"BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
PRODID:-//RDU Software//NONSGML HandCal//EN
|
||
BEGIN:VFREEBUSY
|
||
UID:19970901T115957Z-76A912@example.com
|
||
DTSTAMP:19970901T120000Z
|
||
ORGANIZER:mailto:jsmith@example.com
|
||
DTSTART:19980313T141711Z
|
||
DTEND:19980410T141711Z
|
||
FREEBUSY:19980314T233000Z/19980315T003000Z
|
||
FREEBUSY:19980316T153000Z/19980316T163000Z
|
||
FREEBUSY:19980318T030000Z/19980318T040000Z
|
||
URL:http://www.example.com/calendar/busytime/jsmith.ifb
|
||
END:VFREEBUSY
|
||
END:VCALENDAR
|
||
"
|
||
:parser icalendar-parse-calendar
|
||
:printer icalendar-print-calendar-node
|
||
:source rfc5545-sec4/6)
|
||
|
||
|
||
;; Tests from real world data:
|
||
(ert-deftest ipt:bad-organizer-params ()
|
||
"Real example: bad ORGANIZER property with params introduced by colon"
|
||
(let ((bad "ORGANIZER:CN=ORGANIZER:mailto:anonymized@domain.example\n")
|
||
(ok "ORGANIZER;CN=ORGANIZER:mailto:anonymized@domain.example\n"))
|
||
(should-error (ical:parse-from-string 'ical:organizer bad))
|
||
(should (ical:ast-node-p (ical:parse-from-string 'ical:organizer ok)))))
|
||
|
||
(ert-deftest ipt:bad-attendee ()
|
||
"Real example: bad ATTENDEE property missing mailto: prefix"
|
||
(let ((bad "ATTENDEE;ROLE=REQ-PARTICIPANT;CN=TRAVELLER:anonymized@domain.example\n")
|
||
(ok "ATTENDEE;ROLE=REQ-PARTICIPANT;CN=TRAVELLER:mailto:anonymized@domain.example\n"))
|
||
(should-error (ical:parse-from-string 'ical:attendee bad))
|
||
(should (ical:ast-node-p (ical:parse-from-string 'ical:attendee ok)))))
|
||
|
||
(ert-deftest ipt:bad-attach ()
|
||
"Real example: bad ATTACH property containing broken URI"
|
||
(let ((bad "ATTACH;VALUE=URI:Glass\n")
|
||
(ok "ATTACH;VALUE=URI:https://example.com\n"))
|
||
(should-error (ical:parse-from-string 'ical:attach bad))
|
||
(should (ical:ast-node-p (ical:parse-from-string 'ical:attach ok)))))
|
||
|
||
(ert-deftest ipt:bad-cnparam ()
|
||
"Real example: bad unquoted CN parameter containing a comma"
|
||
(let ((bad "ORGANIZER;CN=Hartlauer Geschäft Wien, Taborstr. 18:mailto:anonymized@domain.example\n")
|
||
(ok "ORGANIZER;CN=\"Hartlauer Geschäft Wien, Taborstr. 18\":mailto:anonymized@domain.example\n"))
|
||
;; strict parser should reject bad but accept ok:
|
||
(let ((ical:parse-strictly t))
|
||
(should (ical:ast-node-p (ical:parse-from-string 'ical:organizer ok)))
|
||
(should-error (ical:parse-from-string 'ical:organizer bad)))
|
||
;; relaxed parser should accept bad:
|
||
(let ((ical:parse-strictly nil))
|
||
(should (ical:ast-node-p (ical:parse-from-string 'ical:organizer bad))))))
|
||
|
||
(ert-deftest ipt:fix-bad-description ()
|
||
"Real example: bad DESCRIPTION property containing blank lines,
|
||
fixed by `icalendar-fix-blank-lines'."
|
||
(let ((bad "BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
CALSCALE:GREGORIAN
|
||
METHOD:REQUEST
|
||
BEGIN:VEVENT
|
||
UID:45dd7698-5c53-47e3-9280-19c5dff62571
|
||
PRIORITY:1
|
||
DTSTART:20210721T175200
|
||
DTEND:20210721T192400
|
||
LOCATION:Verona Porta Nuova
|
||
DESCRIPTION:Verona Porta Nuova-Firenze S. M. Novella;Train: Frecciarossa 8527, departing from Verona Porta Nuova Hours: 17:52; arriving at Firenze S. M. Novella Hours: 19:24 Coach 8, Position 7A; pnr code CLS345
|
||
|
||
|
||
SUMMARY:Trip Verona Porta Nuova-Firenze S. M. Novella, Train Frecciarossa 8527, Coach 8, Position 7A, PNR CLS345,
|
||
ORGANIZER;CN=ORGANIZER:mailto:anonymized@domain.example
|
||
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=BUYER:mailto:anonymized@domain.example
|
||
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=TRAVELLER:mailto:anonymized@domain.example
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"))
|
||
;; The default parser should produce an error on the blank lines in
|
||
;; DESCRIPTION:
|
||
(let ((ical:pre-parsing-hook nil))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(ical:parse)
|
||
;; Parsing should produce error at the bad description property:
|
||
(should (ical:errors-p))))
|
||
;; cleaning up the blank lines before parsing should correct this:
|
||
(let ((ical:pre-parsing-hook '(ical:fix-blank-lines)))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(let ((vcal (ical:parse)))
|
||
(should (not (ical:errors-p)))
|
||
(ical:with-component vcal
|
||
((ical:vevent vevent))
|
||
(ical:with-component vevent
|
||
((ical:description :value description))
|
||
(let* ((expected "CLS345")
|
||
(end (length description))
|
||
(start (- end (length expected))))
|
||
(should (equal expected
|
||
(substring description start end)))))))))))
|
||
|
||
(ert-deftest ipt:bad-hyphenated-dates ()
|
||
"Real example: bad date values containing hyphens, fixed by
|
||
`icalendar-fix-hyphenated-dates'."
|
||
(let ((bad "BEGIN:VCALENDAR
|
||
X-LOTUS-CHARSET:UTF-8
|
||
VERSION:2.0
|
||
PRODID:http://www.bahn.de
|
||
METHOD:PUBLISH
|
||
BEGIN:VTIMEZONE
|
||
TZID:Europe/Berlin
|
||
X-LIC-LOCATION:Europe/Berlin
|
||
BEGIN:DAYLIGHT
|
||
TZOFFSETFROM:+0100
|
||
TZOFFSETTO:+0200
|
||
TZNAME:CEST
|
||
DTSTART:19700329T020000
|
||
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
|
||
END:DAYLIGHT
|
||
BEGIN:STANDARD
|
||
TZOFFSETFROM:+0200
|
||
TZOFFSETTO:+0100
|
||
TZNAME:CET
|
||
DTSTART:19701025T030000
|
||
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
|
||
END:STANDARD
|
||
END:VTIMEZONE
|
||
BEGIN:VEVENT
|
||
UID:bahn2023-08-29141400
|
||
CLASS:PUBLIC
|
||
SUMMARY:Frankfurt(Main)Hbf -> Hamburg Hbf
|
||
DTSTART;TZID=Europe/Berlin:2023-08-29T141400
|
||
DTEND;TZID=Europe/Berlin:2023-08-29T183600
|
||
DTSTAMP:2023-07-30T194700Z
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"))
|
||
;; default parser should skip the invalid DTSTART, DTEND, and DTSTAMP values:
|
||
(let ((ical:pre-parsing-hook nil))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(let ((vcal (ical:parse)))
|
||
;; Parsing should produce errors as the bad properties are
|
||
;; skipped:
|
||
(should (ical:errors-p))
|
||
;; The resulting calendar is invalid because the VEVENT
|
||
;; contains no DTSTAMP:
|
||
(should-error (ical:ast-node-valid-p vcal t)))))
|
||
;; cleaning up the hyphenated dates before parsing should correct
|
||
;; these problems:
|
||
(let ((ical:pre-parsing-hook '(ical:fix-hyphenated-dates)))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(let ((vcal (ical:parse))
|
||
(expected-dtstamp
|
||
(ical:make-date-time :year 2023 :month 7 :day 30
|
||
:hour 19 :minute 47 :second 0
|
||
:zone 0)))
|
||
(should (not (ical:errors-p)))
|
||
(should (ical:ast-node-valid-p vcal t))
|
||
(ical:with-component vcal
|
||
((ical:vevent vevent))
|
||
(ical:with-component vevent
|
||
((ical:dtstamp :value dtstamp))
|
||
(should (equal dtstamp expected-dtstamp)))))))))
|
||
|
||
(ert-deftest ipt:bad-user-addresses ()
|
||
"Real example: bad calendar user addresses missing \"mailto:\", fixed by
|
||
`icalendar-fix-missing-mailtos'."
|
||
(let ((bad "BEGIN:VCALENDAR
|
||
VERSION:2.0
|
||
PRODID:missing
|
||
CALSCALE:GREGORIAN
|
||
METHOD:REQUEST
|
||
BEGIN:VEVENT
|
||
UID:45dd7698-5c53-47e3-9280-19c5dff62571
|
||
PRIORITY:1
|
||
DTSTART:20210721T175200
|
||
DTEND:20210721T192400
|
||
LOCATION:Verona Porta Nuova
|
||
SUMMARY:Trip Verona Porta Nuova-Firenze S. M. Novella
|
||
ORGANIZER;SENT-BY=\"other@domain.example\":anonymized@domain.example
|
||
ATTENDEE;ROLE=REQ-PARTICIPANT;CN=TRAVELER:traveler@domain.example
|
||
END:VEVENT
|
||
END:VCALENDAR
|
||
"))
|
||
(let ((ical:pre-parsing-hook nil))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(ical:parse)
|
||
;; Parsing should produce errors as the bad properties are
|
||
;; skipped:
|
||
(should (ical:errors-p))))
|
||
;; cleaning up the addresses before parsing should correct
|
||
;; these problems:
|
||
(let ((ical:pre-parsing-hook '(ical:fix-missing-mailtos)))
|
||
(with-temp-buffer
|
||
(ical:init-error-buffer)
|
||
(insert bad)
|
||
(goto-char (point-min))
|
||
(let ((vcal (ical:parse))
|
||
(expected-attendee "mailto:traveler@domain.example")
|
||
(expected-organizer "mailto:anonymized@domain.example")
|
||
(expected-sender "mailto:other@domain.example"))
|
||
(should (not (ical:errors-p)))
|
||
(ical:with-component vcal
|
||
((ical:vevent vevent))
|
||
(ical:with-component vevent
|
||
((ical:attendee :value attendee)
|
||
(ical:organizer :value organizer))
|
||
(should (equal attendee expected-attendee))
|
||
(should (equal organizer expected-organizer))
|
||
(ical:with-property organizer
|
||
((ical:sentbyparam :value sent-by))
|
||
(should (equal sent-by expected-sender))))))))))
|
||
|
||
|
||
|
||
|
||
;; Local Variables:
|
||
;; read-symbol-shorthands: (("ipt:" . "icalendar-parser-test-") ("ical:" . "icalendar-"))
|
||
;; End:
|
||
;;; icalendar-parser-tests.el ends here
|