aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/specification/compositor/generation/reference.lux
blob: b3f270445497daa9385aff5d03b78310524dc11f (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
(.using
  [lux {"-" symbol}
   ["_" test {"+" Test}]
   [abstract
    [monad {"+" do}]]
   [control
    [pipe {"+" case>}]
    ["[0]" try]]
   [data
    [number
     ["n" nat]
     ["f" frac]]]
   [tool
    [compiler
     ["[0]" reference]
     ["[0]" synthesis]]]
   [math
    ["r" random {"+" Random}]]]
  [///
   [common {"+" Runner Definer}]])

(def: symbol
  (Random Symbol)
  (let [symbol_part (r.ascii/upper_alpha 5)]
    [(r.and symbol_part symbol_part)]))

(def: (definition define)
  (-> Definer Test)
  (do r.monad
    [name ..symbol
     expected r.safe_frac]
    (_.test "Definitions."
            (|> (define name (synthesis.f64 expected))
                (case> {try.#Success actual}
                       (f.= expected (:as Frac actual))

                       {try.#Failure _}
                       false)))))

(def: (variable run)
  (-> Runner Test)
  (do [! r.monad]
    [register (|> r.nat (# ! each (n.% 100)))
     expected r.safe_frac]
    (_.test "Local variables."
            (|> (synthesis.branch/let [(synthesis.f64 expected)
                                       register
                                       (synthesis.variable/local register)])
                (run "variable")
                (case> {try.#Success actual}
                       (f.= expected (:as Frac actual))

                       {try.#Failure _}
                       false)))))

(def: .public (spec runner definer)
  (-> Runner Definer Test)
  ($_ _.and
      (..definition definer)
      (..variable runner)))