]> code.delx.au - gnu-emacs/blobdiff - test/automated/icalendar-tests.el
Merge from cygw32 branch
[gnu-emacs] / test / automated / icalendar-tests.el
index d586230f6424126aea3fe5b6c9a3cb63a558a973..58b8379bb11073518fc1b545615d8f81341dba7e 100644 (file)
@@ -1,6 +1,6 @@
 ;; icalendar-tests.el --- Test suite for icalendar.el
 
-;; Copyright (C) 2005, 2008-2011  Free Software Foundation, Inc.
+;; Copyright (C) 2005, 2008-2012  Free Software Foundation, Inc.
 
 ;; Author:         Ulf Jasper <ulf.jasper@web.de>
 ;; Created:        March 2005
@@ -39,7 +39,7 @@
 ;; ======================================================================
 
 (defun icalendar-tests--get-ical-event (ical-string)
-  "Return icalendar event for ICAL-STRING."
+  "Return iCalendar event for ICAL-STRING."
   (save-excursion
     (with-temp-buffer
       (insert ical-string)
   (replace-regexp-in-string "[ \t\n]+\\'" ""
                             (replace-regexp-in-string "\\`[ \t\n]+" "" string)))
 
-(defun icalendar-tests--compare-strings (str1 str2)
-  "Compare strings STR1 and STR2.
-Return t if strings are equal, else return substring indicating first difference.
-FIXME: make this a little smarter."
-  (let* ((s1 (icalendar-tests--trim str1))
-         (s2 (icalendar-tests--trim str2))
-         (result (compare-strings s1 0 nil s2 0 nil))
-         (len (length str2)))
-    (if (numberp result)
-        (if (> result 0)
-            (concat "..." (substring str2 (- result 1)
-                                     (min len (+ (- result 1) 3))) "...")
-          (concat "..." (substring str2 (- (+ result 1))
-                                   (min len  (+ (- (+ result 1)) 3))) "..."))
-      t)))
-
-(ert-deftest icalendar-tests--compare-strings ()
-  "Test icalendar-tests--compare-strings."
-  (should (equal t (icalendar-tests--compare-strings " abcde" "abcde ")))
-  (should
-   (string= "...def..."
-            (icalendar-tests--compare-strings "abcxe" "abcdefghijklmn")))
-  (should (string= "...xe..."
-                   (icalendar-tests--compare-strings "abcde" "abcxe")))
-  (should (string= "...ddd..."
-           (icalendar-tests--compare-strings "abc" "abcdddddd")))
-  (should (string= "......"
-                   (icalendar-tests--compare-strings "abcdefghij" "abc"))))
-
 ;; ======================================================================
 ;; Tests of functions
 ;; ======================================================================
@@ -217,7 +188,7 @@ END:VTIMEZONE
     (should (string= "STD-02:00DST-03:00,M3.5.0/03:00:00,M10.5.0/04:00:00"
                      (cdr result)))
     (setq vtimezone (icalendar-tests--get-ical-event "BEGIN:VTIMEZONE
-TZID:anothername
+TZID:anothername\, with a comma
 BEGIN:STANDARD
 DTSTART:16010101T040000
 TZOFFSETFROM:+0300
@@ -233,7 +204,7 @@ END:DAYLIGHT
 END:VTIMEZONE
 "))
     (setq result (icalendar--parse-vtimezone vtimezone))
-    (should (string= "anothername" (car result)))
+    (should (string= "anothername, with a comma" (car result)))
     (message (cdr result))
     (should (string= "STD-02:00DST-03:00,M3.2.1/03:00:00,M10.2.1/04:00:00"
                      (cdr result)))))
@@ -248,7 +219,7 @@ END:VTIMEZONE
     (should (string=  "\nDTSTART;VALUE=DATE:20100215\nDTEND;VALUE=DATE:20100216"
                       (car result)))
     (should (string= "subject" (cadr result)))
-  
+
     ;; with time
     (setq result (icalendar--convert-ordinary-to-ical
                   "&?" "&2010 2 15 12:34-23:45 s"))
@@ -269,85 +240,85 @@ END:VTIMEZONE
 
 (ert-deftest icalendar--diarytime-to-isotime ()
   "Test method for `icalendar--diarytime-to-isotime'."
-  (should (string= (icalendar--diarytime-to-isotime "01:15" "")
-                   "T011500"))
-  (should (string= (icalendar--diarytime-to-isotime "1:15" "")
-                   "T011500"))
-  (should (string= (icalendar--diarytime-to-isotime "0:01" "")
-                   "T000100"))
-  (should (string= (icalendar--diarytime-to-isotime "0100" "")
-                   "T010000"))
-  (should (string= (icalendar--diarytime-to-isotime "0100" "am")
-                   "T010000"))
-  (should (string= (icalendar--diarytime-to-isotime "0100" "pm")
-                   "T130000"))
-  (should (string= (icalendar--diarytime-to-isotime "1200" "")
-                   "T120000"))
-  (should (string= (icalendar--diarytime-to-isotime "17:17" "")
-                   "T171700"))
-  (should (string= (icalendar--diarytime-to-isotime "1200" "am")
-                   "T000000"))
-  (should (string= (icalendar--diarytime-to-isotime "1201" "am")
-                   "T000100"))
-  (should (string= (icalendar--diarytime-to-isotime "1259" "am")
-                   "T005900"))
-  (should (string= (icalendar--diarytime-to-isotime "1200" "pm")
-                   "T120000"))
-  (should (string= (icalendar--diarytime-to-isotime "1201" "pm")
-                   "T120100"))
-  (should (string= (icalendar--diarytime-to-isotime "1259" "pm")
-                   "T125900")))
+  (should (string= "T011500"
+                  (icalendar--diarytime-to-isotime "01:15" "")))
+  (should (string= "T011500"
+                  (icalendar--diarytime-to-isotime "1:15" "")))
+  (should (string= "T000100"
+                  (icalendar--diarytime-to-isotime "0:01" "")))
+  (should (string= "T010000"
+                  (icalendar--diarytime-to-isotime "0100" "")))
+  (should (string= "T010000"
+                  (icalendar--diarytime-to-isotime "0100" "am")))
+  (should (string= "T130000"
+                  (icalendar--diarytime-to-isotime "0100" "pm")))
+  (should (string= "T120000"
+                  (icalendar--diarytime-to-isotime "1200" "")))
+  (should (string= "T171700"
+                  (icalendar--diarytime-to-isotime "17:17" "")))
+  (should (string= "T000000"
+                  (icalendar--diarytime-to-isotime "1200" "am")))
+  (should (string= "T000100"
+                  (icalendar--diarytime-to-isotime "1201" "am")))
+  (should (string= "T005900"
+                  (icalendar--diarytime-to-isotime "1259" "am")))
+  (should (string= "T120000"
+                  (icalendar--diarytime-to-isotime "1200" "pm")))
+  (should (string= "T120100"
+                  (icalendar--diarytime-to-isotime "1201" "pm")))
+  (should (string= "T125900"
+                  (icalendar--diarytime-to-isotime "1259" "pm"))))
 
 (ert-deftest icalendar--datetime-to-diary-date ()
   "Test method for `icalendar--datetime-to-diary-date'."
   (let* ((datetime '(59 59 23 31 12 2008))
          (calendar-date-style 'iso))
-    (should (string= (icalendar--datetime-to-diary-date datetime)
-                     "2008 12 31"))
+    (should (string= "2008 12 31"
+                    (icalendar--datetime-to-diary-date datetime)))
     (setq calendar-date-style 'european)
-    (should (string= (icalendar--datetime-to-diary-date datetime)
-                     "31 12 2008"))
+    (should (string= "31 12 2008"
+                    (icalendar--datetime-to-diary-date datetime)))
     (setq calendar-date-style 'american)
-    (should (string= (icalendar--datetime-to-diary-date datetime)
-                     "12 31 2008"))))
+    (should (string= "12 31 2008"
+                    (icalendar--datetime-to-diary-date datetime)))))
 
 (ert-deftest icalendar--datestring-to-isodate ()
   "Test method for `icalendar--datestring-to-isodate'."
   (let ((calendar-date-style 'iso))
     ;; numeric iso
-    (should (string= (icalendar--datestring-to-isodate "2008 05 11")
-                     "20080511"))
-    (should (string= (icalendar--datestring-to-isodate "2008 05 31")
-                     "20080531"))
-    (should (string= (icalendar--datestring-to-isodate "2008 05 31" 2)
-                     "20080602"))
+    (should (string= "20080511"
+                     (icalendar--datestring-to-isodate "2008 05 11")))
+    (should (string= "20080531"
+                    (icalendar--datestring-to-isodate "2008 05 31")))
+    (should (string= "20080602"
+                    (icalendar--datestring-to-isodate "2008 05 31" 2)))
 
     ;; numeric european
     (setq calendar-date-style 'european)
-    (should (string= (icalendar--datestring-to-isodate "11 05 2008")
-                     "20080511"))
-    (should (string= (icalendar--datestring-to-isodate "31 05 2008")
-                     "20080531"))
-    (should (string= (icalendar--datestring-to-isodate "31 05 2008" 2)
-                     "20080602"))
+    (should (string= "20080511"
+                    (icalendar--datestring-to-isodate "11 05 2008")))
+    (should (string= "20080531"
+                    (icalendar--datestring-to-isodate "31 05 2008")))
+    (should (string= "20080602"
+                    (icalendar--datestring-to-isodate "31 05 2008" 2)))
 
     ;; numeric american
     (setq calendar-date-style 'american)
-    (should (string= (icalendar--datestring-to-isodate "11 05 2008")
-                     "20081105"))
-    (should (string= (icalendar--datestring-to-isodate "12 30 2008")
-                     "20081230"))
-    (should (string= (icalendar--datestring-to-isodate "12 30 2008" 2)
-                     "20090101"))
+    (should (string= "20081105"
+                    (icalendar--datestring-to-isodate "11 05 2008")))
+    (should (string= "20081230"
+                    (icalendar--datestring-to-isodate "12 30 2008")))
+    (should (string= "20090101"
+                    (icalendar--datestring-to-isodate "12 30 2008" 2)))
 
     ;; non-numeric
     (setq calendar-date-style nil)      ;not necessary for conversion
-    (should (string= (icalendar--datestring-to-isodate "Nov 05 2008")
-                     "20081105"))
-    (should (string= (icalendar--datestring-to-isodate "05 Nov 2008")
-                     "20081105"))
-    (should (string= (icalendar--datestring-to-isodate "2008 Nov 05")
-                     "20081105"))))
+    (should (string= "20081105"
+                    (icalendar--datestring-to-isodate "Nov 05 2008")))
+    (should (string= "20081105"
+                    (icalendar--datestring-to-isodate "05 Nov 2008")))
+    (should (string= "20081105"
+                    (icalendar--datestring-to-isodate "2008 Nov 05")))))
 
 (ert-deftest icalendar--first-weekday-of-year ()
   "Test method for `icalendar-first-weekday-of-year'."
@@ -363,7 +334,9 @@ END:VTIMEZONE
 
 (ert-deftest icalendar--import-format-sample ()
   "Test method for `icalendar-import-format-sample'."
-  (should (string= (icalendar-import-format-sample
+  (should (string= (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
+                           "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'")
+                  (icalendar-import-format-sample
                     (icalendar-tests--get-ical-event "BEGIN:VEVENT
 DTSTAMP:20030509T043439Z
 DTSTART:20030509T103000
@@ -373,9 +346,7 @@ LOCATION:c
 DTEND:20030509T153000
 DESCRIPTION:b
 END:VEVENT
-"))
-                   (concat "SUMMARY=`a' DESCRIPTION=`b' LOCATION=`c' "
-                           "ORGANIZER=`d' STATUS=`' URL=`' CLASS=`'"))))
+")))))
 
 (ert-deftest icalendar--format-ical-event ()
   "Test `icalendar--format-ical-event'."
@@ -397,12 +368,11 @@ DTEND:20030509T153000
 DESCRIPTION:des
 END:VEVENT
 ")))
-    (should (string= (icalendar--format-ical-event event)
-                     "SUM sum DES des LOC loc ORG org"))
+    (should (string= "SUM sum DES des LOC loc ORG org"
+                    (icalendar--format-ical-event event)))
     (setq icalendar-import-format (lambda (&rest ignore)
                                     "helloworld"))
-    (should (string= (icalendar--format-ical-event event)
-                     "helloworld"))
+    (should (string= "helloworld"  (icalendar--format-ical-event event)))
     (setq icalendar-import-format
           (lambda (e)
             (format "-%s-%s-%s-%s-%s-%s-%s-"
@@ -413,8 +383,8 @@ END:VEVENT
                     (icalendar--get-event-property event 'STATUS)
                     (icalendar--get-event-property event 'URL)
                     (icalendar--get-event-property event 'CLASS))))
-    (should (string= (icalendar--format-ical-event event)
-                     "-sum-des-loc-org-nil-nil-nil-"))))
+    (should (string= "-sum-des-loc-org-nil-nil-nil-"
+                    (icalendar--format-ical-event event)))))
 
 (ert-deftest icalendar--parse-summary-and-rest ()
   "Test `icalendar--parse-summary-and-rest'."
@@ -428,15 +398,15 @@ END:VEVENT
         (icalendar-import-format-class " CLA %s")
         (result))
     (setq result (icalendar--parse-summary-and-rest "SUM sum ORG org"))
-    (should (string= (cdr (assoc 'org result)) "org"))
+    (should (string= "org"  (cdr (assoc 'org result))))
 
     (setq result (icalendar--parse-summary-and-rest
                   "SUM sum DES des LOC loc ORG org STA sta URL url CLA cla"))
-    (should (string= (cdr (assoc 'des result)) "des"))
-    (should (string= (cdr (assoc 'loc result)) "loc"))
-    (should (string= (cdr (assoc 'org result)) "org"))
-    (should (string= (cdr (assoc 'sta result)) "sta"))
-    (should (string= (cdr (assoc 'cla result)) "cla"))
+    (should (string= "des" (cdr (assoc 'des result))))
+    (should (string= "loc" (cdr (assoc 'loc result))))
+    (should (string= "org" (cdr (assoc 'org result))))
+    (should (string= "sta" (cdr (assoc 'sta result))))
+    (should (string= "cla" (cdr (assoc 'cla result))))
 
     (setq icalendar-import-format (lambda () "Hello world"))
     (setq result (icalendar--parse-summary-and-rest
@@ -454,7 +424,7 @@ END:VEVENT
 Argument INPUT-ISO iso style diary string.
 Argument INPUT-EUROPEAN european style diary string.
 Argument INPUT-AMERICAN american style diary string.
-Argument EXPECTED-OUTPUT expected icalendar result string.
+Argument EXPECTED-OUTPUT expected iCalendar result string.
 
 European style input data must use german month names.  American
 and ISO style input data must use english month names."
@@ -497,7 +467,7 @@ and ISO style input data must use english month names."
 (defun icalendar-tests--do-test-export (input expected-output)
   "Actually perform export test.
 Argument INPUT input diary string.
-Argument EXPECTED-OUTPUT expected icalendar result string."
+Argument EXPECTED-OUTPUT expected iCalendar result string."
   (let ((temp-file (make-temp-file "icalendar-tests-ics")))
     (unwind-protect
        (progn
@@ -712,7 +682,7 @@ Argument EXPECTED-AMERICAN expected american style diary string."
         (unless (eq (char-before) ?\n)
           (insert "\n"))
         (insert "END:VEVENT\nEND:VCALENDAR\n"))
-      (let ((icalendar-import-format "%s%d%l%o%t%u%c")
+      (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
             (icalendar-import-format-summary "%s")
             (icalendar-import-format-location "\n Location: %s")
             (icalendar-import-format-description "\n Desc: %s")
@@ -720,6 +690,7 @@ Argument EXPECTED-AMERICAN expected american style diary string."
             (icalendar-import-format-status "\n Status: %s")
             (icalendar-import-format-url "\n URL: %s")
             (icalendar-import-format-class "\n Class: %s")
+            (icalendar-import-format-uid "\n UID: %s")
             calendar-date-style)
         (when expected-iso
           (setq calendar-date-style 'iso)
@@ -738,12 +709,10 @@ Argument INPUT input icalendar string.
 Argument EXPECTED-OUTPUT expected diary string."
   (let ((temp-file (make-temp-file "icalendar-test-diary")))
     (icalendar-import-buffer temp-file t t)
-    (unwind-protect
-       (save-excursion
-         (find-file temp-file)
-         (let ((result (buffer-substring-no-properties (point-min) (point-max))))
-           (should (icalendar-tests--compare-strings result
-                                                     expected-output))))
+    (save-excursion
+      (find-file temp-file)
+      (let ((result (buffer-substring-no-properties (point-min) (point-max))))
+       (should (string= expected-output result)))
       (kill-buffer (find-buffer-visiting temp-file))
       (delete-file temp-file))))
 
@@ -753,23 +722,22 @@ Argument EXPECTED-OUTPUT expected diary string."
    "SUMMARY:non-recurring
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000"
-   "&2003/9/19 09:00-11:30 non-recurring"
-   "&19/9/2003 09:00-11:30 non-recurring"
-   "&9/19/2003 09:00-11:30 non-recurring")
+   "&2003/9/19 09:00-11:30 non-recurring\n"
+   "&19/9/2003 09:00-11:30 non-recurring\n"
+   "&9/19/2003 09:00-11:30 non-recurring\n")
   (icalendar-tests--test-import
    "SUMMARY:non-recurring allday
 DTSTART;VALUE=DATE-TIME:20030919"
-   "&2003/9/19 non-recurring allday"
-   "&19/9/2003 non-recurring allday"
-   "&9/19/2003 non-recurring allday")
+   "&2003/9/19 non-recurring allday\n"
+   "&19/9/2003 non-recurring allday\n"
+   "&9/19/2003 non-recurring allday\n")
   (icalendar-tests--test-import
-   ;; do not remove the trailing blank after "long"!
-   "SUMMARY:long
- summary
-DTSTART;VALUE=DATE:20030919"
-   "&2003/9/19 long summary"
-   "&19/9/2003 long summary"
-   "&9/19/2003 long summary")
+   ;; Checkdoc removes trailing blanks.  Therefore: format!
+   (format "%s\n%s\n%s" "SUMMARY:long " " summary"
+           "DTSTART;VALUE=DATE:20030919")
+   "&2003/9/19 long summary\n"
+   "&19/9/2003 long summary\n"
+   "&9/19/2003 long summary\n")
   (icalendar-tests--test-import
    "UID:748f2da0-0d9b-11d8-97af-b4ec8686ea61
 SUMMARY:Sommerferien
@@ -784,14 +752,18 @@ DTSTAMP:20031103T011641Z
    "&%%(and (diary-block 2004 7 19 2004 8 27)) Sommerferien
  Status: TENTATIVE
  Class: PRIVATE
+ UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
 "
    "&%%(and (diary-block 19 7 2004 27 8 2004)) Sommerferien
  Status: TENTATIVE
  Class: PRIVATE
+ UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
 "
    "&%%(and (diary-block 7 19 2004 8 27 2004)) Sommerferien
  Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE
+ UID: 748f2da0-0d9b-11d8-97af-b4ec8686ea61
+")
   (icalendar-tests--test-import
    "UID
  :04979712-3902-11d9-93dd-8f9f4afe08da
@@ -814,13 +786,16 @@ LAST-MODIFIED
 "
    "&2004/11/23 14:00-14:30 folded summary
  Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+ UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
    "&23/11/2004 14:00-14:30 folded summary
  Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+ UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n"
    "&11/23/2004 14:00-14:30 folded summary
  Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE
+ UID: 04979712-3902-11d9-93dd-8f9f4afe08da\n")
 
   (icalendar-tests--test-import
    "UID
@@ -842,13 +817,16 @@ DTSTAMP
 "
    "&2004/11/23 14:45-15:45 another example
  Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+ UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
    "&23/11/2004 14:45-15:45 another example
  Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+ UID: 6161a312-3902-11d9-b512-f764153bb28b\n"
    "&11/23/2004 14:45-15:45 another example
  Status: TENTATIVE
- Class: PRIVATE"))
+ Class: PRIVATE
+ UID: 6161a312-3902-11d9-b512-f764153bb28b\n"))
 
 (ert-deftest icalendar-import-rrule ()
   (icalendar-tests--test-import
@@ -857,9 +835,9 @@ DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=DAILY;
 "
-   "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily"
-   "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily"
-   "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily")
+   "&%%(and (diary-cyclic 1 2003 9 19)) 09:00-11:30 rrule daily\n"
+   "&%%(and (diary-cyclic 1 19 9 2003)) 09:00-11:30 rrule daily\n"
+   "&%%(and (diary-cyclic 1 9 19 2003)) 09:00-11:30 rrule daily\n")
   ;; RRULE examples
   (icalendar-tests--test-import
    "SUMMARY:rrule daily
@@ -867,9 +845,9 @@ DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=DAILY;INTERVAL=2
 "
-   "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily"
-   "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily"
-   "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily")
+   "&%%(and (diary-cyclic 2 2003 9 19)) 09:00-11:30 rrule daily\n"
+   "&%%(and (diary-cyclic 2 19 9 2003)) 09:00-11:30 rrule daily\n"
+   "&%%(and (diary-cyclic 2 9 19 2003)) 09:00-11:30 rrule daily\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule daily with exceptions
 DTSTART;VALUE=DATE-TIME:20030919T090000
@@ -877,118 +855,117 @@ DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=DAILY;INTERVAL=2
 EXDATE:20030921,20030925
 "
-   "&%%(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"
-   "&%%(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"
-   "&%%(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")
+   "&%%(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"
+   "&%%(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"
+   "&%%(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")
   (icalendar-tests--test-import
    "SUMMARY:rrule weekly
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=WEEKLY;
 "
-   "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly"
-   "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly"
-   "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly")
+   "&%%(and (diary-cyclic 7 2003 9 19)) 09:00-11:30 rrule weekly\n"
+   "&%%(and (diary-cyclic 7 19 9 2003)) 09:00-11:30 rrule weekly\n"
+   "&%%(and (diary-cyclic 7 9 19 2003)) 09:00-11:30 rrule weekly\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule monthly no end
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=MONTHLY;
 "
-   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end"
-   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end"
-   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end")
+   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 9999 1 1)) 09:00-11:30 rrule monthly no end\n"
+   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n"
+   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 1 9999)) 09:00-11:30 rrule monthly no end\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule monthly with end
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=MONTHLY;UNTIL=20050819;
 "
-   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end"
-   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end"
-   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end")
+   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2005 8 19)) 09:00-11:30 rrule monthly with end\n"
+   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 8 2005)) 09:00-11:30 rrule monthly with end\n"
+   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 8 19 2005)) 09:00-11:30 rrule monthly with end\n")
   (icalendar-tests--test-import
    "DTSTART;VALUE=DATE:20040815
 DTEND;VALUE=DATE:20040816
 SUMMARY:Maria Himmelfahrt
-UID:CC56BEA6-49D2-11D8-8833-00039386D1C2-RID
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8
 "
-   "&%%(and (diary-anniversary 2004 8 15))  Maria Himmelfahrt"
-   "&%%(and (diary-anniversary 15 8 2004))  Maria Himmelfahrt"
-   "&%%(and (diary-anniversary 8 15 2004))  Maria Himmelfahrt")
+   "&%%(and (diary-anniversary 2004 8 15))  Maria Himmelfahrt\n"
+   "&%%(and (diary-anniversary 15 8 2004))  Maria Himmelfahrt\n"
+   "&%%(and (diary-anniversary 8 15 2004))  Maria Himmelfahrt\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule yearly
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=YEARLY;INTERVAL=2
 "
-   "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly" ;FIXME
-   "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly" ;FIXME
-   "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly") ;FIXME
+   "&%%(and (diary-anniversary 2003 9 19)) 09:00-11:30 rrule yearly\n" ;FIXME
+   "&%%(and (diary-anniversary 19 9 2003)) 09:00-11:30 rrule yearly\n" ;FIXME
+   "&%%(and (diary-anniversary 9 19 2003)) 09:00-11:30 rrule yearly\n") ;FIXME
   (icalendar-tests--test-import
    "SUMMARY:rrule count daily short
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=DAILY;COUNT=1;INTERVAL=1
 "
-   "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short"
-   "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short"
-   "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short")
+   "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 9 19)) 09:00-11:30 rrule count daily short\n"
+   "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 19 9 2003)) 09:00-11:30 rrule count daily short\n"
+   "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 9 19 2003)) 09:00-11:30 rrule count daily short\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule count daily long
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=DAILY;COUNT=14;INTERVAL=1
 "
-   "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long"
-   "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long"
-   "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long")
+   "&%%(and (diary-cyclic 1 2003 9 19) (diary-block 2003 9 19 2003 10 2)) 09:00-11:30 rrule count daily long\n"
+   "&%%(and (diary-cyclic 1 19 9 2003) (diary-block 19 9 2003 2 10 2003)) 09:00-11:30 rrule count daily long\n"
+   "&%%(and (diary-cyclic 1 9 19 2003) (diary-block 9 19 2003 10 2 2003)) 09:00-11:30 rrule count daily long\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule count bi-weekly 3 times
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=WEEKLY;COUNT=3;INTERVAL=2
 "
-   "&%%(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"
-   "&%%(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"
-   "&%%(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")
+   "&%%(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"
+   "&%%(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"
+   "&%%(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")
   (icalendar-tests--test-import
    "SUMMARY:rrule count monthly
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=MONTHLY;INTERVAL=1;COUNT=5
 "
-   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly"
-   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly"
-   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly")
+   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 1 19)) 09:00-11:30 rrule count monthly\n"
+   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 1 2004)) 09:00-11:30 rrule count monthly\n"
+   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 1 19 2004)) 09:00-11:30 rrule count monthly\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule count every second month
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=5
 "
-   "&%%(and (diary-date t t 19) (diary-block 2003 9 19 2004 5 19)) 09:00-11:30 rrule count every second month" ;FIXME
-   "&%%(and (diary-date 19 t t) (diary-block 19 9 2003 19 5 2004)) 09:00-11:30 rrule count every second month" ;FIXME
-   "&%%(and (diary-date t 19 t) (diary-block 9 19 2003 5 19 2004)) 09:00-11:30 rrule count every second month") ;FIXME
+   "&%%(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
+   "&%%(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
+   "&%%(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
   (icalendar-tests--test-import
    "SUMMARY:rrule count yearly
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=YEARLY;INTERVAL=1;COUNT=5
 "
-   "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly"
-   "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly"
-   "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly")
+   "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2007 9 19)) 09:00-11:30 rrule count yearly\n"
+   "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2007)) 09:00-11:30 rrule count yearly\n"
+   "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2007)) 09:00-11:30 rrule count yearly\n")
   (icalendar-tests--test-import
    "SUMMARY:rrule count every second year
 DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
 "
-   "&%%(and (diary-date t 9 19) (diary-block 2003 9 19 2011 9 19)) 09:00-11:30 rrule count every second year" ;FIXME!!!
-   "&%%(and (diary-date 19 9 t) (diary-block 19 9 2003 19 9 2011)) 09:00-11:30 rrule count every second year" ;FIXME!!!
-   "&%%(and (diary-date 9 19 t) (diary-block 9 19 2003 9 19 2011)) 09:00-11:30 rrule count every second year") ;FIXME!!!
+   "&%%(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!!!
+   "&%%(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!!!
+   "&%%(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!!!
 )
 
 (ert-deftest icalendar-import-duration ()
@@ -998,9 +975,9 @@ RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=5
 SUMMARY:duration
 DURATION:P7D
 "
-   "&%%(and (diary-block 2005 2 17 2005 2 23)) duration"
-   "&%%(and (diary-block 17 2 2005 23 2 2005)) duration"
-   "&%%(and (diary-block 2 17 2005 2 23 2005)) duration")
+   "&%%(and (diary-block 2005 2 17 2005 2 23)) duration\n"
+   "&%%(and (diary-block 17 2 2005 23 2 2005)) duration\n"
+   "&%%(and (diary-block 2 17 2005 2 23 2005)) duration\n")
   (icalendar-tests--test-import
    "UID:20041127T183329Z-18215-1001-4536-49109@andromeda
 DTSTAMP:20041127T183315Z
@@ -1014,11 +991,14 @@ SEQUENCE:1
 CREATED:20041127T183329
 "
    "&%%(and (diary-cyclic 1 2001 12 21) (diary-block 2001 12 21 2001 12 29))  Urlaub
- Class: PUBLIC"
+ Class: PUBLIC
+ UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
    "&%%(and (diary-cyclic 1 21 12 2001) (diary-block 21 12 2001 29 12 2001))  Urlaub
- Class: PUBLIC"
+ Class: PUBLIC
+ UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"
    "&%%(and (diary-cyclic 1 12 21 2001) (diary-block 12 21 2001 12 29 2001))  Urlaub
- Class: PUBLIC"))
+ Class: PUBLIC
+ UID: 20041127T183329Z-18215-1001-4536-49109@andromeda\n"))
 
 (ert-deftest icalendar-import-bug-6766 ()
   ;;bug#6766 -- multiple byday values in a weekly rrule
@@ -1048,22 +1028,119 @@ UID:8814e3f9-7482-408f-996c-3bfe486a1263
 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 2010 4 21)) 11:30-12:00 Scrum
  Status: CONFIRMED
  Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1262
 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 2010 4 22)) Tues + Thurs thinking
- Class: PUBLIC"
-
+ Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1263
+"
 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 21 4 2010)) 11:30-12:00 Scrum
  Status: CONFIRMED
  Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1262
 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 22 4 2010)) Tues + Thurs thinking
- Class: PUBLIC"
-
+ Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1263
+"
 "&%%(and (memq (calendar-day-of-week date) '(1 3 4 5)) (diary-cyclic 1 4 21 2010)) 11:30-12:00 Scrum
  Status: CONFIRMED
  Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1262
 &%%(and (memq (calendar-day-of-week date) '(2 4)) (diary-cyclic 1 4 22 2010)) Tues + Thurs thinking
- Class: PUBLIC"))
+ Class: PUBLIC
+ UID: 8814e3f9-7482-408f-996c-3bfe486a1263
+"))
+
+(ert-deftest icalendar-import-multiple-vcalendars ()
+  (icalendar-tests--test-import
+   "DTSTART;VALUE=DATE:20110723
+SUMMARY:event-1
+"
+   "&2011/7/23 event-1\n"
+   "&23/7/2011 event-1\n"
+   "&7/23/2011 event-1\n")
+
+  (icalendar-tests--test-import
+   "BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0\nBEGIN:VEVENT
+DTSTART;VALUE=DATE:20110723
+SUMMARY:event-1
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110724
+SUMMARY:event-2
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+PRODID:-//Emacs//NONSGML icalendar.el//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110725
+SUMMARY:event-3a
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110725
+SUMMARY:event-3b
+END:VEVENT
+END:VCALENDAR
+"
+   "&2011/7/23 event-1\n&2011/7/24 event-2\n&2011/7/25 event-3a\n&2011/7/25 event-3b\n"
+   "&23/7/2011 event-1\n&24/7/2011 event-2\n&25/7/2011 event-3a\n&25/7/2011 event-3b\n"
+   "&7/23/2011 event-1\n&7/24/2011 event-2\n&7/25/2011 event-3a\n&7/25/2011 event-3b\n"))
 
+(ert-deftest icalendar-import-with-uid ()
+  "Perform import test with uid."
+  (icalendar-tests--test-import
+   "UID:1234567890uid
+SUMMARY:non-recurring
+DTSTART;VALUE=DATE-TIME:20030919T090000
+DTEND;VALUE=DATE-TIME:20030919T113000"
+   "&2003/9/19 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
+   "&19/9/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"
+   "&9/19/2003 09:00-11:30 non-recurring\n UID: 1234567890uid\n"))
 
+(ert-deftest icalendar-import-with-timezone ()
+  ;; bug#11473
+  (icalendar-tests--test-import
+   "BEGIN:VCALENDAR
+BEGIN:VTIMEZONE
+TZID:fictional\, nonexistent\, arbitrary
+BEGIN:STANDARD
+DTSTART:20100101T000000
+TZOFFSETFROM:+0200
+TZOFFSETTO:-0200
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=01
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20101201T000000
+TZOFFSETFROM:-0200
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+SUMMARY:standardtime
+DTSTART;TZID=\"fictional, nonexistent, arbitrary\":20120115T120000
+DTEND;TZID=\"fictional, nonexistent, arbitrary\":20120115T123000
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:daylightsavingtime
+DTSTART;TZID=\"fictional, nonexistent, arbitrary\":20121215T120000
+DTEND;TZID=\"fictional, nonexistent, arbitrary\":20121215T123000
+END:VEVENT
+END:VCALENDAR"
+   ;; "standardtime" begins first sunday in january and is 4 hours behind CET
+   ;; "daylightsavingtime" begins first sunday in november and is 1 hour before CET
+   "&2012/1/15 15:00-15:30 standardtime
+&2012/12/15 11:00-11:30 daylightsavingtime
+"
+   nil
+   nil)
+  )
 ;; ======================================================================
 ;; Cycle
 ;; ======================================================================
@@ -1079,14 +1156,15 @@ Argument INPUT icalendar event string."
       (unless (eq (char-before) ?\n)
         (insert "\n"))
       (insert "END:VEVENT\nEND:VCALENDAR\n"))
-    (let ((icalendar-import-format "%s%d%l%o%t%u%c")
+    (let ((icalendar-import-format "%s%d%l%o%t%u%c%U")
           (icalendar-import-format-summary "%s")
           (icalendar-import-format-location "\n Location: %s")
           (icalendar-import-format-description "\n Desc: %s")
           (icalendar-import-format-organizer "\n Organizer: %s")
           (icalendar-import-format-status "\n Status: %s")
           (icalendar-import-format-url "\n URL: %s")
-          (icalendar-import-format-class "\n Class: %s"))
+          (icalendar-import-format-class "\n Class: %s")
+          (icalendar-import-format-class "\n UID: %s"))
       (dolist (calendar-date-style '(iso european american))
         (icalendar-tests--do-test-cycle)))))
 
@@ -1100,7 +1178,7 @@ Argument INPUT icalendar event string."
        (progn
          ;; step 1: import
          (icalendar-import-buffer temp-diary t t)
-         
+
          ;; step 2: export what was just imported
          (save-excursion
            (find-file temp-diary)
@@ -1110,10 +1188,10 @@ Argument INPUT icalendar event string."
          (save-excursion
            (find-file temp-ics)
            (goto-char (point-min))
-           (when (re-search-forward "\nUID:.*\n" nil t)
-             (replace-match "\n"))
+           ;;(when (re-search-forward "\nUID:.*\n" nil t)
+             ;;(replace-match "\n"))
            (let ((cycled (buffer-substring-no-properties (point-min) (point-max))))
-             (should (icalendar-tests--compare-strings cycled org-input)))))
+             (should (string= org-input cycled)))))
       ;; clean up
       (kill-buffer (find-buffer-visiting temp-diary))
       (save-excursion
@@ -1124,14 +1202,17 @@ Argument INPUT icalendar event string."
       (delete-file temp-ics))))
 
 (ert-deftest icalendar-cycle ()
-  "Perform cycling tests."
+  "Perform cycling tests.
+Take care to avoid auto-generated UIDs here."
   (icalendar-tests--test-cycle
-   "DTSTART;VALUE=DATE-TIME:20030919T090000
+   "UID:dummyuid
+DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 SUMMARY:Cycletest
 ")
   (icalendar-tests--test-cycle
-   "DTSTART;VALUE=DATE-TIME:20030919T090000
+   "UID:blah
+DTSTART;VALUE=DATE-TIME:20030919T090000
 DTEND;VALUE=DATE-TIME:20030919T113000
 SUMMARY:Cycletest
 DESCRIPTION:beschreibung!
@@ -1139,7 +1220,8 @@ LOCATION:nowhere
 ORGANIZER:ulf
 ")
     (icalendar-tests--test-cycle
-     "DTSTART;VALUE=DATE:19190909
+     "UID:4711
+DTSTART;VALUE=DATE:19190909
 DTEND;VALUE=DATE:19190910
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
 SUMMARY:and diary-anniversary
@@ -1211,12 +1293,16 @@ END:VCALENDAR"
  Desc: 10:30am - Blah
  Location: Cccc
  Organizer: MAILTO:aaaaaaa@aaaaaaa.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
+"
    "&5/9/2003 10:30-15:30 On-Site Interview
  Desc: 10:30am - Blah
  Location: Cccc
  Organizer: MAILTO:aaaaaaa@aaaaaaa.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E0080000000080B6DE661216C301000000000000000010000000DB823520692542408ED02D7023F9DFF9
+")
 
   ;; 2003-06-18 a
   (icalendar-tests--test-import
@@ -1255,12 +1341,16 @@ END:VALARM"
  Desc: 753 Zeichen hier radiert
  Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
  Organizer: MAILTO:xxx@xxxxx.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
+"
    "&6/23/2003 11:00-12:00 Dress Rehearsal for XXXX-XXXX
  Desc: 753 Zeichen hier radiert
  Location: 555 or TN 555-5555 ID 5555 & NochWas (see below)
  Organizer: MAILTO:xxx@xxxxx.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
+")
   ;; 2003-06-18 b -- uses timezone
   (icalendar-tests--test-import
    "BEGIN:VCALENDAR
@@ -1323,12 +1413,16 @@ END:VCALENDAR"
  Desc: Viele Zeichen standen hier früher
  Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
  Organizer: MAILTO:bbb@bbbbb.com
- Status: CONFIRMED"
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
+"
    "&6/23/2003 17:00-18:00 Updated: Dress Rehearsal for ABC01-15
  Desc: Viele Zeichen standen hier früher
  Location: 123 or TN 123-1234 ID abcd & SonstWo (see below)
  Organizer: MAILTO:bbb@bbbbb.com
- Status: CONFIRMED")
+ Status: CONFIRMED
+ UID: 040000008200E00074C5B7101A82E00800000000608AA7DA9835C3010000000000000000100000007C3A6D65EE726E40B7F3D69A23BD567E
+")
   ;; export 2004-10-28 block entries
   (icalendar-tests--test-export
    nil
@@ -1382,7 +1476,7 @@ SUMMARY:may 30 - June 1: ee")
    "DTSTART;VALUE=DATE:20050606
 DTEND;VALUE=DATE:20050609
 SUMMARY:ff")
-  
+
   ;; export 2004-10-28 anniversary entries
   (icalendar-tests--test-export
    nil
@@ -1551,8 +1645,6 @@ VERSION
 PRODID
  :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
 BEGIN:VEVENT
-UID
- :04979712-3902-11d9-93dd-8f9f4afe08da
 SUMMARY
  :Jjjjj & Wwwww
 STATUS
@@ -1571,8 +1663,6 @@ LAST-MODIFIED
  :20041118T013640Z
 END:VEVENT
 BEGIN:VEVENT
-UID
- :6161a312-3902-11d9-b512-f764153bb28b
 SUMMARY
  :BB Aaaaaaaa Bbbbb
 STATUS
@@ -1589,8 +1679,6 @@ DTSTAMP
  :20041118T013641Z
 END:VEVENT
 BEGIN:VEVENT
-UID
- :943a4d7e-3902-11d9-9ce7-c9addeadf928
 SUMMARY
  :Hhhhhhhh
 STATUS
@@ -1607,8 +1695,6 @@ DTSTAMP
  :20041118T013831Z
 END:VEVENT
 BEGIN:VEVENT
-UID
- :fe53615e-3902-11d9-9dd8-9d38a155bf41
 SUMMARY
  :MMM Aaaaaaaaa
 STATUS
@@ -1629,8 +1715,6 @@ DTSTAMP
  :20041118T014117Z
 END:VEVENT
 BEGIN:VEVENT
-UID
- :87c928ee-3901-11d9-b21f-b45042155024
 SUMMARY
  :Rrrr/Cccccc ii Aaaaaaaa
 DESCRIPTION
@@ -1653,8 +1737,6 @@ LAST-MODIFIED
  :20041118T014203Z
 END:VEVENT
 BEGIN:VEVENT
-UID
- :e8f331ae-3902-11d9-9948-dfdcb66a2872
 SUMMARY
  :Wwww aa hhhh
 STATUS
@@ -1697,7 +1779,8 @@ END:VCALENDAR
  Class: PRIVATE
 &%%(and (diary-cyclic 7 1 11 2004)) Wwww aa hhhh
  Status: TENTATIVE
- Class: PRIVATE"
+ Class: PRIVATE
+"
    "&11/23/2004 14:00-14:30 Jjjjj & Wwwww
  Status: TENTATIVE
  Class: PRIVATE
@@ -1716,7 +1799,8 @@ END:VCALENDAR
  Class: PRIVATE
 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
  Status: TENTATIVE
- Class: PRIVATE")
+ Class: PRIVATE
+")
 
   ;; 2004-09-09 pg
   (icalendar-tests--test-export
@@ -1771,11 +1855,15 @@ DTSTAMP
    "&%%(and (diary-block 6 2 2005 6 2 2005)) Waitangi Day
  Desc: abcdef
  Status: CONFIRMED
- Class: PRIVATE"
+ Class: PRIVATE
+ UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
+"
    "&%%(and (diary-block 2 6 2005 2 6 2005)) Waitangi Day
  Desc: abcdef
  Status: CONFIRMED
- Class: PRIVATE")
+ Class: PRIVATE
+ UID: b60d398e-1dd1-11b2-a159-cf8cb05139f4
+")
 
   ;; 2005-03-01 lt
   (icalendar-tests--test-import
@@ -1785,8 +1873,10 @@ UID:6AFA7558-6994-11D9-8A3A-000A95A0E830-RID
 DTSTAMP:20050118T210335Z
 DURATION:P7D"
    nil
-   "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa"
-   "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa")
+   "&%%(and (diary-block 17 2 2005 23 2 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
+ UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n"
+   "&%%(and (diary-block 2 17 2005 2 23 2005)) Hhhhhh Aaaaa ii Aaaaaaaa
+ UID: 6AFA7558-6994-11D9-8A3A-000A95A0E830-RID\n")
 
   ;; 2005-03-23 lt
   (icalendar-tests--test-export
@@ -1811,7 +1901,72 @@ DTEND;VALUE=DATE:19001102
 RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYMONTHDAY=1
 SUMMARY:NNN Wwwwwwww Wwwww - Aaaaaa Pppppppp rrrrrr ddd oo Nnnnnnnn 30
 ")
-  )
+
+  ;; bug#11473
+  (icalendar-tests--test-import
+   "BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:Microsoft Exchange Server 2007
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(UTC+01:00) Amsterdam\, Berlin\, Bern\, Rome\, Stockholm\, Vienna
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+ORGANIZER;CN=\"A. Luser\":MAILTO:a.luser@foo.com
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Luser, Oth
+ er\":MAILTO:other.luser@foo.com
+DESCRIPTION;LANGUAGE=en-US:\nWhassup?\n\n
+SUMMARY;LANGUAGE=en-US:Query
+DTSTART;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\"
+ :20120515T150000
+DTEND;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\":2
+ 0120515T153000
+UID:040000008200E00074C5B7101A82E0080000000020FFAED0CFEFCC01000000000000000
+ 010000000575268034ECDB649A15349B1BF240F15
+RECURRENCE-ID;TZID=\"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, V
+ ienna\":20120515T170000
+CLASS:PUBLIC
+PRIORITY:5
+DTSTAMP:20120514T153645Z
+TRANSP:OPAQUE
+STATUS:CONFIRMED
+SEQUENCE:15
+LOCATION;LANGUAGE=en-US:phone
+X-MICROSOFT-CDO-APPT-SEQUENCE:15
+X-MICROSOFT-CDO-OWNERAPPTID:1907632092
+X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-IMPORTANCE:1
+X-MICROSOFT-CDO-INSTTYPE:3
+BEGIN:VALARM
+ACTION:DISPLAY
+DESCRIPTION:REMINDER
+TRIGGER;RELATED=START:-PT15M
+END:VALARM
+END:VEVENT
+END:VCALENDAR"
+   nil
+   "&15/5/2012 15:00-15:30 Query
+ Location: phone
+ Organizer: MAILTO:a.luser@foo.com
+ Status: CONFIRMED
+ Class: PUBLIC
+ UID: 040000008200E00074C5B7101A82E0080000000020FFAED0CFEFCC01000000000000000010000000575268034ECDB649A15349B1BF240F15
+"     nil)
+)
 
 (provide 'icalendar-tests)
 ;;; icalendar-tests.el ends here