]> code.delx.au - gnu-emacs/blob - test/automated/icalendar-tests.el
503ea22d2b82bccf2c7c2daf323ceae7a9b623c0
[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")
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 calendar-date-style)
694 (when expected-iso
695 (setq calendar-date-style 'iso)
696 (icalendar-tests--do-test-import input expected-iso))
697 (when expected-european
698 (setq calendar-date-style 'european)
699 (icalendar-tests--do-test-import input expected-european))
700 (when expected-american
701 (setq calendar-date-style 'american)
702 (icalendar-tests--do-test-import input expected-american))))
703 (set-time-zone-rule timezone)))
704
705 (defun icalendar-tests--do-test-import (input expected-output)
706 "Actually perform import test.
707 Argument INPUT input icalendar string.
708 Argument EXPECTED-OUTPUT expected diary string."
709 (let ((temp-file (make-temp-file "icalendar-test-diary")))
710 (icalendar-import-buffer temp-file t t)
711 (save-excursion
712 (find-file temp-file)
713 (let ((result (buffer-substring-no-properties (point-min) (point-max))))
714 (should (string= expected-output result)))
715 (kill-buffer (find-buffer-visiting temp-file))
716 (delete-file temp-file))))
717
718 (ert-deftest icalendar-import-non-recurring ()
719 "Perform standard import tests."
720 (icalendar-tests--test-import
721 "SUMMARY:non-recurring
722 DTSTART;VALUE=DATE-TIME:20030919T090000
723 DTEND;VALUE=DATE-TIME:20030919T113000"
724 "&2003/9/19 09:00-11:30 non-recurring\n"
725 "&19/9/2003 09:00-11:30 non-recurring\n"
726 "&9/19/2003 09:00-11:30 non-recurring\n")
727 (icalendar-tests--test-import
728 "SUMMARY:non-recurring allday
729 DTSTART;VALUE=DATE-TIME:20030919"
730 "&2003/9/19 non-recurring allday\n"
731 "&19/9/2003 non-recurring allday\n"
732 "&9/19/2003 non-recurring allday\n")
733 (icalendar-tests--test-import
734 ;; Checkdoc removes trailing blanks. Therefore: format!
735 (format "%s\n%s\n%s" "SUMMARY:long " " summary"
736 "DTSTART;VALUE=DATE:20030919")
737 "&2003/9/19 long summary\n"
738 "&19/9/2003 long summary\n"
739 "&9/19/2003 long summary\n")
740 (icalendar-tests--test-import
741 "UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
742 SUMMARY:Sommerferien
743 STATUS:TENTATIVE
744 CLASS:PRIVATE
745 X-MOZILLA-ALARM-DEFAULT-UNITS:Minuten
746 X-MOZILLA-RECUR-DEFAULT-INTERVAL:0
747 DTSTART;VALUE=DATE:20040719
748 DTEND;VALUE=DATE:20040828
749 DTSTAMP:20031103T011641Z
750 "
751 "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
752 Status: TENTATIVE
753 Class: PRIVATE
754 "
755 "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
756 Status: TENTATIVE
757 Class: PRIVATE
758 "
759 "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
760 Status: TENTATIVE
761 Class: PRIVATE
762 ")
763 (icalendar-tests--test-import
764 "UID
765 :04979712-3902-11d9-93dd-8f9f4afe08da
766 SUMMARY
767 :folded summary
768 STATUS
769 :TENTATIVE
770 CLASS
771 :PRIVATE
772 X-MOZILLA-ALARM-DEFAULT-LENGTH
773 :0
774 DTSTART
775 :20041123T140000
776 DTEND
777 :20041123T143000
778 DTSTAMP
779 :20041118T013430Z
780 LAST-MODIFIED
781 :20041118T013640Z
782 "
783 "&2004/11/23 14:00-14:30 folded summary
784 Status: TENTATIVE
785 Class: PRIVATE\n"
786 "&23/11/2004 14:00-14:30 folded summary
787 Status: TENTATIVE
788 Class: PRIVATE\n"
789 "&11/23/2004 14:00-14:30 folded summary
790 Status: TENTATIVE
791 Class: PRIVATE\n")
792
793 (icalendar-tests--test-import
794 "UID
795 :6161a312-3902-11d9-b512-f764153bb28b
796 SUMMARY
797 :another example
798 STATUS
799 :TENTATIVE
800 CLASS
801 :PRIVATE
802 X-MOZILLA-ALARM-DEFAULT-LENGTH
803 :0
804 DTSTART
805 :20041123T144500
806 DTEND
807 :20041123T154500
808 DTSTAMP
809 :20041118T013641Z
810 "
811 "&2004/11/23 14:45-15:45 another example
812 Status: TENTATIVE
813 Class: PRIVATE\n"
814 "&23/11/2004 14:45-15:45 another example
815 Status: TENTATIVE
816 Class: PRIVATE\n"
817 "&11/23/2004 14:45-15:45 another example
818 Status: TENTATIVE
819 Class: PRIVATE\n"))
820
821 (ert-deftest icalendar-import-rrule ()
822 (icalendar-tests--test-import
823 "SUMMARY:rrule daily
824 DTSTART;VALUE=DATE-TIME:20030919T090000
825 DTEND;VALUE=DATE-TIME:20030919T113000
826 RRULE:FREQ=DAILY;
827 "
828 "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
829 "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
830 "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
831 ;; RRULE examples
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;INTERVAL=2
837 "
838 "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
839 "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
840 "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
841 (icalendar-tests--test-import
842 "SUMMARY:rrule daily with exceptions
843 DTSTART;VALUE=DATE-TIME:20030919T090000
844 DTEND;VALUE=DATE-TIME:20030919T113000
845 RRULE:FREQ=DAILY;INTERVAL=2
846 EXDATE:20030921,20030925
847 "
848 "&%%(and (not (diary-date 2003 9 25)) (not (diary-date 2003 9 21)) (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily with exceptions\n"
849 "&%%(and (not (diary-date 25 9 2003)) (not (diary-date 21 9 2003)) (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily with exceptions\n"
850 "&%%(and (not (diary-date 9 25 2003)) (not (diary-date 9 21 2003)) (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily with exceptions\n")
851 (icalendar-tests--test-import
852 "SUMMARY:rrule weekly
853 DTSTART;VALUE=DATE-TIME:20030919T090000
854 DTEND;VALUE=DATE-TIME:20030919T113000
855 RRULE:FREQ=WEEKLY;
856 "
857 "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
858 "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
859 "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
860 (icalendar-tests--test-import
861 "SUMMARY:rrule monthly no end
862 DTSTART;VALUE=DATE-TIME:20030919T090000
863 DTEND;VALUE=DATE-TIME:20030919T113000
864 RRULE:FREQ=MONTHLY;
865 "
866 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
867 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
868 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
869 (icalendar-tests--test-import
870 "SUMMARY:rrule monthly with end
871 DTSTART;VALUE=DATE-TIME:20030919T090000
872 DTEND;VALUE=DATE-TIME:20030919T113000
873 RRULE:FREQ=MONTHLY;UNTIL=20050819;
874 "
875 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
876 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
877 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
878 (icalendar-tests--test-import
879 "DTSTART;VALUE=DATE:20040815
880 DTEND;VALUE=DATE:20040816
881 SUMMARY:Maria Himmelfahrt
882 UID:CC56BEA6-49D2-11D8-8833-00039386D1C2-RID
883 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
884 "
885 "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
886 "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
887 "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
888 (icalendar-tests--test-import
889 "SUMMARY:rrule yearly
890 DTSTART;VALUE=DATE-TIME:20030919T090000
891 DTEND;VALUE=DATE-TIME:20030919T113000
892 RRULE:FREQ=YEARLY;INTERVAL=2
893 "
894 "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
895 "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
896 "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
897 (icalendar-tests--test-import
898 "SUMMARY:rrule count daily short
899 DTSTART;VALUE=DATE-TIME:20030919T090000
900 DTEND;VALUE=DATE-TIME:20030919T113000
901 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
902 "
903 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
904 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
905 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
906 (icalendar-tests--test-import
907 "SUMMARY:rrule count daily long
908 DTSTART;VALUE=DATE-TIME:20030919T090000
909 DTEND;VALUE=DATE-TIME:20030919T113000
910 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
911 "
912 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
913 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
914 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
915 (icalendar-tests--test-import
916 "SUMMARY:rrule count bi-weekly 3 times
917 DTSTART;VALUE=DATE-TIME:20030919T090000
918 DTEND;VALUE=DATE-TIME:20030919T113000
919 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
920 "
921 "&%%(and (diary-cyclic 14 2003 9 19) (diary-block 2003 9 19 2003 10 31)) 09:00-11:30 rrule count bi-weekly 3 times\n"
922 "&%%(and (diary-cyclic 14 19 9 2003) (diary-block 19 9 2003 31 10 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n"
923 "&%%(and (diary-cyclic 14 9 19 2003) (diary-block 9 19 2003 10 31 2003)) 09:00-11:30 rrule count bi-weekly 3 times\n")
924 (icalendar-tests--test-import
925 "SUMMARY:rrule count monthly
926 DTSTART;VALUE=DATE-TIME:20030919T090000
927 DTEND;VALUE=DATE-TIME:20030919T113000
928 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
929 "
930 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
931 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
932 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
933 (icalendar-tests--test-import
934 "SUMMARY:rrule count every second month
935 DTSTART;VALUE=DATE-TIME:20030919T090000
936 DTEND;VALUE=DATE-TIME:20030919T113000
937 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
938 "
939 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 5 19)) 09:00-11:30 rrule count every second month\n" ;FIXME
940 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 5 2004)) 09:00-11:30 rrule count every second month\n" ;FIXME
941 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 5 19 2004)) 09:00-11:30 rrule count every second month\n") ;FIXME
942 (icalendar-tests--test-import
943 "SUMMARY:rrule count yearly
944 DTSTART;VALUE=DATE-TIME:20030919T090000
945 DTEND;VALUE=DATE-TIME:20030919T113000
946 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
947 "
948 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
949 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
950 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
951 (icalendar-tests--test-import
952 "SUMMARY:rrule count every second year
953 DTSTART;VALUE=DATE-TIME:20030919T090000
954 DTEND;VALUE=DATE-TIME:20030919T113000
955 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
956 "
957 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2011 9 19)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
958 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2011)) 09:00-11:30 rrule count every second year\n" ;FIXME!!!
959 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2011)) 09:00-11:30 rrule count every second year\n") ;FIXME!!!
960 )
961
962 (ert-deftest icalendar-import-duration ()
963 ;; duration
964 (icalendar-tests--test-import
965 "DTSTART;VALUE=DATE:20050217
966 SUMMARY:duration
967 DURATION:P7D
968 "
969 "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
970 "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
971 "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
972 (icalendar-tests--test-import
973 "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
974 DTSTAMP:20041127T183315Z
975 LAST-MODIFIED:20041127T183329
976 SUMMARY:Urlaub
977 DTSTART;VALUE=DATE:20011221
978 DTEND;VALUE=DATE:20011221
979 RRULE:FREQ=DAILY;UNTIL=20011229;INTERVAL=1;WKST=SU
980 CLASS:PUBLIC
981 SEQUENCE:1
982 CREATED:20041127T183329
983 "
984 "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
985 Class: PUBLIC\n"
986 "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
987 Class: PUBLIC\n"
988 "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
989 Class: PUBLIC\n"))
990
991 (ert-deftest icalendar-import-bug-6766 ()
992 ;;bug#6766 -- multiple byday values in a weekly rrule
993 (icalendar-tests--test-import
994 "CLASS:PUBLIC
995 DTEND;TZID=America/New_York:20100421T120000
996 DTSTAMP:20100525T141214Z
997 DTSTART;TZID=America/New_York:20100421T113000
998 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,TH,FR
999 SEQUENCE:1
1000 STATUS:CONFIRMED
1001 SUMMARY:Scrum
1002 TRANSP:OPAQUE
1003 UID:8814e3f9-7482-408f-996c-3bfe486a1262
1004 END:VEVENT
1005 BEGIN:VEVENT
1006 CLASS:PUBLIC
1007 DTSTAMP:20100525T141214Z
1008 DTSTART;VALUE=DATE:20100422
1009 DTEND;VALUE=DATE:20100423
1010 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
1011 SEQUENCE:1
1012 SUMMARY:Tues + Thurs thinking
1013 TRANSP:OPAQUE
1014 UID:8814e3f9-7482-408f-996c-3bfe486a1263
1015 "
1016 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
1017 Status: CONFIRMED
1018 Class: PUBLIC
1019 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
1020 Class: PUBLIC
1021 "
1022 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
1023 Status: CONFIRMED
1024 Class: PUBLIC
1025 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
1026 Class: PUBLIC
1027 "
1028 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
1029 Status: CONFIRMED
1030 Class: PUBLIC
1031 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
1032 Class: PUBLIC
1033 "))
1034
1035 (ert-deftest icalendar-import-multiple-vcalendars ()
1036 (icalendar-tests--test-import
1037 "DTSTART;VALUE=DATE:20110723
1038 SUMMARY:event-1
1039 "
1040 "&2011/7/23 event-1\n"
1041 "&23/7/2011 event-1\n"
1042 "&7/23/2011 event-1\n")
1043
1044 (icalendar-tests--test-import
1045 "BEGIN:VCALENDAR
1046 PRODID:-//Emacs//NONSGML icalendar.el//EN
1047 VERSION:2.0\nBEGIN:VEVENT
1048 DTSTART;VALUE=DATE:20110723
1049 SUMMARY:event-1
1050 END:VEVENT
1051 END:VCALENDAR
1052 BEGIN:VCALENDAR
1053 PRODID:-//Emacs//NONSGML icalendar.el//EN
1054 VERSION:2.0
1055 BEGIN:VEVENT
1056 DTSTART;VALUE=DATE:20110724
1057 SUMMARY:event-2
1058 END:VEVENT
1059 END:VCALENDAR
1060 BEGIN:VCALENDAR
1061 PRODID:-//Emacs//NONSGML icalendar.el//EN
1062 VERSION:2.0
1063 BEGIN:VEVENT
1064 DTSTART;VALUE=DATE:20110725
1065 SUMMARY:event-3a
1066 END:VEVENT
1067 BEGIN:VEVENT
1068 DTSTART;VALUE=DATE:20110725
1069 SUMMARY:event-3b
1070 END:VEVENT
1071 END:VCALENDAR
1072 "
1073 "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
1074 "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
1075 "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
1076
1077 ;; ======================================================================
1078 ;; Cycle
1079 ;; ======================================================================
1080 (defun icalendar-tests--test-cycle (input)
1081 "Perform cycle test.
1082 Argument INPUT icalendar event string."
1083 (with-temp-buffer
1084 (if (string-match "^BEGIN:VCALENDAR" input)
1085 (insert input)
1086 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
1087 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
1088 (insert input)
1089 (unless (eq (char-before) ?\n)
1090 (insert "\n"))
1091 (insert "END:VEVENT\nEND:VCALENDAR\n"))
1092 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
1093 (icalendar-import-format-summary "%s")
1094 (icalendar-import-format-location "\n Location: %s")
1095 (icalendar-import-format-description "\n Desc: %s")
1096 (icalendar-import-format-organizer "\n Organizer: %s")
1097 (icalendar-import-format-status "\n Status: %s")
1098 (icalendar-import-format-url "\n URL: %s")
1099 (icalendar-import-format-class "\n Class: %s"))
1100 (dolist (calendar-date-style '(iso european american))
1101 (icalendar-tests--do-test-cycle)))))
1102
1103 (defun icalendar-tests--do-test-cycle ()
1104 "Actually perform import/export cycle test."
1105 (let ((temp-diary (make-temp-file "icalendar-test-diary"))
1106 (temp-ics (make-temp-file "icalendar-test-ics"))
1107 (org-input (buffer-substring-no-properties (point-min) (point-max))))
1108
1109 (unwind-protect
1110 (progn
1111 ;; step 1: import
1112 (icalendar-import-buffer temp-diary t t)
1113
1114 ;; step 2: export what was just imported
1115 (save-excursion
1116 (find-file temp-diary)
1117 (icalendar-export-region (point-min) (point-max) temp-ics))
1118
1119 ;; compare the output of step 2 with the input of step 1
1120 (save-excursion
1121 (find-file temp-ics)
1122 (goto-char (point-min))
1123 (when (re-search-forward "\nUID:.*\n" nil t)
1124 (replace-match "\n"))
1125 (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
1126 (should (string= org-input cycled)))))
1127 ;; clean up
1128 (kill-buffer (find-buffer-visiting temp-diary))
1129 (save-excursion
1130 (set-buffer (find-buffer-visiting temp-ics))
1131 (set-buffer-modified-p nil)
1132 (kill-buffer (current-buffer)))
1133 (delete-file temp-diary)
1134 (delete-file temp-ics))))
1135
1136 (ert-deftest icalendar-cycle ()
1137 "Perform cycling tests."
1138 (icalendar-tests--test-cycle
1139 "DTSTART;VALUE=DATE-TIME:20030919T090000
1140 DTEND;VALUE=DATE-TIME:20030919T113000
1141 SUMMARY:Cycletest
1142 ")
1143 (icalendar-tests--test-cycle
1144 "DTSTART;VALUE=DATE-TIME:20030919T090000
1145 DTEND;VALUE=DATE-TIME:20030919T113000
1146 SUMMARY:Cycletest
1147 DESCRIPTION:beschreibung!
1148 LOCATION:nowhere
1149 ORGANIZER:ulf
1150 ")
1151 (icalendar-tests--test-cycle
1152 "DTSTART;VALUE=DATE:19190909
1153 DTEND;VALUE=DATE:19190910
1154 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
1155 SUMMARY:and diary-anniversary
1156 "))
1157
1158 ;; ======================================================================
1159 ;; Real world
1160 ;; ======================================================================
1161 (ert-deftest icalendar-real-world ()
1162 "Perform real-world tests, as gathered from problem reports."
1163 ;; 2003-05-29
1164 (icalendar-tests--test-import
1165 "BEGIN:VCALENDAR
1166 METHOD:REQUEST
1167 PRODID:Microsoft CDO for Microsoft Exchange
1168 VERSION:2.0
1169 BEGIN:VTIMEZONE
1170 TZID:Kolkata\, Chennai\, Mumbai\, New Delhi
1171 X-MICROSOFT-CDO-TZID:23
1172 BEGIN:STANDARD
1173 DTSTART:16010101T000000
1174 TZOFFSETFROM:+0530
1175 TZOFFSETTO:+0530
1176 END:STANDARD
1177 BEGIN:DAYLIGHT
1178 DTSTART:16010101T000000
1179 TZOFFSETFROM:+0530
1180 TZOFFSETTO:+0530
1181 END:DAYLIGHT
1182 END:VTIMEZONE
1183 BEGIN:VEVENT
1184 DTSTAMP:20030509T043439Z
1185 DTSTART;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T103000
1186 SUMMARY:On-Site Interview
1187 UID:040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000
1188 010000000DB823520692542408ED02D7023F9DFF9
1189 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Xxxxx
1190 xxx Xxxxxxxxxxxx\":MAILTO:xxxxxxxx@xxxxxxx.com
1191 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Yyyyyyy Y
1192 yyyy\":MAILTO:yyyyyyy@yyyyyyy.com
1193 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Zzzz Zzzz
1194 zz\":MAILTO:zzzzzz@zzzzzzz.com
1195 ORGANIZER;CN=\"Aaaaaa Aaaaa\":MAILTO:aaaaaaa@aaaaaaa.com
1196 LOCATION:Cccc
1197 DTEND;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T153000
1198 DESCRIPTION:10:30am - Blah
1199 SEQUENCE:0
1200 PRIORITY:5
1201 CLASS:
1202 CREATED:20030509T043439Z
1203 LAST-MODIFIED:20030509T043459Z
1204 STATUS:CONFIRMED
1205 TRANSP:OPAQUE
1206 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1207 X-MICROSOFT-CDO-INSTTYPE:0
1208 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1209 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1210 X-MICROSOFT-CDO-IMPORTANCE:1
1211 X-MICROSOFT-CDO-OWNERAPPTID:126441427
1212 BEGIN:VALARM
1213 ACTION:DISPLAY
1214 DESCRIPTION:REMINDER
1215 TRIGGER;RELATED=START:-PT00H15M00S
1216 END:VALARM
1217 END:VEVENT
1218 END:VCALENDAR"
1219 nil
1220 "&9/5/2003 10:30-15:30 On-Site Interview
1221 Desc: 10:30am - Blah
1222 Location: Cccc
1223 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1224 Status: CONFIRMED
1225 "
1226 "&5/9/2003 10:30-15:30 On-Site Interview
1227 Desc: 10:30am - Blah
1228 Location: Cccc
1229 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1230 Status: CONFIRMED
1231 ")
1232
1233 ;; 2003-06-18 a
1234 (icalendar-tests--test-import
1235 "DTSTAMP:20030618T195512Z
1236 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T110000
1237 SUMMARY:Dress Rehearsal for XXXX-XXXX
1238 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1239 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1240 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"AAAAA,AAA
1241 AA (A-AAAAAAA,ex1)\":MAILTO:aaaaa_aaaaa@aaaaa.com
1242 ORGANIZER;CN=\"ABCD,TECHTRAINING
1243 (A-Americas,exgen1)\":MAILTO:xxx@xxxxx.com
1244 LOCATION:555 or TN 555-5555 ID 5555 & NochWas (see below)
1245 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T120000
1246 DESCRIPTION:753 Zeichen hier radiert
1247 SEQUENCE:0
1248 PRIORITY:5
1249 CLASS:
1250 CREATED:20030618T195518Z
1251 LAST-MODIFIED:20030618T195527Z
1252 STATUS:CONFIRMED
1253 TRANSP:OPAQUE
1254 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1255 X-MICROSOFT-CDO-INSTTYPE:0
1256 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1257 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1258 X-MICROSOFT-CDO-IMPORTANCE:1
1259 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1260 BEGIN:VALARM
1261 ACTION:DISPLAY
1262 DESCRIPTION:REMINDER
1263 TRIGGER;RELATED=START:-PT00H15M00S
1264 END:VALARM"
1265 nil
1266 "&23/6/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1267 Desc: 753 Zeichen hier radiert
1268 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1269 Organizer: MAILTO:xxx@xxxxx.com
1270 Status: CONFIRMED
1271 "
1272 "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1273 Desc: 753 Zeichen hier radiert
1274 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1275 Organizer: MAILTO:xxx@xxxxx.com
1276 Status: CONFIRMED
1277 ")
1278 ;; 2003-06-18 b -- uses timezone
1279 (icalendar-tests--test-import
1280 "BEGIN:VCALENDAR
1281 METHOD:REQUEST
1282 PRODID:Microsoft CDO for Microsoft Exchange
1283 VERSION:2.0
1284 BEGIN:VTIMEZONE
1285 TZID:Mountain Time (US & Canada)
1286 X-MICROSOFT-CDO-TZID:12
1287 BEGIN:STANDARD
1288 DTSTART:16010101T020000
1289 TZOFFSETFROM:-0600
1290 TZOFFSETTO:-0700
1291 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
1292 END:STANDARD
1293 BEGIN:DAYLIGHT
1294 DTSTART:16010101T020000
1295 TZOFFSETFROM:-0700
1296 TZOFFSETTO:-0600
1297 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
1298 END:DAYLIGHT
1299 END:VTIMEZONE
1300 BEGIN:VEVENT
1301 DTSTAMP:20030618T230323Z
1302 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T090000
1303 SUMMARY:Updated: Dress Rehearsal for ABC01-15
1304 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1305 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1306 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;X-REPLYTIME=20030618T20
1307 0700Z;RSVP=TRUE;CN=\"AAAAA,AAAAAA
1308 \(A-AAAAAAA,ex1)\":MAILTO:aaaaaa_aaaaa@aaaaa
1309 .com
1310 ORGANIZER;CN=\"ABCD,TECHTRAINING
1311 \(A-Americas,exgen1)\":MAILTO:bbb@bbbbb.com
1312 LOCATION:123 or TN 123-1234 ID abcd & SonstWo (see below)
1313 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T100000
1314 DESCRIPTION:Viele Zeichen standen hier früher
1315 SEQUENCE:0
1316 PRIORITY:5
1317 CLASS:
1318 CREATED:20030618T230326Z
1319 LAST-MODIFIED:20030618T230335Z
1320 STATUS:CONFIRMED
1321 TRANSP:OPAQUE
1322 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1323 X-MICROSOFT-CDO-INSTTYPE:0
1324 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1325 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1326 X-MICROSOFT-CDO-IMPORTANCE:1
1327 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1328 BEGIN:VALARM
1329 ACTION:DISPLAY
1330 DESCRIPTION:REMINDER
1331 TRIGGER;RELATED=START:-PT00H15M00S
1332 END:VALARM
1333 END:VEVENT
1334 END:VCALENDAR"
1335 nil
1336 "&23/6/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1337 Desc: Viele Zeichen standen hier früher
1338 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1339 Organizer: MAILTO:bbb@bbbbb.com
1340 Status: CONFIRMED
1341 "
1342 "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1343 Desc: Viele Zeichen standen hier früher
1344 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1345 Organizer: MAILTO:bbb@bbbbb.com
1346 Status: CONFIRMED
1347 ")
1348 ;; export 2004-10-28 block entries
1349 (icalendar-tests--test-export
1350 nil
1351 nil
1352 "-*- mode: text; fill-column: 256;-*-
1353
1354 >>> block entries:
1355
1356 %%(diary-block 11 8 2004 11 10 2004) Nov 8-10 aa
1357 "
1358 "DTSTART;VALUE=DATE:20041108
1359 DTEND;VALUE=DATE:20041111
1360 SUMMARY:Nov 8-10 aa")
1361
1362 (icalendar-tests--test-export
1363 nil
1364 nil
1365 "%%(diary-block 12 13 2004 12 17 2004) Dec 13-17 bb"
1366 "DTSTART;VALUE=DATE:20041213
1367 DTEND;VALUE=DATE:20041218
1368 SUMMARY:Dec 13-17 bb")
1369
1370 (icalendar-tests--test-export
1371 nil
1372 nil
1373 "%%(diary-block 2 3 2005 2 4 2005) Feb 3-4 cc"
1374 "DTSTART;VALUE=DATE:20050203
1375 DTEND;VALUE=DATE:20050205
1376 SUMMARY:Feb 3-4 cc")
1377
1378 (icalendar-tests--test-export
1379 nil
1380 nil
1381 "%%(diary-block 4 24 2005 4 29 2005) April 24-29 dd"
1382 "DTSTART;VALUE=DATE:20050424
1383 DTEND;VALUE=DATE:20050430
1384 SUMMARY:April 24-29 dd
1385 ")
1386 (icalendar-tests--test-export
1387 nil
1388 nil
1389 "%%(diary-block 5 30 2005 6 1 2005) may 30 - June 1: ee"
1390 "DTSTART;VALUE=DATE:20050530
1391 DTEND;VALUE=DATE:20050602
1392 SUMMARY:may 30 - June 1: ee")
1393
1394 (icalendar-tests--test-export
1395 nil
1396 nil
1397 "%%(diary-block 6 6 2005 6 8 2005) ff"
1398 "DTSTART;VALUE=DATE:20050606
1399 DTEND;VALUE=DATE:20050609
1400 SUMMARY:ff")
1401
1402 ;; export 2004-10-28 anniversary entries
1403 (icalendar-tests--test-export
1404 nil
1405 nil
1406 "
1407 >>> anniversaries:
1408
1409 %%(diary-anniversary 3 28 1991) aa birthday (%d years old)"
1410 "DTSTART;VALUE=DATE:19910328
1411 DTEND;VALUE=DATE:19910329
1412 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=03;BYMONTHDAY=28
1413 SUMMARY:aa birthday (%d years old)
1414 ")
1415
1416 (icalendar-tests--test-export
1417 nil
1418 nil
1419 "%%(diary-anniversary 5 17 1957) bb birthday (%d years old)"
1420 "DTSTART;VALUE=DATE:19570517
1421 DTEND;VALUE=DATE:19570518
1422 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=05;BYMONTHDAY=17
1423 SUMMARY:bb birthday (%d years old)")
1424
1425 (icalendar-tests--test-export
1426 nil
1427 nil
1428 "%%(diary-anniversary 6 8 1997) cc birthday (%d years old)"
1429 "DTSTART;VALUE=DATE:19970608
1430 DTEND;VALUE=DATE:19970609
1431 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=08
1432 SUMMARY:cc birthday (%d years old)")
1433
1434 (icalendar-tests--test-export
1435 nil
1436 nil
1437 "%%(diary-anniversary 7 22 1983) dd (%d years ago...!)"
1438 "DTSTART;VALUE=DATE:19830722
1439 DTEND;VALUE=DATE:19830723
1440 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=07;BYMONTHDAY=22
1441 SUMMARY:dd (%d years ago...!)")
1442
1443 (icalendar-tests--test-export
1444 nil
1445 nil
1446 "%%(diary-anniversary 8 1 1988) ee birthday (%d years old)"
1447 "DTSTART;VALUE=DATE:19880801
1448 DTEND;VALUE=DATE:19880802
1449 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=08;BYMONTHDAY=01
1450 SUMMARY:ee birthday (%d years old)")
1451
1452 (icalendar-tests--test-export
1453 nil
1454 nil
1455 "%%(diary-anniversary 9 21 1957) ff birthday (%d years old)"
1456 "DTSTART;VALUE=DATE:19570921
1457 DTEND;VALUE=DATE:19570922
1458 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=21
1459 SUMMARY:ff birthday (%d years old)")
1460
1461
1462 ;; FIXME!
1463
1464 ;; export 2004-10-28 monthly, weekly entries
1465
1466 ;; (icalendar-tests--test-export
1467 ;; nil
1468 ;; "
1469 ;; >>> ------------ monthly:
1470
1471 ;; */27/* 10:00 blah blah"
1472 ;; "xxx")
1473
1474 (icalendar-tests--test-export
1475 nil
1476 nil
1477 ">>> ------------ my week:
1478
1479 Monday 13:00 MAC"
1480 "DTSTART;VALUE=DATE-TIME:20000103T130000
1481 DTEND;VALUE=DATE-TIME:20000103T140000
1482 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1483 SUMMARY:MAC")
1484
1485 (icalendar-tests--test-export
1486 nil
1487 nil
1488 "Monday 15:00 a1"
1489 "DTSTART;VALUE=DATE-TIME:20000103T150000
1490 DTEND;VALUE=DATE-TIME:20000103T160000
1491 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1492 SUMMARY:a1")
1493
1494
1495 (icalendar-tests--test-export
1496 nil
1497 nil
1498 "Monday 16:00-17:00 a2"
1499 "DTSTART;VALUE=DATE-TIME:20000103T160000
1500 DTEND;VALUE=DATE-TIME:20000103T170000
1501 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1502 SUMMARY:a2")
1503
1504 (icalendar-tests--test-export
1505 nil
1506 nil
1507 "Tuesday 11:30-13:00 a3"
1508 "DTSTART;VALUE=DATE-TIME:20000104T113000
1509 DTEND;VALUE=DATE-TIME:20000104T130000
1510 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1511 SUMMARY:a3")
1512
1513 (icalendar-tests--test-export
1514 nil
1515 nil
1516 "Tuesday 15:00 a4"
1517 "DTSTART;VALUE=DATE-TIME:20000104T150000
1518 DTEND;VALUE=DATE-TIME:20000104T160000
1519 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1520 SUMMARY:a4")
1521
1522 (icalendar-tests--test-export
1523 nil
1524 nil
1525 "Wednesday 13:00 a5"
1526 "DTSTART;VALUE=DATE-TIME:20000105T130000
1527 DTEND;VALUE=DATE-TIME:20000105T140000
1528 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1529 SUMMARY:a5")
1530
1531 (icalendar-tests--test-export
1532 nil
1533 nil
1534 "Wednesday 11:30-13:30 a6"
1535 "DTSTART;VALUE=DATE-TIME:20000105T113000
1536 DTEND;VALUE=DATE-TIME:20000105T133000
1537 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1538 SUMMARY:a6")
1539
1540 (icalendar-tests--test-export
1541 nil
1542 nil
1543 "Wednesday 15:00 s1"
1544 "DTSTART;VALUE=DATE-TIME:20000105T150000
1545 DTEND;VALUE=DATE-TIME:20000105T160000
1546 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1547 SUMMARY:s1")
1548
1549
1550 ;; export 2004-10-28 regular entries
1551 (icalendar-tests--test-export
1552 nil
1553 nil
1554 "
1555 >>> regular diary entries:
1556
1557 Oct 12 2004, 14:00 Tue: [2004-10-12] q1"
1558 "DTSTART;VALUE=DATE-TIME:20041012T140000
1559 DTEND;VALUE=DATE-TIME:20041012T150000
1560 SUMMARY:Tue: [2004-10-12] q1")
1561
1562 ;; 2004-11-19
1563 (icalendar-tests--test-import
1564 "BEGIN:VCALENDAR
1565 VERSION
1566 :2.0
1567 PRODID
1568 :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
1569 BEGIN:VEVENT
1570 UID
1571 :04979712-3902-11d9-93dd-8f9f4afe08da
1572 SUMMARY
1573 :Jjjjj & Wwwww
1574 STATUS
1575 :TENTATIVE
1576 CLASS
1577 :PRIVATE
1578 X-MOZILLA-ALARM-DEFAULT-LENGTH
1579 :0
1580 DTSTART
1581 :20041123T140000
1582 DTEND
1583 :20041123T143000
1584 DTSTAMP
1585 :20041118T013430Z
1586 LAST-MODIFIED
1587 :20041118T013640Z
1588 END:VEVENT
1589 BEGIN:VEVENT
1590 UID
1591 :6161a312-3902-11d9-b512-f764153bb28b
1592 SUMMARY
1593 :BB Aaaaaaaa Bbbbb
1594 STATUS
1595 :TENTATIVE
1596 CLASS
1597 :PRIVATE
1598 X-MOZILLA-ALARM-DEFAULT-LENGTH
1599 :0
1600 DTSTART
1601 :20041123T144500
1602 DTEND
1603 :20041123T154500
1604 DTSTAMP
1605 :20041118T013641Z
1606 END:VEVENT
1607 BEGIN:VEVENT
1608 UID
1609 :943a4d7e-3902-11d9-9ce7-c9addeadf928
1610 SUMMARY
1611 :Hhhhhhhh
1612 STATUS
1613 :TENTATIVE
1614 CLASS
1615 :PRIVATE
1616 X-MOZILLA-ALARM-DEFAULT-LENGTH
1617 :0
1618 DTSTART
1619 :20041123T110000
1620 DTEND
1621 :20041123T120000
1622 DTSTAMP
1623 :20041118T013831Z
1624 END:VEVENT
1625 BEGIN:VEVENT
1626 UID
1627 :fe53615e-3902-11d9-9dd8-9d38a155bf41
1628 SUMMARY
1629 :MMM Aaaaaaaaa
1630 STATUS
1631 :TENTATIVE
1632 CLASS
1633 :PRIVATE
1634 X-MOZILLA-ALARM-DEFAULT-LENGTH
1635 :0
1636 X-MOZILLA-RECUR-DEFAULT-INTERVAL
1637 :2
1638 RRULE
1639 :FREQ=WEEKLY;INTERVAL=2;BYDAY=FR
1640 DTSTART
1641 :20041112T140000
1642 DTEND
1643 :20041112T183000
1644 DTSTAMP
1645 :20041118T014117Z
1646 END:VEVENT
1647 BEGIN:VEVENT
1648 UID
1649 :87c928ee-3901-11d9-b21f-b45042155024
1650 SUMMARY
1651 :Rrrr/Cccccc ii Aaaaaaaa
1652 DESCRIPTION
1653 :Vvvvv Rrrr aaa Cccccc
1654 STATUS
1655 :TENTATIVE
1656 CLASS
1657 :PRIVATE
1658 X-MOZILLA-ALARM-DEFAULT-LENGTH
1659 :0
1660 DTSTART
1661 ;VALUE=DATE
1662 :20041119
1663 DTEND
1664 ;VALUE=DATE
1665 :20041120
1666 DTSTAMP
1667 :20041118T013107Z
1668 LAST-MODIFIED
1669 :20041118T014203Z
1670 END:VEVENT
1671 BEGIN:VEVENT
1672 UID
1673 :e8f331ae-3902-11d9-9948-dfdcb66a2872
1674 SUMMARY
1675 :Wwww aa hhhh
1676 STATUS
1677 :TENTATIVE
1678 CLASS
1679 :PRIVATE
1680 X-MOZILLA-ALARM-DEFAULT-LENGTH
1681 :0
1682 RRULE
1683 :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1684 DTSTART
1685 ;VALUE=DATE
1686 :20041101
1687 DTEND
1688 ;VALUE=DATE
1689 :20041102
1690 DTSTAMP
1691 :20041118T014045Z
1692 LAST-MODIFIED
1693 :20041118T023846Z
1694 END:VEVENT
1695 END:VCALENDAR
1696 "
1697 nil
1698 "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
1699 Status: TENTATIVE
1700 Class: PRIVATE
1701 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1702 Status: TENTATIVE
1703 Class: PRIVATE
1704 &23/11/2004 11:00-12:00 Hhhhhhhh
1705 Status: TENTATIVE
1706 Class: PRIVATE
1707 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
1708 Status: TENTATIVE
1709 Class: PRIVATE
1710 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
1711 Desc: Vvvvv Rrrr aaa Cccccc
1712 Status: TENTATIVE
1713 Class: PRIVATE
1714 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
1715 Status: TENTATIVE
1716 Class: PRIVATE
1717 "
1718 "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
1719 Status: TENTATIVE
1720 Class: PRIVATE
1721 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1722 Status: TENTATIVE
1723 Class: PRIVATE
1724 &11/23/2004 11:00-12:00 Hhhhhhhh
1725 Status: TENTATIVE
1726 Class: PRIVATE
1727 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
1728 Status: TENTATIVE
1729 Class: PRIVATE
1730 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
1731 Desc: Vvvvv Rrrr aaa Cccccc
1732 Status: TENTATIVE
1733 Class: PRIVATE
1734 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
1735 Status: TENTATIVE
1736 Class: PRIVATE
1737 ")
1738
1739 ;; 2004-09-09 pg
1740 (icalendar-tests--test-export
1741 "%%(diary-block 1 1 2004 4 1 2004) Urlaub"
1742 nil
1743 nil
1744 "DTSTART;VALUE=DATE:20040101
1745 DTEND;VALUE=DATE:20040105
1746 SUMMARY:Urlaub")
1747
1748 ;; 2004-10-25 pg
1749 (icalendar-tests--test-export
1750 nil
1751 "5 11 2004 Bla Fasel"
1752 nil
1753 "DTSTART;VALUE=DATE:20041105
1754 DTEND;VALUE=DATE:20041106
1755 SUMMARY:Bla Fasel")
1756
1757 ;; 2004-10-30 pg
1758 (icalendar-tests--test-export
1759 nil
1760 "2 Nov 2004 15:00-16:30 Zahnarzt"
1761 nil
1762 "DTSTART;VALUE=DATE-TIME:20041102T150000
1763 DTEND;VALUE=DATE-TIME:20041102T163000
1764 SUMMARY:Zahnarzt")
1765
1766 ;; 2005-02-07 lt
1767 (icalendar-tests--test-import
1768 "UID
1769 :b60d398e-1dd1-11b2-a159-cf8cb05139f4
1770 SUMMARY
1771 :Waitangi Day
1772 DESCRIPTION
1773 :abcdef
1774 CATEGORIES
1775 :Public Holiday
1776 STATUS
1777 :CONFIRMED
1778 CLASS
1779 :PRIVATE
1780 DTSTART
1781 ;VALUE=DATE
1782 :20050206
1783 DTEND
1784 ;VALUE=DATE
1785 :20050207
1786 DTSTAMP
1787 :20050128T011209Z"
1788 nil
1789 "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
1790 Desc: abcdef
1791 Status: CONFIRMED
1792 Class: PRIVATE
1793 "
1794 "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
1795 Desc: abcdef
1796 Status: CONFIRMED
1797 Class: PRIVATE
1798 ")
1799
1800 ;; 2005-03-01 lt
1801 (icalendar-tests--test-import
1802 "DTSTART;VALUE=DATE:20050217
1803 SUMMARY:Hhhhhh Aaaaa ii Aaaaaaaa
1804 UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
1805 DTSTAMP:20050118T210335Z
1806 DURATION:P7D"
1807 nil
1808 "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n"
1809 "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n")
1810
1811 ;; 2005-03-23 lt
1812 (icalendar-tests--test-export
1813 nil
1814 "&%%(diary-cyclic 7 8 2 2005) 16:00-16:45 [WORK] Pppp"
1815 nil
1816 "DTSTART;VALUE=DATE-TIME:20050208T160000
1817 DTEND;VALUE=DATE-TIME:20050208T164500
1818 RRULE:FREQ=DAILY;INTERVAL=7
1819 SUMMARY:[WORK] Pppp
1820 ")
1821
1822 ;; 2005-05-27 eu
1823 (icalendar-tests--test-export
1824 nil
1825 nil
1826 ;; FIXME: colon not allowed!
1827 ;;"Nov 1: NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1828 "Nov 1 NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1829 "DTSTART;VALUE=DATE:19001101
1830 DTEND;VALUE=DATE:19001102
1831 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
1832 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
1833 ")
1834 )
1835
1836 (provide 'icalendar-tests)
1837 ;;; icalendar-tests.el ends here