Fix cursor movement in R2L text within L2R paragraphs.
[emacs.git] / test / automated / icalendar-tests.el
blob04fce7383fd2eef6a7bdcb1547f100b28a5f2cec
1 ;; icalendar-tests.el --- Test suite for icalendar.el
3 ;; Copyright (C) 2005, 2008-2011 Free Software Foundation, Inc.
5 ;; Author: Ulf Jasper <ulf.jasper@web.de>
6 ;; Created: March 2005
7 ;; Keywords: calendar
8 ;; Human-Keywords: calendar, diary, iCalendar, vCalendar
10 ;; This file is part of GNU Emacs.
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation, either version 3 of the License, or
15 ;; (at your option) any later version.
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
25 ;;; Commentary:
27 ;; TODO:
28 ;; - Add more unit tests for functions, timezone etc.
30 ;; Note: Watch the trailing blank that is added on import.
32 ;;; Code:
34 (require 'ert)
35 (require 'icalendar)
37 ;; ======================================================================
38 ;; Helpers
39 ;; ======================================================================
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)))))
49 (defun icalendar-tests--trim (string)
50 "Remove leading and trailing whitespace from STRING."
51 (replace-regexp-in-string "[ \t\n]+\\'" ""
52 (replace-regexp-in-string "\\`[ \t\n]+" "" string)))
54 ;; ======================================================================
55 ;; Tests of functions
56 ;; ======================================================================
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"))
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)))))
83 (ert-deftest icalendar--calendar-style ()
84 "Test for `icalendar--date-style'."
85 (dolist (calendar-date-style '(iso american european))
86 (should (eq (icalendar--date-style) calendar-date-style)))
87 (let ((cds calendar-date-style)
88 (european-calendar-style t))
89 (makunbound 'calendar-date-style)
90 (should (eq (icalendar--date-style) 'european))
91 (with-no-warnings (setq european-calendar-style nil)) ;still get warning!?! FIXME
92 (should (eq (icalendar--date-style) 'american))
93 (setq calendar-date-style cds)))
95 (ert-deftest icalendar-convert-anniversary-to-ical ()
96 "Test method for `icalendar--convert-anniversary-to-ical'."
97 (let* ((calendar-date-style 'iso)
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)))))
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)))))
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)))))
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)))))
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)))))
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
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
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)))))
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)))
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)))
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)))))
241 (ert-deftest icalendar--diarytime-to-isotime ()
242 "Test method for `icalendar--diarytime-to-isotime'."
243 (should (string= "T011500"
244 (icalendar--diarytime-to-isotime "01:15" "")))
245 (should (string= "T011500"
246 (icalendar--diarytime-to-isotime "1:15" "")))
247 (should (string= "T000100"
248 (icalendar--diarytime-to-isotime "0:01" "")))
249 (should (string= "T010000"
250 (icalendar--diarytime-to-isotime "0100" "")))
251 (should (string= "T010000"
252 (icalendar--diarytime-to-isotime "0100" "am")))
253 (should (string= "T130000"
254 (icalendar--diarytime-to-isotime "0100" "pm")))
255 (should (string= "T120000"
256 (icalendar--diarytime-to-isotime "1200" "")))
257 (should (string= "T171700"
258 (icalendar--diarytime-to-isotime "17:17" "")))
259 (should (string= "T000000"
260 (icalendar--diarytime-to-isotime "1200" "am")))
261 (should (string= "T000100"
262 (icalendar--diarytime-to-isotime "1201" "am")))
263 (should (string= "T005900"
264 (icalendar--diarytime-to-isotime "1259" "am")))
265 (should (string= "T120000"
266 (icalendar--diarytime-to-isotime "1200" "pm")))
267 (should (string= "T120100"
268 (icalendar--diarytime-to-isotime "1201" "pm")))
269 (should (string= "T125900"
270 (icalendar--diarytime-to-isotime "1259" "pm"))))
272 (ert-deftest icalendar--datetime-to-diary-date ()
273 "Test method for `icalendar--datetime-to-diary-date'."
274 (let* ((datetime '(59 59 23 31 12 2008))
275 (calendar-date-style 'iso))
276 (should (string= "2008 12 31"
277 (icalendar--datetime-to-diary-date datetime)))
278 (setq calendar-date-style 'european)
279 (should (string= "31 12 2008"
280 (icalendar--datetime-to-diary-date datetime)))
281 (setq calendar-date-style 'american)
282 (should (string= "12 31 2008"
283 (icalendar--datetime-to-diary-date datetime)))))
285 (ert-deftest icalendar--datestring-to-isodate ()
286 "Test method for `icalendar--datestring-to-isodate'."
287 (let ((calendar-date-style 'iso))
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)))
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)))
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)))
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")))))
323 (ert-deftest icalendar--first-weekday-of-year ()
324 "Test method for `icalendar-first-weekday-of-year'."
325 (should (eq 1 (icalendar-first-weekday-of-year "TU" 2008)))
326 (should (eq 3 (icalendar-first-weekday-of-year "WE" 2007)))
327 (should (eq 5 (icalendar-first-weekday-of-year "TH" 2006)))
328 (should (eq 7 (icalendar-first-weekday-of-year "FR" 2005)))
329 (should (eq 3 (icalendar-first-weekday-of-year "SA" 2004)))
330 (should (eq 5 (icalendar-first-weekday-of-year "SU" 2003)))
331 (should (eq 7 (icalendar-first-weekday-of-year "MO" 2002)))
332 (should (eq 3 (icalendar-first-weekday-of-year "MO" 2000)))
333 (should (eq 1 (icalendar-first-weekday-of-year "TH" 1970))))
335 (ert-deftest icalendar--import-format-sample ()
336 "Test method for `icalendar-import-format-sample'."
337 (should (string= (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
338 "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'")
339 (icalendar-import-format-sample
340 (icalendar-tests--get-ical-event "BEGIN:VEVENT
341 DTSTAMP:20030509T043439Z
342 DTSTART:20030509T103000
343 SUMMARY:a
344 ORGANIZER:d
345 LOCATION:c
346 DTEND:20030509T153000
347 DESCRIPTION:b
348 END:VEVENT
349 ")))))
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)))))
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))))
403 (setq result (icalendar--parse-summary-and-rest
404 "SUM sum DES des LOC loc ORG org STA sta URL url CLA cla"))
405 (should (string= "des" (cdr (assoc 'des result))))
406 (should (string= "loc" (cdr (assoc 'loc result))))
407 (should (string= "org" (cdr (assoc 'org result))))
408 (should (string= "sta" (cdr (assoc 'sta result))))
409 (should (string= "cla" (cdr (assoc 'cla result))))
411 (setq icalendar-import-format (lambda () "Hello world"))
412 (setq result (icalendar--parse-summary-and-rest
413 "blah blah "))
414 (should (not result))
417 ;; ======================================================================
418 ;; Export tests
419 ;; ======================================================================
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.
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))))
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)))
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))))
508 (ert-deftest icalendar-export-ordinary-no-time ()
509 "Perform export test."
511 (let ((icalendar-export-hidden-diary-entries nil))
512 (icalendar-tests--test-export
513 "&2000 Oct 3 ordinary no time "
514 "&3 Okt 2000 ordinary no time "
515 "&Oct 3 2000 ordinary no time "
516 nil))
518 (icalendar-tests--test-export
519 "2000 Oct 3 ordinary no time "
520 "3 Okt 2000 ordinary no time "
521 "Oct 3 2000 ordinary no time "
522 "DTSTART;VALUE=DATE:20001003
523 DTEND;VALUE=DATE:20001004
524 SUMMARY:ordinary no time
527 (ert-deftest icalendar-export-ordinary ()
528 "Perform export test."
530 (icalendar-tests--test-export
531 "2000 Oct 3 16:30 ordinary with time"
532 "3 Okt 2000 16:30 ordinary with time"
533 "Oct 3 2000 16:30 ordinary with time"
534 "DTSTART;VALUE=DATE-TIME:20001003T163000
535 DTEND;VALUE=DATE-TIME:20001003T173000
536 SUMMARY:ordinary with time
538 (icalendar-tests--test-export
539 "2000 10 3 16:30 ordinary with time 2"
540 "3 10 2000 16:30 ordinary with time 2"
541 "10 3 2000 16:30 ordinary with time 2"
542 "DTSTART;VALUE=DATE-TIME:20001003T163000
543 DTEND;VALUE=DATE-TIME:20001003T173000
544 SUMMARY:ordinary with time 2
547 (icalendar-tests--test-export
548 "2000/10/3 16:30 ordinary with time 3"
549 "3/10/2000 16:30 ordinary with time 3"
550 "10/3/2000 16:30 ordinary with time 3"
551 "DTSTART;VALUE=DATE-TIME:20001003T163000
552 DTEND;VALUE=DATE-TIME:20001003T173000
553 SUMMARY:ordinary with time 3
556 (ert-deftest icalendar-export-multiline ()
557 "Perform export test."
559 ;; multiline -- FIXME!!!
560 (icalendar-tests--test-export
561 "2000 October 3 16:30 multiline
562 17:30 multiline continued FIXME"
563 "3 Oktober 2000 16:30 multiline
564 17:30 multiline continued FIXME"
565 "October 3 2000 16:30 multiline
566 17:30 multiline continued FIXME"
567 "DTSTART;VALUE=DATE-TIME:20001003T163000
568 DTEND;VALUE=DATE-TIME:20001003T173000
569 SUMMARY:multiline
570 DESCRIPTION:
571 17:30 multiline continued FIXME
574 (ert-deftest icalendar-export-weekly-by-day ()
575 "Perform export test."
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
588 (icalendar-tests--test-export
589 "Monday 13:30-15:00 weekly by day with start and end time"
590 "Montag 13:30-15:00 weekly by day with start and end time"
591 "Monday 01:30pm-03:00pm weekly by day with start and end time"
592 "DTSTART;VALUE=DATE-TIME:20000103T133000
593 DTEND;VALUE=DATE-TIME:20000103T150000
594 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
595 SUMMARY:weekly by day with start and end time
598 (ert-deftest icalendar-export-yearly ()
599 "Perform export test."
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
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
623 (icalendar-tests--test-export
624 "%%(diary-anniversary 1989 10 3) 19:00-20:00 anniversary with time"
625 "%%(diary-anniversary 3 10 1989) 19:00-20:00 anniversary with time"
626 "%%(diary-anniversary 10 3 1989) 19:00-20:00 anniversary with time"
627 "DTSTART;VALUE=DATE-TIME:19891003T190000
628 DTEND;VALUE=DATE-TIME:19891004T200000
629 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYMONTHDAY=03
630 SUMMARY:anniversary with time
633 (ert-deftest icalendar-export-block ()
634 "Perform export test."
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
644 (icalendar-tests--test-export
645 "%%(diary-block 2001 6 18 2001 7 6) 13:00-17:00 block with time"
646 "%%(diary-block 18 6 2001 6 7 2001) 13:00-17:00 block with time"
647 "%%(diary-block 6 18 2001 7 6 2001) 13:00-17:00 block with time"
648 "DTSTART;VALUE=DATE-TIME:20010618T130000
649 DTEND;VALUE=DATE-TIME:20010618T170000
650 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
651 SUMMARY:block with time
653 (icalendar-tests--test-export
654 "%%(diary-block 2001 6 18 2001 7 6) 13:00 block no end time"
655 "%%(diary-block 18 6 2001 6 7 2001) 13:00 block no end time"
656 "%%(diary-block 6 18 2001 7 6 2001) 13:00 block no end time"
657 "DTSTART;VALUE=DATE-TIME:20010618T130000
658 DTEND;VALUE=DATE-TIME:20010618T140000
659 RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
660 SUMMARY:block no end time
663 ;; ======================================================================
664 ;; Import tests
665 ;; ======================================================================
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)))
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))))
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 ;; do not remove the trailing blank after "long"!
735 "SUMMARY:long
736 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
752 "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
753 Status: TENTATIVE
754 Class: PRIVATE
756 "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
757 Status: TENTATIVE
758 Class: PRIVATE
760 "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
761 Status: TENTATIVE
762 Class: PRIVATE
764 (icalendar-tests--test-import
765 "UID
766 :04979712-3902-11d9-93dd-8f9f4afe08da
767 SUMMARY
768 :folded summary
769 STATUS
770 :TENTATIVE
771 CLASS
772 :PRIVATE
773 X-MOZILLA-ALARM-DEFAULT-LENGTH
775 DTSTART
776 :20041123T140000
777 DTEND
778 :20041123T143000
779 DTSTAMP
780 :20041118T013430Z
781 LAST-MODIFIED
782 :20041118T013640Z
784 "&2004/11/23 14:00-14:30 folded summary
785 Status: TENTATIVE
786 Class: PRIVATE\n"
787 "&23/11/2004 14:00-14:30 folded summary
788 Status: TENTATIVE
789 Class: PRIVATE\n"
790 "&11/23/2004 14:00-14:30 folded summary
791 Status: TENTATIVE
792 Class: PRIVATE\n")
794 (icalendar-tests--test-import
795 "UID
796 :6161a312-3902-11d9-b512-f764153bb28b
797 SUMMARY
798 :another example
799 STATUS
800 :TENTATIVE
801 CLASS
802 :PRIVATE
803 X-MOZILLA-ALARM-DEFAULT-LENGTH
805 DTSTART
806 :20041123T144500
807 DTEND
808 :20041123T154500
809 DTSTAMP
810 :20041118T013641Z
812 "&2004/11/23 14:45-15:45 another example
813 Status: TENTATIVE
814 Class: PRIVATE\n"
815 "&23/11/2004 14:45-15:45 another example
816 Status: TENTATIVE
817 Class: PRIVATE\n"
818 "&11/23/2004 14:45-15:45 another example
819 Status: TENTATIVE
820 Class: PRIVATE\n"))
822 (ert-deftest icalendar-import-rrule ()
823 (icalendar-tests--test-import
824 "SUMMARY:rrule daily
825 DTSTART;VALUE=DATE-TIME:20030919T090000
826 DTEND;VALUE=DATE-TIME:20030919T113000
827 RRULE:FREQ=DAILY;
829 "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
830 "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
831 "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
832 ;; RRULE examples
833 (icalendar-tests--test-import
834 "SUMMARY:rrule daily
835 DTSTART;VALUE=DATE-TIME:20030919T090000
836 DTEND;VALUE=DATE-TIME:20030919T113000
837 RRULE:FREQ=DAILY;INTERVAL=2
839 "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
840 "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
841 "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
842 (icalendar-tests--test-import
843 "SUMMARY:rrule daily with exceptions
844 DTSTART;VALUE=DATE-TIME:20030919T090000
845 DTEND;VALUE=DATE-TIME:20030919T113000
846 RRULE:FREQ=DAILY;INTERVAL=2
847 EXDATE:20030921,20030925
849 "&%%(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"
850 "&%%(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"
851 "&%%(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")
852 (icalendar-tests--test-import
853 "SUMMARY:rrule weekly
854 DTSTART;VALUE=DATE-TIME:20030919T090000
855 DTEND;VALUE=DATE-TIME:20030919T113000
856 RRULE:FREQ=WEEKLY;
858 "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
859 "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
860 "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
861 (icalendar-tests--test-import
862 "SUMMARY:rrule monthly no end
863 DTSTART;VALUE=DATE-TIME:20030919T090000
864 DTEND;VALUE=DATE-TIME:20030919T113000
865 RRULE:FREQ=MONTHLY;
867 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
868 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
869 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
870 (icalendar-tests--test-import
871 "SUMMARY:rrule monthly with end
872 DTSTART;VALUE=DATE-TIME:20030919T090000
873 DTEND;VALUE=DATE-TIME:20030919T113000
874 RRULE:FREQ=MONTHLY;UNTIL=20050819;
876 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
877 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
878 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
879 (icalendar-tests--test-import
880 "DTSTART;VALUE=DATE:20040815
881 DTEND;VALUE=DATE:20040816
882 SUMMARY:Maria Himmelfahrt
883 UID:CC56BEA6-49D2-11D8-8833-00039386D1C2-RID
884 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
886 "&%%(and (diary-anniversary 2004 8 15)) Maria Himmelfahrt\n"
887 "&%%(and (diary-anniversary 15 8 2004)) Maria Himmelfahrt\n"
888 "&%%(and (diary-anniversary 8 15 2004)) Maria Himmelfahrt\n")
889 (icalendar-tests--test-import
890 "SUMMARY:rrule yearly
891 DTSTART;VALUE=DATE-TIME:20030919T090000
892 DTEND;VALUE=DATE-TIME:20030919T113000
893 RRULE:FREQ=YEARLY;INTERVAL=2
895 "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
896 "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
897 "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
898 (icalendar-tests--test-import
899 "SUMMARY:rrule count daily short
900 DTSTART;VALUE=DATE-TIME:20030919T090000
901 DTEND;VALUE=DATE-TIME:20030919T113000
902 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
904 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
905 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
906 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
907 (icalendar-tests--test-import
908 "SUMMARY:rrule count daily long
909 DTSTART;VALUE=DATE-TIME:20030919T090000
910 DTEND;VALUE=DATE-TIME:20030919T113000
911 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
913 "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
914 "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
915 "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
916 (icalendar-tests--test-import
917 "SUMMARY:rrule count bi-weekly 3 times
918 DTSTART;VALUE=DATE-TIME:20030919T090000
919 DTEND;VALUE=DATE-TIME:20030919T113000
920 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
922 "&%%(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"
923 "&%%(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"
924 "&%%(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")
925 (icalendar-tests--test-import
926 "SUMMARY:rrule count monthly
927 DTSTART;VALUE=DATE-TIME:20030919T090000
928 DTEND;VALUE=DATE-TIME:20030919T113000
929 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
931 "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
932 "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
933 "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
934 (icalendar-tests--test-import
935 "SUMMARY:rrule count every second month
936 DTSTART;VALUE=DATE-TIME:20030919T090000
937 DTEND;VALUE=DATE-TIME:20030919T113000
938 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
940 "&%%(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
941 "&%%(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
942 "&%%(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
943 (icalendar-tests--test-import
944 "SUMMARY:rrule count yearly
945 DTSTART;VALUE=DATE-TIME:20030919T090000
946 DTEND;VALUE=DATE-TIME:20030919T113000
947 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
949 "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
950 "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
951 "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
952 (icalendar-tests--test-import
953 "SUMMARY:rrule count every second year
954 DTSTART;VALUE=DATE-TIME:20030919T090000
955 DTEND;VALUE=DATE-TIME:20030919T113000
956 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
958 "&%%(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!!!
959 "&%%(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!!!
960 "&%%(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!!!
963 (ert-deftest icalendar-import-duration ()
964 ;; duration
965 (icalendar-tests--test-import
966 "DTSTART;VALUE=DATE:20050217
967 SUMMARY:duration
968 DURATION:P7D
970 "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
971 "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
972 "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
973 (icalendar-tests--test-import
974 "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
975 DTSTAMP:20041127T183315Z
976 LAST-MODIFIED:20041127T183329
977 SUMMARY:Urlaub
978 DTSTART;VALUE=DATE:20011221
979 DTEND;VALUE=DATE:20011221
980 RRULE:FREQ=DAILY;UNTIL=20011229;INTERVAL=1;WKST=SU
981 CLASS:PUBLIC
982 SEQUENCE:1
983 CREATED:20041127T183329
985 "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29)) Urlaub
986 Class: PUBLIC\n"
987 "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001)) Urlaub
988 Class: PUBLIC\n"
989 "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001)) Urlaub
990 Class: PUBLIC\n"))
992 (ert-deftest icalendar-import-bug-6766 ()
993 ;;bug#6766 -- multiple byday values in a weekly rrule
994 (icalendar-tests--test-import
995 "CLASS:PUBLIC
996 DTEND;TZID=America/New_York:20100421T120000
997 DTSTAMP:20100525T141214Z
998 DTSTART;TZID=America/New_York:20100421T113000
999 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,TH,FR
1000 SEQUENCE:1
1001 STATUS:CONFIRMED
1002 SUMMARY:Scrum
1003 TRANSP:OPAQUE
1004 UID:8814e3f9-7482-408f-996c-3bfe486a1262
1005 END:VEVENT
1006 BEGIN:VEVENT
1007 CLASS:PUBLIC
1008 DTSTAMP:20100525T141214Z
1009 DTSTART;VALUE=DATE:20100422
1010 DTEND;VALUE=DATE:20100423
1011 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
1012 SEQUENCE:1
1013 SUMMARY:Tues + Thurs thinking
1014 TRANSP:OPAQUE
1015 UID:8814e3f9-7482-408f-996c-3bfe486a1263
1017 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
1018 Status: CONFIRMED
1019 Class: PUBLIC
1020 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
1021 Class: PUBLIC
1023 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
1024 Status: CONFIRMED
1025 Class: PUBLIC
1026 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
1027 Class: PUBLIC
1029 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
1030 Status: CONFIRMED
1031 Class: PUBLIC
1032 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
1033 Class: PUBLIC
1036 (ert-deftest icalendar-import-multiple-vcalendars ()
1037 (icalendar-tests--test-import
1038 "DTSTART;VALUE=DATE:20110723
1039 SUMMARY:event-1
1041 "&2011/7/23 event-1\n"
1042 "&23/7/2011 event-1\n"
1043 "&7/23/2011 event-1\n")
1045 (icalendar-tests--test-import
1046 "BEGIN:VCALENDAR
1047 PRODID:-//Emacs//NONSGML icalendar.el//EN
1048 VERSION:2.0\nBEGIN:VEVENT
1049 DTSTART;VALUE=DATE:20110723
1050 SUMMARY:event-1
1051 END:VEVENT
1052 END:VCALENDAR
1053 BEGIN:VCALENDAR
1054 PRODID:-//Emacs//NONSGML icalendar.el//EN
1055 VERSION:2.0
1056 BEGIN:VEVENT
1057 DTSTART;VALUE=DATE:20110724
1058 SUMMARY:event-2
1059 END:VEVENT
1060 END:VCALENDAR
1061 BEGIN:VCALENDAR
1062 PRODID:-//Emacs//NONSGML icalendar.el//EN
1063 VERSION:2.0
1064 BEGIN:VEVENT
1065 DTSTART;VALUE=DATE:20110725
1066 SUMMARY:event-3a
1067 END:VEVENT
1068 BEGIN:VEVENT
1069 DTSTART;VALUE=DATE:20110725
1070 SUMMARY:event-3b
1071 END:VEVENT
1072 END:VCALENDAR
1074 "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
1075 "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
1076 "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
1078 ;; ======================================================================
1079 ;; Cycle
1080 ;; ======================================================================
1081 (defun icalendar-tests--test-cycle (input)
1082 "Perform cycle test.
1083 Argument INPUT icalendar event string."
1084 (with-temp-buffer
1085 (if (string-match "^BEGIN:VCALENDAR" input)
1086 (insert input)
1087 (insert "BEGIN:VCALENDAR\nPRODID:-//Emacs//NONSGML icalendar.el//EN\n")
1088 (insert "VERSION:2.0\nBEGIN:VEVENT\n")
1089 (insert input)
1090 (unless (eq (char-before) ?\n)
1091 (insert "\n"))
1092 (insert "END:VEVENT\nEND:VCALENDAR\n"))
1093 (let ((icalendar-import-format "%s%d%l%o%t%u%c")
1094 (icalendar-import-format-summary "%s")
1095 (icalendar-import-format-location "\n Location: %s")
1096 (icalendar-import-format-description "\n Desc: %s")
1097 (icalendar-import-format-organizer "\n Organizer: %s")
1098 (icalendar-import-format-status "\n Status: %s")
1099 (icalendar-import-format-url "\n URL: %s")
1100 (icalendar-import-format-class "\n Class: %s"))
1101 (dolist (calendar-date-style '(iso european american))
1102 (icalendar-tests--do-test-cycle)))))
1104 (defun icalendar-tests--do-test-cycle ()
1105 "Actually perform import/export cycle test."
1106 (let ((temp-diary (make-temp-file "icalendar-test-diary"))
1107 (temp-ics (make-temp-file "icalendar-test-ics"))
1108 (org-input (buffer-substring-no-properties (point-min) (point-max))))
1110 (unwind-protect
1111 (progn
1112 ;; step 1: import
1113 (icalendar-import-buffer temp-diary t t)
1115 ;; step 2: export what was just imported
1116 (save-excursion
1117 (find-file temp-diary)
1118 (icalendar-export-region (point-min) (point-max) temp-ics))
1120 ;; compare the output of step 2 with the input of step 1
1121 (save-excursion
1122 (find-file temp-ics)
1123 (goto-char (point-min))
1124 (when (re-search-forward "\nUID:.*\n" nil t)
1125 (replace-match "\n"))
1126 (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
1127 (should (string= org-input cycled)))))
1128 ;; clean up
1129 (kill-buffer (find-buffer-visiting temp-diary))
1130 (save-excursion
1131 (set-buffer (find-buffer-visiting temp-ics))
1132 (set-buffer-modified-p nil)
1133 (kill-buffer (current-buffer)))
1134 (delete-file temp-diary)
1135 (delete-file temp-ics))))
1137 (ert-deftest icalendar-cycle ()
1138 "Perform cycling tests."
1139 (icalendar-tests--test-cycle
1140 "DTSTART;VALUE=DATE-TIME:20030919T090000
1141 DTEND;VALUE=DATE-TIME:20030919T113000
1142 SUMMARY:Cycletest
1144 (icalendar-tests--test-cycle
1145 "DTSTART;VALUE=DATE-TIME:20030919T090000
1146 DTEND;VALUE=DATE-TIME:20030919T113000
1147 SUMMARY:Cycletest
1148 DESCRIPTION:beschreibung!
1149 LOCATION:nowhere
1150 ORGANIZER:ulf
1152 (icalendar-tests--test-cycle
1153 "DTSTART;VALUE=DATE:19190909
1154 DTEND;VALUE=DATE:19190910
1155 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
1156 SUMMARY:and diary-anniversary
1159 ;; ======================================================================
1160 ;; Real world
1161 ;; ======================================================================
1162 (ert-deftest icalendar-real-world ()
1163 "Perform real-world tests, as gathered from problem reports."
1164 ;; 2003-05-29
1165 (icalendar-tests--test-import
1166 "BEGIN:VCALENDAR
1167 METHOD:REQUEST
1168 PRODID:Microsoft CDO for Microsoft Exchange
1169 VERSION:2.0
1170 BEGIN:VTIMEZONE
1171 TZID:Kolkata\, Chennai\, Mumbai\, New Delhi
1172 X-MICROSOFT-CDO-TZID:23
1173 BEGIN:STANDARD
1174 DTSTART:16010101T000000
1175 TZOFFSETFROM:+0530
1176 TZOFFSETTO:+0530
1177 END:STANDARD
1178 BEGIN:DAYLIGHT
1179 DTSTART:16010101T000000
1180 TZOFFSETFROM:+0530
1181 TZOFFSETTO:+0530
1182 END:DAYLIGHT
1183 END:VTIMEZONE
1184 BEGIN:VEVENT
1185 DTSTAMP:20030509T043439Z
1186 DTSTART;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T103000
1187 SUMMARY:On-Site Interview
1188 UID:040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000
1189 010000000DB823520692542408ED02D7023F9DFF9
1190 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Xxxxx
1191 xxx Xxxxxxxxxxxx\":MAILTO:xxxxxxxx@xxxxxxx.com
1192 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Yyyyyyy Y
1193 yyyy\":MAILTO:yyyyyyy@yyyyyyy.com
1194 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Zzzz Zzzz
1195 zz\":MAILTO:zzzzzz@zzzzzzz.com
1196 ORGANIZER;CN=\"Aaaaaa Aaaaa\":MAILTO:aaaaaaa@aaaaaaa.com
1197 LOCATION:Cccc
1198 DTEND;TZID=\"Kolkata, Chennai, Mumbai, New Delhi\":20030509T153000
1199 DESCRIPTION:10:30am - Blah
1200 SEQUENCE:0
1201 PRIORITY:5
1202 CLASS:
1203 CREATED:20030509T043439Z
1204 LAST-MODIFIED:20030509T043459Z
1205 STATUS:CONFIRMED
1206 TRANSP:OPAQUE
1207 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1208 X-MICROSOFT-CDO-INSTTYPE:0
1209 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1210 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1211 X-MICROSOFT-CDO-IMPORTANCE:1
1212 X-MICROSOFT-CDO-OWNERAPPTID:126441427
1213 BEGIN:VALARM
1214 ACTION:DISPLAY
1215 DESCRIPTION:REMINDER
1216 TRIGGER;RELATED=START:-PT00H15M00S
1217 END:VALARM
1218 END:VEVENT
1219 END:VCALENDAR"
1221 "&9/5/2003 10:30-15:30 On-Site Interview
1222 Desc: 10:30am - Blah
1223 Location: Cccc
1224 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1225 Status: CONFIRMED
1227 "&5/9/2003 10:30-15:30 On-Site Interview
1228 Desc: 10:30am - Blah
1229 Location: Cccc
1230 Organizer: MAILTO:aaaaaaa@aaaaaaa.com
1231 Status: CONFIRMED
1234 ;; 2003-06-18 a
1235 (icalendar-tests--test-import
1236 "DTSTAMP:20030618T195512Z
1237 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T110000
1238 SUMMARY:Dress Rehearsal for XXXX-XXXX
1239 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1240 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1241 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"AAAAA,AAA
1242 AA (A-AAAAAAA,ex1)\":MAILTO:aaaaa_aaaaa@aaaaa.com
1243 ORGANIZER;CN=\"ABCD,TECHTRAINING
1244 (A-Americas,exgen1)\":MAILTO:xxx@xxxxx.com
1245 LOCATION:555 or TN 555-5555 ID 5555 & NochWas (see below)
1246 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T120000
1247 DESCRIPTION:753 Zeichen hier radiert
1248 SEQUENCE:0
1249 PRIORITY:5
1250 CLASS:
1251 CREATED:20030618T195518Z
1252 LAST-MODIFIED:20030618T195527Z
1253 STATUS:CONFIRMED
1254 TRANSP:OPAQUE
1255 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1256 X-MICROSOFT-CDO-INSTTYPE:0
1257 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1258 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1259 X-MICROSOFT-CDO-IMPORTANCE:1
1260 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1261 BEGIN:VALARM
1262 ACTION:DISPLAY
1263 DESCRIPTION:REMINDER
1264 TRIGGER;RELATED=START:-PT00H15M00S
1265 END:VALARM"
1267 "&23/6/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1268 Desc: 753 Zeichen hier radiert
1269 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1270 Organizer: MAILTO:xxx@xxxxx.com
1271 Status: CONFIRMED
1273 "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
1274 Desc: 753 Zeichen hier radiert
1275 Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
1276 Organizer: MAILTO:xxx@xxxxx.com
1277 Status: CONFIRMED
1279 ;; 2003-06-18 b -- uses timezone
1280 (icalendar-tests--test-import
1281 "BEGIN:VCALENDAR
1282 METHOD:REQUEST
1283 PRODID:Microsoft CDO for Microsoft Exchange
1284 VERSION:2.0
1285 BEGIN:VTIMEZONE
1286 TZID:Mountain Time (US & Canada)
1287 X-MICROSOFT-CDO-TZID:12
1288 BEGIN:STANDARD
1289 DTSTART:16010101T020000
1290 TZOFFSETFROM:-0600
1291 TZOFFSETTO:-0700
1292 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
1293 END:STANDARD
1294 BEGIN:DAYLIGHT
1295 DTSTART:16010101T020000
1296 TZOFFSETFROM:-0700
1297 TZOFFSETTO:-0600
1298 RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
1299 END:DAYLIGHT
1300 END:VTIMEZONE
1301 BEGIN:VEVENT
1302 DTSTAMP:20030618T230323Z
1303 DTSTART;TZID=\"Mountain Time (US & Canada)\":20030623T090000
1304 SUMMARY:Updated: Dress Rehearsal for ABC01-15
1305 UID:040000008200E00074C5B7101A82E00800000000608AA7DA9835C301000000000000000
1306 0100000007C3A6D65EE726E40B7F3D69A23BD567E
1307 ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;X-REPLYTIME=20030618T20
1308 0700Z;RSVP=TRUE;CN=\"AAAAA,AAAAAA
1309 \(A-AAAAAAA,ex1)\":MAILTO:aaaaaa_aaaaa@aaaaa
1310 .com
1311 ORGANIZER;CN=\"ABCD,TECHTRAINING
1312 \(A-Americas,exgen1)\":MAILTO:bbb@bbbbb.com
1313 LOCATION:123 or TN 123-1234 ID abcd & SonstWo (see below)
1314 DTEND;TZID=\"Mountain Time (US & Canada)\":20030623T100000
1315 DESCRIPTION:Viele Zeichen standen hier früher
1316 SEQUENCE:0
1317 PRIORITY:5
1318 CLASS:
1319 CREATED:20030618T230326Z
1320 LAST-MODIFIED:20030618T230335Z
1321 STATUS:CONFIRMED
1322 TRANSP:OPAQUE
1323 X-MICROSOFT-CDO-BUSYSTATUS:BUSY
1324 X-MICROSOFT-CDO-INSTTYPE:0
1325 X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
1326 X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
1327 X-MICROSOFT-CDO-IMPORTANCE:1
1328 X-MICROSOFT-CDO-OWNERAPPTID:1022519251
1329 BEGIN:VALARM
1330 ACTION:DISPLAY
1331 DESCRIPTION:REMINDER
1332 TRIGGER;RELATED=START:-PT00H15M00S
1333 END:VALARM
1334 END:VEVENT
1335 END:VCALENDAR"
1337 "&23/6/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1338 Desc: Viele Zeichen standen hier früher
1339 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1340 Organizer: MAILTO:bbb@bbbbb.com
1341 Status: CONFIRMED
1343 "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
1344 Desc: Viele Zeichen standen hier früher
1345 Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
1346 Organizer: MAILTO:bbb@bbbbb.com
1347 Status: CONFIRMED
1349 ;; export 2004-10-28 block entries
1350 (icalendar-tests--test-export
1353 "-*- mode: text; fill-column: 256;-*-
1355 >>> block entries:
1357 %%(diary-block 11 8 2004 11 10 2004) Nov 8-10 aa
1359 "DTSTART;VALUE=DATE:20041108
1360 DTEND;VALUE=DATE:20041111
1361 SUMMARY:Nov 8-10 aa")
1363 (icalendar-tests--test-export
1366 "%%(diary-block 12 13 2004 12 17 2004) Dec 13-17 bb"
1367 "DTSTART;VALUE=DATE:20041213
1368 DTEND;VALUE=DATE:20041218
1369 SUMMARY:Dec 13-17 bb")
1371 (icalendar-tests--test-export
1374 "%%(diary-block 2 3 2005 2 4 2005) Feb 3-4 cc"
1375 "DTSTART;VALUE=DATE:20050203
1376 DTEND;VALUE=DATE:20050205
1377 SUMMARY:Feb 3-4 cc")
1379 (icalendar-tests--test-export
1382 "%%(diary-block 4 24 2005 4 29 2005) April 24-29 dd"
1383 "DTSTART;VALUE=DATE:20050424
1384 DTEND;VALUE=DATE:20050430
1385 SUMMARY:April 24-29 dd
1387 (icalendar-tests--test-export
1390 "%%(diary-block 5 30 2005 6 1 2005) may 30 - June 1: ee"
1391 "DTSTART;VALUE=DATE:20050530
1392 DTEND;VALUE=DATE:20050602
1393 SUMMARY:may 30 - June 1: ee")
1395 (icalendar-tests--test-export
1398 "%%(diary-block 6 6 2005 6 8 2005) ff"
1399 "DTSTART;VALUE=DATE:20050606
1400 DTEND;VALUE=DATE:20050609
1401 SUMMARY:ff")
1403 ;; export 2004-10-28 anniversary entries
1404 (icalendar-tests--test-export
1408 >>> anniversaries:
1410 %%(diary-anniversary 3 28 1991) aa birthday (%d years old)"
1411 "DTSTART;VALUE=DATE:19910328
1412 DTEND;VALUE=DATE:19910329
1413 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=03;BYMONTHDAY=28
1414 SUMMARY:aa birthday (%d years old)
1417 (icalendar-tests--test-export
1420 "%%(diary-anniversary 5 17 1957) bb birthday (%d years old)"
1421 "DTSTART;VALUE=DATE:19570517
1422 DTEND;VALUE=DATE:19570518
1423 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=05;BYMONTHDAY=17
1424 SUMMARY:bb birthday (%d years old)")
1426 (icalendar-tests--test-export
1429 "%%(diary-anniversary 6 8 1997) cc birthday (%d years old)"
1430 "DTSTART;VALUE=DATE:19970608
1431 DTEND;VALUE=DATE:19970609
1432 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=06;BYMONTHDAY=08
1433 SUMMARY:cc birthday (%d years old)")
1435 (icalendar-tests--test-export
1438 "%%(diary-anniversary 7 22 1983) dd (%d years ago...!)"
1439 "DTSTART;VALUE=DATE:19830722
1440 DTEND;VALUE=DATE:19830723
1441 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=07;BYMONTHDAY=22
1442 SUMMARY:dd (%d years ago...!)")
1444 (icalendar-tests--test-export
1447 "%%(diary-anniversary 8 1 1988) ee birthday (%d years old)"
1448 "DTSTART;VALUE=DATE:19880801
1449 DTEND;VALUE=DATE:19880802
1450 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=08;BYMONTHDAY=01
1451 SUMMARY:ee birthday (%d years old)")
1453 (icalendar-tests--test-export
1456 "%%(diary-anniversary 9 21 1957) ff birthday (%d years old)"
1457 "DTSTART;VALUE=DATE:19570921
1458 DTEND;VALUE=DATE:19570922
1459 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=21
1460 SUMMARY:ff birthday (%d years old)")
1463 ;; FIXME!
1465 ;; export 2004-10-28 monthly, weekly entries
1467 ;; (icalendar-tests--test-export
1468 ;; nil
1469 ;; "
1470 ;; >>> ------------ monthly:
1472 ;; */27/* 10:00 blah blah"
1473 ;; "xxx")
1475 (icalendar-tests--test-export
1478 ">>> ------------ my week:
1480 Monday 13:00 MAC"
1481 "DTSTART;VALUE=DATE-TIME:20000103T130000
1482 DTEND;VALUE=DATE-TIME:20000103T140000
1483 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1484 SUMMARY:MAC")
1486 (icalendar-tests--test-export
1489 "Monday 15:00 a1"
1490 "DTSTART;VALUE=DATE-TIME:20000103T150000
1491 DTEND;VALUE=DATE-TIME:20000103T160000
1492 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1493 SUMMARY:a1")
1496 (icalendar-tests--test-export
1499 "Monday 16:00-17:00 a2"
1500 "DTSTART;VALUE=DATE-TIME:20000103T160000
1501 DTEND;VALUE=DATE-TIME:20000103T170000
1502 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1503 SUMMARY:a2")
1505 (icalendar-tests--test-export
1508 "Tuesday 11:30-13:00 a3"
1509 "DTSTART;VALUE=DATE-TIME:20000104T113000
1510 DTEND;VALUE=DATE-TIME:20000104T130000
1511 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1512 SUMMARY:a3")
1514 (icalendar-tests--test-export
1517 "Tuesday 15:00 a4"
1518 "DTSTART;VALUE=DATE-TIME:20000104T150000
1519 DTEND;VALUE=DATE-TIME:20000104T160000
1520 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU
1521 SUMMARY:a4")
1523 (icalendar-tests--test-export
1526 "Wednesday 13:00 a5"
1527 "DTSTART;VALUE=DATE-TIME:20000105T130000
1528 DTEND;VALUE=DATE-TIME:20000105T140000
1529 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1530 SUMMARY:a5")
1532 (icalendar-tests--test-export
1535 "Wednesday 11:30-13:30 a6"
1536 "DTSTART;VALUE=DATE-TIME:20000105T113000
1537 DTEND;VALUE=DATE-TIME:20000105T133000
1538 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1539 SUMMARY:a6")
1541 (icalendar-tests--test-export
1544 "Wednesday 15:00 s1"
1545 "DTSTART;VALUE=DATE-TIME:20000105T150000
1546 DTEND;VALUE=DATE-TIME:20000105T160000
1547 RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE
1548 SUMMARY:s1")
1551 ;; export 2004-10-28 regular entries
1552 (icalendar-tests--test-export
1556 >>> regular diary entries:
1558 Oct 12 2004, 14:00 Tue: [2004-10-12] q1"
1559 "DTSTART;VALUE=DATE-TIME:20041012T140000
1560 DTEND;VALUE=DATE-TIME:20041012T150000
1561 SUMMARY:Tue: [2004-10-12] q1")
1563 ;; 2004-11-19
1564 (icalendar-tests--test-import
1565 "BEGIN:VCALENDAR
1566 VERSION
1567 :2.0
1568 PRODID
1569 :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
1570 BEGIN:VEVENT
1572 :04979712-3902-11d9-93dd-8f9f4afe08da
1573 SUMMARY
1574 :Jjjjj & Wwwww
1575 STATUS
1576 :TENTATIVE
1577 CLASS
1578 :PRIVATE
1579 X-MOZILLA-ALARM-DEFAULT-LENGTH
1581 DTSTART
1582 :20041123T140000
1583 DTEND
1584 :20041123T143000
1585 DTSTAMP
1586 :20041118T013430Z
1587 LAST-MODIFIED
1588 :20041118T013640Z
1589 END:VEVENT
1590 BEGIN:VEVENT
1592 :6161a312-3902-11d9-b512-f764153bb28b
1593 SUMMARY
1594 :BB Aaaaaaaa Bbbbb
1595 STATUS
1596 :TENTATIVE
1597 CLASS
1598 :PRIVATE
1599 X-MOZILLA-ALARM-DEFAULT-LENGTH
1601 DTSTART
1602 :20041123T144500
1603 DTEND
1604 :20041123T154500
1605 DTSTAMP
1606 :20041118T013641Z
1607 END:VEVENT
1608 BEGIN:VEVENT
1610 :943a4d7e-3902-11d9-9ce7-c9addeadf928
1611 SUMMARY
1612 :Hhhhhhhh
1613 STATUS
1614 :TENTATIVE
1615 CLASS
1616 :PRIVATE
1617 X-MOZILLA-ALARM-DEFAULT-LENGTH
1619 DTSTART
1620 :20041123T110000
1621 DTEND
1622 :20041123T120000
1623 DTSTAMP
1624 :20041118T013831Z
1625 END:VEVENT
1626 BEGIN:VEVENT
1628 :fe53615e-3902-11d9-9dd8-9d38a155bf41
1629 SUMMARY
1630 :MMM Aaaaaaaaa
1631 STATUS
1632 :TENTATIVE
1633 CLASS
1634 :PRIVATE
1635 X-MOZILLA-ALARM-DEFAULT-LENGTH
1637 X-MOZILLA-RECUR-DEFAULT-INTERVAL
1639 RRULE
1640 :FREQ=WEEKLY;INTERVAL=2;BYDAY=FR
1641 DTSTART
1642 :20041112T140000
1643 DTEND
1644 :20041112T183000
1645 DTSTAMP
1646 :20041118T014117Z
1647 END:VEVENT
1648 BEGIN:VEVENT
1650 :87c928ee-3901-11d9-b21f-b45042155024
1651 SUMMARY
1652 :Rrrr/Cccccc ii Aaaaaaaa
1653 DESCRIPTION
1654 :Vvvvv Rrrr aaa Cccccc
1655 STATUS
1656 :TENTATIVE
1657 CLASS
1658 :PRIVATE
1659 X-MOZILLA-ALARM-DEFAULT-LENGTH
1661 DTSTART
1662 ;VALUE=DATE
1663 :20041119
1664 DTEND
1665 ;VALUE=DATE
1666 :20041120
1667 DTSTAMP
1668 :20041118T013107Z
1669 LAST-MODIFIED
1670 :20041118T014203Z
1671 END:VEVENT
1672 BEGIN:VEVENT
1674 :e8f331ae-3902-11d9-9948-dfdcb66a2872
1675 SUMMARY
1676 :Wwww aa hhhh
1677 STATUS
1678 :TENTATIVE
1679 CLASS
1680 :PRIVATE
1681 X-MOZILLA-ALARM-DEFAULT-LENGTH
1683 RRULE
1684 :FREQ=WEEKLY;INTERVAL=1;BYDAY=MO
1685 DTSTART
1686 ;VALUE=DATE
1687 :20041101
1688 DTEND
1689 ;VALUE=DATE
1690 :20041102
1691 DTSTAMP
1692 :20041118T014045Z
1693 LAST-MODIFIED
1694 :20041118T023846Z
1695 END:VEVENT
1696 END:VCALENDAR
1699 "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
1700 Status: TENTATIVE
1701 Class: PRIVATE
1702 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1703 Status: TENTATIVE
1704 Class: PRIVATE
1705 &23/11/2004 11:00-12:00 Hhhhhhhh
1706 Status: TENTATIVE
1707 Class: PRIVATE
1708 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
1709 Status: TENTATIVE
1710 Class: PRIVATE
1711 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
1712 Desc: Vvvvv Rrrr aaa Cccccc
1713 Status: TENTATIVE
1714 Class: PRIVATE
1715 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
1716 Status: TENTATIVE
1717 Class: PRIVATE
1719 "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
1720 Status: TENTATIVE
1721 Class: PRIVATE
1722 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
1723 Status: TENTATIVE
1724 Class: PRIVATE
1725 &11/23/2004 11:00-12:00 Hhhhhhhh
1726 Status: TENTATIVE
1727 Class: PRIVATE
1728 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
1729 Status: TENTATIVE
1730 Class: PRIVATE
1731 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
1732 Desc: Vvvvv Rrrr aaa Cccccc
1733 Status: TENTATIVE
1734 Class: PRIVATE
1735 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
1736 Status: TENTATIVE
1737 Class: PRIVATE
1740 ;; 2004-09-09 pg
1741 (icalendar-tests--test-export
1742 "%%(diary-block 1 1 2004 4 1 2004) Urlaub"
1745 "DTSTART;VALUE=DATE:20040101
1746 DTEND;VALUE=DATE:20040105
1747 SUMMARY:Urlaub")
1749 ;; 2004-10-25 pg
1750 (icalendar-tests--test-export
1752 "5 11 2004 Bla Fasel"
1754 "DTSTART;VALUE=DATE:20041105
1755 DTEND;VALUE=DATE:20041106
1756 SUMMARY:Bla Fasel")
1758 ;; 2004-10-30 pg
1759 (icalendar-tests--test-export
1761 "2 Nov 2004 15:00-16:30 Zahnarzt"
1763 "DTSTART;VALUE=DATE-TIME:20041102T150000
1764 DTEND;VALUE=DATE-TIME:20041102T163000
1765 SUMMARY:Zahnarzt")
1767 ;; 2005-02-07 lt
1768 (icalendar-tests--test-import
1769 "UID
1770 :b60d398e-1dd1-11b2-a159-cf8cb05139f4
1771 SUMMARY
1772 :Waitangi Day
1773 DESCRIPTION
1774 :abcdef
1775 CATEGORIES
1776 :Public Holiday
1777 STATUS
1778 :CONFIRMED
1779 CLASS
1780 :PRIVATE
1781 DTSTART
1782 ;VALUE=DATE
1783 :20050206
1784 DTEND
1785 ;VALUE=DATE
1786 :20050207
1787 DTSTAMP
1788 :20050128T011209Z"
1790 "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
1791 Desc: abcdef
1792 Status: CONFIRMED
1793 Class: PRIVATE
1795 "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
1796 Desc: abcdef
1797 Status: CONFIRMED
1798 Class: PRIVATE
1801 ;; 2005-03-01 lt
1802 (icalendar-tests--test-import
1803 "DTSTART;VALUE=DATE:20050217
1804 SUMMARY:Hhhhhh Aaaaa ii Aaaaaaaa
1805 UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
1806 DTSTAMP:20050118T210335Z
1807 DURATION:P7D"
1809 "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n"
1810 "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa\n")
1812 ;; 2005-03-23 lt
1813 (icalendar-tests--test-export
1815 "&%%(diary-cyclic 7 8 2 2005) 16:00-16:45 [WORK] Pppp"
1817 "DTSTART;VALUE=DATE-TIME:20050208T160000
1818 DTEND;VALUE=DATE-TIME:20050208T164500
1819 RRULE:FREQ=DAILY;INTERVAL=7
1820 SUMMARY:[WORK] Pppp
1823 ;; 2005-05-27 eu
1824 (icalendar-tests--test-export
1827 ;; FIXME: colon not allowed!
1828 ;;"Nov 1: NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1829 "Nov 1 NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30"
1830 "DTSTART;VALUE=DATE:19001101
1831 DTEND;VALUE=DATE:19001102
1832 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
1833 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
1837 (provide 'icalendar-tests)
1838 ;;; icalendar-tests.el ends here