1 ;; icalendar-tests.el --- Test suite for icalendar.el
3 ;; Copyright (C) 2005, 2008-2012 Free Software Foundation, Inc.
5 ;; Author: Ulf Jasper <ulf.jasper@web.de>
8 ;; Human-Keywords: calendar, diary, iCalendar, vCalendar
10 ;; This file is part of GNU Emacs.
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation, either version 3 of the License, or
15 ;; (at your option) any later version.
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
28 ;; - Add more unit tests for functions, timezone etc.
30 ;; Note: Watch the trailing blank that is added on import.
37 ;; ======================================================================
39 ;; ======================================================================
41 (defun icalendar-tests--get-ical-event (ical-string)
42 "Return iCalendar event for ICAL-STRING."
46 (goto-char (point-min))
47 (car (icalendar--read-element nil nil)))))
49 (defun icalendar-tests--trim (string)
50 "Remove leading and trailing whitespace from STRING."
51 (replace-regexp-in-string "[ \t\n]+\\'" ""
52 (replace-regexp-in-string "\\`[ \t\n]+" "" string)))
54 ;; ======================================================================
56 ;; ======================================================================
58 (ert-deftest icalendar--create-uid ()
59 "Test for `icalendar--create-uid'."
60 (let* ((icalendar-uid-format "xxx-%t-%c-%h-%u-%s")
62 (icalendar--uid-count 77)
63 (entry-full "30.06.1964 07:01 blahblah")
64 (hash (format "%d" (abs (sxhash entry-full))))
65 (contents "DTSTART:19640630T070100\nblahblah")
66 (username (or user-login-name "UNKNOWN_USER"))
68 (fset 't-ct (symbol-function 'current-time))
71 (fset 'current-time (lambda () '(1 2 3)))
72 (should (= 77 icalendar--uid-count))
73 (should (string= (concat "xxx-123-77-" hash "-" username "-19640630")
74 (icalendar--create-uid entry-full contents)))
75 (should (= 78 icalendar--uid-count)))
76 ;; restore 'current-time
77 (fset 'current-time (symbol-function 't-ct)))
78 (setq contents "blahblah")
79 (setq icalendar-uid-format "yyy%syyy")
80 (should (string= (concat "yyyDTSTARTyyy")
81 (icalendar--create-uid entry-full contents)))))
83 (ert-deftest icalendar--calendar-style ()
84 "Test for `icalendar--date-style'."
85 (dolist (calendar-date-style '(iso american european))
86 (should (eq (icalendar--date-style) calendar-date-style)))
87 (let ((cds calendar-date-style)
88 (european-calendar-style t))
89 (makunbound 'calendar-date-style)
90 (should (eq (icalendar--date-style) 'european))
91 (with-no-warnings (setq european-calendar-style nil)) ;still get warning!?! FIXME
92 (should (eq (icalendar--date-style) 'american))
93 (setq calendar-date-style cds)))
95 (ert-deftest icalendar-convert-anniversary-to-ical ()
96 "Test method for `icalendar--convert-anniversary-to-ical'."
97 (let* ((calendar-date-style 'iso)
99 (setq result (icalendar--convert-anniversary-to-ical
100 "" "%%(diary-anniversary 1964 6 30) g"))
101 (should (= 2 (length result)))
102 (should (string= (concat
103 "\nDTSTART;VALUE=DATE:19640630"
104 "\nDTEND;VALUE=DATE:19640701"
105 "\nRRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=30")
107 (should (string= "g" (cadr result)))))
109 (ert-deftest icalendar--convert-cyclic-to-ical ()
110 "Test method for `icalendar--convert-cyclic-to-ical'."
111 (let* ((calendar-date-style 'iso)
113 (setq result (icalendar--convert-block-to-ical
114 "" "%%(diary-block 2004 7 19 2004 8 27) Sommerferien"))
115 (should (= 2 (length result)))
116 (should (string= (concat
117 "\nDTSTART;VALUE=DATE:20040719"
118 "\nDTEND;VALUE=DATE:20040828")
120 (should (string= "Sommerferien" (cadr result)))))
122 (ert-deftest icalendar--convert-block-to-ical ()
123 "Test method for `icalendar--convert-block-to-ical'."
124 (let* ((calendar-date-style 'iso)
126 (setq result (icalendar--convert-block-to-ical
127 "" "%%(diary-block 2004 7 19 2004 8 27) Sommerferien"))
128 (should (= 2 (length result)))
129 (should (string= (concat
130 "\nDTSTART;VALUE=DATE:20040719"
131 "\nDTEND;VALUE=DATE:20040828")
133 (should (string= "Sommerferien" (cadr result)))))
135 (ert-deftest icalendar--convert-yearly-to-ical ()
136 "Test method for `icalendar--convert-yearly-to-ical'."
137 (let* ((calendar-date-style 'iso)
139 (calendar-month-name-array
140 ["January" "February" "March" "April" "May" "June" "July" "August"
141 "September" "October" "November" "December"]))
142 (setq result (icalendar--convert-yearly-to-ical "" "May 1 Tag der Arbeit"))
143 (should (= 2 (length result)))
144 (should (string= (concat
145 "\nDTSTART;VALUE=DATE:19000501"
146 "\nDTEND;VALUE=DATE:19000502"
147 "\nRRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYMONTHDAY=1")
149 (should (string= "Tag der Arbeit" (cadr result)))))
151 (ert-deftest icalendar--convert-weekly-to-ical ()
152 "Test method for `icalendar--convert-weekly-to-ical'."
153 (let* ((calendar-date-style 'iso)
155 (calendar-day-name-array
156 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
158 (setq result (icalendar--convert-weekly-to-ical "" "Monday 8:30 subject"))
159 (should (= 2 (length result)))
160 (should (string= (concat "\nDTSTART;VALUE=DATE-TIME:20050103T083000"
161 "\nDTEND;VALUE=DATE-TIME:20050103T093000"
162 "\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO")
164 (should (string= "subject" (cadr result)))))
166 (ert-deftest icalendar--parse-vtimezone ()
167 "Test method for `icalendar--parse-vtimezone'."
168 (let (vtimezone result)
169 (setq vtimezone (icalendar-tests--get-ical-event "BEGIN:VTIMEZONE
172 DTSTART:16010101T040000
175 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
178 DTSTART:16010101T030000
181 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
185 (setq result (icalendar--parse-vtimezone vtimezone))
186 (should (string= "thename" (car result)))
187 (message (cdr result))
188 (should (string= "STD-02:00DST-03:00,M3.5.0/03:00:00,M10.5.0/04:00:00"
190 (setq vtimezone (icalendar-tests--get-ical-event "BEGIN:VTIMEZONE
193 DTSTART:16010101T040000
196 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=10
199 DTSTART:16010101T030000
202 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=3
206 (setq result (icalendar--parse-vtimezone vtimezone))
207 (should (string= "anothername" (car result)))
208 (message (cdr result))
209 (should (string= "STD-02:00DST-03:00,M3.2.1/03:00:00,M10.2.1/04:00:00"
212 (ert-deftest icalendar--convert-ordinary-to-ical ()
213 "Test method for `icalendar--convert-ordinary-to-ical'."
214 (let* ((calendar-date-style 'iso)
217 (setq result (icalendar--convert-ordinary-to-ical "&?" "2010 2 15 subject"))
218 (should (= 2 (length result)))
219 (should (string= "\nDTSTART;VALUE=DATE:20100215\nDTEND;VALUE=DATE:20100216"
221 (should (string= "subject" (cadr result)))
224 (setq result (icalendar--convert-ordinary-to-ical
225 "&?" "&2010 2 15 12:34-23:45 s"))
226 (should (= 2 (length result)))
227 (should (string= (concat "\nDTSTART;VALUE=DATE-TIME:20100215T123400"
228 "\nDTEND;VALUE=DATE-TIME:20100215T234500")
230 (should (string= "s" (cadr result)))
232 ;; with time, again -- test bug#5549
233 (setq result (icalendar--convert-ordinary-to-ical
234 "x?" "x2010 2 15 0:34-1:45 s"))
235 (should (= 2 (length result)))
236 (should (string= (concat "\nDTSTART;VALUE=DATE-TIME:20100215T003400"
237 "\nDTEND;VALUE=DATE-TIME:20100215T014500")
239 (should (string= "s" (cadr result)))))
241 (ert-deftest icalendar--diarytime-to-isotime ()
242 "Test method for `icalendar--diarytime-to-isotime'."
243 (should (string= "T011500"
244 (icalendar--diarytime-to-isotime "01:15" "")))
245 (should (string= "T011500"
246 (icalendar--diarytime-to-isotime "1:15" "")))
247 (should (string= "T000100"
248 (icalendar--diarytime-to-isotime "0:01" "")))
249 (should (string= "T010000"
250 (icalendar--diarytime-to-isotime "0100" "")))
251 (should (string= "T010000"
252 (icalendar--diarytime-to-isotime "0100" "am")))
253 (should (string= "T130000"
254 (icalendar--diarytime-to-isotime "0100" "pm")))
255 (should (string= "T120000"
256 (icalendar--diarytime-to-isotime "1200" "")))
257 (should (string= "T171700"
258 (icalendar--diarytime-to-isotime "17:17" "")))
259 (should (string= "T000000"
260 (icalendar--diarytime-to-isotime "1200" "am")))
261 (should (string= "T000100"
262 (icalendar--diarytime-to-isotime "1201" "am")))
263 (should (string= "T005900"
264 (icalendar--diarytime-to-isotime "1259" "am")))
265 (should (string= "T120000"
266 (icalendar--diarytime-to-isotime "1200" "pm")))
267 (should (string= "T120100"
268 (icalendar--diarytime-to-isotime "1201" "pm")))
269 (should (string= "T125900"
270 (icalendar--diarytime-to-isotime "1259" "pm"))))
272 (ert-deftest icalendar--datetime-to-diary-date ()
273 "Test method for `icalendar--datetime-to-diary-date'."
274 (let* ((datetime '(59 59 23 31 12 2008))
275 (calendar-date-style 'iso))
276 (should (string= "2008 12 31"
277 (icalendar--datetime-to-diary-date datetime)))
278 (setq calendar-date-style 'european)
279 (should (string= "31 12 2008"
280 (icalendar--datetime-to-diary-date datetime)))
281 (setq calendar-date-style 'american)
282 (should (string= "12 31 2008"
283 (icalendar--datetime-to-diary-date datetime)))))
285 (ert-deftest icalendar--datestring-to-isodate ()
286 "Test method for `icalendar--datestring-to-isodate'."
287 (let ((calendar-date-style 'iso))
289 (should (string= "20080511"
290 (icalendar--datestring-to-isodate "2008 05 11")))
291 (should (string= "20080531"
292 (icalendar--datestring-to-isodate "2008 05 31")))
293 (should (string= "20080602"
294 (icalendar--datestring-to-isodate "2008 05 31" 2)))
297 (setq calendar-date-style 'european)
298 (should (string= "20080511"
299 (icalendar--datestring-to-isodate "11 05 2008")))
300 (should (string= "20080531"
301 (icalendar--datestring-to-isodate "31 05 2008")))
302 (should (string= "20080602"
303 (icalendar--datestring-to-isodate "31 05 2008" 2)))
306 (setq calendar-date-style 'american)
307 (should (string= "20081105"
308 (icalendar--datestring-to-isodate "11 05 2008")))
309 (should (string= "20081230"
310 (icalendar--datestring-to-isodate "12 30 2008")))
311 (should (string= "20090101"
312 (icalendar--datestring-to-isodate "12 30 2008" 2)))
315 (setq calendar-date-style nil) ;not necessary for conversion
316 (should (string= "20081105"
317 (icalendar--datestring-to-isodate "Nov 05 2008")))
318 (should (string= "20081105"
319 (icalendar--datestring-to-isodate "05 Nov 2008")))
320 (should (string= "20081105"
321 (icalendar--datestring-to-isodate "2008 Nov 05")))))
323 (ert-deftest icalendar--first-weekday-of-year ()
324 "Test method for `icalendar-first-weekday-of-year'."
325 (should (eq 1 (icalendar-first-weekday-of-year "TU" 2008)))
326 (should (eq 3 (icalendar-first-weekday-of-year "WE" 2007)))
327 (should (eq 5 (icalendar-first-weekday-of-year "TH" 2006)))
328 (should (eq 7 (icalendar-first-weekday-of-year "FR" 2005)))
329 (should (eq 3 (icalendar-first-weekday-of-year "SA" 2004)))
330 (should (eq 5 (icalendar-first-weekday-of-year "SU" 2003)))
331 (should (eq 7 (icalendar-first-weekday-of-year "MO" 2002)))
332 (should (eq 3 (icalendar-first-weekday-of-year "MO" 2000)))
333 (should (eq 1 (icalendar-first-weekday-of-year "TH" 1970))))
335 (ert-deftest icalendar--import-format-sample ()
336 "Test method for `icalendar-import-format-sample'."
337 (should (string= (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
338 "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'")
339 (icalendar-import-format-sample
340 (icalendar-tests--get-ical-event "BEGIN:VEVENT
341 DTSTAMP:20030509T043439Z
342 DTSTART:20030509T103000
346 DTEND:20030509T153000
351 (ert-deftest icalendar--format-ical-event ()
352 "Test `icalendar--format-ical-event'."
353 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
354 (icalendar-import-format-summary "SUM %s")
355 (icalendar-import-format-location " LOC %s")
356 (icalendar-import-format-description " DES %s")
357 (icalendar-import-format-organizer " ORG %s")
358 (icalendar-import-format-status " STA %s")
359 (icalendar-import-format-url " URL %s")
360 (icalendar-import-format-class " CLA %s")
361 (event (icalendar-tests--get-ical-event "BEGIN:VEVENT
362 DTSTAMP:20030509T043439Z
363 DTSTART:20030509T103000
367 DTEND:20030509T153000
371 (should (string= "SUM sum DES des LOC loc ORG org"
372 (icalendar--format-ical-event event)))
373 (setq icalendar-import-format (lambda (&rest ignore)
375 (should (string= "helloworld" (icalendar--format-ical-event event)))
376 (setq icalendar-import-format
378 (format "-%s-%s-%s-%s-%s-%s-%s-"
379 (icalendar--get-event-property event 'SUMMARY)
380 (icalendar--get-event-property event 'DESCRIPTION)
381 (icalendar--get-event-property event 'LOCATION)
382 (icalendar--get-event-property event 'ORGANIZER)
383 (icalendar--get-event-property event 'STATUS)
384 (icalendar--get-event-property event 'URL)
385 (icalendar--get-event-property event 'CLASS))))
386 (should (string= "-sum-des-loc-org-nil-nil-nil-"
387 (icalendar--format-ical-event event)))))
389 (ert-deftest icalendar--parse-summary-and-rest ()
390 "Test `icalendar--parse-summary-and-rest'."
391 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
392 (icalendar-import-format-summary "SUM %s")
393 (icalendar-import-format-location " LOC %s")
394 (icalendar-import-format-description " DES %s")
395 (icalendar-import-format-organizer " ORG %s")
396 (icalendar-import-format-status " STA %s")
397 (icalendar-import-format-url " URL %s")
398 (icalendar-import-format-class " CLA %s")
400 (setq result (icalendar--parse-summary-and-rest "SUM sum ORG org"))
401 (should (string= "org" (cdr (assoc 'org result))))
403 (setq result (icalendar--parse-summary-and-rest
404 "SUM sum DES des LOC loc ORG org STA sta URL url CLA cla"))
405 (should (string= "des" (cdr (assoc 'des result))))
406 (should (string= "loc" (cdr (assoc 'loc result))))
407 (should (string= "org" (cdr (assoc 'org result))))
408 (should (string= "sta" (cdr (assoc 'sta result))))
409 (should (string= "cla" (cdr (assoc 'cla result))))
411 (setq icalendar-import-format (lambda () "Hello world"))
412 (setq result (icalendar--parse-summary-and-rest
414 (should (not result))
417 ;; ======================================================================
419 ;; ======================================================================
421 (defun icalendar-tests--test-export (input-iso input-european input-american
423 "Perform an export test.
424 Argument INPUT-ISO iso style diary string.
425 Argument INPUT-EUROPEAN european style diary string.
426 Argument INPUT-AMERICAN american style diary string.
427 Argument EXPECTED-OUTPUT expected iCalendar result string.
429 European style input data must use german month names. American
430 and ISO style input data must use english month names."
431 (let ((tz (cadr (current-time-zone)))
432 (calendar-date-style 'iso)
433 (icalendar-recurring-start-year 2000))
436 (set-time-zone-rule "CET")
438 (let ((calendar-month-name-array
439 ["January" "February" "March" "April" "May" "June" "July" "August"
440 "September" "October" "November" "December"])
441 (calendar-day-name-array
442 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
444 (setq calendar-date-style 'iso)
445 (icalendar-tests--do-test-export input-iso expected-output)))
447 (let ((calendar-month-name-array
448 ["Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August"
449 "September" "Oktober" "November" "Dezember"])
450 (calendar-day-name-array
451 ["Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag"
453 (setq calendar-date-style 'european)
454 (icalendar-tests--do-test-export input-european expected-output)))
456 (let ((calendar-month-name-array
457 ["January" "February" "March" "April" "May" "June" "July" "August"
458 "September" "October" "November" "December"])
459 (calendar-day-name-array
460 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
462 (setq calendar-date-style 'american)
463 (icalendar-tests--do-test-export input-american expected-output))))
464 ;; restore time-zone if something went terribly wrong
465 (set-time-zone-rule tz))))
467 (defun icalendar-tests--do-test-export (input expected-output)
468 "Actually perform export test.
469 Argument INPUT input diary string.
470 Argument EXPECTED-OUTPUT expected iCalendar result string."
471 (let ((temp-file (make-temp-file "icalendar-tests-ics")))
476 (icalendar-export-region (point-min) (point-max) temp-file))
478 (find-file temp-file)
479 (goto-char (point-min))
480 (cond (expected-output
481 (should (re-search-forward "^\\s-*BEGIN:VCALENDAR
482 PRODID:-//Emacs//NONSGML icalendar.el//EN
491 (should (string-match
493 (regexp-quote (buffer-substring-no-properties
494 (match-beginning 1) (match-end 1)))
498 (should (re-search-forward "^\\s-*BEGIN:VCALENDAR
499 PRODID:-//Emacs//NONSGML icalendar.el//EN
505 (kill-buffer (find-buffer-visiting temp-file))
506 (delete-file temp-file))))
508 (ert-deftest icalendar-export-ordinary-no-time ()
509 "Perform export test."
511 (let ((icalendar-export-hidden-diary-entries nil))
512 (icalendar-tests--test-export
513 "&2000 Oct 3 ordinary no time "
514 "&3 Okt 2000 ordinary no time "
515 "&Oct 3 2000 ordinary no time "
518 (icalendar-tests--test-export
519 "2000 Oct 3 ordinary no time "
520 "3 Okt 2000 ordinary no time "
521 "Oct 3 2000 ordinary no time "
522 "DTSTART;VALUE=DATE:20001003
523 DTEND;VALUE=DATE:20001004
524 SUMMARY:ordinary no time
527 (ert-deftest icalendar-export-ordinary ()
528 "Perform export test."
530 (icalendar-tests--test-export
531 "2000 Oct 3 16:30 ordinary with time"
532 "3 Okt 2000 16:30 ordinary with time"
533 "Oct 3 2000 16:30 ordinary with time"
534 "DTSTART;VALUE=DATE-TIME:20001003T163000
535 DTEND;VALUE=DATE-TIME:20001003T173000
536 SUMMARY:ordinary with time
538 (icalendar-tests--test-export
539 "2000 10 3 16:30 ordinary with time 2"
540 "3 10 2000 16:30 ordinary with time 2"
541 "10 3 2000 16:30 ordinary with time 2"
542 "DTSTART;VALUE=DATE-TIME:20001003T163000
543 DTEND;VALUE=DATE-TIME:20001003T173000
544 SUMMARY:ordinary with time 2
547 (icalendar-tests--test-export
548 "2000/10/3 16:30 ordinary with time 3"
549 "3/10/2000 16:30 ordinary with time 3"
550 "10/3/2000 16:30 ordinary with time 3"
551 "DTSTART;VALUE=DATE-TIME:20001003T163000
552 DTEND;VALUE=DATE-TIME:20001003T173000
553 SUMMARY:ordinary with time 3
556 (ert-deftest icalendar-export-multiline ()
557 "Perform export test."
559 ;; multiline -- FIXME!!!
560 (icalendar-tests--test-export
561 "2000 October 3 16:30 multiline
562 17:30 multiline continued FIXME"
563 "3 Oktober 2000 16:30 multiline
564 17:30 multiline continued FIXME"
565 "October 3 2000 16:30 multiline
566 17:30 multiline continued FIXME"
567 "DTSTART;VALUE=DATE-TIME:20001003T163000
568 DTEND;VALUE=DATE-TIME:20001003T173000
571 17:30 multiline continued FIXME
574 (ert-deftest icalendar-export-weekly-by-day ()
575 "Perform export test."
578 (icalendar-tests--test-export
579 "Monday 1:30pm weekly by day with start time"
580 "Montag 13:30 weekly by day with start time"
581 "Monday 1:30pm weekly by day with start time"
582 "DTSTART;VALUE=DATE-TIME:20000103T133000
583 DTEND;VALUE=DATE-TIME:20000103T143000
584 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
585 SUMMARY:weekly by day with start time
588 (icalendar-tests--test-export
589 "Monday 13:30-15:00 weekly by day with start and end time"
590 "Montag 13:30-15:00 weekly by day with start and end time"
591 "Monday 01:30pm-03:00pm weekly by day with start and end time"
592 "DTSTART;VALUE=DATE-TIME:20000103T133000
593 DTEND;VALUE=DATE-TIME:20000103T150000
594 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
595 SUMMARY:weekly by day with start and end time
598 (ert-deftest icalendar-export-yearly ()
599 "Perform export test."
601 (icalendar-tests--test-export
602 "may 1 yearly no time"
603 "1 Mai yearly no time"
604 "may 1 yearly no time"
605 "DTSTART;VALUE=DATE:19000501
606 DTEND;VALUE=DATE:19000502
607 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYMONTHDAY=1
608 SUMMARY:yearly no time
611 (ert-deftest icalendar-export-anniversary ()
612 "Perform export test."
614 (icalendar-tests--test-export
615 "%%(diary-anniversary 1989 10 3) anniversary no time"
616 "%%(diary-anniversary 3 10 1989) anniversary no time"
617 "%%(diary-anniversary 10 3 1989) anniversary no time"
618 "DTSTART;VALUE=DATE:19891003
619 DTEND;VALUE=DATE:19891004
620 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYMONTHDAY=03
621 SUMMARY:anniversary no time
623 (icalendar-tests--test-export
624 "%%(diary-anniversary 1989 10 3) 19:00-20:00 anniversary with time"
625 "%%(diary-anniversary 3 10 1989) 19:00-20:00 anniversary with time"
626 "%%(diary-anniversary 10 3 1989) 19:00-20:00 anniversary with time"
627 "DTSTART;VALUE=DATE-TIME:19891003T190000
628 DTEND;VALUE=DATE-TIME:19891004T200000
629 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYMONTHDAY=03
630 SUMMARY:anniversary with time
633 (ert-deftest icalendar-export-block ()
634 "Perform export test."
636 (icalendar-tests--test-export
637 "%%(diary-block 2001 6 18 2001 7 6) block no time"
638 "%%(diary-block 18 6 2001 6 7 2001) block no time"
639 "%%(diary-block 6 18 2001 7 6 2001) block no time"
640 "DTSTART;VALUE=DATE:20010618
641 DTEND;VALUE=DATE:20010707
642 SUMMARY:block no time
644 (icalendar-tests--test-export
645 "%%(diary-block 2001 6 18 2001 7 6) 13:00-17:00 block with time"
646 "%%(diary-block 18 6 2001 6 7 2001) 13:00-17:00 block with time"
647 "%%(diary-block 6 18 2001 7 6 2001) 13:00-17:00 block with time"
648 "DTSTART;VALUE=DATE-TIME:20010618T130000
649 DTEND;VALUE=DATE-TIME:20010618T170000
650 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
651 SUMMARY:block with time
653 (icalendar-tests--test-export
654 "%%(diary-block 2001 6 18 2001 7 6) 13:00 block no end time"
655 "%%(diary-block 18 6 2001 6 7 2001) 13:00 block no end time"
656 "%%(diary-block 6 18 2001 7 6 2001) 13:00 block no end time"
657 "DTSTART;VALUE=DATE-TIME:20010618T130000
658 DTEND;VALUE=DATE-TIME:20010618T140000
659 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
660 SUMMARY:block no end time
663 ;; ======================================================================
665 ;; ======================================================================
667 (defun icalendar-tests--test-import (input expected-iso expected-european
669 "Perform import test.
670 Argument INPUT icalendar event string.
671 Argument EXPECTED-ISO expected iso style diary string.
672 Argument EXPECTED-EUROPEAN expected european style diary string.
673 Argument EXPECTED-AMERICAN expected american style diary string."
674 (let ((timezone (cadr (current-time-zone))))
675 (set-time-zone-rule "CET")
677 (if (string-match "^BEGIN:VCALENDAR" input)
679 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
680 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
682 (unless (eq (char-before) ?\n)
684 (insert "END:VEVENT\nEND:VCALENDAR\n"))
685 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
686 (icalendar-import-format-summary "%s")
687 (icalendar-import-format-location "\n Location: %s")
688 (icalendar-import-format-description "\n Desc: %s")
689 (icalendar-import-format-organizer "\n Organizer: %s")
690 (icalendar-import-format-status "\n Status: %s")
691 (icalendar-import-format-url "\n URL: %s")
692 (icalendar-import-format-class "\n Class: %s")
695 (setq calendar-date-style 'iso)
696 (icalendar-tests--do-test-import input expected-iso))
697 (when expected-european
698 (setq calendar-date-style 'european)
699 (icalendar-tests--do-test-import input expected-european))
700 (when expected-american
701 (setq calendar-date-style 'american)
702 (icalendar-tests--do-test-import input expected-american))))
703 (set-time-zone-rule timezone)))
705 (defun icalendar-tests--do-test-import (input expected-output)
706 "Actually perform import test.
707 Argument INPUT input icalendar string.
708 Argument EXPECTED-OUTPUT expected diary string."
709 (let ((temp-file (make-temp-file "icalendar-test-diary")))
710 (icalendar-import-buffer temp-file t t)
712 (find-file temp-file)
713 (let ((result (buffer-substring-no-properties (point-min) (point-max))))
714 (should (string= expected-output result)))
715 (kill-buffer (find-buffer-visiting temp-file))
716 (delete-file temp-file))))
718 (ert-deftest icalendar-import-non-recurring ()
719 "Perform standard import tests."
720 (icalendar-tests--test-import
721 "SUMMARY:non-recurring
722 DTSTART;VALUE=DATE-TIME:20030919T090000
723 DTEND;VALUE=DATE-TIME:20030919T113000"
724 "&2003/9/19 09:00-11:30 non-recurring\n"
725 "&19/9/2003 09:00-11:30 non-recurring\n"
726 "&9/19/2003 09:00-11:30 non-recurring\n")
727 (icalendar-tests--test-import
728 "SUMMARY:non-recurring allday
729 DTSTART;VALUE=DATE-TIME:20030919"
730 "&2003/9/19 non-recurring allday\n"
731 "&19/9/2003 non-recurring allday\n"
732 "&9/19/2003 non-recurring allday\n")
733 (icalendar-tests--test-import
734 ;; Checkdoc removes trailing blanks. Therefore: format!
735 (format "%s\n%s\n%s" "SUMMARY:long " " summary"
736 "DTSTART;VALUE=DATE:20030919")
737 "&2003/9/19 long summary\n"
738 "&19/9/2003 long summary\n"
739 "&9/19/2003 long summary\n")
740 (icalendar-tests--test-import
741 "UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
745 X-MOZILLA-ALARM-DEFAULT-UNITS:Minuten
746 X-MOZILLA-RECUR-DEFAULT-INTERVAL:0
747 DTSTART;VALUE=DATE:20040719
748 DTEND;VALUE=DATE:20040828
749 DTSTAMP:20031103T011641Z
751 "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
755 "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
759 "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
763 (icalendar-tests--test-import
765 :04979712-3902-11d9-93dd-8f9f4afe08da
772 X-MOZILLA-ALARM-DEFAULT-LENGTH
783 "&2004/11/23 14:00-14:30 folded summary
786 "&23/11/2004 14:00-14:30 folded summary
789 "&11/23/2004 14:00-14:30 folded summary
793 (icalendar-tests--test-import
795 :6161a312-3902-11d9-b512-f764153bb28b
802 X-MOZILLA-ALARM-DEFAULT-LENGTH
811 "&2004/11/23 14:45-15:45 another example
814 "&23/11/2004 14:45-15:45 another example
817 "&11/23/2004 14:45-15:45 another example
821 (ert-deftest icalendar-import-rrule ()
822 (icalendar-tests--test-import
824 DTSTART;VALUE=DATE-TIME:20030919T090000
825 DTEND;VALUE=DATE-TIME:20030919T113000
828 "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
829 "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
830 "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
832 (icalendar-tests--test-import
834 DTSTART;VALUE=DATE-TIME:20030919T090000
835 DTEND;VALUE=DATE-TIME:20030919T113000
836 RRULE:FREQ=DAILY;INTERVAL=2
838 "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
839 "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
840 "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
841 (icalendar-tests--test-import
842 "SUMMARY:rrule daily with exceptions
843 DTSTART;VALUE=DATE-TIME:20030919T090000
844 DTEND;VALUE=DATE-TIME:20030919T113000
845 RRULE:FREQ=DAILY;INTERVAL=2
846 EXDATE:20030921,20030925
848 "&%%(and (not (diary-date 2003 9 25)) (not (diary-date 2003 9 21)) (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily with exceptions\n"
849 "&%%(and (not (diary-date 25 9 2003)) (not (diary-date 21 9 2003)) (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily with exceptions\n"
850 "&%%(and (not (diary-date 9 25 2003)) (not (diary-date 9 21 2003)) (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily with exceptions\n")
851 (icalendar-tests--test-import
852 "SUMMARY:rrule weekly
853 DTSTART;VALUE=DATE-TIME:20030919T090000
854 DTEND;VALUE=DATE-TIME:20030919T113000
857 "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
858 "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
859 "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
860 (icalendar-tests--test-import
861 "SUMMARY:rrule monthly no end
862 DTSTART;VALUE=DATE-TIME:20030919T090000
863 DTEND;VALUE=DATE-TIME:20030919T113000
866 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
867 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
868 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
869 (icalendar-tests--test-import
870 "SUMMARY:rrule monthly with end
871 DTSTART;VALUE=DATE-TIME:20030919T090000
872 DTEND;VALUE=DATE-TIME:20030919T113000
873 RRULE:FREQ=MONTHLY;UNTIL=20050819;
875 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
876 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
877 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
878 (icalendar-tests--test-import
879 "DTSTART;VALUE=DATE:20040815
880 DTEND;VALUE=DATE:20040816
881 SUMMARY:Maria Himmelfahrt
882 UID:CC56BEA6-49D2-11D8-8833-00039386D1C2-RID
883 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
885 "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
886 "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
887 "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
888 (icalendar-tests--test-import
889 "SUMMARY:rrule yearly
890 DTSTART;VALUE=DATE-TIME:20030919T090000
891 DTEND;VALUE=DATE-TIME:20030919T113000
892 RRULE:FREQ=YEARLY;INTERVAL=2
894 "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
895 "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
896 "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
897 (icalendar-tests--test-import
898 "SUMMARY:rrule count daily short
899 DTSTART;VALUE=DATE-TIME:20030919T090000
900 DTEND;VALUE=DATE-TIME:20030919T113000
901 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
903 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
904 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
905 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
906 (icalendar-tests--test-import
907 "SUMMARY:rrule count daily long
908 DTSTART;VALUE=DATE-TIME:20030919T090000
909 DTEND;VALUE=DATE-TIME:20030919T113000
910 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
912 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
913 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
914 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
915 (icalendar-tests--test-import
916 "SUMMARY:rrule count bi-weekly 3 times
917 DTSTART;VALUE=DATE-TIME:20030919T090000
918 DTEND;VALUE=DATE-TIME:20030919T113000
919 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
921 "&%%(and (diary-cyclic 14 2003 9 19) (diary-block 2003 9 19 2003 10 31)) 09:00-11:30 rrule count bi-weekly 3 times\n"
922 "&%%(and (diary-cyclic 14 19 9 2003) (diary-block 19 9 2003 31 10 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n"
923 "&%%(and (diary-cyclic 14 9 19 2003) (diary-block 9 19 2003 10 31 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n")
924 (icalendar-tests--test-import
925 "SUMMARY:rrule count monthly
926 DTSTART;VALUE=DATE-TIME:20030919T090000
927 DTEND;VALUE=DATE-TIME:20030919T113000
928 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
930 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
931 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
932 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
933 (icalendar-tests--test-import
934 "SUMMARY:rrule count every second month
935 DTSTART;VALUE=DATE-TIME:20030919T090000
936 DTEND;VALUE=DATE-TIME:20030919T113000
937 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
939 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 5 19)) 09:00-11:30 rrule count every second month\n" ;FIXME
940 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 5 2004)) 09:00-11:30 rrule count every second month\n" ;FIXME
941 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 5 19 2004)) 09:00-11:30 rrule count every second month\n") ;FIXME
942 (icalendar-tests--test-import
943 "SUMMARY:rrule count yearly
944 DTSTART;VALUE=DATE-TIME:20030919T090000
945 DTEND;VALUE=DATE-TIME:20030919T113000
946 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
948 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
949 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
950 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
951 (icalendar-tests--test-import
952 "SUMMARY:rrule count every second year
953 DTSTART;VALUE=DATE-TIME:20030919T090000
954 DTEND;VALUE=DATE-TIME:20030919T113000
955 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
957 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2011 9 19)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
958 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2011)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
959 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2011)) 09:00-11:30 rrule count every second year\n") ;FIXME!!!
962 (ert-deftest icalendar-import-duration ()
964 (icalendar-tests--test-import
965 "DTSTART;VALUE=DATE:20050217
969 "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
970 "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
971 "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
972 (icalendar-tests--test-import
973 "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
974 DTSTAMP:20041127T183315Z
975 LAST-MODIFIED:20041127T183329
977 DTSTART;VALUE=DATE:20011221
978 DTEND;VALUE=DATE:20011221
979 RRULE:FREQ=DAILY;UNTIL=20011229;INTERVAL=1;WKST=SU
982 CREATED:20041127T183329
984 "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
986 "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
988 "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
991 (ert-deftest icalendar-import-bug-6766 ()
992 ;;bug#6766 -- multiple byday values in a weekly rrule
993 (icalendar-tests--test-import
995 DTEND;TZID=America/New_York:20100421T120000
996 DTSTAMP:20100525T141214Z
997 DTSTART;TZID=America/New_York:20100421T113000
998 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,TH,FR
1003 UID:8814e3f9-7482-408f-996c-3bfe486a1262
1007 DTSTAMP:20100525T141214Z
1008 DTSTART;VALUE=DATE:20100422
1009 DTEND;VALUE=DATE:20100423
1010 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
1012 SUMMARY:Tues + Thurs thinking
1014 UID:8814e3f9-7482-408f-996c-3bfe486a1263
1016 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
1019 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
1022 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
1025 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
1028 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
1031 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
1035 (ert-deftest icalendar-import-multiple-vcalendars ()
1036 (icalendar-tests--test-import
1037 "DTSTART;VALUE=DATE:20110723
1040 "&2011/7/23 event-1\n"
1041 "&23/7/2011 event-1\n"
1042 "&7/23/2011 event-1\n")
1044 (icalendar-tests--test-import
1046 PRODID:-//Emacs//NONSGML icalendar.el//EN
1047 VERSION:2.0\nBEGIN:VEVENT
1048 DTSTART;VALUE=DATE:20110723
1053 PRODID:-//Emacs//NONSGML icalendar.el//EN
1056 DTSTART;VALUE=DATE:20110724
1061 PRODID:-//Emacs//NONSGML icalendar.el//EN
1064 DTSTART;VALUE=DATE:20110725
1068 DTSTART;VALUE=DATE:20110725
1073 "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
1074 "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
1075 "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
1077 ;; ======================================================================
1079 ;; ======================================================================
1080 (defun icalendar-tests--test-cycle (input)
1081 "Perform cycle test.
1082 Argument INPUT icalendar event string."
1084 (if (string-match "^BEGIN:VCALENDAR" input)
1086 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
1087 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
1089 (unless (eq (char-before) ?\n)
1091 (insert "END:VEVENT\nEND:VCALENDAR\n"))
1092 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
1093 (icalendar-import-format-summary "%s")
1094 (icalendar-import-format-location "\n Location: %s")
1095 (icalendar-import-format-description "\n Desc: %s")
1096 (icalendar-import-format-organizer "\n Organizer: %s")
1097 (icalendar-import-format-status "\n Status: %s")
1098 (icalendar-import-format-url "\n URL: %s")
1099 (icalendar-import-format-class "\n Class: %s"))
1100 (dolist (calendar-date-style '(iso european american))
1101 (icalendar-tests--do-test-cycle)))))
1103 (defun icalendar-tests--do-test-cycle ()
1104 "Actually perform import/export cycle test."
1105 (let ((temp-diary (make-temp-file "icalendar-test-diary"))
1106 (temp-ics (make-temp-file "icalendar-test-ics"))
1107 (org-input (buffer-substring-no-properties (point-min) (point-max))))
1112 (icalendar-import-buffer temp-diary t t)
1114 ;; step 2: export what was just imported
1116 (find-file temp-diary)
1117 (icalendar-export-region (point-min) (point-max) temp-ics))
1119 ;; compare the output of step 2 with the input of step 1
1121 (find-file temp-ics)
1122 (goto-char (point-min))
1123 (when (re-search-forward "\nUID:.*\n" nil t)
1124 (replace-match "\n"))
1125 (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
1126 (should (string= org-input cycled)))))
1128 (kill-buffer (find-buffer-visiting temp-diary))
1130 (set-buffer (find-buffer-visiting temp-ics))
1131 (set-buffer-modified-p nil)
1132 (kill-buffer (current-buffer)))
1133 (delete-file temp-diary)
1134 (delete-file temp-ics))))
1136 (ert-deftest icalendar-cycle ()
1137 "Perform cycling tests."
1138 (icalendar-tests--test-cycle
1139 "DTSTART;VALUE=DATE-TIME:20030919T090000
1140 DTEND;VALUE=DATE-TIME:20030919T113000
1143 (icalendar-tests--test-cycle
1144 "DTSTART;VALUE=DATE-TIME:20030919T090000
1145 DTEND;VALUE=DATE-TIME:20030919T113000
1147 DESCRIPTION:beschreibung!
1151 (icalendar-tests--test-cycle
1152 "DTSTART;VALUE=DATE:19190909
1153 DTEND;VALUE=DATE:19190910
1154 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
1155 SUMMARY:and diary-anniversary
1158 ;; ======================================================================
1160 ;; ======================================================================
1161 (ert-deftest icalendar-real-world ()
1162 "Perform real-world tests, as gathered from problem reports."
1164 (icalendar-tests--test-import
1167 PRODID:Microsoft CDO for Microsoft Exchange
1170 TZID:Kolkata\, Chennai\, Mumbai\, New Delhi
1171 X-MICROSOFT-CDO-TZID:23
1173 DTSTART:16010101T000000
1178 DTSTART:16010101T000000
1184 DTSTAMP:20030509T043439Z
1185 DTSTART;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T103000
1186 SUMMARY:On-Site Interview
1187 UID:040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000
1188 010000000DB823520692542408ED02D7023F9DFF9
1189 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Xxxxx
1190 xxx Xxxxxxxxxxxx\":MAILTO:xxxxxxxx@xxxxxxx.com
1191 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Yyyyyyy Y
1192 yyyy\":MAILTO:yyyyyyy@yyyyyyy.com
1193 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Zzzz Zzzz
1194 zz\":MAILTO:zzzzzz@zzzzzzz.com
1195 ORGANIZER;CN=\"Aaaaaa Aaaaa\":MAILTO:aaaaaaa@aaaaaaa.com
1197 DTEND;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T153000
1198 DESCRIPTION:10:30am - Blah
1202 CREATED:20030509T043439Z
1203 LAST-MODIFIED:20030509T043459Z
1206 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1207 X-MICROSOFT-CDO-INSTTYPE:0
1208 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1209 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1210 X-MICROSOFT-CDO-IMPORTANCE:1
1211 X-MICROSOFT-CDO-OWNERAPPTID:126441427
1214 DESCRIPTION:REMINDER
1215 TRIGGER;RELATED=START:-PT00H15M00S
1220 "&9/5/2003 10:30-15:30 On-Site Interview
1221 Desc: 10:30am - Blah
1223 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1226 "&5/9/2003 10:30-15:30 On-Site Interview
1227 Desc: 10:30am - Blah
1229 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1234 (icalendar-tests--test-import
1235 "DTSTAMP:20030618T195512Z
1236 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T110000
1237 SUMMARY:Dress Rehearsal for XXXX-XXXX
1238 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1239 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1240 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"AAAAA,AAA
1241 AA (A-AAAAAAA,ex1)\":MAILTO:aaaaa_aaaaa@aaaaa.com
1242 ORGANIZER;CN=\"ABCD,TECHTRAINING
1243 (A-Americas,exgen1)\":MAILTO:xxx@xxxxx.com
1244 LOCATION:555 or TN 555-5555 ID 5555 & NochWas (see below)
1245 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T120000
1246 DESCRIPTION:753 Zeichen hier radiert
1250 CREATED:20030618T195518Z
1251 LAST-MODIFIED:20030618T195527Z
1254 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1255 X-MICROSOFT-CDO-INSTTYPE:0
1256 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1257 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1258 X-MICROSOFT-CDO-IMPORTANCE:1
1259 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1262 DESCRIPTION:REMINDER
1263 TRIGGER;RELATED=START:-PT00H15M00S
1266 "&23/6/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1267 Desc: 753 Zeichen hier radiert
1268 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1269 Organizer: MAILTO:xxx@xxxxx.com
1272 "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1273 Desc: 753 Zeichen hier radiert
1274 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1275 Organizer: MAILTO:xxx@xxxxx.com
1278 ;; 2003-06-18 b -- uses timezone
1279 (icalendar-tests--test-import
1282 PRODID:Microsoft CDO for Microsoft Exchange
1285 TZID:Mountain Time (US & Canada)
1286 X-MICROSOFT-CDO-TZID:12
1288 DTSTART:16010101T020000
1291 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
1294 DTSTART:16010101T020000
1297 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
1301 DTSTAMP:20030618T230323Z
1302 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T090000
1303 SUMMARY:Updated: Dress Rehearsal for ABC01-15
1304 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1305 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1306 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;X-REPLYTIME=20030618T20
1307 0700Z;RSVP=TRUE;CN=\"AAAAA,AAAAAA
1308 \(A-AAAAAAA,ex1)\":MAILTO:aaaaaa_aaaaa@aaaaa
1310 ORGANIZER;CN=\"ABCD,TECHTRAINING
1311 \(A-Americas,exgen1)\":MAILTO:bbb@bbbbb.com
1312 LOCATION:123 or TN 123-1234 ID abcd & SonstWo (see below)
1313 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T100000
1314 DESCRIPTION:Viele Zeichen standen hier früher
1318 CREATED:20030618T230326Z
1319 LAST-MODIFIED:20030618T230335Z
1322 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1323 X-MICROSOFT-CDO-INSTTYPE:0
1324 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1325 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1326 X-MICROSOFT-CDO-IMPORTANCE:1
1327 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1330 DESCRIPTION:REMINDER
1331 TRIGGER;RELATED=START:-PT00H15M00S
1336 "&23/6/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1337 Desc: Viele Zeichen standen hier früher
1338 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1339 Organizer: MAILTO:bbb@bbbbb.com
1342 "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1343 Desc: Viele Zeichen standen hier früher
1344 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1345 Organizer: MAILTO:bbb@bbbbb.com
1348 ;; export 2004-10-28 block entries
1349 (icalendar-tests--test-export
1352 "-*- mode: text; fill-column: 256;-*-
1356 %%(diary-block 11 8 2004 11 10 2004) Nov 8-10 aa
1358 "DTSTART;VALUE=DATE:20041108
1359 DTEND;VALUE=DATE:20041111
1360 SUMMARY:Nov 8-10 aa")
1362 (icalendar-tests--test-export
1365 "%%(diary-block 12 13 2004 12 17 2004) Dec 13-17 bb"
1366 "DTSTART;VALUE=DATE:20041213
1367 DTEND;VALUE=DATE:20041218
1368 SUMMARY:Dec 13-17 bb")
1370 (icalendar-tests--test-export
1373 "%%(diary-block 2 3 2005 2 4 2005) Feb 3-4 cc"
1374 "DTSTART;VALUE=DATE:20050203
1375 DTEND;VALUE=DATE:20050205
1376 SUMMARY:Feb 3-4 cc")
1378 (icalendar-tests--test-export
1381 "%%(diary-block 4 24 2005 4 29 2005) April 24-29 dd"
1382 "DTSTART;VALUE=DATE:20050424
1383 DTEND;VALUE=DATE:20050430
1384 SUMMARY:April 24-29 dd
1386 (icalendar-tests--test-export
1389 "%%(diary-block 5 30 2005 6 1 2005) may 30 - June 1: ee"
1390 "DTSTART;VALUE=DATE:20050530
1391 DTEND;VALUE=DATE:20050602
1392 SUMMARY:may 30 - June 1: ee")
1394 (icalendar-tests--test-export
1397 "%%(diary-block 6 6 2005 6 8 2005) ff"
1398 "DTSTART;VALUE=DATE:20050606
1399 DTEND;VALUE=DATE:20050609
1402 ;; export 2004-10-28 anniversary entries
1403 (icalendar-tests--test-export
1409 %%(diary-anniversary 3 28 1991) aa birthday (%d years old)"
1410 "DTSTART;VALUE=DATE:19910328
1411 DTEND;VALUE=DATE:19910329
1412 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=03;BYMONTHDAY=28
1413 SUMMARY:aa birthday (%d years old)
1416 (icalendar-tests--test-export
1419 "%%(diary-anniversary 5 17 1957) bb birthday (%d years old)"
1420 "DTSTART;VALUE=DATE:19570517
1421 DTEND;VALUE=DATE:19570518
1422 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=05;BYMONTHDAY=17
1423 SUMMARY:bb birthday (%d years old)")
1425 (icalendar-tests--test-export
1428 "%%(diary-anniversary 6 8 1997) cc birthday (%d years old)"
1429 "DTSTART;VALUE=DATE:19970608
1430 DTEND;VALUE=DATE:19970609
1431 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=08
1432 SUMMARY:cc birthday (%d years old)")
1434 (icalendar-tests--test-export
1437 "%%(diary-anniversary 7 22 1983) dd (%d years ago...!)"
1438 "DTSTART;VALUE=DATE:19830722
1439 DTEND;VALUE=DATE:19830723
1440 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=07;BYMONTHDAY=22
1441 SUMMARY:dd (%d years ago...!)")
1443 (icalendar-tests--test-export
1446 "%%(diary-anniversary 8 1 1988) ee birthday (%d years old)"
1447 "DTSTART;VALUE=DATE:19880801
1448 DTEND;VALUE=DATE:19880802
1449 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=08;BYMONTHDAY=01
1450 SUMMARY:ee birthday (%d years old)")
1452 (icalendar-tests--test-export
1455 "%%(diary-anniversary 9 21 1957) ff birthday (%d years old)"
1456 "DTSTART;VALUE=DATE:19570921
1457 DTEND;VALUE=DATE:19570922
1458 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=21
1459 SUMMARY:ff birthday (%d years old)")
1464 ;; export 2004-10-28 monthly, weekly entries
1466 ;; (icalendar-tests--test-export
1469 ;; >>> ------------ monthly:
1471 ;; */27/* 10:00 blah blah"
1474 (icalendar-tests--test-export
1477 ">>> ------------ my week:
1480 "DTSTART;VALUE=DATE-TIME:20000103T130000
1481 DTEND;VALUE=DATE-TIME:20000103T140000
1482 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1485 (icalendar-tests--test-export
1489 "DTSTART;VALUE=DATE-TIME:20000103T150000
1490 DTEND;VALUE=DATE-TIME:20000103T160000
1491 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1495 (icalendar-tests--test-export
1498 "Monday 16:00-17:00 a2"
1499 "DTSTART;VALUE=DATE-TIME:20000103T160000
1500 DTEND;VALUE=DATE-TIME:20000103T170000
1501 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1504 (icalendar-tests--test-export
1507 "Tuesday 11:30-13:00 a3"
1508 "DTSTART;VALUE=DATE-TIME:20000104T113000
1509 DTEND;VALUE=DATE-TIME:20000104T130000
1510 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1513 (icalendar-tests--test-export
1517 "DTSTART;VALUE=DATE-TIME:20000104T150000
1518 DTEND;VALUE=DATE-TIME:20000104T160000
1519 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1522 (icalendar-tests--test-export
1525 "Wednesday 13:00 a5"
1526 "DTSTART;VALUE=DATE-TIME:20000105T130000
1527 DTEND;VALUE=DATE-TIME:20000105T140000
1528 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1531 (icalendar-tests--test-export
1534 "Wednesday 11:30-13:30 a6"
1535 "DTSTART;VALUE=DATE-TIME:20000105T113000
1536 DTEND;VALUE=DATE-TIME:20000105T133000
1537 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1540 (icalendar-tests--test-export
1543 "Wednesday 15:00 s1"
1544 "DTSTART;VALUE=DATE-TIME:20000105T150000
1545 DTEND;VALUE=DATE-TIME:20000105T160000
1546 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1550 ;; export 2004-10-28 regular entries
1551 (icalendar-tests--test-export
1555 >>> regular diary entries:
1557 Oct 12 2004, 14:00 Tue: [2004-10-12] q1"
1558 "DTSTART;VALUE=DATE-TIME:20041012T140000
1559 DTEND;VALUE=DATE-TIME:20041012T150000
1560 SUMMARY:Tue: [2004-10-12] q1")
1563 (icalendar-tests--test-import
1568 :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
1571 :04979712-3902-11d9-93dd-8f9f4afe08da
1578 X-MOZILLA-ALARM-DEFAULT-LENGTH
1591 :6161a312-3902-11d9-b512-f764153bb28b
1598 X-MOZILLA-ALARM-DEFAULT-LENGTH
1609 :943a4d7e-3902-11d9-9ce7-c9addeadf928
1616 X-MOZILLA-ALARM-DEFAULT-LENGTH
1627 :fe53615e-3902-11d9-9dd8-9d38a155bf41
1634 X-MOZILLA-ALARM-DEFAULT-LENGTH
1636 X-MOZILLA-RECUR-DEFAULT-INTERVAL
1639 :FREQ=WEEKLY;INTERVAL=2;BYDAY=FR
1649 :87c928ee-3901-11d9-b21f-b45042155024
1651 :Rrrr/Cccccc ii Aaaaaaaa
1653 :Vvvvv Rrrr aaa Cccccc
1658 X-MOZILLA-ALARM-DEFAULT-LENGTH
1673 :e8f331ae-3902-11d9-9948-dfdcb66a2872
1680 X-MOZILLA-ALARM-DEFAULT-LENGTH
1683 :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1698 "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
1701 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1704 &23/11/2004 11:00-12:00 Hhhhhhhh
1707 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
1710 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
1711 Desc: Vvvvv Rrrr aaa Cccccc
1714 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
1718 "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
1721 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1724 &11/23/2004 11:00-12:00 Hhhhhhhh
1727 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
1730 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
1731 Desc: Vvvvv Rrrr aaa Cccccc
1734 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
1740 (icalendar-tests--test-export
1741 "%%(diary-block 1 1 2004 4 1 2004) Urlaub"
1744 "DTSTART;VALUE=DATE:20040101
1745 DTEND;VALUE=DATE:20040105
1749 (icalendar-tests--test-export
1751 "5 11 2004 Bla Fasel"
1753 "DTSTART;VALUE=DATE:20041105
1754 DTEND;VALUE=DATE:20041106
1758 (icalendar-tests--test-export
1760 "2 Nov 2004 15:00-16:30 Zahnarzt"
1762 "DTSTART;VALUE=DATE-TIME:20041102T150000
1763 DTEND;VALUE=DATE-TIME:20041102T163000
1767 (icalendar-tests--test-import
1769 :b60d398e-1dd1-11b2-a159-cf8cb05139f4
1789 "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
1794 "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
1801 (icalendar-tests--test-import
1802 "DTSTART;VALUE=DATE:20050217
1803 SUMMARY:Hhhhhh Aaaaa ii Aaaaaaaa
1804 UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
1805 DTSTAMP:20050118T210335Z
1808 "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n"
1809 "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n")
1812 (icalendar-tests--test-export
1814 "&%%(diary-cyclic 7 8 2 2005) 16:00-16:45 [WORK] Pppp"
1816 "DTSTART;VALUE=DATE-TIME:20050208T160000
1817 DTEND;VALUE=DATE-TIME:20050208T164500
1818 RRULE:FREQ=DAILY;INTERVAL=7
1823 (icalendar-tests--test-export
1826 ;; FIXME: colon not allowed!
1827 ;;"Nov 1: NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1828 "Nov 1 NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1829 "DTSTART;VALUE=DATE:19001101
1830 DTEND;VALUE=DATE:19001102
1831 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
1832 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
1836 (provide 'icalendar-tests)
1837 ;;; icalendar-tests.el ends here