-
Notifications
You must be signed in to change notification settings - Fork 2
/
conformance.janet
76 lines (62 loc) · 2.36 KB
/
conformance.janet
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
(import json)
(import ../src/tomlin)
(import ../src/tomlin/json :as tomlin)
(when (nil? (os/stat "specs"))
(quit))
(defn- validate [file expect actual]
(case (type actual)
:table
(let [a-len (length (keys actual))
e-len (length (keys expect))]
(assert (= e-len a-len)
(string file ": actual length " a-len ", expect length " e-len))
(each [a-key a-val] (pairs actual)
(def e-val (get expect a-key))
(assert e-val (string file ": bad key " a-key " in " actual))
(case (type e-val)
:string (assert (= e-val a-val) (string file ": actual value " (describe a-val) ", expect value " (describe e-val)))
:array (validate file e-val a-val)
:table (validate file e-val a-val)
(error "impossible"))))
:array
(let [a-len (length actual)
e-len (length expect)]
(assert (= e-len a-len)
(string file ": actual length " a-len ", expect length " e-len))
(loop [i :range [0 a-len]]
(def a-val (get actual i))
(def e-val (get expect i))
(assert e-val (string file ": bad item " a-val " in " actual))
(case (type a-val)
:table (validate file e-val a-val)
(error "impossible"))))))
(def valid-dir "specs/values/")
(each filename (os/dir valid-dir)
(when (string/has-suffix? ".json" filename)
(def json-file (string valid-dir filename))
(def toml-file (string/replace ".json" ".toml" json-file))
(def expect (try (-> (slurp json-file)
(json/decode))
([err fib]
(propagate (string json-file ": " err) fib))))
(def actual (try (-> (slurp toml-file)
(tomlin/toml->janet)
(tomlin/janet->json)
(json/decode))
([err fib]
(propagate (string toml-file ": " err) fib))))
(validate toml-file expect actual)))
(def error-dir "specs/errors/")
(each filename (os/dir error-dir)
(var errored? false)
(def toml-file (string error-dir filename))
(try (do
(-> (slurp toml-file)
(tomlin/toml->janet)))
([err fib]
# (debug/stacktrace fib)
# (print toml-file ": " err)
(set errored? true)))
(unless errored?
(error (string toml-file)))
(set errored? false))