aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/world/time/duration.lux
blob: 7900331b80eac117bb4a10d3ba5d3afa219579c5 (plain)
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
(.require
 [library
  [lux (.except)
   [abstract
    [monad (.only do)]
    [\\specification
     ["$[0]" equivalence]]
    ["[0]" enum
     ["[1]T" \\test]]
    ["[0]" codec
     ["[1]T" \\test]]
    ["[0]" order
     ["[1]T" \\test]]
    ["[0]" monoid
     ["[1]T" \\test]]]
   [data
    ["[0]" bit (.use "[1]#[0]" equivalence)]]
   [math
    ["[0]" random (.only Random)]
    [number
     ["n" nat]
     ["i" int]]]
   [test
    ["_" property (.only Test)]]]]
 [\\library
  ["[0]" /]])

(def .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Duration])
      (all _.and
           (_.for [/.equivalence]
                  ($equivalence.spec /.equivalence random.duration))
           (_.for [/.order]
                  (orderT.spec /.order random.duration))
           (_.for [/.enum]
                  (enumT.spec /.enum random.duration))
           (_.for [/.monoid]
                  (monoidT.spec /.equivalence /.monoid random.duration))
           (_.for [/.codec]
                  (codecT.spec /.equivalence /.codec random.duration))

           (do random.monad
             [duration random.duration]
             (_.coverage [/.of_millis /.millis]
               (|> duration /.millis /.of_millis (of /.equivalence = duration))))
           (do random.monad
             [.let [(open "#[0]") /.equivalence]
              expected random.duration
              parameter random.duration]
             (all _.and
                  (_.coverage [/.composite /.difference]
                    (|> expected (/.composite parameter) (/.difference parameter) (#= expected)))
                  (_.coverage [/.empty]
                    (|> expected (/.composite /.empty) (#= expected)))
                  (_.coverage [/.inverse]
                    (and (|> expected /.inverse /.inverse (#= expected))
                         (|> expected (/.composite (/.inverse expected)) (#= /.empty))))
                  (_.coverage [/.positive? /.negative? /.neutral?]
                    (or (bit#= (/.positive? expected)
                               (/.negative? (/.inverse expected)))
                        (bit#= (/.neutral? expected)
                               (/.neutral? (/.inverse expected)))))
                  ))
           (do random.monad
             [.let [(open "#[0]") /.equivalence]
              factor random.nat]
             (_.coverage [/.up /.down]
               (|> /.milli_second (/.up factor) (/.down factor) (#= /.milli_second))))
           (do [! random.monad]
             [.let [(open "#[0]") /.order
                    positive (|> random.duration
                                 (random.only (|>> (#= /.empty) not))
                                 (of ! each (function (_ duration)
                                              (if (/.positive? duration)
                                                duration
                                                (/.inverse duration)))))]
              sample positive
              frame positive]
             (`` (all _.and
                      (_.coverage [/.framed]
                        (let [sample' (/.framed frame sample)]
                          (and (#< frame sample')
                               (bit#= (#< frame sample)
                                      (#= sample sample')))))
                      (_.coverage [/.ticks]
                        (i.= +1 (/.ticks sample sample)))
                      (_.coverage [/.milli_second]
                        (#= /.empty (of /.enum pred /.milli_second)))
                      (,, (with_template [<factor> <big> <small>]
                            [(_.coverage [<big>]
                               (|> <big> (/.ticks <small>) (i.= <factor>)))]

                            [+1,000 /.second /.milli_second]
                            [+60 /.minute /.second]
                            [+60 /.hour /.minute]
                            [+24 /.day /.hour]

                            [+7 /.week /.day]
                            [+365 /.normal_year /.day]
                            [+366 /.leap_year /.day]
                            ))
                      )))
           )))