changeset 106617:78f92ffeb7ab

Fixed timezone handling problem in icalendar.el.
author Ulf Jasper <ulf.jasper@web.de>
date Fri, 18 Dec 2009 19:35:14 +0000
parents 9fd36368ff9b
children 431b202f351d
files lisp/ChangeLog lisp/calendar/icalendar.el test/ChangeLog test/icalendar-testsuite.el
diffstat 4 files changed, 101 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Dec 18 04:29:17 2009 +0000
+++ b/lisp/ChangeLog	Fri Dec 18 19:35:14 2009 +0000
@@ -1,3 +1,11 @@
+2009-12-18  Ulf Jasper  <ulf.jasper@web.de>
+
+	* calendar/icalendar.el (icalendar--convert-tz-offset): Fixed
+	timezone names.
+	(icalendar--convert-tz-offset): Fixed the "last-day-problem".
+	(icalendar--add-diary-entry): Remove the trailing blank that
+	diary-make-entry inserts.
+
 2009-12-17  Michael Albinus  <michael.albinus@gmx.de>
 
 	Make `file-expand-wildcards' work for remote files.
--- a/lisp/calendar/icalendar.el	Fri Dec 18 04:29:17 2009 +0000
+++ b/lisp/calendar/icalendar.el	Fri Dec 18 19:35:14 2009 +0000
@@ -454,7 +454,7 @@
 	    (cons
 	     (concat
 	      ;; Fake a name.
-	      (if dst-p "(DST?)" "(STD?)")
+	      (if dst-p "DST" "STD")
 	      ;; For TZ, OFFSET is added to the local time.  So,
 	      ;; invert the values.
 	      (if (eq (aref offset 0) ?-) "+" "-")
@@ -466,6 +466,10 @@
 		    (week (if (eq day -1)
 			      byday
 			    (substring byday 0 -2))))
+               ;; "Translate" the icalendar way to specify the last
+               ;; (sun|mon|...)day in month to the tzset way.
+               (if (string= week "-1")  ; last day as icalendar calls it
+                   (setq week "5"))     ; last day as tzset calls it
 	       (concat "M" bymonth "." week "." (if (eq day -1) "0"
 						  (int-to-string day))
 		       ;; Start time.
@@ -2241,6 +2245,12 @@
                    'diary-make-entry
                  'make-diary-entry)
                string non-marking diary-file)))
+  ;; Würgaround to remove the trailing blank char
+  (save-excursion
+    (set-buffer (find-file diary-file))
+    (goto-char (point-max))
+    (if (= (char-before) ? )
+        (delete-char -1)))
   ;; return diary-file in case it has been changed interactively
   diary-file)
 
--- a/test/ChangeLog	Fri Dec 18 04:29:17 2009 +0000
+++ b/test/ChangeLog	Fri Dec 18 19:35:14 2009 +0000
@@ -1,3 +1,15 @@
+2009-12-18  Ulf Jasper  <ulf.jasper@web.de>
+
+	* icalendar-testsuite.el
+	(icalendar-testsuite--run-function-tests): Added
+	icalendar-testsuite--test-parse-vtimezone.
+	(icalendar-testsuite--test-parse-vtimezone): New.
+	(icalendar-testsuite--do-test-cycle): Doc changes.
+	(icalendar-testsuite--run-real-world-tests): Removed trailing
+	whitespace -- see change of icalendar--add-diary-entry in
+	icalendar.el.
+	(icalendar-testsuite--run-cycle-tests): Re-enabled all tests.
+
 2009-09-30  Glenn Morris  <rgm@gnu.org>
 
 	* cedet/semantic-utest-c.el: Relicense under GPLv3+.
--- a/test/icalendar-testsuite.el	Fri Dec 18 04:29:17 2009 +0000
+++ b/test/icalendar-testsuite.el	Fri Dec 18 19:35:14 2009 +0000
@@ -53,7 +53,8 @@
   (icalendar-testsuite--test-datetime-to-diary-date)
   (icalendar-testsuite--test-diarytime-to-isotime)
   (icalendar-testsuite--test-calendar-style)
-  (icalendar-testsuite--test-create-uid))
+  (icalendar-testsuite--test-create-uid)
+  (icalendar-testsuite--test-parse-vtimezone))
 
 (defun icalendar-testsuite--test-format-ical-event ()
   "Test `icalendar--format-ical-event'."
