aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/tree.lux
blob: b5dbfa7c4e9020844ab13901de737aa214a0c6da (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 "*"
   ["_" test {"+" Test}]
   [abstract
    ["[0]" monad {"+" do}]
    [\\specification
     ["$[0]" equivalence]
     ["$[0]" mix]
     ["$[0]" functor]]]
   [data
    ["[0]" product]
    [collection
     ["[0]" list ("[1]#[0]" functor mix)]]]
   [math
    ["[0]" random {"+" Random}]
    [number
     ["n" nat]]]]]
 [\\library
  ["[0]" / {"+" 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)]
             (_.cover [/.flat]
                      (n.= size
                           (list.size (/.flat sample)))))
           (do random.monad
             [expected random.nat]
             (_.cover [/.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)]
             (_.cover [/.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]
             (_.cover [/.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 {}}}})))
                           )))
           )))