diff options
| author | Lars Ingebrigtsen | 2019-07-29 14:22:31 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2019-07-29 14:22:38 +0200 |
| commit | fa04c8b87e50a2e2b0d021958f637be8f475d8bc (patch) | |
| tree | 304b07bc09258970ecf7c4a97fd53e85d4cddfe8 /test | |
| parent | 6cfda69d72cb9debefc48d0d95e341d389e7303a (diff) | |
| download | emacs-fa04c8b87e50a2e2b0d021958f637be8f475d8bc.tar.gz emacs-fa04c8b87e50a2e2b0d021958f637be8f475d8bc.zip | |
Add an ISO 8601 parsing library
* doc/lispref/os.texi (Time Parsing): Document it.
* lisp/calendar/iso8601.el: New file.
* test/lisp/calendar/iso8601-tests.el: Test ISO8601 parsing functions.
Diffstat (limited to 'test')
| -rw-r--r-- | test/lisp/calendar/iso8601-tests.el | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/test/lisp/calendar/iso8601-tests.el b/test/lisp/calendar/iso8601-tests.el new file mode 100644 index 00000000000..2959f54b811 --- /dev/null +++ b/test/lisp/calendar/iso8601-tests.el | |||
| @@ -0,0 +1,291 @@ | |||
| 1 | ;;; iso8601-tests.el --- tests for calendar/iso8601.el -*- lexical-binding:t -*- | ||
| 2 | |||
| 3 | ;; Copyright (C) 2019 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; This file is part of GNU Emacs. | ||
| 6 | |||
| 7 | ;; GNU Emacs is free software: you can redistribute it and/or modify | ||
| 8 | ;; it under the terms of the GNU General Public License as published by | ||
| 9 | ;; the Free Software Foundation, either version 3 of the License, or | ||
| 10 | ;; (at your option) any later version. | ||
| 11 | |||
| 12 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | ;; GNU General Public License for more details. | ||
| 16 | |||
| 17 | ;; You should have received a copy of the GNU General Public License | ||
| 18 | ;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. | ||
| 19 | |||
| 20 | ;;; Code: | ||
| 21 | |||
| 22 | (require 'ert) | ||
| 23 | (require 'iso8601) | ||
| 24 | |||
| 25 | (ert-deftest test-iso8601-date-years () | ||
| 26 | (should (equal (iso8601-parse-date "1985") | ||
| 27 | '(nil nil nil nil nil 1985 nil nil nil))) | ||
| 28 | (should (equal (iso8601-parse-date "-0003") | ||
| 29 | '(nil nil nil nil nil -4 nil nil nil))) | ||
| 30 | (should (equal (iso8601-parse-date "+1985") | ||
| 31 | '(nil nil nil nil nil 1985 nil nil nil)))) | ||
| 32 | |||
| 33 | (ert-deftest test-iso8601-date-dates () | ||
| 34 | (should (equal (iso8601-parse-date "1985-03-14") | ||
| 35 | '(nil nil nil 14 3 1985 nil nil nil))) | ||
| 36 | (should (equal (iso8601-parse-date "19850314") | ||
| 37 | '(nil nil nil 14 3 1985 nil nil nil))) | ||
| 38 | (should (equal (iso8601-parse-date "1985-02") | ||
| 39 | '(nil nil nil nil 2 1985 nil nil nil)))) | ||
| 40 | |||
| 41 | (ert-deftest test-iso8601-date-obsolete () | ||
| 42 | (should (equal (iso8601-parse-date "--02-01") | ||
| 43 | '(nil nil nil 1 2 nil nil nil nil))) | ||
| 44 | (should (equal (iso8601-parse-date "--0201") | ||
| 45 | '(nil nil nil 1 2 nil nil nil nil)))) | ||
| 46 | |||
| 47 | (ert-deftest test-iso8601-date-weeks () | ||
| 48 | (should (equal (iso8601-parse-date "2008W39-6") | ||
| 49 | '(nil nil nil 27 9 2008 nil nil nil))) | ||
| 50 | (should (equal (iso8601-parse-date "2009W01-1") | ||
| 51 | '(nil nil nil 29 12 2008 nil nil nil))) | ||
| 52 | (should (equal (iso8601-parse-date "2009W53-7") | ||
| 53 | '(nil nil nil 3 1 2010 nil nil nil)))) | ||
| 54 | |||
| 55 | (ert-deftest test-iso8601-date-ordinals () | ||
| 56 | (should (equal (iso8601-parse-date "1981-095") | ||
| 57 | '(nil nil nil 5 4 1981 nil nil nil)))) | ||
| 58 | |||
| 59 | (ert-deftest test-iso8601-time () | ||
| 60 | (should (equal (iso8601-parse-time "13:47:30") | ||
| 61 | '(30 47 13 nil nil nil nil nil nil))) | ||
| 62 | (should (equal (iso8601-parse-time "134730") | ||
| 63 | '(30 47 13 nil nil nil nil nil nil))) | ||
| 64 | (should (equal (iso8601-parse-time "1347") | ||
| 65 | '(0 47 13 nil nil nil nil nil nil)))) | ||
| 66 | |||
| 67 | (ert-deftest test-iso8601-combined () | ||
| 68 | (should (equal (iso8601-parse "2008-03-02T13:47:30") | ||
| 69 | '(30 47 13 2 3 2008 nil nil nil))) | ||
| 70 | (should (equal (iso8601-parse "2008-03-02T13:47:30Z") | ||
| 71 | '(30 47 13 2 3 2008 nil nil 0))) | ||
| 72 | (should (equal (iso8601-parse "2008-03-02T13:47:30+01:00") | ||
| 73 | '(30 47 13 2 3 2008 nil nil 3600))) | ||
| 74 | (should (equal (iso8601-parse "2008-03-02T13:47:30-01") | ||
| 75 | '(30 47 13 2 3 2008 nil nil -3600)))) | ||
| 76 | |||
| 77 | (ert-deftest test-iso8601-duration () | ||
| 78 | (should (equal (iso8601-parse-duration "P3Y6M4DT12H30M5S") | ||
| 79 | '(5 30 12 4 6 3 nil nil nil))) | ||
| 80 | (should (equal (iso8601-parse-duration "P1M") | ||
| 81 | '(0 0 0 0 1 0 nil nil nil))) | ||
| 82 | (should (equal (iso8601-parse-duration "PT1M") | ||
| 83 | '(0 1 0 0 0 0 nil nil nil))) | ||
| 84 | (should (equal (iso8601-parse-duration "P0003-06-04T12:30:05") | ||
| 85 | '(5 30 12 4 6 3 nil nil nil)))) | ||
| 86 | |||
| 87 | (ert-deftest test-iso8601-invalid () | ||
| 88 | (should-not (iso8601-valid-p " 2008-03-02T13:47:30-01")) | ||
| 89 | (should-not (iso8601-valid-p "2008-03-02T13:47:30-01:200")) | ||
| 90 | (should-not (iso8601-valid-p "2008-03-02T13:47:30-01 ")) | ||
| 91 | (should-not (iso8601-valid-p "2008-03-02 T 13:47:30-01 ")) | ||
| 92 | (should-not (iso8601-valid-p "20008-03-02T13:47:30-01"))) | ||
| 93 | |||
| 94 | (ert-deftest test-iso8601-intervals () | ||
| 95 | (should (equal | ||
| 96 | (iso8601-parse-interval "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z") | ||
| 97 | '((0 0 13 1 3 2007 nil nil 0) | ||
| 98 | (0 30 15 11 5 2008 nil nil 0) | ||
| 99 | ;; Hm... can't really use decode-time for time differences... | ||
| 100 | (0 30 2 14 3 1971 0 nil 0)))) | ||
| 101 | (should (equal (iso8601-parse-interval "2007-03-01T13:00:00Z/P1Y2M10DT2H30M") | ||
| 102 | '((0 0 13 1 3 2007 nil nil 0) | ||
| 103 | (0 30 15 11 5 2008 nil nil 0) | ||
| 104 | (0 30 2 10 2 1 nil nil nil)))) | ||
| 105 | (should (equal (iso8601-parse-interval "P1Y2M10DT2H30M/2008-05-11T15:30:00Z") | ||
| 106 | '((0 0 13 1 3 2007 nil nil 0) | ||
| 107 | (0 30 15 11 5 2008 nil nil 0) | ||
| 108 | (0 30 2 10 2 1 nil nil nil))))) | ||
| 109 | |||
| 110 | (ert-deftest standard-test-dates () | ||
| 111 | (should (equal (iso8601-parse-date "19850412") | ||
| 112 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 113 | (should (equal (iso8601-parse-date "1985-04-12") | ||
| 114 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 115 | |||
| 116 | (should (equal (iso8601-parse-date "1985102") | ||
| 117 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 118 | (should (equal (iso8601-parse-date "1985-102") | ||
| 119 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 120 | |||
| 121 | (should (equal (iso8601-parse-date "1985W155") | ||
| 122 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 123 | (should (equal (iso8601-parse-date "1985-W15-5") | ||
| 124 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 125 | |||
| 126 | (should (equal (iso8601-parse-date "1985W15") | ||
| 127 | '(nil nil nil 7 4 1985 nil nil nil))) | ||
| 128 | (should (equal (iso8601-parse-date "1985-W15") | ||
| 129 | '(nil nil nil 7 4 1985 nil nil nil))) | ||
| 130 | |||
| 131 | (should (equal (iso8601-parse-date "1985-04") | ||
| 132 | '(nil nil nil nil 4 1985 nil nil nil))) | ||
| 133 | |||
| 134 | (should (equal (iso8601-parse-date "1985") | ||
| 135 | '(nil nil nil nil nil 1985 nil nil nil))) | ||
| 136 | |||
| 137 | (should (equal (iso8601-parse-date "+1985-04-12") | ||
| 138 | '(nil nil nil 12 4 1985 nil nil nil))) | ||
| 139 | (should (equal (iso8601-parse-date "+19850412") | ||
| 140 | '(nil nil nil 12 4 1985 nil nil nil)))) | ||
| 141 | |||
| 142 | (ert-deftest standard-test-time-of-day-local-time () | ||
| 143 | (should (equal (iso8601-parse-time "152746") | ||
| 144 | '(46 27 15 nil nil nil nil nil nil))) | ||
| 145 | (should (equal (iso8601-parse-time "15:27:46") | ||
| 146 | '(46 27 15 nil nil nil nil nil nil))) | ||
| 147 | |||
| 148 | (should (equal (iso8601-parse-time "1528") | ||
| 149 | '(0 28 15 nil nil nil nil nil nil))) | ||
| 150 | (should (equal (iso8601-parse-time "15:28") | ||
| 151 | '(0 28 15 nil nil nil nil nil nil))) | ||
| 152 | |||
| 153 | (should (equal (iso8601-parse-time "15") | ||
| 154 | '(0 0 15 nil nil nil nil nil nil)))) | ||
| 155 | |||
| 156 | (ert-deftest standard-test-time-of-day-fractions () | ||
| 157 | ;; decoded-time doesn't support sub-second times. | ||
| 158 | ;; (should (equal (iso8601-parse-time "152735,5") | ||
| 159 | ;; '(46 27 15 nil nil nil nil nil nil))) | ||
| 160 | ;; (should (equal (iso8601-parse-time "15:27:35,5") | ||
| 161 | ;; '(46 27 15 nil nil nil nil nil nil))) | ||
| 162 | ) | ||
| 163 | |||
| 164 | (ert-deftest standard-test-time-of-day-beginning-of-day () | ||
| 165 | (should (equal (iso8601-parse-time "000000") | ||
| 166 | '(0 0 0 nil nil nil nil nil nil))) | ||
| 167 | (should (equal (iso8601-parse-time "00:00:00") | ||
| 168 | '(0 0 0 nil nil nil nil nil nil))) | ||
| 169 | |||
| 170 | (should (equal (iso8601-parse-time "0000") | ||
| 171 | '(0 0 0 nil nil nil nil nil nil))) | ||
| 172 | (should (equal (iso8601-parse-time "00:00") | ||
| 173 | '(0 0 0 nil nil nil nil nil nil)))) | ||
| 174 | |||
| 175 | (ert-deftest standard-test-time-of-day-utc () | ||
| 176 | (should (equal (iso8601-parse-time "232030Z") | ||
| 177 | '(30 20 23 nil nil nil nil nil 0))) | ||
| 178 | (should (equal (iso8601-parse-time "23:20:30Z") | ||
| 179 | '(30 20 23 nil nil nil nil nil 0))) | ||
| 180 | |||
| 181 | (should (equal (iso8601-parse-time "2320Z") | ||
| 182 | '(0 20 23 nil nil nil nil nil 0))) | ||
| 183 | (should (equal (iso8601-parse-time "23:20Z") | ||
| 184 | '(0 20 23 nil nil nil nil nil 0))) | ||
| 185 | |||
| 186 | (should (equal (iso8601-parse-time "23Z") | ||
| 187 | '(0 0 23 nil nil nil nil nil 0)))) | ||
| 188 | |||
| 189 | |||
| 190 | (ert-deftest standard-test-time-of-day-zone () | ||
| 191 | (should (equal (iso8601-parse-time "152746+0100") | ||
| 192 | '(46 27 15 nil nil nil nil nil 3600))) | ||
| 193 | (should (equal (iso8601-parse-time "15:27:46+0100") | ||
| 194 | '(46 27 15 nil nil nil nil nil 3600))) | ||
| 195 | |||
| 196 | (should (equal (iso8601-parse-time "152746+01") | ||
| 197 | '(46 27 15 nil nil nil nil nil 3600))) | ||
| 198 | (should (equal (iso8601-parse-time "15:27:46+01") | ||
| 199 | '(46 27 15 nil nil nil nil nil 3600))) | ||
| 200 | |||
| 201 | (should (equal (iso8601-parse-time "152746-0500") | ||
| 202 | '(46 27 15 nil nil nil nil nil -18000))) | ||
| 203 | (should (equal (iso8601-parse-time "15:27:46-0500") | ||
| 204 | '(46 27 15 nil nil nil nil nil -18000))) | ||
| 205 | |||
| 206 | (should (equal (iso8601-parse-time "152746-05") | ||
| 207 | '(46 27 15 nil nil nil nil nil -18000))) | ||
| 208 | (should (equal (iso8601-parse-time "15:27:46-05") | ||
| 209 | '(46 27 15 nil nil nil nil nil -18000)))) | ||
| 210 | |||
| 211 | (ert-deftest standard-test-date-and-time-of-day () | ||
| 212 | (should (equal (iso8601-parse "19850412T101530") | ||
| 213 | '(30 15 10 12 4 1985 nil nil nil))) | ||
| 214 | (should (equal (iso8601-parse "1985-04-12T10:15:30") | ||
| 215 | '(30 15 10 12 4 1985 nil nil nil))) | ||
| 216 | |||
| 217 | (should (equal (iso8601-parse "1985102T235030Z") | ||
| 218 | '(30 50 23 12 4 1985 nil nil 0))) | ||
| 219 | (should (equal (iso8601-parse "1985-102T23:50:30Z") | ||
| 220 | '(30 50 23 12 4 1985 nil nil 0))) | ||
| 221 | |||
| 222 | (should (equal (iso8601-parse "1985W155T235030") | ||
| 223 | '(30 50 23 12 4 1985 nil nil nil))) | ||
| 224 | (should (equal (iso8601-parse "1985-W155T23:50:30") | ||
| 225 | '(30 50 23 12 4 1985 nil nil nil)))) | ||
| 226 | |||
| 227 | (ert-deftest standard-test-interval () | ||
| 228 | ;; A time interval starting at 20 minutes and 50 seconds past 23 | ||
| 229 | ;; hours on 12 April 1985 and ending at 30 minutes past 10 hours on | ||
| 230 | ;; 25 June 1985. | ||
| 231 | (should (equal (iso8601-parse-interval "19850412T232050/19850625T103000") | ||
| 232 | '((50 20 23 12 4 1985 nil nil nil) | ||
| 233 | (0 30 10 25 6 1985 nil nil nil) | ||
| 234 | (10 9 11 15 3 1970 0 nil 0)))) | ||
| 235 | (should (equal (iso8601-parse-interval | ||
| 236 | "1985-04-12T23:20:50/1985-06-25T10:30:00") | ||
| 237 | '((50 20 23 12 4 1985 nil nil nil) | ||
| 238 | (0 30 10 25 6 1985 nil nil nil) | ||
| 239 | (10 9 11 15 3 1970 0 nil 0)))) | ||
| 240 | |||
| 241 | ;; A time interval starting at 12 April 1985 and ending on 25 June | ||
| 242 | ;; 1985. | ||
| 243 | |||
| 244 | ;; This example doesn't seem valid according to the standard. | ||
| 245 | ;; "0625" is unambiguous, and means "the year 625". Weird. | ||
| 246 | ;; (should (equal (iso8601-parse-interval "19850412/0625") | ||
| 247 | ;; '((nil nil nil 12 4 1985 nil nil nil) | ||
| 248 | ;; (nil nil nil nil nil 625 nil nil nil) | ||
| 249 | ;; (0 17 0 22 9 609 5 nil 0)))) | ||
| 250 | |||
| 251 | ;; A time interval of 2 years, 10 months, 15 days, 10 hours, 20 | ||
| 252 | ;; minutes and 30 seconds. | ||
| 253 | (should (equal (iso8601-parse-duration "P2Y10M15DT10H20M30S") | ||
| 254 | '(30 20 10 15 10 2 nil nil nil))) | ||
| 255 | |||
| 256 | (should (equal (iso8601-parse-duration "P00021015T102030") | ||
| 257 | '(30 20 10 15 10 2 nil nil nil))) | ||
| 258 | (should (equal (iso8601-parse-duration "P0002-10-15T10:20:30") | ||
| 259 | '(30 20 10 15 10 2 nil nil nil))) | ||
| 260 | |||
| 261 | ;; A time interval of 1 year and 6 months. | ||
| 262 | (should (equal (iso8601-parse-duration "P1Y6M") | ||
| 263 | '(0 0 0 0 6 1 nil nil nil))) | ||
| 264 | (should (equal (iso8601-parse-duration "P0001-06") | ||
| 265 | '(nil nil nil nil 6 1 nil nil nil))) | ||
| 266 | |||
| 267 | ;; A time interval of seventy-two hours. | ||
| 268 | (should (equal (iso8601-parse-duration "PT72H") | ||
| 269 | '(0 0 72 0 0 0 nil nil nil))) | ||
| 270 | |||
| 271 | ;; Defined by start and duration | ||
| 272 | ;; A time interval of 1 year, 2 months, 15 days and 12 hours, | ||
| 273 | ;; beginning on 12 April 1985 at 20 minutes past 23 hours. | ||
| 274 | (should (equal (iso8601-parse-interval "19850412T232000/P1Y2M15DT12H") | ||
| 275 | '((0 20 23 12 4 1985 nil nil nil) | ||
| 276 | (0 20 11 28 6 1986 nil nil nil) | ||
| 277 | (0 0 12 15 2 1 nil nil nil)))) | ||
| 278 | (should (equal (iso8601-parse-interval "1985-04-12T23:20:00/P1Y2M15DT12H") | ||
| 279 | '((0 20 23 12 4 1985 nil nil nil) | ||
| 280 | (0 20 11 28 6 1986 nil nil nil) | ||
| 281 | (0 0 12 15 2 1 nil nil nil)))) | ||
| 282 | |||
| 283 | ;; Defined by duration and end | ||
| 284 | ;; A time interval of 1 year, 2 months, 15 days and 12 hours, ending | ||
| 285 | ;; on 12 April 1985 at 20 minutes past 23 hour. | ||
| 286 | (should (equal (iso8601-parse-interval "P1Y2M15DT12H/19850412T232000") | ||
| 287 | '((0 20 11 28 1 1984 nil nil nil) | ||
| 288 | (0 20 23 12 4 1985 nil nil nil) | ||
| 289 | (0 0 12 15 2 1 nil nil nil))))) | ||
| 290 | |||
| 291 | ;;; iso8601-tests.el ends here | ||