aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/tree.lux
blob: 986ef566ed1424202ba118c39ce7fcde05bf839d (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
(.module:
  [library
   [lux #*
    ["_" test (#+ Test)]
    [abstract
     ["." monad (#+ do)]
     [\\specification
      ["$." equivalence]
      ["$." fold]
      ["$." functor]]]
    [data
     ["." product]
     [collection
      ["." list ("#\." functor fold)]]]
    [math
     ["." random (#+ Random)]
     [number
      ["n" nat]]]]]
  [\\library
   ["." / (#+ Tree)]])

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

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Tree])
      ($_ _.and
          (_.for [/.equivalence]
                 (|> (..tree random.nat)
                     (\ random.monad map product.right)
                     ($equivalence.spec (/.equivalence n.equivalence))))
          (_.for [/.fold]
                 ($fold.spec /.leaf /.equivalence /.fold))
          (_.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 (\ ! map (n.% 3) random.nat)
             children (random.list num_children random.nat)]
            (_.cover [/.branch]
                     (\ (list.equivalence n.equivalence) =
                        (list& value children)
                        (/.flat (/.branch value (list\map /.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 {}}}})))
                          )))
          )))