1 ;; icalendar-tests.el --- Test suite for icalendar.el
3 ;; Copyright (C) 2005, 2008-2014 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
191 TZID:anothername\, with a comma
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, with a comma" (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 (ert-deftest icalendar--decode-isodatetime ()
418 "Test `icalendar--decode-isodatetime'."
419 (let ((tz (getenv "TZ"))
423 ;; Use Eastern European Time (UTC+1, UTC+2 daylight saving)
426 (message "%s" (current-time-zone (encode-time 0 0 10 1 1 2013 0)))
427 (message "%s" (current-time-zone (encode-time 0 0 10 1 8 2013 0)))
429 ;; testcase: no time zone in input -> keep time as is
431 (should (equal '(0 0 10 1 1 2013 2 nil 7200)
432 (icalendar--decode-isodatetime "20130101T100000")))
433 ;; 1 Aug 2013 10:00 (DST)
434 (should (equal '(0 0 10 1 8 2013 4 t 10800)
435 (icalendar--decode-isodatetime "20130801T100000")))
437 ;; testcase: UTC time zone specifier in input -> convert to local time
438 ;; 31 Dec 2013 23:00 UTC -> 1 Jan 2013 01:00 EET
439 (should (equal '(0 0 1 1 1 2014 3 nil 7200)
440 (icalendar--decode-isodatetime "20131231T230000Z")))
441 ;; 1 Aug 2013 10:00 UTC -> 1 Aug 2013 13:00 EEST
442 (should (equal '(0 0 13 1 8 2013 4 t 10800)
443 (icalendar--decode-isodatetime "20130801T100000Z")))
446 ;; restore time-zone even if something went terribly wrong
449 ;; ======================================================================
451 ;; ======================================================================
453 (defun icalendar-tests--test-export (input-iso input-european input-american
455 "Perform an export test.
456 Argument INPUT-ISO iso style diary string.
457 Argument INPUT-EUROPEAN european style diary string.
458 Argument INPUT-AMERICAN american style diary string.
459 Argument EXPECTED-OUTPUT expected iCalendar result string.
461 European style input data must use german month names. American
462 and ISO style input data must use english month names."
463 (let ((tz (getenv "TZ"))
464 (calendar-date-style 'iso)
465 (icalendar-recurring-start-year 2000))
468 ;;; (message "Current time zone: %s" (current-time-zone))
469 ;; Use this form so as not to rely on system tz database.
470 ;; Eg hydra.nixos.org.
471 (setenv "TZ" "CET-1CEST,M3.5.0/2,M10.5.0/3")
472 ;;; (message "Current time zone: %s" (current-time-zone))
474 (let ((calendar-month-name-array
475 ["January" "February" "March" "April" "May" "June" "July" "August"
476 "September" "October" "November" "December"])
477 (calendar-day-name-array
478 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
480 (setq calendar-date-style 'iso)
481 (icalendar-tests--do-test-export input-iso expected-output)))
483 (let ((calendar-month-name-array
484 ["Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August"
485 "September" "Oktober" "November" "Dezember"])
486 (calendar-day-name-array
487 ["Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag"
489 (setq calendar-date-style 'european)
490 (icalendar-tests--do-test-export input-european expected-output)))
492 (let ((calendar-month-name-array
493 ["January" "February" "March" "April" "May" "June" "July" "August"
494 "September" "October" "November" "December"])
495 (calendar-day-name-array
496 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
498 (setq calendar-date-style 'american)
499 (icalendar-tests--do-test-export input-american expected-output))))
500 ;; restore time-zone even if something went terribly wrong
503 (defun icalendar-tests--do-test-export (input expected-output)
504 "Actually perform export test.
505 Argument INPUT input diary string.
506 Argument EXPECTED-OUTPUT expected iCalendar result string."
507 (let ((temp-file (make-temp-file "icalendar-tests-ics")))
512 (icalendar-export-region (point-min) (point-max) temp-file))
514 (find-file temp-file)
515 (goto-char (point-min))
516 (cond (expected-output
517 (should (re-search-forward "^\\s-*BEGIN:VCALENDAR
518 PRODID:-//Emacs//NONSGML icalendar.el//EN
527 (should (string-match
529 (regexp-quote (buffer-substring-no-properties
530 (match-beginning 1) (match-end 1)))
534 (should (re-search-forward "^\\s-*BEGIN:VCALENDAR
535 PRODID:-//Emacs//NONSGML icalendar.el//EN
541 (kill-buffer (find-buffer-visiting temp-file))
542 (delete-file temp-file))))
544 (ert-deftest icalendar-export-ordinary-no-time ()
545 "Perform export test."
547 (let ((icalendar-export-hidden-diary-entries nil))
548 (icalendar-tests--test-export
549 "&2000 Oct 3 ordinary no time "
550 "&3 Okt 2000 ordinary no time "
551 "&Oct 3 2000 ordinary no time "
554 (icalendar-tests--test-export
555 "2000 Oct 3 ordinary no time "
556 "3 Okt 2000 ordinary no time "
557 "Oct 3 2000 ordinary no time "
558 "DTSTART;VALUE=DATE:20001003
559 DTEND;VALUE=DATE:20001004
560 SUMMARY:ordinary no time
563 (ert-deftest icalendar-export-ordinary ()
564 "Perform export test."
566 (icalendar-tests--test-export
567 "2000 Oct 3 16:30 ordinary with time"
568 "3 Okt 2000 16:30 ordinary with time"
569 "Oct 3 2000 16:30 ordinary with time"
570 "DTSTART;VALUE=DATE-TIME:20001003T163000
571 DTEND;VALUE=DATE-TIME:20001003T173000
572 SUMMARY:ordinary with time
574 (icalendar-tests--test-export
575 "2000 10 3 16:30 ordinary with time 2"
576 "3 10 2000 16:30 ordinary with time 2"
577 "10 3 2000 16:30 ordinary with time 2"
578 "DTSTART;VALUE=DATE-TIME:20001003T163000
579 DTEND;VALUE=DATE-TIME:20001003T173000
580 SUMMARY:ordinary with time 2
583 (icalendar-tests--test-export
584 "2000/10/3 16:30 ordinary with time 3"
585 "3/10/2000 16:30 ordinary with time 3"
586 "10/3/2000 16:30 ordinary with time 3"
587 "DTSTART;VALUE=DATE-TIME:20001003T163000
588 DTEND;VALUE=DATE-TIME:20001003T173000
589 SUMMARY:ordinary with time 3
592 (ert-deftest icalendar-export-multiline ()
593 "Perform export test."
595 ;; multiline -- FIXME!!!
596 (icalendar-tests--test-export
597 "2000 October 3 16:30 multiline
598 17:30 multiline continued FIXME"
599 "3 Oktober 2000 16:30 multiline
600 17:30 multiline continued FIXME"
601 "October 3 2000 16:30 multiline
602 17:30 multiline continued FIXME"
603 "DTSTART;VALUE=DATE-TIME:20001003T163000
604 DTEND;VALUE=DATE-TIME:20001003T173000
607 17:30 multiline continued FIXME
610 (ert-deftest icalendar-export-weekly-by-day ()
611 "Perform export test."
614 (icalendar-tests--test-export
615 "Monday 1:30pm weekly by day with start time"
616 "Montag 13:30 weekly by day with start time"
617 "Monday 1:30pm weekly by day with start time"
618 "DTSTART;VALUE=DATE-TIME:20000103T133000
619 DTEND;VALUE=DATE-TIME:20000103T143000
620 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
621 SUMMARY:weekly by day with start time
624 (icalendar-tests--test-export
625 "Monday 13:30-15:00 weekly by day with start and end time"
626 "Montag 13:30-15:00 weekly by day with start and end time"
627 "Monday 01:30pm-03:00pm weekly by day with start and end time"
628 "DTSTART;VALUE=DATE-TIME:20000103T133000
629 DTEND;VALUE=DATE-TIME:20000103T150000
630 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
631 SUMMARY:weekly by day with start and end time
634 (ert-deftest icalendar-export-yearly ()
635 "Perform export test."
637 (icalendar-tests--test-export
638 "may 1 yearly no time"
639 "1 Mai yearly no time"
640 "may 1 yearly no time"
641 "DTSTART;VALUE=DATE:19000501
642 DTEND;VALUE=DATE:19000502
643 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYMONTHDAY=1
644 SUMMARY:yearly no time
647 (ert-deftest icalendar-export-anniversary ()
648 "Perform export test."
650 (icalendar-tests--test-export
651 "%%(diary-anniversary 1989 10 3) anniversary no time"
652 "%%(diary-anniversary 3 10 1989) anniversary no time"
653 "%%(diary-anniversary 10 3 1989) anniversary no time"
654 "DTSTART;VALUE=DATE:19891003
655 DTEND;VALUE=DATE:19891004
656 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYMONTHDAY=03
657 SUMMARY:anniversary no time
659 (icalendar-tests--test-export
660 "%%(diary-anniversary 1989 10 3) 19:00-20:00 anniversary with time"
661 "%%(diary-anniversary 3 10 1989) 19:00-20:00 anniversary with time"
662 "%%(diary-anniversary 10 3 1989) 19:00-20:00 anniversary with time"
663 "DTSTART;VALUE=DATE-TIME:19891003T190000
664 DTEND;VALUE=DATE-TIME:19891004T200000
665 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYMONTHDAY=03
666 SUMMARY:anniversary with time
669 (ert-deftest icalendar-export-block ()
670 "Perform export test."
672 (icalendar-tests--test-export
673 "%%(diary-block 2001 6 18 2001 7 6) block no time"
674 "%%(diary-block 18 6 2001 6 7 2001) block no time"
675 "%%(diary-block 6 18 2001 7 6 2001) block no time"
676 "DTSTART;VALUE=DATE:20010618
677 DTEND;VALUE=DATE:20010707
678 SUMMARY:block no time
680 (icalendar-tests--test-export
681 "%%(diary-block 2001 6 18 2001 7 6) 13:00-17:00 block with time"
682 "%%(diary-block 18 6 2001 6 7 2001) 13:00-17:00 block with time"
683 "%%(diary-block 6 18 2001 7 6 2001) 13:00-17:00 block with time"
684 "DTSTART;VALUE=DATE-TIME:20010618T130000
685 DTEND;VALUE=DATE-TIME:20010618T170000
686 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
687 SUMMARY:block with time
689 (icalendar-tests--test-export
690 "%%(diary-block 2001 6 18 2001 7 6) 13:00 block no end time"
691 "%%(diary-block 18 6 2001 6 7 2001) 13:00 block no end time"
692 "%%(diary-block 6 18 2001 7 6 2001) 13:00 block no end time"
693 "DTSTART;VALUE=DATE-TIME:20010618T130000
694 DTEND;VALUE=DATE-TIME:20010618T140000
695 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
696 SUMMARY:block no end time
699 ;; ======================================================================
701 ;; ======================================================================
703 (defun icalendar-tests--test-import (input expected-iso expected-european
705 "Perform import test.
706 Argument INPUT icalendar event string.
707 Argument EXPECTED-ISO expected iso style diary string.
708 Argument EXPECTED-EUROPEAN expected european style diary string.
709 Argument EXPECTED-AMERICAN expected american style diary string."
710 (let ((timezone (getenv "TZ")))
713 ;;; (message "Current time zone: %s" (current-time-zone))
714 ;; Use this form so as not to rely on system tz database.
715 ;; Eg hydra.nixos.org.
716 (setenv "TZ" "CET-1CEST,M3.5.0/2,M10.5.0/3")
717 ;;; (message "Current time zone: %s" (current-time-zone))
719 (if (string-match "^BEGIN:VCALENDAR" input)
721 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
722 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
724 (unless (eq (char-before) ?\n)
726 (insert "END:VEVENT\nEND:VCALENDAR\n"))
727 (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
728 (icalendar-import-format-summary "%s")
729 (icalendar-import-format-location "\n Location: %s")
730 (icalendar-import-format-description "\n Desc: %s")
731 (icalendar-import-format-organizer "\n Organizer: %s")
732 (icalendar-import-format-status "\n Status: %s")
733 (icalendar-import-format-url "\n URL: %s")
734 (icalendar-import-format-class "\n Class: %s")
735 (icalendar-import-format-uid "\n UID: %s")
738 (setq calendar-date-style 'iso)
739 (icalendar-tests--do-test-import input expected-iso))
740 (when expected-european
741 (setq calendar-date-style 'european)
742 (icalendar-tests--do-test-import input expected-european))
743 (when expected-american
744 (setq calendar-date-style 'american)
745 (icalendar-tests--do-test-import input expected-american)))))
746 (setenv "TZ" timezone))))
748 (defun icalendar-tests--do-test-import (input expected-output)
749 "Actually perform import test.
750 Argument INPUT input icalendar string.
751 Argument EXPECTED-OUTPUT expected diary string."
752 (let ((temp-file (make-temp-file "icalendar-test-diary")))
753 ;; Test the Catch-the-mysterious-coding-header logic below.
754 ;; Ruby-mode adds an after-save-hook which inserts the header!
756 ;; (find-file temp-file)
758 (icalendar-import-buffer temp-file t t)
760 (find-file temp-file)
761 ;; Check for the mysterious "# coding: ..." header, remove it
763 (goto-char (point-min))
764 (when (re-search-forward "# coding: .*?\n" nil t)
765 (message (concat "%s\n"
766 "Found mysterious \"# coding ...\" header! Removing it.\n"
767 "Current Modes: %s, %s\n"
775 (buffer-disable-undo)
777 (set-buffer-modified-p nil))
779 (let ((result (buffer-substring-no-properties (point-min) (point-max))))
780 (should (string= expected-output result)))
781 (kill-buffer (find-buffer-visiting temp-file))
782 (delete-file temp-file))))
784 (ert-deftest icalendar-import-non-recurring ()
785 "Perform standard import tests."
786 (icalendar-tests--test-import
787 "SUMMARY:non-recurring
788 DTSTART;VALUE=DATE-TIME:20030919T090000
789 DTEND;VALUE=DATE-TIME:20030919T113000"
790 "&2003/9/19 09:00-11:30 non-recurring\n"
791 "&19/9/2003 09:00-11:30 non-recurring\n"
792 "&9/19/2003 09:00-11:30 non-recurring\n")
793 (icalendar-tests--test-import
794 "SUMMARY:non-recurring allday
795 DTSTART;VALUE=DATE-TIME:20030919"
796 "&2003/9/19 non-recurring allday\n"
797 "&19/9/2003 non-recurring allday\n"
798 "&9/19/2003 non-recurring allday\n")
799 (icalendar-tests--test-import
800 ;; Checkdoc removes trailing blanks. Therefore: format!
801 (format "%s\n%s\n%s" "SUMMARY:long " " summary"
802 "DTSTART;VALUE=DATE:20030919")
803 "&2003/9/19 long summary\n"
804 "&19/9/2003 long summary\n"
805 "&9/19/2003 long summary\n")
806 (icalendar-tests--test-import
807 "UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
811 X-MOZILLA-ALARM-DEFAULT-UNITS:Minuten
812 X-MOZILLA-RECUR-DEFAULT-INTERVAL:0
813 DTSTART;VALUE=DATE:20040719
814 DTEND;VALUE=DATE:20040828
815 DTSTAMP:20031103T011641Z
817 "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
820 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
822 "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
825 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
827 "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
830 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
832 (icalendar-tests--test-import
834 :04979712-3902-11d9-93dd-8f9f4afe08da
841 X-MOZILLA-ALARM-DEFAULT-LENGTH
852 "&2004/11/23 14:00-14:30 folded summary
855 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
856 "&23/11/2004 14:00-14:30 folded summary
859 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
860 "&11/23/2004 14:00-14:30 folded summary
863 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n")
865 (icalendar-tests--test-import
867 :6161a312-3902-11d9-b512-f764153bb28b
874 X-MOZILLA-ALARM-DEFAULT-LENGTH
883 "&2004/11/23 14:45-15:45 another example
886 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
887 "&23/11/2004 14:45-15:45 another example
890 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
891 "&11/23/2004 14:45-15:45 another example
894 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"))
896 (ert-deftest icalendar-import-rrule ()
897 (icalendar-tests--test-import
899 DTSTART;VALUE=DATE-TIME:20030919T090000
900 DTEND;VALUE=DATE-TIME:20030919T113000
903 "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
904 "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
905 "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
907 (icalendar-tests--test-import
909 DTSTART;VALUE=DATE-TIME:20030919T090000
910 DTEND;VALUE=DATE-TIME:20030919T113000
911 RRULE:FREQ=DAILY;INTERVAL=2
913 "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
914 "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
915 "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
916 (icalendar-tests--test-import
917 "SUMMARY:rrule daily with exceptions
918 DTSTART;VALUE=DATE-TIME:20030919T090000
919 DTEND;VALUE=DATE-TIME:20030919T113000
920 RRULE:FREQ=DAILY;INTERVAL=2
921 EXDATE:20030921,20030925
923 "&%%(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"
924 "&%%(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"
925 "&%%(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")
926 (icalendar-tests--test-import
927 "SUMMARY:rrule weekly
928 DTSTART;VALUE=DATE-TIME:20030919T090000
929 DTEND;VALUE=DATE-TIME:20030919T113000
932 "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
933 "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
934 "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
935 (icalendar-tests--test-import
936 "SUMMARY:rrule monthly no end
937 DTSTART;VALUE=DATE-TIME:20030919T090000
938 DTEND;VALUE=DATE-TIME:20030919T113000
941 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
942 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
943 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
944 (icalendar-tests--test-import
945 "SUMMARY:rrule monthly with end
946 DTSTART;VALUE=DATE-TIME:20030919T090000
947 DTEND;VALUE=DATE-TIME:20030919T113000
948 RRULE:FREQ=MONTHLY;UNTIL=20050819;
950 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
951 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
952 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
953 (icalendar-tests--test-import
954 "DTSTART;VALUE=DATE:20040815
955 DTEND;VALUE=DATE:20040816
956 SUMMARY:Maria Himmelfahrt
957 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
959 "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
960 "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
961 "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
962 (icalendar-tests--test-import
963 "SUMMARY:rrule yearly
964 DTSTART;VALUE=DATE-TIME:20030919T090000
965 DTEND;VALUE=DATE-TIME:20030919T113000
966 RRULE:FREQ=YEARLY;INTERVAL=2
968 "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
969 "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
970 "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
971 (icalendar-tests--test-import
972 "SUMMARY:rrule count daily short
973 DTSTART;VALUE=DATE-TIME:20030919T090000
974 DTEND;VALUE=DATE-TIME:20030919T113000
975 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
977 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
978 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
979 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
980 (icalendar-tests--test-import
981 "SUMMARY:rrule count daily long
982 DTSTART;VALUE=DATE-TIME:20030919T090000
983 DTEND;VALUE=DATE-TIME:20030919T113000
984 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
986 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
987 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
988 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
989 (icalendar-tests--test-import
990 "SUMMARY:rrule count bi-weekly 3 times
991 DTSTART;VALUE=DATE-TIME:20030919T090000
992 DTEND;VALUE=DATE-TIME:20030919T113000
993 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
995 "&%%(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"
996 "&%%(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"
997 "&%%(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")
998 (icalendar-tests--test-import
999 "SUMMARY:rrule count monthly
1000 DTSTART;VALUE=DATE-TIME:20030919T090000
1001 DTEND;VALUE=DATE-TIME:20030919T113000
1002 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
1004 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
1005 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
1006 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
1007 (icalendar-tests--test-import
1008 "SUMMARY:rrule count every second month
1009 DTSTART;VALUE=DATE-TIME:20030919T090000
1010 DTEND;VALUE=DATE-TIME:20030919T113000
1011 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
1013 "&%%(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
1014 "&%%(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
1015 "&%%(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
1016 (icalendar-tests--test-import
1017 "SUMMARY:rrule count yearly
1018 DTSTART;VALUE=DATE-TIME:20030919T090000
1019 DTEND;VALUE=DATE-TIME:20030919T113000
1020 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
1022 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
1023 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
1024 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
1025 (icalendar-tests--test-import
1026 "SUMMARY:rrule count every second year
1027 DTSTART;VALUE=DATE-TIME:20030919T090000
1028 DTEND;VALUE=DATE-TIME:20030919T113000
1029 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
1031 "&%%(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!!!
1032 "&%%(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!!!
1033 "&%%(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!!!
1036 (ert-deftest icalendar-import-duration ()
1038 (icalendar-tests--test-import
1039 "DTSTART;VALUE=DATE:20050217
1043 "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
1044 "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
1045 "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
1046 (icalendar-tests--test-import
1047 "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
1048 DTSTAMP:20041127T183315Z
1049 LAST-MODIFIED:20041127T183329
1051 DTSTART;VALUE=DATE:20011221
1052 DTEND;VALUE=DATE:20011221
1053 RRULE:FREQ=DAILY;UNTIL=20011229;INTERVAL=1;WKST=SU
1056 CREATED:20041127T183329
1058 "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
1060 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
1061 "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
1063 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
1064 "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
1066 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"))
1068 (ert-deftest icalendar-import-bug-6766 ()
1069 ;;bug#6766 -- multiple byday values in a weekly rrule
1070 (icalendar-tests--test-import
1072 DTEND;TZID=America/New_York:20100421T120000
1073 DTSTAMP:20100525T141214Z
1074 DTSTART;TZID=America/New_York:20100421T113000
1075 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,TH,FR
1080 UID:8814e3f9-7482-408f-996c-3bfe486a1262
1084 DTSTAMP:20100525T141214Z
1085 DTSTART;VALUE=DATE:20100422
1086 DTEND;VALUE=DATE:20100423
1087 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
1089 SUMMARY:Tues + Thurs thinking
1091 UID:8814e3f9-7482-408f-996c-3bfe486a1263
1093 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
1096 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1097 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
1099 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1101 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
1104 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1105 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
1107 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1109 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
1112 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1113 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
1115 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1118 (ert-deftest icalendar-import-multiple-vcalendars ()
1119 (icalendar-tests--test-import
1120 "DTSTART;VALUE=DATE:20110723
1123 "&2011/7/23 event-1\n"
1124 "&23/7/2011 event-1\n"
1125 "&7/23/2011 event-1\n")
1127 (icalendar-tests--test-import
1129 PRODID:-//Emacs//NONSGML icalendar.el//EN
1130 VERSION:2.0\nBEGIN:VEVENT
1131 DTSTART;VALUE=DATE:20110723
1136 PRODID:-//Emacs//NONSGML icalendar.el//EN
1139 DTSTART;VALUE=DATE:20110724
1144 PRODID:-//Emacs//NONSGML icalendar.el//EN
1147 DTSTART;VALUE=DATE:20110725
1151 DTSTART;VALUE=DATE:20110725
1156 "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
1157 "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
1158 "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
1160 (ert-deftest icalendar-import-with-uid ()
1161 "Perform import test with uid."
1162 (icalendar-tests--test-import
1164 SUMMARY:non-recurring
1165 DTSTART;VALUE=DATE-TIME:20030919T090000
1166 DTEND;VALUE=DATE-TIME:20030919T113000"
1167 "&2003/9/19 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
1168 "&19/9/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
1169 "&9/19/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"))
1171 (ert-deftest icalendar-import-with-timezone ()
1173 (icalendar-tests--test-import
1176 TZID:fictional\, nonexistent\, arbitrary
1178 DTSTART:20100101T000000
1181 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=01
1184 DTSTART:20101201T000000
1187 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11
1191 SUMMARY:standardtime
1192 DTSTART;TZID=\"fictional, nonexistent, arbitrary\":20120115T120000
1193 DTEND;TZID=\"fictional, nonexistent, arbitrary\":20120115T123000
1196 SUMMARY:daylightsavingtime
1197 DTSTART;TZID=\"fictional, nonexistent, arbitrary\":20121215T120000
1198 DTEND;TZID=\"fictional, nonexistent, arbitrary\":20121215T123000
1201 ;; "standardtime" begins first sunday in january and is 4 hours behind CET
1202 ;; "daylightsavingtime" begins first sunday in november and is 1 hour before CET
1203 "&2012/1/15 15:00-15:30 standardtime
1204 &2012/12/15 11:00-11:30 daylightsavingtime
1209 ;; ======================================================================
1211 ;; ======================================================================
1212 (defun icalendar-tests--test-cycle (input)
1213 "Perform cycle test.
1214 Argument INPUT icalendar event string."
1216 (if (string-match "^BEGIN:VCALENDAR" input)
1218 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
1219 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
1221 (unless (eq (char-before) ?\n)
1223 (insert "END:VEVENT\nEND:VCALENDAR\n"))
1224 (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
1225 (icalendar-import-format-summary "%s")
1226 (icalendar-import-format-location "\n Location: %s")
1227 (icalendar-import-format-description "\n Desc: %s")
1228 (icalendar-import-format-organizer "\n Organizer: %s")
1229 (icalendar-import-format-status "\n Status: %s")
1230 (icalendar-import-format-url "\n URL: %s")
1231 (icalendar-import-format-class "\n Class: %s")
1232 (icalendar-import-format-class "\n UID: %s"))
1233 (dolist (calendar-date-style '(iso european american))
1234 (icalendar-tests--do-test-cycle)))))
1236 (defun icalendar-tests--do-test-cycle ()
1237 "Actually perform import/export cycle test."
1238 (let ((temp-diary (make-temp-file "icalendar-test-diary"))
1239 (temp-ics (make-temp-file "icalendar-test-ics"))
1240 (org-input (buffer-substring-no-properties (point-min) (point-max))))
1245 (icalendar-import-buffer temp-diary t t)
1247 ;; step 2: export what was just imported
1249 (find-file temp-diary)
1250 (icalendar-export-region (point-min) (point-max) temp-ics))
1252 ;; compare the output of step 2 with the input of step 1
1254 (find-file temp-ics)
1255 (goto-char (point-min))
1256 ;;(when (re-search-forward "\nUID:.*\n" nil t)
1257 ;;(replace-match "\n"))
1258 (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
1259 (should (string= org-input cycled)))))
1261 (kill-buffer (find-buffer-visiting temp-diary))
1262 (with-current-buffer (find-buffer-visiting temp-ics)
1263 (set-buffer-modified-p nil)
1264 (kill-buffer (current-buffer)))
1265 (delete-file temp-diary)
1266 (delete-file temp-ics))))
1268 (ert-deftest icalendar-cycle ()
1269 "Perform cycling tests.
1270 Take care to avoid auto-generated UIDs here."
1271 (icalendar-tests--test-cycle
1273 DTSTART;VALUE=DATE-TIME:20030919T090000
1274 DTEND;VALUE=DATE-TIME:20030919T113000
1277 (icalendar-tests--test-cycle
1279 DTSTART;VALUE=DATE-TIME:20030919T090000
1280 DTEND;VALUE=DATE-TIME:20030919T113000
1282 DESCRIPTION:beschreibung!
1286 (icalendar-tests--test-cycle
1288 DTSTART;VALUE=DATE:19190909
1289 DTEND;VALUE=DATE:19190910
1290 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
1291 SUMMARY:and diary-anniversary
1294 ;; ======================================================================
1296 ;; ======================================================================
1297 (ert-deftest icalendar-real-world ()
1298 "Perform real-world tests, as gathered from problem reports."
1300 (icalendar-tests--test-import
1303 PRODID:Microsoft CDO for Microsoft Exchange
1306 TZID:Kolkata\, Chennai\, Mumbai\, New Delhi
1307 X-MICROSOFT-CDO-TZID:23
1309 DTSTART:16010101T000000
1314 DTSTART:16010101T000000
1320 DTSTAMP:20030509T043439Z
1321 DTSTART;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T103000
1322 SUMMARY:On-Site Interview
1323 UID:040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000
1324 010000000DB823520692542408ED02D7023F9DFF9
1325 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Xxxxx
1326 xxx Xxxxxxxxxxxx\":MAILTO:xxxxxxxx@xxxxxxx.com
1327 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Yyyyyyy Y
1328 yyyy\":MAILTO:yyyyyyy@yyyyyyy.com
1329 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Zzzz Zzzz
1330 zz\":MAILTO:zzzzzz@zzzzzzz.com
1331 ORGANIZER;CN=\"Aaaaaa Aaaaa\":MAILTO:aaaaaaa@aaaaaaa.com
1333 DTEND;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T153000
1334 DESCRIPTION:10:30am - Blah
1338 CREATED:20030509T043439Z
1339 LAST-MODIFIED:20030509T043459Z
1342 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1343 X-MICROSOFT-CDO-INSTTYPE:0
1344 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1345 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1346 X-MICROSOFT-CDO-IMPORTANCE:1
1347 X-MICROSOFT-CDO-OWNERAPPTID:126441427
1350 DESCRIPTION:REMINDER
1351 TRIGGER;RELATED=START:-PT00H15M00S
1356 "&9/5/2003 10:30-15:30 On-Site Interview
1357 Desc: 10:30am - Blah
1359 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1361 UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
1363 "&5/9/2003 10:30-15:30 On-Site Interview
1364 Desc: 10:30am - Blah
1366 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1368 UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
1372 (icalendar-tests--test-import
1373 "DTSTAMP:20030618T195512Z
1374 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T110000
1375 SUMMARY:Dress Rehearsal for XXXX-XXXX
1376 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1377 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1378 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"AAAAA,AAA
1379 AA (A-AAAAAAA,ex1)\":MAILTO:aaaaa_aaaaa@aaaaa.com
1380 ORGANIZER;CN=\"ABCD,TECHTRAINING
1381 (A-Americas,exgen1)\":MAILTO:xxx@xxxxx.com
1382 LOCATION:555 or TN 555-5555 ID 5555 & NochWas (see below)
1383 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T120000
1384 DESCRIPTION:753 Zeichen hier radiert
1388 CREATED:20030618T195518Z
1389 LAST-MODIFIED:20030618T195527Z
1392 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1393 X-MICROSOFT-CDO-INSTTYPE:0
1394 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1395 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1396 X-MICROSOFT-CDO-IMPORTANCE:1
1397 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1400 DESCRIPTION:REMINDER
1401 TRIGGER;RELATED=START:-PT00H15M00S
1404 "&23/6/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1405 Desc: 753 Zeichen hier radiert
1406 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1407 Organizer: MAILTO:xxx@xxxxx.com
1409 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1411 "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1412 Desc: 753 Zeichen hier radiert
1413 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1414 Organizer: MAILTO:xxx@xxxxx.com
1416 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1418 ;; 2003-06-18 b -- uses timezone
1419 (icalendar-tests--test-import
1422 PRODID:Microsoft CDO for Microsoft Exchange
1425 TZID:Mountain Time (US & Canada)
1426 X-MICROSOFT-CDO-TZID:12
1428 DTSTART:16010101T020000
1431 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
1434 DTSTART:16010101T020000
1437 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
1441 DTSTAMP:20030618T230323Z
1442 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T090000
1443 SUMMARY:Updated: Dress Rehearsal for ABC01-15
1444 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1445 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1446 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;X-REPLYTIME=20030618T20
1447 0700Z;RSVP=TRUE;CN=\"AAAAA,AAAAAA
1448 \(A-AAAAAAA,ex1)\":MAILTO:aaaaaa_aaaaa@aaaaa
1450 ORGANIZER;CN=\"ABCD,TECHTRAINING
1451 \(A-Americas,exgen1)\":MAILTO:bbb@bbbbb.com
1452 LOCATION:123 or TN 123-1234 ID abcd & SonstWo (see below)
1453 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T100000
1454 DESCRIPTION:Viele Zeichen standen hier früher
1458 CREATED:20030618T230326Z
1459 LAST-MODIFIED:20030618T230335Z
1462 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1463 X-MICROSOFT-CDO-INSTTYPE:0
1464 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1465 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1466 X-MICROSOFT-CDO-IMPORTANCE:1
1467 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1470 DESCRIPTION:REMINDER
1471 TRIGGER;RELATED=START:-PT00H15M00S
1476 "&23/6/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1477 Desc: Viele Zeichen standen hier früher
1478 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1479 Organizer: MAILTO:bbb@bbbbb.com
1481 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1483 "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1484 Desc: Viele Zeichen standen hier früher
1485 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1486 Organizer: MAILTO:bbb@bbbbb.com
1488 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1490 ;; export 2004-10-28 block entries
1491 (icalendar-tests--test-export
1494 "-*- mode: text; fill-column: 256;-*-
1498 %%(diary-block 11 8 2004 11 10 2004) Nov 8-10 aa
1500 "DTSTART;VALUE=DATE:20041108
1501 DTEND;VALUE=DATE:20041111
1502 SUMMARY:Nov 8-10 aa")
1504 (icalendar-tests--test-export
1507 "%%(diary-block 12 13 2004 12 17 2004) Dec 13-17 bb"
1508 "DTSTART;VALUE=DATE:20041213
1509 DTEND;VALUE=DATE:20041218
1510 SUMMARY:Dec 13-17 bb")
1512 (icalendar-tests--test-export
1515 "%%(diary-block 2 3 2005 2 4 2005) Feb 3-4 cc"
1516 "DTSTART;VALUE=DATE:20050203
1517 DTEND;VALUE=DATE:20050205
1518 SUMMARY:Feb 3-4 cc")
1520 (icalendar-tests--test-export
1523 "%%(diary-block 4 24 2005 4 29 2005) April 24-29 dd"
1524 "DTSTART;VALUE=DATE:20050424
1525 DTEND;VALUE=DATE:20050430
1526 SUMMARY:April 24-29 dd
1528 (icalendar-tests--test-export
1531 "%%(diary-block 5 30 2005 6 1 2005) may 30 - June 1: ee"
1532 "DTSTART;VALUE=DATE:20050530
1533 DTEND;VALUE=DATE:20050602
1534 SUMMARY:may 30 - June 1: ee")
1536 (icalendar-tests--test-export
1539 "%%(diary-block 6 6 2005 6 8 2005) ff"
1540 "DTSTART;VALUE=DATE:20050606
1541 DTEND;VALUE=DATE:20050609
1544 ;; export 2004-10-28 anniversary entries
1545 (icalendar-tests--test-export
1551 %%(diary-anniversary 3 28 1991) aa birthday (%d years old)"
1552 "DTSTART;VALUE=DATE:19910328
1553 DTEND;VALUE=DATE:19910329
1554 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=03;BYMONTHDAY=28
1555 SUMMARY:aa birthday (%d years old)
1558 (icalendar-tests--test-export
1561 "%%(diary-anniversary 5 17 1957) bb birthday (%d years old)"
1562 "DTSTART;VALUE=DATE:19570517
1563 DTEND;VALUE=DATE:19570518
1564 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=05;BYMONTHDAY=17
1565 SUMMARY:bb birthday (%d years old)")
1567 (icalendar-tests--test-export
1570 "%%(diary-anniversary 6 8 1997) cc birthday (%d years old)"
1571 "DTSTART;VALUE=DATE:19970608
1572 DTEND;VALUE=DATE:19970609
1573 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=08
1574 SUMMARY:cc birthday (%d years old)")
1576 (icalendar-tests--test-export
1579 "%%(diary-anniversary 7 22 1983) dd (%d years ago...!)"
1580 "DTSTART;VALUE=DATE:19830722
1581 DTEND;VALUE=DATE:19830723
1582 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=07;BYMONTHDAY=22
1583 SUMMARY:dd (%d years ago...!)")
1585 (icalendar-tests--test-export
1588 "%%(diary-anniversary 8 1 1988) ee birthday (%d years old)"
1589 "DTSTART;VALUE=DATE:19880801
1590 DTEND;VALUE=DATE:19880802
1591 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=08;BYMONTHDAY=01
1592 SUMMARY:ee birthday (%d years old)")
1594 (icalendar-tests--test-export
1597 "%%(diary-anniversary 9 21 1957) ff birthday (%d years old)"
1598 "DTSTART;VALUE=DATE:19570921
1599 DTEND;VALUE=DATE:19570922
1600 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=21
1601 SUMMARY:ff birthday (%d years old)")
1606 ;; export 2004-10-28 monthly, weekly entries
1608 ;; (icalendar-tests--test-export
1611 ;; >>> ------------ monthly:
1613 ;; */27/* 10:00 blah blah"
1616 (icalendar-tests--test-export
1619 ">>> ------------ my week:
1622 "DTSTART;VALUE=DATE-TIME:20000103T130000
1623 DTEND;VALUE=DATE-TIME:20000103T140000
1624 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1627 (icalendar-tests--test-export
1631 "DTSTART;VALUE=DATE-TIME:20000103T150000
1632 DTEND;VALUE=DATE-TIME:20000103T160000
1633 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1637 (icalendar-tests--test-export
1640 "Monday 16:00-17:00 a2"
1641 "DTSTART;VALUE=DATE-TIME:20000103T160000
1642 DTEND;VALUE=DATE-TIME:20000103T170000
1643 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1646 (icalendar-tests--test-export
1649 "Tuesday 11:30-13:00 a3"
1650 "DTSTART;VALUE=DATE-TIME:20000104T113000
1651 DTEND;VALUE=DATE-TIME:20000104T130000
1652 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1655 (icalendar-tests--test-export
1659 "DTSTART;VALUE=DATE-TIME:20000104T150000
1660 DTEND;VALUE=DATE-TIME:20000104T160000
1661 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1664 (icalendar-tests--test-export
1667 "Wednesday 13:00 a5"
1668 "DTSTART;VALUE=DATE-TIME:20000105T130000
1669 DTEND;VALUE=DATE-TIME:20000105T140000
1670 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1673 (icalendar-tests--test-export
1676 "Wednesday 11:30-13:30 a6"
1677 "DTSTART;VALUE=DATE-TIME:20000105T113000
1678 DTEND;VALUE=DATE-TIME:20000105T133000
1679 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1682 (icalendar-tests--test-export
1685 "Wednesday 15:00 s1"
1686 "DTSTART;VALUE=DATE-TIME:20000105T150000
1687 DTEND;VALUE=DATE-TIME:20000105T160000
1688 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1692 ;; export 2004-10-28 regular entries
1693 (icalendar-tests--test-export
1697 >>> regular diary entries:
1699 Oct 12 2004, 14:00 Tue: [2004-10-12] q1"
1700 "DTSTART;VALUE=DATE-TIME:20041012T140000
1701 DTEND;VALUE=DATE-TIME:20041012T150000
1702 SUMMARY:Tue: [2004-10-12] q1")
1705 (icalendar-tests--test-import
1710 :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
1718 X-MOZILLA-ALARM-DEFAULT-LENGTH
1736 X-MOZILLA-ALARM-DEFAULT-LENGTH
1752 X-MOZILLA-ALARM-DEFAULT-LENGTH
1768 X-MOZILLA-ALARM-DEFAULT-LENGTH
1770 X-MOZILLA-RECUR-DEFAULT-INTERVAL
1773 :FREQ=WEEKLY;INTERVAL=2;BYDAY=FR
1783 :Rrrr/Cccccc ii Aaaaaaaa
1785 :Vvvvv Rrrr aaa Cccccc
1790 X-MOZILLA-ALARM-DEFAULT-LENGTH
1810 X-MOZILLA-ALARM-DEFAULT-LENGTH
1813 :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1828 "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
1831 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1834 &23/11/2004 11:00-12:00 Hhhhhhhh
1837 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
1840 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
1841 Desc: Vvvvv Rrrr aaa Cccccc
1844 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
1848 "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
1851 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1854 &11/23/2004 11:00-12:00 Hhhhhhhh
1857 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
1860 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
1861 Desc: Vvvvv Rrrr aaa Cccccc
1864 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
1870 (icalendar-tests--test-export
1871 "%%(diary-block 1 1 2004 4 1 2004) Urlaub"
1874 "DTSTART;VALUE=DATE:20040101
1875 DTEND;VALUE=DATE:20040105
1879 (icalendar-tests--test-export
1881 "5 11 2004 Bla Fasel"
1883 "DTSTART;VALUE=DATE:20041105
1884 DTEND;VALUE=DATE:20041106
1888 (icalendar-tests--test-export
1890 "2 Nov 2004 15:00-16:30 Zahnarzt"
1892 "DTSTART;VALUE=DATE-TIME:20041102T150000
1893 DTEND;VALUE=DATE-TIME:20041102T163000
1897 (icalendar-tests--test-import
1899 :b60d398e-1dd1-11b2-a159-cf8cb05139f4
1919 "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
1923 UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
1925 "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
1929 UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
1933 (icalendar-tests--test-import
1934 "DTSTART;VALUE=DATE:20050217
1935 SUMMARY:Hhhhhh Aaaaa ii Aaaaaaaa
1936 UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
1937 DTSTAMP:20050118T210335Z
1940 "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
1941 UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n"
1942 "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
1943 UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n")
1946 (icalendar-tests--test-export
1948 "&%%(diary-cyclic 7 8 2 2005) 16:00-16:45 [WORK] Pppp"
1950 "DTSTART;VALUE=DATE-TIME:20050208T160000
1951 DTEND;VALUE=DATE-TIME:20050208T164500
1952 RRULE:FREQ=DAILY;INTERVAL=7
1957 (icalendar-tests--test-export
1960 ;; FIXME: colon not allowed!
1961 ;;"Nov 1: NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1962 "Nov 1 NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1963 "DTSTART;VALUE=DATE:19001101
1964 DTEND;VALUE=DATE:19001102
1965 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
1966 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
1970 (icalendar-tests--test-import
1973 PRODID:Microsoft Exchange Server 2007
1976 TZID:(UTC+01:00) Amsterdam\, Berlin\, Bern\, Rome\, Stockholm\, Vienna
1978 DTSTART:16010101T030000
1981 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
1984 DTSTART:16010101T020000
1987 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
1991 ORGANIZER;CN=\"A. Luser\":MAILTO:a.luser@foo.com
1992 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Luser, Oth
1993 er\":MAILTO:other.luser@foo.com
1994 DESCRIPTION;LANGUAGE=en-US:\nWhassup?\n\n
1995 SUMMARY;LANGUAGE=en-US:Query
1996 DTSTART;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\"
1998 DTEND;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\":2
2000 UID:040000008200E00074C5B7101A82E0080000000020FFAED0CFEFCC01000000000000000
2001 010000000575268034ECDB649A15349B1BF240F15
2002 RECURRENCE-ID;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, V
2003 ienna\":20120515T170000
2006 DTSTAMP:20120514T153645Z
2010 LOCATION;LANGUAGE=en-US:phone
2011 X-MICROSOFT-CDO-APPT-SEQUENCE:15
2012 X-MICROSOFT-CDO-OWNERAPPTID:1907632092
2013 X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE
2014 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
2015 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
2016 X-MICROSOFT-CDO-IMPORTANCE:1
2017 X-MICROSOFT-CDO-INSTTYPE:3
2020 DESCRIPTION:REMINDER
2021 TRIGGER;RELATED=START:-PT15M
2026 "&15/5/2012 15:00-15:30 Query
2028 Organizer: MAILTO:a.luser@foo.com
2031 UID: 040000008200E00074C5B7101A82E0080000000020FFAED0CFEFCC01000000000000000010000000575268034ECDB649A15349B1BF240F15
2035 (provide 'icalendar-tests)
2036 ;;; icalendar-tests.el ends here