aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/parser.lux
blob: a171e694d4322f3d23d1da23377849f61f806100 (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
106
107
108
109
110
111
112
113
114
115
116
117
118
(.module:
  [lux #*
   ["_" test (#+ Test)]
   [abstract
    [monad (#+ do)]
    [hash (#+ Hash)]]
   [control
    [pipe (#+ case>)]
    ["." try]
    [parser
     ["<c>" code]]]
   [data
    ["." text]
    [number
     ["n" nat]]
    [collection
     ["." set (#+ Set)]
     ["." dictionary (#+ Dictionary)]
     ["." list ("#@." functor)]]]
   [math
    ["." random (#+ Random) ("#@." monad)]]
   [macro
    ["." code]]]
  [//
   ["_." profile]]
  {#program
   ["." /
    ["/#" // #_
     ["#" profile]
     ["#." project (#+ Project)]
     ["#." artifact (#+ Artifact)]
     ["#." dependency (#+ Repository Dependency)]
     ["#." format]]]})

(def: name
  (Random //.Name)
  (random.ascii/alpha 1))

(def: (list-of random)
  (All [a] (-> (Random a) (Random (List a))))
  (do {@ random.monad}
    [size (:: @ map (n.% 5) random.nat)]
    (random.list size random)))

(def: (dictionary-of key-hash key-random value-random)
  (All [k v] (-> (Hash k) (Random k) (Random v) (Random (Dictionary k v))))
  (:: random.functor map
      (dictionary.from-list key-hash)
      (..list-of (random.and key-random value-random))))

(def: project
  (Random Project)
  (..dictionary-of text.hash ..name _profile.random))

(def: with-default-sources
  (-> //.Profile //.Profile)
  (update@ #//.sources
           (: (-> (Set //.Source) (Set //.Source))
              (function (_ sources)
                (if (set.empty? sources)
                  (set.from-list text.hash (list //.default-source))
                  sources)))))

(def: single-profile
  Test
  (do random.monad
    [expected _profile.random]
    (_.test "Single profile."
            (|> expected
                //format.profile
                list
                (<c>.run /.project)
                (case> (#try.Success actual)
                       (|> expected
                           ..with-default-sources
                           (//project.project //.default)
                           (:: //project.equivalence = actual))
                       
                       (#try.Failure error)
                       false)))))

(def: (with-empty-profile project)
  (-> Project Project)
  (if (dictionary.empty? project)
    (//project.project //.default (:: //.monoid identity))
    project))

(def: multiple-profiles
  Test
  (do random.monad
    [expected ..project]
    (_.test "Multiple profiles."
            (|> expected
                //format.project
                list
                (<c>.run /.project)
                (case> (#try.Success actual)
                       (|> expected
                           ..with-empty-profile
                           dictionary.entries
                           (list@map (function (_ [name profile])
                                       [name (..with-default-sources profile)]))
                           (dictionary.from-list text.hash) 
                           (:: //project.equivalence = actual))
                       
                       (#try.Failure error)
                       false)))))

(def: #export test
  Test
  (<| (_.covering /._)
      (_.covering //format._)
      (_.with-cover [/.project
                     //format.Format //format.profile //format.project]
        ($_ _.and
            ..single-profile
            ..multiple-profiles
            ))))