1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
(in-package #:local-time.test)
(defsuite* (timezone :in test))
(eval-when (:compile-toplevel :load-toplevel :execute)
(local-time::define-timezone eastern-tz
(merge-pathnames #p"EST5EDT" local-time::*default-timezone-repository-path*))
(local-time::define-timezone utc-leaps
(merge-pathnames #p"../zoneinfo-leaps/UTC" local-time::*default-timezone-repository-path*)))
(deftest transition-position/correct-position ()
(let ((cases '((0 #(1 2 3 4 5) 0)
(1 #(1 2 3 4 5) 0)
(2 #(1 2 3 4 5) 1)
(3 #(1 2 3 4 5) 2)
(4 #(1 2 3 4 5) 3)
(5 #(1 2 3 4 5) 4)
(1 #(1 3 5) 0)
(2 #(1 3 5) 0)
(3 #(1 3 5) 1)
(4 #(1 3 5) 1)
(5 #(1 3 5) 2)
(6 #(1 3 5) 2)
(1 #(1 3 5 7) 0)
(2 #(1 3 5 7) 0)
(3 #(1 3 5 7) 1)
(4 #(1 3 5 7) 1)
(5 #(1 3 5 7) 2)
(6 #(1 3 5 7) 2)
(7 #(1 3 5 7) 3)
(8 #(1 3 5 7) 3)
)))
(dolist (case cases)
(destructuring-bind (needle haystack want)
case
(let ((got (local-time::transition-position needle haystack)))
(is (= got want)
"(transition-position ~a ~a) got ~a, want ~a"
needle haystack got want))))))
(deftest test/timezone/decode-timestamp-dst ()
;; Testing DST calculation with a known timezone
(let ((test-cases '(
;; Spring forward
((2008 3 9 6 58) (2008 3 9 1 58))
((2008 3 9 6 59) (2008 3 9 1 59))
((2008 3 9 7 0) (2008 3 9 3 0))
((2008 3 9 7 1) (2008 3 9 3 1))
;; Fall back
((2008 11 2 5 59) (2008 11 2 1 59))
((2008 11 2 6 0) (2008 11 2 1 0))
((2008 11 2 6 1) (2008 11 2 1 1)))))
(dolist (test-case test-cases)
(is (equal
(let ((timestamp
(apply 'local-time:encode-timestamp
`(0 0 ,@(reverse (first test-case)) :offset 0))))
(local-time:decode-timestamp timestamp :timezone eastern-tz))
(apply 'values `(0 0 ,@(reverse (second test-case)))))))))
(deftest test/timezone/adjust-across-dst-by-days ()
(let* ((old (parse-timestring "2014-03-09T01:00:00.000000-05:00"))
(new (timestamp+ old 1 :day eastern-tz)))
(is (= (* 23 60 60) (timestamp-difference new old)))))
(deftest test/timezone/adjust-across-dst-by-hours ()
(let* ((old (parse-timestring "2014-03-09T01:00:00.000000-05:00"))
(new (timestamp+ old 24 :hour eastern-tz)))
(is (= (* 24 60 60) (timestamp-difference new old)))))
(deftest test/timezone/timestamp-minimize-part ()
(is (timestamp=
(timestamp-minimize-part
(encode-timestamp 999999999 59 59 1 14 3 2010 :timezone eastern-tz)
:month
:timezone eastern-tz)
(encode-timestamp 0 0 0 0 1 1 2010 :timezone eastern-tz)))
(is (timestamp=
(timestamp-minimize-part
(encode-timestamp 0 0 0 2 14 3 2010 :timezone eastern-tz)
:month
:timezone eastern-tz)
(encode-timestamp 0 0 0 0 1 1 2010 :timezone eastern-tz))))
(deftest test/timezone/timestamp-maximize-part ()
(is (timestamp=
(timestamp-maximize-part
(encode-timestamp 999999999 59 59 1 7 11 2010 :timezone eastern-tz)
:month
:timezone eastern-tz)
(encode-timestamp 999999999 59 59 23 31 12 2010 :timezone eastern-tz)))
(is (timestamp=
(timestamp-maximize-part
(encode-timestamp 0 0 0 2 7 11 2010 :timezone eastern-tz)
:month
:timezone eastern-tz)
(encode-timestamp 999999999 59 59 23 31 12 2010 :timezone eastern-tz))))
(deftest test/leaps/tai-to-utc ()
(let ((*default-timezone* utc-leaps))
(is (= 1435708799
(local-time::%adjust-sec-for-leap-seconds 1435708824)
(local-time::%adjust-sec-for-leap-seconds 1435708825)))
(is (= 1435708800
(local-time::%adjust-sec-for-leap-seconds 1435708826)))))
|