@@ -272,6 +273,48 @@
                       (icalendar--create-uid entry-full contents)))
     ))
 
+(defun icalendar-testsuite--test-parse-vtimezone ()
+  (let (vtimezone result)
+    (setq vtimezone (icalendar-testsuite--get-ical-event "BEGIN:VTIMEZONE
+TZID:thename
+BEGIN:STANDARD
+DTSTART:16010101T040000
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+"))
+    (setq result (icalendar--parse-vtimezone vtimezone))
+    (assert (string= "thename" (car result)))
+    (message (cdr result))
+    (assert (string= "STD-02:00DST-03:00,M3.5.0/03:00:00,M10.5.0/04:00:00" (cdr result)))
+    (setq vtimezone (icalendar-testsuite--get-ical-event "BEGIN:VTIMEZONE
+TZID:anothername
+BEGIN:STANDARD
+DTSTART:16010101T040000
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2MO;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+"))
+    (setq result (icalendar--parse-vtimezone vtimezone))
+    (assert (string= "anothername" (car result)))
+    (message (cdr result))
+    (assert (string= "STD-02:00DST-03:00,M3.2.1/03:00:00,M10.2.1/04:00:00" (cdr result)))))
 
 ;; ======================================================================
 ;; Test methods for exporting from diary to icalendar
@@ -455,10 +498,16 @@
   (let ((temp-diary (make-temp-file "icalendar-test-diary"))
         (temp-ics (make-temp-file "icalendar-test-ics"))
         (org-input (buffer-substring-no-properties (point-min) (point-max))))
+
+    ;; step 1: import
     (icalendar-import-buffer temp-diary t t)
+
+    ;; step 2: export what was just imported
     (save-excursion
       (find-file temp-diary)
       (icalendar-export-region (point-min) (point-max) temp-ics))
+
+    ;; compare the output of step 2 with the input of step 1
     (save-excursion
       (find-file temp-ics)
       (goto-char (point-min))
@@ -468,6 +517,8 @@
         (unless (string-equal org-input cycled)
           (error "Import test failed! Found `%s'\nbut expected `%s'" cycled
                  org-input))))
+
+    ;; clean up -- Note this is done only if test is passed
     (kill-buffer (find-buffer-visiting temp-diary))
     (save-excursion
       (set-buffer (find-buffer-visiting temp-ics))
@@ -1410,42 +1461,42 @@
    nil
    "&23/11/2004 14:00-14:30 Jjjjj & Wwwww
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &23/11/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &23/11/2004 11:00-12:00 Hhhhhhhh
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &%%(and (diary-cyclic 14 12 11 2004)) 14:00-18:30 MMM Aaaaaaaaa
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &%%(and (diary-block 19 11 2004 19 11 2004)) Rrrr/Cccccc ii Aaaaaaaa
  Desc: Vvvvv Rrrr aaa Cccccc
  Status: TENTATIVE
- Class: PRIVATE 
+ 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 
+ Class: PRIVATE
 &11/23/2004 14:45-15:45 BB Aaaaaaaa Bbbbb
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &11/23/2004 11:00-12:00 Hhhhhhhh
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &%%(and (diary-cyclic 14 11 12 2004)) 14:00-18:30 MMM Aaaaaaaaa
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &%%(and (diary-block 11 19 2004 11 19 2004)) Rrrr/Cccccc ii Aaaaaaaa
  Desc: Vvvvv Rrrr aaa Cccccc
  Status: TENTATIVE
- Class: PRIVATE 
+ Class: PRIVATE
 &%%(and (diary-cyclic 7 11 1 2004)) Wwww aa hhhh
  Status: TENTATIVE
- Class: PRIVATE ")
+ Class: PRIVATE")
 
   ;; 2004-09-09 pg
   (icalendar-testsuite--test-export
@@ -1555,13 +1606,12 @@
 ORGANIZER:ulf
 ")
 
-  ;; FIXME: does not work
-  ;;  (icalendar-testsuite--test-cycle
-  ;;   "DTSTART;VALUE=DATE:19190909
-  ;;DTEND;VALUE=DATE:19190910
-  ;;RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
-  ;;SUMMARY:and diary-anniversary
-  ;;")
+    (icalendar-testsuite--test-cycle
+     "DTSTART;VALUE=DATE:19190909
+DTEND;VALUE=DATE:19190910
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=09;BYMONTHDAY=09
+SUMMARY:and diary-anniversary
+")
   )