forked from oils-for-unix/oils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathj8-errors.sh
executable file
·218 lines (179 loc) · 3.65 KB
/
j8-errors.sh
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#!/usr/bin/env bash
#
# Usage:
# data_lang/j8-errors.sh <function name>
# NOTE: No set -o errexit, etc.
source test/common.sh # $OSH, $YSH
source test/sh-assert.sh # banner, _assert-sh-status
_error-case-X() {
local expected_status=$1
shift
local message=$0
_assert-sh-status $expected_status $OSH "$message" \
-c "$@"
}
_expr-error-case() {
### Expect status 3
_error-case-X 3 "$@"
}
#
# Cases
#
test-line-numbers() {
# J8 string
_osh-error-here-X 1 << 'EOF'
echo '
{
"a": 99,
"foo\z": 42
}
' | json read
EOF
# JSON
_osh-error-here-X 1 << 'EOF'
echo '
{
"foo": 42 oops
}
' | json read
EOF
# J8 Lines
_ysh-error-here-X 4 << 'EOF'
proc p {
echo unquoted
echo
echo
echo ' "hi" oops' # line 4 error
}
write -- @(p)
EOF
}
test-parse-errors() {
# Unexpected EOF
_error-case-X 1 'echo "" | json read'
# Unexpected token
_error-case-X 1 'echo { | json read'
# Invalid token
_error-case-X 1 'echo + | json read'
# NIL8 token, not JSON8 token
_error-case-X 1 'echo "(" | json read'
# Extra input after valid message
_ysh-error-here-X 1 << 'EOF'
echo '{}[ ' | json read
EOF
}
test-ascii-control() {
# Disallowed ASCII control chars OUTSIDE string
_osh-error-here-X 1 << 'EOF'
echo $'\x02' | json read
EOF
# JSON
_ysh-error-here-X 1 << 'EOF'
echo $'"foo \x01 "' | json read
pp line (_reply)
EOF
# J8
_ysh-error-here-X 1 << 'EOF'
var invalid = b'\y01'
echo $["u'foo" ++ invalid ++ "'"] | json8 read
pp line (_reply)
EOF
}
test-str-unclosed-quote() {
# JSON
_osh-error-here-X 1 << 'EOF'
echo -n '["' | json read
EOF
# J8
_osh-error-here-X 1 << 'EOF'
echo -n "[b'" | json8 read
EOF
}
test-str-bad-escape() {
# Invalid string escape JSON
_ysh-error-here-X 1 << 'EOF'
echo '"hi \z bye"' | json read
EOF
_ysh-error-here-X 1 << 'EOF'
var invalid = r'\z'
echo $["u'hi" ++ invalid ++ "bye'"] | json8 read
EOF
return
}
test-str-invalid-utf8() {
# JSON
_ysh-error-here-X 1 << 'EOF'
# part of mu = \u03bc
echo $' "\xce" ' | json read
EOF
# J8
_ysh-error-here-X 1 << 'EOF'
var invalid = b'\yce'
echo $["u'" ++ invalid ++ "'"] | json8 read
EOF
}
test-encode() {
_error-case-X 1 'var d = {}; setvar d.k = d; json write (d)'
_error-case-X 1 'var L = []; call L->append(L); json write (L)'
# This should fail!
# But not pp line (L)
_error-case-X 1 'var L = []; call L->append(/d+/); j8 write (L)'
}
test-cpython() {
# control char is error in Python
echo $'"foo \x01 "' \
| python3 -c 'import json, sys; json.loads(sys.stdin.read())' || true
echo $' \x01' \
| python3 -c 'import json, sys; json.loads(sys.stdin.read())' || true
}
test-j8-lines() {
_ysh-should-run-here <<'EOF'
write @(echo ' "json\tstring" '; echo; echo " b'j8' "; echo ' unquoted ';)
EOF
#return
# quotes that don't match - in expression mode
_ysh-error-here-X 4 <<'EOF'
var lines = @(
echo '"unbalanced'
)
pp line (lines)
EOF
# error in word language
_ysh-error-here-X 4 <<'EOF'
write @(echo '"unbalanced')
EOF
# can't have two strings on a line
_ysh-error-here-X 4 <<'EOF'
write @(echo '"json" "nope"')
EOF
_ysh-error-here-X 4 <<'EOF'
write @(echo '"json" unquoted')
EOF
# syntax error inside quotes
_ysh-error-here-X 4 <<'EOF'
write @(echo '"hello \z"')
EOF
# unquoted line must be valid UTF-8
_ysh-error-here-X 4 <<'EOF'
write @(echo $'foo \xff-bar spam')
EOF
# unquoted line can't have ASCII control chars
_ysh-error-here-X 4 <<'EOF'
write @(echo $'foo \x01-bar spam')
EOF
}
#
# Entry points
#
soil-run-py() {
run-test-funcs
}
soil-run-cpp() {
local osh=_bin/cxx-asan/osh
ninja $osh
OSH=$osh run-test-funcs
}
run-for-release() {
run-other-suite-for-release j8-errors run-test-funcs
}
"$@"