aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/tree.lux
blob: 35aefe13caba0ae0788d29e0caf397b1f465ef8a (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
(.using
 [library
  [lux (.full)
   ["_" test (.only Test)]
   [abstract
    ["[0]" monad (.only do)]
    [\\specification
     ["$[0]" equivalence]
     ["$[0]" mix]
     ["$[0]" functor]]]
   [data
    ["[0]" product]
    [collection
     ["[0]" list ("[1]#[0]" functor mix)]]]
   [math
    ["[0]" random (.only Random)]
    [number
     ["n" nat]]]]]
 [\\library
  ["[0]" / (.only Tree)]])

(def: .public (tree gen_value)
  (All (_ a) (-> (Random a) (Random [Nat (Tree a)])))
  (do [! random.monad]
    [value gen_value
     num_children (# ! each (n.% 2) random.nat)
     children (random.list num_children (tree gen_value))]
    (in [(|> children
             (list#each product.left)
             (list#mix n.+ 1))
         [/.#value value
          /.#children (list#each product.right children)]])))

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Tree])
      (all _.and
           (_.for [/.equivalence]
                  (|> (..tree random.nat)
                      (# random.monad each product.right)
                      ($equivalence.spec (/.equivalence n.equivalence))))
           (_.for [/.mix]
                  ($mix.spec /.leaf /.equivalence /.mix))
           (_.for [/.functor]
                  ($functor.spec /.leaf /.equivalence /.functor))
           
           (do random.monad
             [[size sample] (..tree random.nat)]
             (_.coverage [/.flat]
               (n.= size
                    (list.size (/.flat sample)))))
           (do random.monad
             [expected random.nat]
             (_.coverage [/.leaf]
               (# (list.equivalence n.equivalence) =
                  (list expected)
                  (/.flat (/.leaf expected)))))
           (do [! random.monad]
             [value random.nat
              num_children (# ! each (n.% 3) random.nat)
              children (random.list num_children random.nat)]
             (_.coverage [/.branch]
               (# (list.equivalence n.equivalence) =
                  (partial_list value children)
                  (/.flat (/.branch value (list#each /.leaf children))))))
           (do random.monad
             [expected/0 random.nat
              expected/1 random.nat
              expected/2 random.nat
              expected/3 random.nat
              expected/4 random.nat
              expected/5 random.nat]
             (_.coverage [/.tree]
               (and (# (list.equivalence n.equivalence) =
                       (list expected/0)
                       (/.flat (/.tree expected/0)))
                    (# (list.equivalence n.equivalence) =
                       (list expected/0 expected/1 expected/2)
                       (/.flat (/.tree expected/0
                                       {expected/1 {}
                                                   expected/2 {}})))
                    (# (list.equivalence n.equivalence) =
                       (list expected/0 expected/1 expected/2
                             expected/3 expected/4 expected/5)
                       (/.flat (/.tree expected/0
                                       {expected/1 {}
                                                   expected/2 {expected/3 {}
                                                                          expected/4 {expected/5 {}}}})))
                    )))
           )))