aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/meta/compiler/language/lux.lux
blob: ed26027df1213630003d86f81c70ba40dd9d3bdf (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
119
120
121
122
123
124
125
126
127
128
(.require
 [library
  [lux (.except global)
   [abstract
    [equivalence (.only Equivalence)]
    [monad (.only do)]]
   [control
    ["[0]" try (.use "[1]#[0]" functor)]]
   [data
    ["[0]" sum]
    ["[0]" product]
    ["[0]" bit]
    ["[0]" text (.use "[1]#[0]" equivalence)]
    ["[0]" binary
     ["![1]" \\format]
     ["?[1]" \\parser]]
    [collection
     ["[0]" list]]]
   [math
    ["[0]" random (.only Random) (.use "[1]#[0]" monad)]
    [number
     ["[0]" nat]]]
   [meta
    ["[0]" version]
    ["[0]" type (.only)
     ["[1]T" \\test]]
    ["[0]" symbol (.only)
     ["[1]T" \\test]]
    [compiler
     [meta
      [archive
       ["[0]" key]
       ["[0]" signature]]]]]
   [test
    ["_" property (.only Test)]]]]
 [\\library
  ["[0]" /]])

(def any_equivalence
  (Equivalence Any)
  (implementation
   (def (= _ _)
     true)))

(def definition_equivalence
  (Equivalence Definition)
  (all product.equivalence
       type.equivalence
       ..any_equivalence
       ))

(def definition
  (Random Definition)
  (do random.monad
    [type (typeT.random 1)]
    (in [type []])))

(def global_equivalence
  (Equivalence Global)
  (all sum.equivalence
       ..definition_equivalence
       symbol.equivalence
       ..definition_equivalence
       ))

(def global
  (Random Global)
  (all random.or
       ..definition
       (symbolT.random 1 1)
       ..definition
       ))

(def module_state_equivalence
  (Equivalence Module_State)
  (all sum.equivalence
       ..any_equivalence
       ..any_equivalence
       ..any_equivalence
       ))

(def module_state
  (Random Module_State)
  (all random.or
       (random#in [])
       (random#in [])
       (random#in [])
       ))

(def module_equivalence
  (Equivalence Module)
  (all product.equivalence
       nat.equivalence
       (list.equivalence (product.equivalence text.equivalence text.equivalence))
       (list.equivalence (all product.equivalence text.equivalence bit.equivalence global_equivalence))
       (list.equivalence text.equivalence)
       ..module_state_equivalence
       ))

(def module
  (Random Module)
  (all random.and
       random.nat
       (random.list 1 (random.and (random.upper_cased 2) (random.upper_cased 3)))
       (random.list 4 (all random.and (random.upper_cased 5) random.bit ..global))
       (random.list 6 (random.upper_cased 7))
       ..module_state
       ))

(def .public test
  Test
  (<| (_.covering /._)
      (do [! random.monad]
        [expected ..module])
      (all _.and
           (_.coverage [/.format /.parser]
             (|> expected
                 (!binary.result /.format)
                 (?binary.result /.parser)
                 (try#each (of module_equivalence = (has .#module_state {.#Cached} expected)))
                 (try.else false)))
           (_.coverage [/.key]
             (let [it (key.signature /.key)]
               (and (let [[expected_module _] (symbol /._)
                          [actual_module actual_short] (the signature.#name it)]
                      (and (text#= expected_module actual_module)))
                    (same? version.latest (the signature.#version it)))))
           )))