aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/control/function/mutual.lux
blob: 875c7eee5896238b0b90b6dbb8a5a79945233fcf (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
(.module:
  [library
   [lux "*"
    ["_" test {"+" [Test]}]
    [abstract
     [monad {"+" [do]}]]
    [data
     ["." bit ("#\." equivalence)]
     [text
      ["%" format {"+" [format]}]]]
    [math
     ["." random {"+" [Random]}]
     [number
      ["n" nat]]]]]
  [\\library
   ["." /]])

(def: test_let
  Test
  (do {! random.monad}
    [sample (\ ! each (n.% 10) random.nat)
     .let [expected (n.even? sample)]]
    (<| (_.cover [/.let])
        (/.let [(even? number)
                (-> Nat Bit)
                (case number
                  0 true
                  _ (odd? (-- number)))

                (odd? number)
                (-> Nat Bit)
                (case number
                  0 false
                  _ (even? (-- number)))]
          (and (bit\= expected (even? sample))
               (bit\= (not expected) (odd? sample)))))))

(/.def:
  [(even? number)
   (-> Nat Bit)
   (case number
     0 true
     _ (odd? (-- number)))]

  [(odd? number)
   (-> Nat Bit)
   (case number
     0 false
     _ (even? (-- number)))])

(def: test_def
  Test
  (do {! random.monad}
    [sample (\ ! each (n.% 10) random.nat)
     .let [expected (n.even? sample)]]
    (<| (_.cover [/.def:])
        (and (bit\= expected (..even? sample))
             (bit\= (not expected) (..odd? sample))))))

(def: .public test
  Test
  (<| (_.covering /._)
      ($_ _.and
          ..test_let
          ..test_def
          )))