OILS / spec / shell-grammar.test.sh View on Github | oils.pub

208 lines, 106 significant
1## compare_shells: bash mksh zsh
2
3# Test cases for the grammar. It uses pidgin shell because we don't have a
4# proper lexer in ANTLR (ANTLR's lexers don't have states anyway.)
5#
6# These tests should run under the normal shell. But REAL shell tests won't
7# run under the fake shells grammar/shell*.sh
8
9## suite: disabled
10
11#### Simple command
12echo
13
14#### Command with args
15echo word word
16
17#### Command with trailer
18echo word word &
19
20#### a & b
21echo word_a & echo word_b
22
23#### a & b &
24echo word_a & echo word_b &
25
26#### a && b
27echo word_a && echo word_b
28
29#### a || b
30echo word_a || echo word_b
31
32#### a && b || c
33echo word_a && echo word_b || echo
34
35#### Invalid token
36invalid
37# TODO: change these to qualifiers!
38## status: 99
39
40#### Filename Redirect
41echo 2>filename
42
43#### Append redirect
44echo >>filename
45
46#### Prefix redirect
47<filename echo
48
49#### Var assignment
50NAME=foo echo >>filename
51
52#### Brace group
53{ echo
54 echo
55}
56
57#### Brace group on oneline
58{ echo word_a; echo word_b; }
59
60#### Subshell
61(echo word_a; echo word_b;)
62
63#### Command sub
64#echo $(echo word_a; echo word_b;)
65echo
66
67#### Subshell on multiple lines
68(echo
69echo
70echo
71)
72
73#### For loop
74# TODO: need to add variables
75for name in word_a word_b word_c
76do
77 echo word_x
78 echo word_y
79done
80
81#### While loop with empty lines
82while ! echo word_a
83do
84
85 echo word_b
86
87 echo word_c
88
89done
90
91#### Until loop
92until echo word_a
93do
94 echo word_b
95 echo word_c
96done
97
98#### If
99if echo
100then
101 echo
102else
103 echo
104fi
105
106#### If with then on same line
107if echo; then
108 echo
109else
110 echo
111fi
112
113#### If with then on same line missing semicolon
114# My ANTLR parsers fail to flag this. The 'else' keyword should be unexpected.
115if echo then
116 echo
117else
118 echo
119fi
120## status: 2
121
122#### If on one line
123if echo; then echo; else echo; fi
124
125#### If pipe
126if echo | echo word_b; then
127 echo
128else
129 echo
130fi
131
132
133#### Empty case
134case word_a in
135esac
136
137#### Case without last dsemi
138case word_a in
139 word_b) echo
140esac
141
142#### Case with last dsemi
143case word_a in
144 word_b) echo
145 ;;
146esac
147
148#### Case with empty clauses
149case word_a in
150 word_b)
151 ;;
152 word_c)
153esac
154
155#### case item without ;; is not allowed
156case word_a in
157 word_a)
158 word_b)
159 echo
160 ;;
161esac
162## status: 99
163
164
165#### Case with last dsemi on same line
166case word_a in
167 word_b) echo ;;
168esac
169
170#### Case with 2 options
171case word_a in
172 word_b|word_c)
173 echo word_d
174 echo word_e
175 ;;
176 word_e)
177 echo word_f
178 ;;
179esac
180
181#### Case all on one line
182case word_a in word_b) echo ;; word_c) echo ;; esac
183
184#### Case all on one line without trailing ;;
185case word_a in word_b) echo word_b;; word_c) echo word_c; esac
186
187#### Case all on one line without trailing ;; or ;
188# My ANTLR parsers don't fail here and they should.
189case word_a in word_b) echo word_b;; word_c) echo word_c esac
190## status: 99
191
192#### case: Using ; instead of ;;
193case word_a in
194 word_a)
195 ;
196 word_b)
197 echo
198 ;;
199esac
200## status: 99
201
202
203#### Function def
204name_a() {
205 echo word_a
206 echo word_b
207}
208