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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
(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"right/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)))))
(deftest test/abbrev-subzone/not-found ()
(is (null (local-time:all-timezones-matching-subzone "FOO"))))
(deftest test/abbrev-subzone/find-bst ()
(is (member
"Europe/London"
(local-time:timezones-matching-subzone "BST" (unix-to-timestamp 1585906626))
:key (lambda (x) (local-time:zone-name (car x)))
:test #'string=))
;; Some historical timezone
(is (member
"America/Atka"
(local-time:all-timezones-matching-subzone "BST")
:key (lambda (x) (local-time:zone-name (car x)))
:test #'string=)))
(deftest test/abbrev-subzone/find-gmt ()
;; As of 2020-04-03
(is (equal
"Etc/Greenwich"
(local-time:zone-name
(caar (local-time:timezones-matching-subzone "GMT" (unix-to-timestamp 1585906626)))))))
|