File: parsing.lisp

package info (click to toggle)
acl2 8.6%2Bdfsg-2
  • links: PTS
  • area: main
  • in suites: trixie
  • size: 1,111,420 kB
  • sloc: lisp: 17,818,294; java: 125,359; python: 28,122; javascript: 23,458; cpp: 18,851; ansic: 11,569; perl: 7,678; xml: 5,591; sh: 3,976; makefile: 3,833; ruby: 2,633; yacc: 1,126; ml: 763; awk: 295; csh: 233; lex: 197; php: 178; tcl: 49; asm: 23; haskell: 17
file content (92 lines) | stat: -rw-r--r-- 4,284 bytes parent folder | download | duplicates (2)
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
(in-package #:local-time.test)

(defsuite* (parsing :in test))

(deftest test/parsing/parse-format-consistency/range (&key (start-day -100000) (end-day 100000))
  (declare (optimize debug))
  (without-test-progress-printing
    (loop
      :with time = (make-timestamp)
      :for day :from start-day :upto end-day
      :for index :upfrom 0 :do
        (setf (day-of time) day)
        (when (zerop (mod index 10000))
          (print time))
        (let ((parsed (parse-timestring (format-timestring nil time))))
          (is (timestamp= parsed time))))))

(deftest test/parsing/parse-format-consistency ()
  (flet ((compare (nsec sec min hour day mon year str
                        &key start end offset
                        (allow-missing-elements t))
           (let* ((timestamp-a (encode-timestamp nsec sec min hour
                                                 day mon year :offset offset))
                  (used-offset (or offset
                                   (let ((zone (local-time::%realize-timezone *default-timezone*)))
                                     (local-time::subzone-offset
                                      (local-time::%subzone-as-of zone
                                                                  (sec-of timestamp-a)
                                                                  (day-of timestamp-a)
                                                                  t)))))
                  (timestamp-b (parse-timestring str
                                                 :start start
                                                 :end end
                                                 :allow-missing-elements
                                                 allow-missing-elements
                                                 :offset used-offset)))
             (is (timestamp= timestamp-a timestamp-b)))))
    (let ((timestamp (now)))
      (is (timestamp= timestamp
                      (parse-timestring
                       (format-timestring nil timestamp)))))

    (let* ((*default-timezone* (find-timezone-by-location-name "Europe/Budapest")))
      (compare 0 0 0 0 1 1 1 "0001-01-01T00:00:00,0"))

    (compare 0 0 0 0 1 1 1 "0001-01-01T00:00:00Z" :offset 0)

    (compare 0 0 0 0 1 1 2006 "2006-01-01T00:00:00,0")
    (compare 0 0 0 0 1 1 2006 "xxxx 2006-01-01T00:00:00,0 xxxx"
             :start 5
             :end 15)

    (is (eql (day-of (parse-timestring "2006-06-06TZ")) 2288))

    (compare 20000000 3 4 5 6 7 2008 "2008-07-06T05:04:03,02")
    (compare 0 2 0 0 23 3 2000 "--23T::02" :allow-missing-elements t)
    (compare 80000000 7 6 5 1 3 2000 "T05:06:07,08" :allow-missing-elements t)
    (compare 940703000 28 56 16 20 2 2008 "2008-02-20T16:56:28.940703Z"
             :offset 0)))

(deftest test/parsing/split ()
  (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-05")
             '(2006 1 2 3 4 5 600000000 -5 0)))
  (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-0515")
             '(2006 1 2 3 4 5 600000000 -5 -15)))
  (is (equal (local-time::%split-timestring "2006-01-02T03:04:05,6-05:15")
             '(2006 1 2 3 4 5 600000000 -5 -15))))


(deftest test/parsing/reader ()
  (let ((now (now)))
    (setf (nsec-of now) 123456000)
    (is (timestamp= now
                     (with-input-from-string (ins (format-timestring nil now))
                       (local-time::%read-timestring ins #\@))))))

(deftest test/parsing/read-universal-time ()
  (let ((now (now)))
    (setf (nsec-of now) 0)
    (is (timestamp= now
                     (with-input-from-string (ins (princ-to-string (timestamp-to-universal now)))
                       (local-time::%read-universal-time ins #\@ nil))))))

(deftest test/parsing/error ()
  (signals invalid-timestring (parse-timestring "2019-w2-20")))

(deftest test/parsing/parse-rfc3339 ()
  (let ((local-time:*default-timezone* local-time:+utc-zone+))
    (is (equal (multiple-value-list (decode-timestamp (local-time::parse-rfc3339-timestring "2006-01-02T03:04:05.6-05")))
               '(600000000 5 4 8 2 1 2006 1 NIL 0 "UTC")))
    ;; rfc3339 only supports . for fractional seconds
    (signals local-time::invalid-timestring (local-time::parse-rfc3339-timestring "2006-01-02T03:04:05,6-05"))))