]> code.delx.au - gnu-emacs/blob - test/automated/icalendar-tests.el
merge trunk
[gnu-emacs] / test / automated / icalendar-tests.el
1 ;; icalendar-tests.el --- Test suite for icalendar.el
2
3 ;; Copyright (C) 2005, 2008-2012 Free Software Foundation, Inc.
4
5 ;; Author: Ulf Jasper <ulf.jasper@web.de>
6 ;; Created: March 2005
7 ;; Keywords: calendar
8 ;; Human-Keywords: calendar, diary, iCalendar, vCalendar
9
10 ;; This file is part of GNU Emacs.
11
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.
16
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.
21
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/>.
24
25 ;;; Commentary:
26
27 ;; TODO:
28 ;; - Add more unit tests for functions, timezone etc.
29
30 ;; Note: Watch the trailing blank that is added on import.
31
32 ;;; Code:
33
34 (require 'ert)
35 (require 'icalendar)
36
37 ;; ======================================================================
38 ;; Helpers
39 ;; ======================================================================
40
41 (defun icalendar-tests--get-ical-event (ical-string)
42 "Return iCalendar event for ICAL-STRING."
43 (save-excursion
44 (with-temp-buffer
45 (insert ical-string)
46 (goto-char (point-min))
47 (car (icalendar--read-element nil nil)))))
48
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)))
53
54 ;; ======================================================================
55 ;; Tests of functions
56 ;; ======================================================================
57
58 (ert-deftest icalendar--create-uid ()
59 "Test for `icalendar--create-uid'."
60 (let* ((icalendar-uid-format "xxx-%t-%c-%h-%u-%s")
61 t-ct
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"))
67 )
68 (fset 't-ct (symbol-function 'current-time))
69 (unwind-protect
70 (progn
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)))))
82
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)))
94
95 (ert-deftest icalendar-convert-anniversary-to-ical ()
96 "Test method for `icalendar--convert-anniversary-to-ical'."
97 (let* ((calendar-date-style 'iso)
98 result)
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")
106 (car result)))
107 (should (string= "g" (cadr result)))))
108
109 (ert-deftest icalendar--convert-cyclic-to-ical ()
110 "Test method for `icalendar--convert-cyclic-to-ical'."
111 (let* ((calendar-date-style 'iso)
112 result)
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")
119 (car result)))
120 (should (string= "Sommerferien" (cadr result)))))
121
122 (ert-deftest icalendar--convert-block-to-ical ()
123 "Test method for `icalendar--convert-block-to-ical'."
124 (let* ((calendar-date-style 'iso)
125 result)
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")
132 (car result)))
133 (should (string= "Sommerferien" (cadr result)))))
134
135 (ert-deftest icalendar--convert-yearly-to-ical ()
136 "Test method for `icalendar--convert-yearly-to-ical'."
137 (let* ((calendar-date-style 'iso)
138 result
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")
148 (car result)))
149 (should (string= "Tag der Arbeit" (cadr result)))))
150
151 (ert-deftest icalendar--convert-weekly-to-ical ()
152 "Test method for `icalendar--convert-weekly-to-ical'."
153 (let* ((calendar-date-style 'iso)
154 result
155 (calendar-day-name-array
156 ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday"
157 "Saturday"]))
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")
163 (car result)))
164 (should (string= "subject" (cadr result)))))
165
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
170 TZID:thename
171 BEGIN:STANDARD
172 DTSTART:16010101T040000
173 TZOFFSETFROM:+0300
174 TZOFFSETTO:+0200
175 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
176 END:STANDARD
177 BEGIN:DAYLIGHT
178 DTSTART:16010101T030000
179 TZOFFSETFROM:+0200
180 TZOFFSETTO:+0300
181 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
182 END:DAYLIGHT
183 END:VTIMEZONE
184 "))
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"
189 (cdr result)))
190 (setq vtimezone (icalendar-tests--get-ical-event "BEGIN:VTIMEZONE
191 TZID:anothername
192 BEGIN:STANDARD
193 DTSTART:16010101T040000
194 TZOFFSETFROM:+0300
195 TZOFFSETTO:+0200
196 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=10
197 END:STANDARD
198 BEGIN:DAYLIGHT
199 DTSTART:16010101T030000
200 TZOFFSETFROM:+0200
201 TZOFFSETTO:+0300
202 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=3
203 END:DAYLIGHT
204 END:VTIMEZONE
205 "))
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"
210 (cdr result)))))
211
212 (ert-deftest icalendar--convert-ordinary-to-ical ()
213 "Test method for `icalendar--convert-ordinary-to-ical'."
214 (let* ((calendar-date-style 'iso)
215 result)
216 ;; without time
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"
220 (car result)))
221 (should (string= "subject" (cadr result)))
222
223 ;; with time
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")
229 (car result)))
230 (should (string= "s" (cadr result)))
231
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")
238 (car result)))
239 (should (string= "s" (cadr result)))))
240
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"))))
271
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)))))
284
285 (ert-deftest icalendar--datestring-to-isodate ()
286 "Test method for `icalendar--datestring-to-isodate'."
287 (let ((calendar-date-style 'iso))
288 ;; numeric 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)))
295
296 ;; numeric european
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)))
304
305 ;; numeric american
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)))
313
314 ;; non-numeric
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")))))
322
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))))
334
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
343 SUMMARY:a
344 ORGANIZER:d
345 LOCATION:c
346 DTEND:20030509T153000
347 DESCRIPTION:b
348 END:VEVENT
349 ")))))
350
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
364 SUMMARY:sum
365 ORGANIZER:org
366 LOCATION:loc
367 DTEND:20030509T153000
368 DESCRIPTION:des
369 END:VEVENT
370 ")))
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)
374 "helloworld"))
375 (should (string= "helloworld" (icalendar--format-ical-event event)))
376 (setq icalendar-import-format
377 (lambda (e)
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)))))
388
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")
399 (result))
400 (setq result (icalendar--parse-summary-and-rest "SUM sum ORG org"))
401 (should (string= "org" (cdr (assoc 'org result))))
402
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))))
410
411 (setq icalendar-import-format (lambda () "Hello world"))
412 (setq result (icalendar--parse-summary-and-rest
413 "blah blah "))
414 (should (not result))
415 ))
416
417 ;; ======================================================================
418 ;; Export tests
419 ;; ======================================================================
420
421 (defun icalendar-tests--test-export (input-iso input-european input-american
422 expected-output)
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.
428
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))
434 (unwind-protect
435 (progn
436 (set-time-zone-rule "CET")
437 (when input-iso
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"
443 "Saturday"]))
444 (setq calendar-date-style 'iso)
445 (icalendar-tests--do-test-export input-iso expected-output)))
446 (when input-european
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"
452 "Samstag"]))
453 (setq calendar-date-style 'european)
454 (icalendar-tests--do-test-export input-european expected-output)))
455 (when input-american
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"
461 "Saturday"]))
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))))
466
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")))
472 (unwind-protect
473 (progn
474 (with-temp-buffer
475 (insert input)
476 (icalendar-export-region (point-min) (point-max) temp-file))
477 (save-excursion
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
483 VERSION:2.0
484 BEGIN:VEVENT
485 UID:emacs[0-9]+
486 \\(\\(.\\|\n\\)+\\)
487 END:VEVENT
488 END:VCALENDAR
489 \\s-*$"
490 nil t))
491 (should (string-match
492 (concat "^\\s-*"
493 (regexp-quote (buffer-substring-no-properties
494 (match-beginning 1) (match-end 1)))
495 "\\s-*$")
496 expected-output)))
497 (t
498 (should (re-search-forward "^\\s-*BEGIN:VCALENDAR
499 PRODID:-//Emacs//NONSGML icalendar.el//EN
500 VERSION:2.0
501 END:VCALENDAR
502 \\s-*$"
503 nil t))))))
504 ;; cleanup!!
505 (kill-buffer (find-buffer-visiting temp-file))
506 (delete-file temp-file))))
507
508 (ert-deftest icalendar-export-ordinary-no-time ()
509 "Perform export test."
510
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 "
516 nil))
517
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
525 "))
526
527 (ert-deftest icalendar-export-ordinary ()
528 "Perform export test."
529
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
537 ")
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
545 ")
546
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
554 "))
555
556 (ert-deftest icalendar-export-multiline ()
557 "Perform export test."
558
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
569 SUMMARY:multiline
570 DESCRIPTION:
571 17:30 multiline continued FIXME
572 "))
573
574 (ert-deftest icalendar-export-weekly-by-day ()
575 "Perform export test."
576
577 ;; weekly by day
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
586 ")
587
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
596 "))
597
598 (ert-deftest icalendar-export-yearly ()
599 "Perform export test."
600 ;; yearly
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
609 "))
610
611 (ert-deftest icalendar-export-anniversary ()
612 "Perform export test."
613 ;; anniversaries
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
622 ")
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
631 "))
632
633 (ert-deftest icalendar-export-block ()
634 "Perform export test."
635 ;; block
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
643 ")
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
652 ")
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
661 "))
662
663 ;; ======================================================================
664 ;; Import tests
665 ;; ======================================================================
666
667 (defun icalendar-tests--test-import (input expected-iso expected-european
668 expected-american)
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")
676 (with-temp-buffer
677 (if (string-match "^BEGIN:VCALENDAR" input)
678 (insert input)
679 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
680 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
681 (insert input)
682 (unless (eq (char-before) ?\n)
683 (insert "\n"))
684 (insert "END:VEVENT\nEND:VCALENDAR\n"))
685 (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
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")
693 (icalendar-import-format-uid "\n UID: %s")
694 calendar-date-style)
695 (when expected-iso
696 (setq calendar-date-style 'iso)
697 (icalendar-tests--do-test-import input expected-iso))
698 (when expected-european
699 (setq calendar-date-style 'european)
700 (icalendar-tests--do-test-import input expected-european))
701 (when expected-american
702 (setq calendar-date-style 'american)
703 (icalendar-tests--do-test-import input expected-american))))
704 (set-time-zone-rule timezone)))
705
706 (defun icalendar-tests--do-test-import (input expected-output)
707 "Actually perform import test.
708 Argument INPUT input icalendar string.
709 Argument EXPECTED-OUTPUT expected diary string."
710 (let ((temp-file (make-temp-file "icalendar-test-diary")))
711 (icalendar-import-buffer temp-file t t)
712 (save-excursion
713 (find-file temp-file)
714 (let ((result (buffer-substring-no-properties (point-min) (point-max))))
715 (should (string= expected-output result)))
716 (kill-buffer (find-buffer-visiting temp-file))
717 (delete-file temp-file))))
718
719 (ert-deftest icalendar-import-non-recurring ()
720 "Perform standard import tests."
721 (icalendar-tests--test-import
722 "SUMMARY:non-recurring
723 DTSTART;VALUE=DATE-TIME:20030919T090000
724 DTEND;VALUE=DATE-TIME:20030919T113000"
725 "&2003/9/19 09:00-11:30 non-recurring\n"
726 "&19/9/2003 09:00-11:30 non-recurring\n"
727 "&9/19/2003 09:00-11:30 non-recurring\n")
728 (icalendar-tests--test-import
729 "SUMMARY:non-recurring allday
730 DTSTART;VALUE=DATE-TIME:20030919"
731 "&2003/9/19 non-recurring allday\n"
732 "&19/9/2003 non-recurring allday\n"
733 "&9/19/2003 non-recurring allday\n")
734 (icalendar-tests--test-import
735 ;; Checkdoc removes trailing blanks. Therefore: format!
736 (format "%s\n%s\n%s" "SUMMARY:long " " summary"
737 "DTSTART;VALUE=DATE:20030919")
738 "&2003/9/19 long summary\n"
739 "&19/9/2003 long summary\n"
740 "&9/19/2003 long summary\n")
741 (icalendar-tests--test-import
742 "UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
743 SUMMARY:Sommerferien
744 STATUS:TENTATIVE
745 CLASS:PRIVATE
746 X-MOZILLA-ALARM-DEFAULT-UNITS:Minuten
747 X-MOZILLA-RECUR-DEFAULT-INTERVAL:0
748 DTSTART;VALUE=DATE:20040719
749 DTEND;VALUE=DATE:20040828
750 DTSTAMP:20031103T011641Z
751 "
752 "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
753 Status: TENTATIVE
754 Class: PRIVATE
755 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
756 "
757 "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
758 Status: TENTATIVE
759 Class: PRIVATE
760 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
761 "
762 "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
763 Status: TENTATIVE
764 Class: PRIVATE
765 UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
766 ")
767 (icalendar-tests--test-import
768 "UID
769 :04979712-3902-11d9-93dd-8f9f4afe08da
770 SUMMARY
771 :folded summary
772 STATUS
773 :TENTATIVE
774 CLASS
775 :PRIVATE
776 X-MOZILLA-ALARM-DEFAULT-LENGTH
777 :0
778 DTSTART
779 :20041123T140000
780 DTEND
781 :20041123T143000
782 DTSTAMP
783 :20041118T013430Z
784 LAST-MODIFIED
785 :20041118T013640Z
786 "
787 "&2004/11/23 14:00-14:30 folded summary
788 Status: TENTATIVE
789 Class: PRIVATE
790 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
791 "&23/11/2004 14:00-14:30 folded summary
792 Status: TENTATIVE
793 Class: PRIVATE
794 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
795 "&11/23/2004 14:00-14:30 folded summary
796 Status: TENTATIVE
797 Class: PRIVATE
798 UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n")
799
800 (icalendar-tests--test-import
801 "UID
802 :6161a312-3902-11d9-b512-f764153bb28b
803 SUMMARY
804 :another example
805 STATUS
806 :TENTATIVE
807 CLASS
808 :PRIVATE
809 X-MOZILLA-ALARM-DEFAULT-LENGTH
810 :0
811 DTSTART
812 :20041123T144500
813 DTEND
814 :20041123T154500
815 DTSTAMP
816 :20041118T013641Z
817 "
818 "&2004/11/23 14:45-15:45 another example
819 Status: TENTATIVE
820 Class: PRIVATE
821 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
822 "&23/11/2004 14:45-15:45 another example
823 Status: TENTATIVE
824 Class: PRIVATE
825 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
826 "&11/23/2004 14:45-15:45 another example
827 Status: TENTATIVE
828 Class: PRIVATE
829 UID: 6161a312-3902-11d9-b512-f764153bb28b\n"))
830
831 (ert-deftest icalendar-import-rrule ()
832 (icalendar-tests--test-import
833 "SUMMARY:rrule daily
834 DTSTART;VALUE=DATE-TIME:20030919T090000
835 DTEND;VALUE=DATE-TIME:20030919T113000
836 RRULE:FREQ=DAILY;
837 "
838 "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
839 "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
840 "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
841 ;; RRULE examples
842 (icalendar-tests--test-import
843 "SUMMARY:rrule daily
844 DTSTART;VALUE=DATE-TIME:20030919T090000
845 DTEND;VALUE=DATE-TIME:20030919T113000
846 RRULE:FREQ=DAILY;INTERVAL=2
847 "
848 "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
849 "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
850 "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
851 (icalendar-tests--test-import
852 "SUMMARY:rrule daily with exceptions
853 DTSTART;VALUE=DATE-TIME:20030919T090000
854 DTEND;VALUE=DATE-TIME:20030919T113000
855 RRULE:FREQ=DAILY;INTERVAL=2
856 EXDATE:20030921,20030925
857 "
858 "&%%(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"
859 "&%%(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"
860 "&%%(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")
861 (icalendar-tests--test-import
862 "SUMMARY:rrule weekly
863 DTSTART;VALUE=DATE-TIME:20030919T090000
864 DTEND;VALUE=DATE-TIME:20030919T113000
865 RRULE:FREQ=WEEKLY;
866 "
867 "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
868 "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
869 "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
870 (icalendar-tests--test-import
871 "SUMMARY:rrule monthly no end
872 DTSTART;VALUE=DATE-TIME:20030919T090000
873 DTEND;VALUE=DATE-TIME:20030919T113000
874 RRULE:FREQ=MONTHLY;
875 "
876 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
877 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
878 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
879 (icalendar-tests--test-import
880 "SUMMARY:rrule monthly with end
881 DTSTART;VALUE=DATE-TIME:20030919T090000
882 DTEND;VALUE=DATE-TIME:20030919T113000
883 RRULE:FREQ=MONTHLY;UNTIL=20050819;
884 "
885 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
886 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
887 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
888 (icalendar-tests--test-import
889 "DTSTART;VALUE=DATE:20040815
890 DTEND;VALUE=DATE:20040816
891 SUMMARY:Maria Himmelfahrt
892 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
893 "
894 "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
895 "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
896 "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
897 (icalendar-tests--test-import
898 "SUMMARY:rrule yearly
899 DTSTART;VALUE=DATE-TIME:20030919T090000
900 DTEND;VALUE=DATE-TIME:20030919T113000
901 RRULE:FREQ=YEARLY;INTERVAL=2
902 "
903 "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
904 "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
905 "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
906 (icalendar-tests--test-import
907 "SUMMARY:rrule count daily short
908 DTSTART;VALUE=DATE-TIME:20030919T090000
909 DTEND;VALUE=DATE-TIME:20030919T113000
910 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
911 "
912 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
913 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
914 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
915 (icalendar-tests--test-import
916 "SUMMARY:rrule count daily long
917 DTSTART;VALUE=DATE-TIME:20030919T090000
918 DTEND;VALUE=DATE-TIME:20030919T113000
919 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
920 "
921 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
922 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
923 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
924 (icalendar-tests--test-import
925 "SUMMARY:rrule count bi-weekly 3 times
926 DTSTART;VALUE=DATE-TIME:20030919T090000
927 DTEND;VALUE=DATE-TIME:20030919T113000
928 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
929 "
930 "&%%(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"
931 "&%%(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"
932 "&%%(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")
933 (icalendar-tests--test-import
934 "SUMMARY:rrule count monthly
935 DTSTART;VALUE=DATE-TIME:20030919T090000
936 DTEND;VALUE=DATE-TIME:20030919T113000
937 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
938 "
939 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
940 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
941 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
942 (icalendar-tests--test-import
943 "SUMMARY:rrule count every second month
944 DTSTART;VALUE=DATE-TIME:20030919T090000
945 DTEND;VALUE=DATE-TIME:20030919T113000
946 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
947 "
948 "&%%(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
949 "&%%(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
950 "&%%(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
951 (icalendar-tests--test-import
952 "SUMMARY:rrule count yearly
953 DTSTART;VALUE=DATE-TIME:20030919T090000
954 DTEND;VALUE=DATE-TIME:20030919T113000
955 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
956 "
957 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
958 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
959 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
960 (icalendar-tests--test-import
961 "SUMMARY:rrule count every second year
962 DTSTART;VALUE=DATE-TIME:20030919T090000
963 DTEND;VALUE=DATE-TIME:20030919T113000
964 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
965 "
966 "&%%(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!!!
967 "&%%(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!!!
968 "&%%(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!!!
969 )
970
971 (ert-deftest icalendar-import-duration ()
972 ;; duration
973 (icalendar-tests--test-import
974 "DTSTART;VALUE=DATE:20050217
975 SUMMARY:duration
976 DURATION:P7D
977 "
978 "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
979 "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
980 "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
981 (icalendar-tests--test-import
982 "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
983 DTSTAMP:20041127T183315Z
984 LAST-MODIFIED:20041127T183329
985 SUMMARY:Urlaub
986 DTSTART;VALUE=DATE:20011221
987 DTEND;VALUE=DATE:20011221
988 RRULE:FREQ=DAILY;UNTIL=20011229;INTERVAL=1;WKST=SU
989 CLASS:PUBLIC
990 SEQUENCE:1
991 CREATED:20041127T183329
992 "
993 "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
994 Class: PUBLIC
995 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
996 "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
997 Class: PUBLIC
998 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
999 "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
1000 Class: PUBLIC
1001 UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"))
1002
1003 (ert-deftest icalendar-import-bug-6766 ()
1004 ;;bug#6766 -- multiple byday values in a weekly rrule
1005 (icalendar-tests--test-import
1006 "CLASS:PUBLIC
1007 DTEND;TZID=America/New_York:20100421T120000
1008 DTSTAMP:20100525T141214Z
1009 DTSTART;TZID=America/New_York:20100421T113000
1010 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,TH,FR
1011 SEQUENCE:1
1012 STATUS:CONFIRMED
1013 SUMMARY:Scrum
1014 TRANSP:OPAQUE
1015 UID:8814e3f9-7482-408f-996c-3bfe486a1262
1016 END:VEVENT
1017 BEGIN:VEVENT
1018 CLASS:PUBLIC
1019 DTSTAMP:20100525T141214Z
1020 DTSTART;VALUE=DATE:20100422
1021 DTEND;VALUE=DATE:20100423
1022 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
1023 SEQUENCE:1
1024 SUMMARY:Tues + Thurs thinking
1025 TRANSP:OPAQUE
1026 UID:8814e3f9-7482-408f-996c-3bfe486a1263
1027 "
1028 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
1029 Status: CONFIRMED
1030 Class: PUBLIC
1031 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1032 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
1033 Class: PUBLIC
1034 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1035 "
1036 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
1037 Status: CONFIRMED
1038 Class: PUBLIC
1039 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1040 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
1041 Class: PUBLIC
1042 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1043 "
1044 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
1045 Status: CONFIRMED
1046 Class: PUBLIC
1047 UID: 8814e3f9-7482-408f-996c-3bfe486a1262
1048 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
1049 Class: PUBLIC
1050 UID: 8814e3f9-7482-408f-996c-3bfe486a1263
1051 "))
1052
1053 (ert-deftest icalendar-import-multiple-vcalendars ()
1054 (icalendar-tests--test-import
1055 "DTSTART;VALUE=DATE:20110723
1056 SUMMARY:event-1
1057 "
1058 "&2011/7/23 event-1\n"
1059 "&23/7/2011 event-1\n"
1060 "&7/23/2011 event-1\n")
1061
1062 (icalendar-tests--test-import
1063 "BEGIN:VCALENDAR
1064 PRODID:-//Emacs//NONSGML icalendar.el//EN
1065 VERSION:2.0\nBEGIN:VEVENT
1066 DTSTART;VALUE=DATE:20110723
1067 SUMMARY:event-1
1068 END:VEVENT
1069 END:VCALENDAR
1070 BEGIN:VCALENDAR
1071 PRODID:-//Emacs//NONSGML icalendar.el//EN
1072 VERSION:2.0
1073 BEGIN:VEVENT
1074 DTSTART;VALUE=DATE:20110724
1075 SUMMARY:event-2
1076 END:VEVENT
1077 END:VCALENDAR
1078 BEGIN:VCALENDAR
1079 PRODID:-//Emacs//NONSGML icalendar.el//EN
1080 VERSION:2.0
1081 BEGIN:VEVENT
1082 DTSTART;VALUE=DATE:20110725
1083 SUMMARY:event-3a
1084 END:VEVENT
1085 BEGIN:VEVENT
1086 DTSTART;VALUE=DATE:20110725
1087 SUMMARY:event-3b
1088 END:VEVENT
1089 END:VCALENDAR
1090 "
1091 "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
1092 "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
1093 "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
1094
1095 (ert-deftest icalendar-import-with-uid ()
1096 "Perform import test with uid."
1097 (icalendar-tests--test-import
1098 "UID:1234567890uid
1099 SUMMARY:non-recurring
1100 DTSTART;VALUE=DATE-TIME:20030919T090000
1101 DTEND;VALUE=DATE-TIME:20030919T113000"
1102 "&2003/9/19 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
1103 "&19/9/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
1104 "&9/19/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"))
1105
1106 ;; ======================================================================
1107 ;; Cycle
1108 ;; ======================================================================
1109 (defun icalendar-tests--test-cycle (input)
1110 "Perform cycle test.
1111 Argument INPUT icalendar event string."
1112 (with-temp-buffer
1113 (if (string-match "^BEGIN:VCALENDAR" input)
1114 (insert input)
1115 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
1116 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
1117 (insert input)
1118 (unless (eq (char-before) ?\n)
1119 (insert "\n"))
1120 (insert "END:VEVENT\nEND:VCALENDAR\n"))
1121 (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
1122 (icalendar-import-format-summary "%s")
1123 (icalendar-import-format-location "\n Location: %s")
1124 (icalendar-import-format-description "\n Desc: %s")
1125 (icalendar-import-format-organizer "\n Organizer: %s")
1126 (icalendar-import-format-status "\n Status: %s")
1127 (icalendar-import-format-url "\n URL: %s")
1128 (icalendar-import-format-class "\n Class: %s")
1129 (icalendar-import-format-class "\n UID: %s"))
1130 (dolist (calendar-date-style '(iso european american))
1131 (icalendar-tests--do-test-cycle)))))
1132
1133 (defun icalendar-tests--do-test-cycle ()
1134 "Actually perform import/export cycle test."
1135 (let ((temp-diary (make-temp-file "icalendar-test-diary"))
1136 (temp-ics (make-temp-file "icalendar-test-ics"))
1137 (org-input (buffer-substring-no-properties (point-min) (point-max))))
1138
1139 (unwind-protect
1140 (progn
1141 ;; step 1: import
1142 (icalendar-import-buffer temp-diary t t)
1143
1144 ;; step 2: export what was just imported
1145 (save-excursion
1146 (find-file temp-diary)
1147 (icalendar-export-region (point-min) (point-max) temp-ics))
1148
1149 ;; compare the output of step 2 with the input of step 1
1150 (save-excursion
1151 (find-file temp-ics)
1152 (goto-char (point-min))
1153 ;;(when (re-search-forward "\nUID:.*\n" nil t)
1154 ;;(replace-match "\n"))
1155 (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
1156 (should (string= org-input cycled)))))
1157 ;; clean up
1158 (kill-buffer (find-buffer-visiting temp-diary))
1159 (save-excursion
1160 (set-buffer (find-buffer-visiting temp-ics))
1161 (set-buffer-modified-p nil)
1162 (kill-buffer (current-buffer)))
1163 (delete-file temp-diary)
1164 (delete-file temp-ics))))
1165
1166 (ert-deftest icalendar-cycle ()
1167 "Perform cycling tests.
1168 Take care to avoid auto-generated UIDs here."
1169 (icalendar-tests--test-cycle
1170 "UID:dummyuid
1171 DTSTART;VALUE=DATE-TIME:20030919T090000
1172 DTEND;VALUE=DATE-TIME:20030919T113000
1173 SUMMARY:Cycletest
1174 ")
1175 (icalendar-tests--test-cycle
1176 "UID:blah
1177 DTSTART;VALUE=DATE-TIME:20030919T090000
1178 DTEND;VALUE=DATE-TIME:20030919T113000
1179 SUMMARY:Cycletest
1180 DESCRIPTION:beschreibung!
1181 LOCATION:nowhere
1182 ORGANIZER:ulf
1183 ")
1184 (icalendar-tests--test-cycle
1185 "UID:4711
1186 DTSTART;VALUE=DATE:19190909
1187 DTEND;VALUE=DATE:19190910
1188 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
1189 SUMMARY:and diary-anniversary
1190 "))
1191
1192 ;; ======================================================================
1193 ;; Real world
1194 ;; ======================================================================
1195 (ert-deftest icalendar-real-world ()
1196 "Perform real-world tests, as gathered from problem reports."
1197 ;; 2003-05-29
1198 (icalendar-tests--test-import
1199 "BEGIN:VCALENDAR
1200 METHOD:REQUEST
1201 PRODID:Microsoft CDO for Microsoft Exchange
1202 VERSION:2.0
1203 BEGIN:VTIMEZONE
1204 TZID:Kolkata\, Chennai\, Mumbai\, New Delhi
1205 X-MICROSOFT-CDO-TZID:23
1206 BEGIN:STANDARD
1207 DTSTART:16010101T000000
1208 TZOFFSETFROM:+0530
1209 TZOFFSETTO:+0530
1210 END:STANDARD
1211 BEGIN:DAYLIGHT
1212 DTSTART:16010101T000000
1213 TZOFFSETFROM:+0530
1214 TZOFFSETTO:+0530
1215 END:DAYLIGHT
1216 END:VTIMEZONE
1217 BEGIN:VEVENT
1218 DTSTAMP:20030509T043439Z
1219 DTSTART;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T103000
1220 SUMMARY:On-Site Interview
1221 UID:040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000
1222 010000000DB823520692542408ED02D7023F9DFF9
1223 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Xxxxx
1224 xxx Xxxxxxxxxxxx\":MAILTO:xxxxxxxx@xxxxxxx.com
1225 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Yyyyyyy Y
1226 yyyy\":MAILTO:yyyyyyy@yyyyyyy.com
1227 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Zzzz Zzzz
1228 zz\":MAILTO:zzzzzz@zzzzzzz.com
1229 ORGANIZER;CN=\"Aaaaaa Aaaaa\":MAILTO:aaaaaaa@aaaaaaa.com
1230 LOCATION:Cccc
1231 DTEND;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T153000
1232 DESCRIPTION:10:30am - Blah
1233 SEQUENCE:0
1234 PRIORITY:5
1235 CLASS:
1236 CREATED:20030509T043439Z
1237 LAST-MODIFIED:20030509T043459Z
1238 STATUS:CONFIRMED
1239 TRANSP:OPAQUE
1240 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1241 X-MICROSOFT-CDO-INSTTYPE:0
1242 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1243 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1244 X-MICROSOFT-CDO-IMPORTANCE:1
1245 X-MICROSOFT-CDO-OWNERAPPTID:126441427
1246 BEGIN:VALARM
1247 ACTION:DISPLAY
1248 DESCRIPTION:REMINDER
1249 TRIGGER;RELATED=START:-PT00H15M00S
1250 END:VALARM
1251 END:VEVENT
1252 END:VCALENDAR"
1253 nil
1254 "&9/5/2003 10:30-15:30 On-Site Interview
1255 Desc: 10:30am - Blah
1256 Location: Cccc
1257 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1258 Status: CONFIRMED
1259 UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
1260 "
1261 "&5/9/2003 10:30-15:30 On-Site Interview
1262 Desc: 10:30am - Blah
1263 Location: Cccc
1264 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1265 Status: CONFIRMED
1266 UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
1267 ")
1268
1269 ;; 2003-06-18 a
1270 (icalendar-tests--test-import
1271 "DTSTAMP:20030618T195512Z
1272 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T110000
1273 SUMMARY:Dress Rehearsal for XXXX-XXXX
1274 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1275 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1276 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"AAAAA,AAA
1277 AA (A-AAAAAAA,ex1)\":MAILTO:aaaaa_aaaaa@aaaaa.com
1278 ORGANIZER;CN=\"ABCD,TECHTRAINING
1279 (A-Americas,exgen1)\":MAILTO:xxx@xxxxx.com
1280 LOCATION:555 or TN 555-5555 ID 5555 & NochWas (see below)
1281 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T120000
1282 DESCRIPTION:753 Zeichen hier radiert
1283 SEQUENCE:0
1284 PRIORITY:5
1285 CLASS:
1286 CREATED:20030618T195518Z
1287 LAST-MODIFIED:20030618T195527Z
1288 STATUS:CONFIRMED
1289 TRANSP:OPAQUE
1290 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1291 X-MICROSOFT-CDO-INSTTYPE:0
1292 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1293 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1294 X-MICROSOFT-CDO-IMPORTANCE:1
1295 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1296 BEGIN:VALARM
1297 ACTION:DISPLAY
1298 DESCRIPTION:REMINDER
1299 TRIGGER;RELATED=START:-PT00H15M00S
1300 END:VALARM"
1301 nil
1302 "&23/6/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1303 Desc: 753 Zeichen hier radiert
1304 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1305 Organizer: MAILTO:xxx@xxxxx.com
1306 Status: CONFIRMED
1307 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1308 "
1309 "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1310 Desc: 753 Zeichen hier radiert
1311 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1312 Organizer: MAILTO:xxx@xxxxx.com
1313 Status: CONFIRMED
1314 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1315 ")
1316 ;; 2003-06-18 b -- uses timezone
1317 (icalendar-tests--test-import
1318 "BEGIN:VCALENDAR
1319 METHOD:REQUEST
1320 PRODID:Microsoft CDO for Microsoft Exchange
1321 VERSION:2.0
1322 BEGIN:VTIMEZONE
1323 TZID:Mountain Time (US & Canada)
1324 X-MICROSOFT-CDO-TZID:12
1325 BEGIN:STANDARD
1326 DTSTART:16010101T020000
1327 TZOFFSETFROM:-0600
1328 TZOFFSETTO:-0700
1329 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
1330 END:STANDARD
1331 BEGIN:DAYLIGHT
1332 DTSTART:16010101T020000
1333 TZOFFSETFROM:-0700
1334 TZOFFSETTO:-0600
1335 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
1336 END:DAYLIGHT
1337 END:VTIMEZONE
1338 BEGIN:VEVENT
1339 DTSTAMP:20030618T230323Z
1340 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T090000
1341 SUMMARY:Updated: Dress Rehearsal for ABC01-15
1342 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1343 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1344 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;X-REPLYTIME=20030618T20
1345 0700Z;RSVP=TRUE;CN=\"AAAAA,AAAAAA
1346 \(A-AAAAAAA,ex1)\":MAILTO:aaaaaa_aaaaa@aaaaa
1347 .com
1348 ORGANIZER;CN=\"ABCD,TECHTRAINING
1349 \(A-Americas,exgen1)\":MAILTO:bbb@bbbbb.com
1350 LOCATION:123 or TN 123-1234 ID abcd & SonstWo (see below)
1351 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T100000
1352 DESCRIPTION:Viele Zeichen standen hier früher
1353 SEQUENCE:0
1354 PRIORITY:5
1355 CLASS:
1356 CREATED:20030618T230326Z
1357 LAST-MODIFIED:20030618T230335Z
1358 STATUS:CONFIRMED
1359 TRANSP:OPAQUE
1360 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1361 X-MICROSOFT-CDO-INSTTYPE:0
1362 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1363 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1364 X-MICROSOFT-CDO-IMPORTANCE:1
1365 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1366 BEGIN:VALARM
1367 ACTION:DISPLAY
1368 DESCRIPTION:REMINDER
1369 TRIGGER;RELATED=START:-PT00H15M00S
1370 END:VALARM
1371 END:VEVENT
1372 END:VCALENDAR"
1373 nil
1374 "&23/6/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1375 Desc: Viele Zeichen standen hier früher
1376 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1377 Organizer: MAILTO:bbb@bbbbb.com
1378 Status: CONFIRMED
1379 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1380 "
1381 "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1382 Desc: Viele Zeichen standen hier früher
1383 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1384 Organizer: MAILTO:bbb@bbbbb.com
1385 Status: CONFIRMED
1386 UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
1387 ")
1388 ;; export 2004-10-28 block entries
1389 (icalendar-tests--test-export
1390 nil
1391 nil
1392 "-*- mode: text; fill-column: 256;-*-
1393
1394 >>> block entries:
1395
1396 %%(diary-block 11 8 2004 11 10 2004) Nov 8-10 aa
1397 "
1398 "DTSTART;VALUE=DATE:20041108
1399 DTEND;VALUE=DATE:20041111
1400 SUMMARY:Nov 8-10 aa")
1401
1402 (icalendar-tests--test-export
1403 nil
1404 nil
1405 "%%(diary-block 12 13 2004 12 17 2004) Dec 13-17 bb"
1406 "DTSTART;VALUE=DATE:20041213
1407 DTEND;VALUE=DATE:20041218
1408 SUMMARY:Dec 13-17 bb")
1409
1410 (icalendar-tests--test-export
1411 nil
1412 nil
1413 "%%(diary-block 2 3 2005 2 4 2005) Feb 3-4 cc"
1414 "DTSTART;VALUE=DATE:20050203
1415 DTEND;VALUE=DATE:20050205
1416 SUMMARY:Feb 3-4 cc")
1417
1418 (icalendar-tests--test-export
1419 nil
1420 nil
1421 "%%(diary-block 4 24 2005 4 29 2005) April 24-29 dd"
1422 "DTSTART;VALUE=DATE:20050424
1423 DTEND;VALUE=DATE:20050430
1424 SUMMARY:April 24-29 dd
1425 ")
1426 (icalendar-tests--test-export
1427 nil
1428 nil
1429 "%%(diary-block 5 30 2005 6 1 2005) may 30 - June 1: ee"
1430 "DTSTART;VALUE=DATE:20050530
1431 DTEND;VALUE=DATE:20050602
1432 SUMMARY:may 30 - June 1: ee")
1433
1434 (icalendar-tests--test-export
1435 nil
1436 nil
1437 "%%(diary-block 6 6 2005 6 8 2005) ff"
1438 "DTSTART;VALUE=DATE:20050606
1439 DTEND;VALUE=DATE:20050609
1440 SUMMARY:ff")
1441
1442 ;; export 2004-10-28 anniversary entries
1443 (icalendar-tests--test-export
1444 nil
1445 nil
1446 "
1447 >>> anniversaries:
1448
1449 %%(diary-anniversary 3 28 1991) aa birthday (%d years old)"
1450 "DTSTART;VALUE=DATE:19910328
1451 DTEND;VALUE=DATE:19910329
1452 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=03;BYMONTHDAY=28
1453 SUMMARY:aa birthday (%d years old)
1454 ")
1455
1456 (icalendar-tests--test-export
1457 nil
1458 nil
1459 "%%(diary-anniversary 5 17 1957) bb birthday (%d years old)"
1460 "DTSTART;VALUE=DATE:19570517
1461 DTEND;VALUE=DATE:19570518
1462 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=05;BYMONTHDAY=17
1463 SUMMARY:bb birthday (%d years old)")
1464
1465 (icalendar-tests--test-export
1466 nil
1467 nil
1468 "%%(diary-anniversary 6 8 1997) cc birthday (%d years old)"
1469 "DTSTART;VALUE=DATE:19970608
1470 DTEND;VALUE=DATE:19970609
1471 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=08
1472 SUMMARY:cc birthday (%d years old)")
1473
1474 (icalendar-tests--test-export
1475 nil
1476 nil
1477 "%%(diary-anniversary 7 22 1983) dd (%d years ago...!)"
1478 "DTSTART;VALUE=DATE:19830722
1479 DTEND;VALUE=DATE:19830723
1480 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=07;BYMONTHDAY=22
1481 SUMMARY:dd (%d years ago...!)")
1482
1483 (icalendar-tests--test-export
1484 nil
1485 nil
1486 "%%(diary-anniversary 8 1 1988) ee birthday (%d years old)"
1487 "DTSTART;VALUE=DATE:19880801
1488 DTEND;VALUE=DATE:19880802
1489 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=08;BYMONTHDAY=01
1490 SUMMARY:ee birthday (%d years old)")
1491
1492 (icalendar-tests--test-export
1493 nil
1494 nil
1495 "%%(diary-anniversary 9 21 1957) ff birthday (%d years old)"
1496 "DTSTART;VALUE=DATE:19570921
1497 DTEND;VALUE=DATE:19570922
1498 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=21
1499 SUMMARY:ff birthday (%d years old)")
1500
1501
1502 ;; FIXME!
1503
1504 ;; export 2004-10-28 monthly, weekly entries
1505
1506 ;; (icalendar-tests--test-export
1507 ;; nil
1508 ;; "
1509 ;; >>> ------------ monthly:
1510
1511 ;; */27/* 10:00 blah blah"
1512 ;; "xxx")
1513
1514 (icalendar-tests--test-export
1515 nil
1516 nil
1517 ">>> ------------ my week:
1518
1519 Monday 13:00 MAC"
1520 "DTSTART;VALUE=DATE-TIME:20000103T130000
1521 DTEND;VALUE=DATE-TIME:20000103T140000
1522 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1523 SUMMARY:MAC")
1524
1525 (icalendar-tests--test-export
1526 nil
1527 nil
1528 "Monday 15:00 a1"
1529 "DTSTART;VALUE=DATE-TIME:20000103T150000
1530 DTEND;VALUE=DATE-TIME:20000103T160000
1531 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1532 SUMMARY:a1")
1533
1534
1535 (icalendar-tests--test-export
1536 nil
1537 nil
1538 "Monday 16:00-17:00 a2"
1539 "DTSTART;VALUE=DATE-TIME:20000103T160000
1540 DTEND;VALUE=DATE-TIME:20000103T170000
1541 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1542 SUMMARY:a2")
1543
1544 (icalendar-tests--test-export
1545 nil
1546 nil
1547 "Tuesday 11:30-13:00 a3"
1548 "DTSTART;VALUE=DATE-TIME:20000104T113000
1549 DTEND;VALUE=DATE-TIME:20000104T130000
1550 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1551 SUMMARY:a3")
1552
1553 (icalendar-tests--test-export
1554 nil
1555 nil
1556 "Tuesday 15:00 a4"
1557 "DTSTART;VALUE=DATE-TIME:20000104T150000
1558 DTEND;VALUE=DATE-TIME:20000104T160000
1559 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1560 SUMMARY:a4")
1561
1562 (icalendar-tests--test-export
1563 nil
1564 nil
1565 "Wednesday 13:00 a5"
1566 "DTSTART;VALUE=DATE-TIME:20000105T130000
1567 DTEND;VALUE=DATE-TIME:20000105T140000
1568 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1569 SUMMARY:a5")
1570
1571 (icalendar-tests--test-export
1572 nil
1573 nil
1574 "Wednesday 11:30-13:30 a6"
1575 "DTSTART;VALUE=DATE-TIME:20000105T113000
1576 DTEND;VALUE=DATE-TIME:20000105T133000
1577 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1578 SUMMARY:a6")
1579
1580 (icalendar-tests--test-export
1581 nil
1582 nil
1583 "Wednesday 15:00 s1"
1584 "DTSTART;VALUE=DATE-TIME:20000105T150000
1585 DTEND;VALUE=DATE-TIME:20000105T160000
1586 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1587 SUMMARY:s1")
1588
1589
1590 ;; export 2004-10-28 regular entries
1591 (icalendar-tests--test-export
1592 nil
1593 nil
1594 "
1595 >>> regular diary entries:
1596
1597 Oct 12 2004, 14:00 Tue: [2004-10-12] q1"
1598 "DTSTART;VALUE=DATE-TIME:20041012T140000
1599 DTEND;VALUE=DATE-TIME:20041012T150000
1600 SUMMARY:Tue: [2004-10-12] q1")
1601
1602 ;; 2004-11-19
1603 (icalendar-tests--test-import
1604 "BEGIN:VCALENDAR
1605 VERSION
1606 :2.0
1607 PRODID
1608 :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
1609 BEGIN:VEVENT
1610 SUMMARY
1611 :Jjjjj & Wwwww
1612 STATUS
1613 :TENTATIVE
1614 CLASS
1615 :PRIVATE
1616 X-MOZILLA-ALARM-DEFAULT-LENGTH
1617 :0
1618 DTSTART
1619 :20041123T140000
1620 DTEND
1621 :20041123T143000
1622 DTSTAMP
1623 :20041118T013430Z
1624 LAST-MODIFIED
1625 :20041118T013640Z
1626 END:VEVENT
1627 BEGIN:VEVENT
1628 SUMMARY
1629 :BB Aaaaaaaa Bbbbb
1630 STATUS
1631 :TENTATIVE
1632 CLASS
1633 :PRIVATE
1634 X-MOZILLA-ALARM-DEFAULT-LENGTH
1635 :0
1636 DTSTART
1637 :20041123T144500
1638 DTEND
1639 :20041123T154500
1640 DTSTAMP
1641 :20041118T013641Z
1642 END:VEVENT
1643 BEGIN:VEVENT
1644 SUMMARY
1645 :Hhhhhhhh
1646 STATUS
1647 :TENTATIVE
1648 CLASS
1649 :PRIVATE
1650 X-MOZILLA-ALARM-DEFAULT-LENGTH
1651 :0
1652 DTSTART
1653 :20041123T110000
1654 DTEND
1655 :20041123T120000
1656 DTSTAMP
1657 :20041118T013831Z
1658 END:VEVENT
1659 BEGIN:VEVENT
1660 SUMMARY
1661 :MMM Aaaaaaaaa
1662 STATUS
1663 :TENTATIVE
1664 CLASS
1665 :PRIVATE
1666 X-MOZILLA-ALARM-DEFAULT-LENGTH
1667 :0
1668 X-MOZILLA-RECUR-DEFAULT-INTERVAL
1669 :2
1670 RRULE
1671 :FREQ=WEEKLY;INTERVAL=2;BYDAY=FR
1672 DTSTART
1673 :20041112T140000
1674 DTEND
1675 :20041112T183000
1676 DTSTAMP
1677 :20041118T014117Z
1678 END:VEVENT
1679 BEGIN:VEVENT
1680 SUMMARY
1681 :Rrrr/Cccccc ii Aaaaaaaa
1682 DESCRIPTION
1683 :Vvvvv Rrrr aaa Cccccc
1684 STATUS
1685 :TENTATIVE
1686 CLASS
1687 :PRIVATE
1688 X-MOZILLA-ALARM-DEFAULT-LENGTH
1689 :0
1690 DTSTART
1691 ;VALUE=DATE
1692 :20041119
1693 DTEND
1694 ;VALUE=DATE
1695 :20041120
1696 DTSTAMP
1697 :20041118T013107Z
1698 LAST-MODIFIED
1699 :20041118T014203Z
1700 END:VEVENT
1701 BEGIN:VEVENT
1702 SUMMARY
1703 :Wwww aa hhhh
1704 STATUS
1705 :TENTATIVE
1706 CLASS
1707 :PRIVATE
1708 X-MOZILLA-ALARM-DEFAULT-LENGTH
1709 :0
1710 RRULE
1711 :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1712 DTSTART
1713 ;VALUE=DATE
1714 :20041101
1715 DTEND
1716 ;VALUE=DATE
1717 :20041102
1718 DTSTAMP
1719 :20041118T014045Z
1720 LAST-MODIFIED
1721 :20041118T023846Z
1722 END:VEVENT
1723 END:VCALENDAR
1724 "
1725 nil
1726 "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
1727 Status: TENTATIVE
1728 Class: PRIVATE
1729 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1730 Status: TENTATIVE
1731 Class: PRIVATE
1732 &23/11/2004 11:00-12:00 Hhhhhhhh
1733 Status: TENTATIVE
1734 Class: PRIVATE
1735 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
1736 Status: TENTATIVE
1737 Class: PRIVATE
1738 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
1739 Desc: Vvvvv Rrrr aaa Cccccc
1740 Status: TENTATIVE
1741 Class: PRIVATE
1742 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
1743 Status: TENTATIVE
1744 Class: PRIVATE
1745 "
1746 "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
1747 Status: TENTATIVE
1748 Class: PRIVATE
1749 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1750 Status: TENTATIVE
1751 Class: PRIVATE
1752 &11/23/2004 11:00-12:00 Hhhhhhhh
1753 Status: TENTATIVE
1754 Class: PRIVATE
1755 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
1756 Status: TENTATIVE
1757 Class: PRIVATE
1758 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
1759 Desc: Vvvvv Rrrr aaa Cccccc
1760 Status: TENTATIVE
1761 Class: PRIVATE
1762 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
1763 Status: TENTATIVE
1764 Class: PRIVATE
1765 ")
1766
1767 ;; 2004-09-09 pg
1768 (icalendar-tests--test-export
1769 "%%(diary-block 1 1 2004 4 1 2004) Urlaub"
1770 nil
1771 nil
1772 "DTSTART;VALUE=DATE:20040101
1773 DTEND;VALUE=DATE:20040105
1774 SUMMARY:Urlaub")
1775
1776 ;; 2004-10-25 pg
1777 (icalendar-tests--test-export
1778 nil
1779 "5 11 2004 Bla Fasel"
1780 nil
1781 "DTSTART;VALUE=DATE:20041105
1782 DTEND;VALUE=DATE:20041106
1783 SUMMARY:Bla Fasel")
1784
1785 ;; 2004-10-30 pg
1786 (icalendar-tests--test-export
1787 nil
1788 "2 Nov 2004 15:00-16:30 Zahnarzt"
1789 nil
1790 "DTSTART;VALUE=DATE-TIME:20041102T150000
1791 DTEND;VALUE=DATE-TIME:20041102T163000
1792 SUMMARY:Zahnarzt")
1793
1794 ;; 2005-02-07 lt
1795 (icalendar-tests--test-import
1796 "UID
1797 :b60d398e-1dd1-11b2-a159-cf8cb05139f4
1798 SUMMARY
1799 :Waitangi Day
1800 DESCRIPTION
1801 :abcdef
1802 CATEGORIES
1803 :Public Holiday
1804 STATUS
1805 :CONFIRMED
1806 CLASS
1807 :PRIVATE
1808 DTSTART
1809 ;VALUE=DATE
1810 :20050206
1811 DTEND
1812 ;VALUE=DATE
1813 :20050207
1814 DTSTAMP
1815 :20050128T011209Z"
1816 nil
1817 "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
1818 Desc: abcdef
1819 Status: CONFIRMED
1820 Class: PRIVATE
1821 UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
1822 "
1823 "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
1824 Desc: abcdef
1825 Status: CONFIRMED
1826 Class: PRIVATE
1827 UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
1828 ")
1829
1830 ;; 2005-03-01 lt
1831 (icalendar-tests--test-import
1832 "DTSTART;VALUE=DATE:20050217
1833 SUMMARY:Hhhhhh Aaaaa ii Aaaaaaaa
1834 UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
1835 DTSTAMP:20050118T210335Z
1836 DURATION:P7D"
1837 nil
1838 "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
1839 UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n"
1840 "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
1841 UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n")
1842
1843 ;; 2005-03-23 lt
1844 (icalendar-tests--test-export
1845 nil
1846 "&%%(diary-cyclic 7 8 2 2005) 16:00-16:45 [WORK] Pppp"
1847 nil
1848 "DTSTART;VALUE=DATE-TIME:20050208T160000
1849 DTEND;VALUE=DATE-TIME:20050208T164500
1850 RRULE:FREQ=DAILY;INTERVAL=7
1851 SUMMARY:[WORK] Pppp
1852 ")
1853
1854 ;; 2005-05-27 eu
1855 (icalendar-tests--test-export
1856 nil
1857 nil
1858 ;; FIXME: colon not allowed!
1859 ;;"Nov 1: NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1860 "Nov 1 NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1861 "DTSTART;VALUE=DATE:19001101
1862 DTEND;VALUE=DATE:19001102
1863 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
1864 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
1865 ")
1866 )
1867
1868 (provide 'icalendar-tests)
1869 ;;; icalendar-tests.el ends here