blob: 17068bb7204a9a100556c8a1bdf96cea0a3a7722 (
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
|
(.module:
lux
(lux [io #+ IO]
(control [monad #+ do]
pipe)
(data ["e" error]
[maybe]
[bit "bit/" Eq<Bit>]
[text "text/" Eq<Text>]
text/format
(coll [array]
[list "list/" Functor<List>]))
["r" math/random "r/" Monad<Random>]
[macro]
(macro [code])
[host]
test)
(luxc [lang]
(lang [".L" host]
[synthesis #+ Synthesis]))
(test/luxc common))
(host.import: java/lang/Integer)
(def: (tuples-spec run)
(-> Runner Test)
(do r.Monad<Random>
[size (|> r.nat (:: @ map (|>> (n/% +10) (n/max +2))))
tuple-in (r.list size r.int)]
(test "Can translate tuple."
(|> (run (code.tuple (list/map code.int tuple-in)))
(case> (#e.Success tuple-out)
(let [tuple-out (:coerce (Array Any) tuple-out)]
(and (n/= size (array.size tuple-out))
(list.every? (function (_ [left right])
(i/= left (:coerce Int right)))
(list.zip2 tuple-in (array.to-list tuple-out)))))
(#e.Error error)
(exec (log! error)
false))))))
(def: (variants-spec run)
(-> Runner Test)
(do r.Monad<Random>
[num-tags (|> r.nat (:: @ map (|>> (n/% +10) (n/max +2))))
tag-in (|> r.nat (:: @ map (n/% num-tags)))
#let [last?-in (n/= (n/dec num-tags) tag-in)]
value-in r.int]
(test "Can translate variant."
(|> (run (` ((~ (code.nat tag-in)) (~ (code.bit last?-in)) (~ (code.int value-in)))))
(case> (#e.Success valueT)
(let [valueT (:coerce (Array Any) valueT)]
(and (n/= +3 (array.size valueT))
(let [tag-out (:coerce Integer (maybe.assume (array.read +0 valueT)))
last?-out (array.read +1 valueT)
value-out (:coerce Any (maybe.assume (array.read +2 valueT)))
same-tag? (n/= tag-in (|> tag-out host.int-to-long (:coerce Nat)))
same-flag? (case last?-out
(#.Some last?-out')
(and last?-in (text/= "" (:coerce Text last?-out')))
#.None
(not last?-in))
same-value? (i/= value-in (:coerce Int value-out))]
(and same-tag?
same-flag?
same-value?))))
(#e.Error error)
(exec (log! error)
false))))))
(def: (structure-spec run)
(-> Runner Test)
($_ seq
(tuples-spec run)
(variants-spec run)))
(context: "[JVM] Structures."
(<| (times +100)
(structure-spec run-jvm)))
## (context: "[JS] Structures."
## (<| (times +100)
## (structure-spec run-js)))
## (context: "[Lua] Structures."
## (<| (times +100)
## (structure-spec run-lua)))
## (context: "[Ruby] Structures."
## (<| (times +100)
## (structure-spec run-ruby)))
## (context: "[Python] Structures."
## (<| (times +100)
## (structure-spec run-python)))
## (context: "[R] Structures."
## (<| (times +100)
## (structure-spec run-r)))
## (context: "[Scheme] Structures."
## (<| (times +100)
## (structure-spec run-scheme)))
## (context: "[Common Lisp] Structures."
## (<| (times +100)
## (structure-spec run-common-lisp)))
## (context: "[PHP] Structures."
## (<| (times +100)
## (structure-spec run-php)))
|