blob: 179d5d2a24ae8199ac6d818b8f853d1a943782f1 [file] [log] [blame]
Denys Vlasenko9a23b072018-12-12 21:41:40 +01001#!/bin/sh
2# Copyright 2018 by Denys Vlasenko
3# Licensed under GPLv2 or later, see file LICENSE in this source tree.
4
5. ./testing.sh
6
Denys Vlasenko766f6722018-12-13 17:23:24 +01007# testing "test name" "command" "expected result" "file input" "stdin"
8
Denys Vlasenko94576d22018-12-25 23:45:57 +01009testing "bc comment" \
Denys Vlasenko766f6722018-12-13 17:23:24 +010010 "bc" \
11 "3\n" \
12 "" "1 /* comment */ + 2"
13
Denys Vlasenko94576d22018-12-25 23:45:57 +010014testing "bc /*/ is not a closed comment" \
Denys Vlasenko766f6722018-12-13 17:23:24 +010015 "bc" \
16 "4\n" \
17 "" "1 /*/ + 2 */ + 3"
18
Denys Vlasenko94576d22018-12-25 23:45:57 +010019# this needs interactive testing
20testing "bc comment with \"" \
21 "bc" \
22 "3\n" \
23 "" "1 /* \" */ + 2"
24
25# this needs interactive testing
26testing "bc \"string/*\" is not a comment" \
27 "bc" \
28 "string/*9\n" \
29 "" "\"string/*\";9"
30
Denys Vlasenko55f3cab2018-12-18 14:37:16 +010031testing "bc comment 3: unterminated #comment" \
32 "bc" \
33 "" \
34 "" "#foo" # no trailing newline
35
Denys Vlasenko818b6022018-12-13 17:56:35 +010036testing "bc backslash 1" \
37 "bc" \
38 "3\n" \
39 "" "1 \\\\\n + 2"
40
41testing "bc string 1" \
42 "bc" \
43 "STR\n" \
44 "" "\"STR\n\""
45
Denys Vlasenko8c1e7232018-12-22 01:34:10 +010046testing "bc read() 4<EOF>" \
47 "bc input" \
48 "4\n" \
49 "read();halt" "4"
50
51testing "bc read()^2" \
52 "bc input" \
53 "16\n" \
54 "read()^2;halt" "4\n"
55
56testing "bc read()*read()" \
57 "bc input" \
58 "20\n" \
59 "read()*read();halt" "4\n5"
60
Denys Vlasenko99b37622018-12-15 20:06:59 +010061testing "bc if 0 else" \
62 "bc" \
63 "2\n9\n" \
64 "" "if (0) 1 else 2; 9"
65
66testing "bc if 1 else" \
67 "bc" \
68 "1\n9\n" \
69 "" "if (1) 1 else 2; 9"
70
71testing "bc if 1 if 1 else else" \
72 "bc" \
73 "1\n9\n" \
74 "" "if (1) if (1) 1 else 2 else 3; 9"
75
76testing "bc if 0 else if 1" \
77 "bc" \
78 "2\n9\n" \
79 "" "if (0) 1 else if (1) 2; 9"
80
Denys Vlasenko5fa74b92018-12-25 17:07:51 +010081testing "bc for (;;)" \
Denys Vlasenko52caa002018-12-21 00:35:22 +010082 "bc" \
83 "2\n3\n2\n9\n" \
84 "" "i=2; for (;;) { 2; if(--i==0) break; 3; }; 9"
85
Denys Vlasenko19eee8e2018-12-21 20:29:34 +010086testing "bc for (;cond;)" \
87 "bc" \
88 "1\n2\n3\n9\n" \
89 "" "i=0; for(;i<3;)++i; 9"
90
91testing "bc for (;cond;upd)" \
92 "bc" \
93 "1\n2\n3\n9\n" \
94 "" "i=1; for(;i<4;i++)i; 9"
95
96testing "bc for (init;cond;upd)" \
97 "bc" \
98 "1\n2\n3\n9\n" \
99 "" "for(i=1;i<4;i++)i; 9"
100
Denys Vlasenko5fa74b92018-12-25 17:07:51 +0100101testing "bc for (;;) {break}" \
102 "bc" \
103 "2\n9\n" \
104 "" "for (;;) {2;break}; 9"
105
Denys Vlasenko96b5ec12019-01-03 23:34:36 +0100106testing "bc define {return}" \
107 "bc" \
108 "0\n9\n" \
109 "" "define w() {return}\nw();9"
110
Denys Vlasenkod1d29b42018-12-16 16:03:03 +0100111testing "bc define auto" \
112 "bc" \
113 "8\n9\n" \
114 "" "define w() { auto z; return 8; }; w(); 9"
115
Denys Vlasenko22314682019-01-01 21:50:14 +0100116testing "bc define auto array same name" \
117 "bc" \
118 "8\n9\n" \
119 "" "define w(x) { auto x[]; return x; }; w(8); 9"
120
Denys Vlasenkoe9519e42018-12-16 17:06:07 +0100121testing "bc define with body on next line" \
122 "bc" \
123 "8\n9\n" \
124 "" "define w()\n{ auto z; return 8; }\nw()\n9"
125
Denys Vlasenko54f5c1d2019-01-04 13:58:46 +0100126testing "bc void function" \
127 "bc" \
128 "void9\n" \
129 "" "define void w() {print \"void\"}\nw()\n9"
130
131# Extra POSIX compat - GNU bc does not allow this
132testing "bc function named 'void'" \
133 "bc" \
134 "void0\n9\n" \
135 "" "define void() {print \"void\"}\nvoid()\n9"
136
137# Extra POSIX compat - GNU bc does not allow this
138testing "bc variable named 'void'" \
139 "bc" \
140 "6\n9\n" \
141 "" "void=6\nvoid\n9"
142
Denys Vlasenko202dd192018-12-16 17:30:35 +0100143testing "bc if(cond)<NL>" \
144 "bc" \
145 "9\n" \
146 "" "if(0)\n3\n9"
147
Denys Vlasenkoa50576a2018-12-16 19:21:57 +0100148testing "bc if(cond) stmt else<NL>" \
149 "bc" \
150 "4\n9\n" \
151 "" "if(0)3 else\n4\n9"
152
Denys Vlasenko202dd192018-12-16 17:30:35 +0100153testing "bc while(cond)<NL>" \
154 "bc" \
155 "8\n7\n6\n5\n4\n3\n2\n1\n9\n" \
156 "" "i=9;while(--i)\ni\n9"
157
Denys Vlasenko5acd14b2018-12-20 16:48:50 +0100158testing "bc ifz does not match if keyword" \
159 "bc" \
160 "1\n2\n2\n3\n" \
161 "" "ifz=1;ifz\n++ifz;ifz++\nifz"
162
Denys Vlasenko22314682019-01-01 21:50:14 +0100163# had parse error on "f()-N"
164testing "bc -l 'e(0)-2'" \
165 "bc -l" \
166 "-1.00000000000000000000\n" \
167 "" "e(0)-2"
168
169testing "bc (!a&&b)" \
170 "bc" \
171 "0\n" \
172 "" "(!a&&b)"
173
Denys Vlasenko266bec82019-01-02 05:03:53 +0100174# check that dc code is not messing this up (no NUL printing!)
175testing "bc print \"\"" \
176 "bc" \
177 "" \
178 "" "print \"\""
179
Denys Vlasenko5d18f6b2018-12-16 21:08:30 +0100180testing "bc print 1,2,3" \
181 "bc" \
182 "123" \
183 "" "print 1,2,3"
184
Denys Vlasenko4b72aeb2018-12-17 16:54:37 +0100185testing "bc { print 1 }" \
186 "bc" \
187 "1" \
188 "" "{ print 1 }"
189
Denys Vlasenko00841372019-11-23 17:25:21 +0100190testing "bc comparison 1" \
191 "bc" \
192 "1\n" \
193 "" "-10 < -9"
194
Denys Vlasenko06ade772018-12-16 22:44:51 +0100195testing "bc nested loops and breaks" \
196 "bc" \
197 "\
19811
19921
20031
20122
20212
20399
204" \
205 "" "\
206if(1) {
207 11
208 while(1) {
209 21
210 while(1) {
211 31
212 break
213 32
214 }
215 22
216 break
217 23
218 }
219 12
220} else {
221 88
222}
22399
224"
225
Denys Vlasenkode24e9d2018-12-16 23:02:22 +0100226testing "bc continue in if" \
227 "bc" \
228 "\
22911
23021
23111
23231
23399
234" \
235 "" "\
236i=2
237while(i--) {
Denys Vlasenkocb7c9552019-01-02 14:00:20 +0100238 11
239 if(i) {
240 21
241 continue
242 22
243 } else {
244 31
245 continue
246 32
Denys Vlasenkode24e9d2018-12-16 23:02:22 +0100247 }
Denys Vlasenkocb7c9552019-01-02 14:00:20 +0100248 12
Denys Vlasenkode24e9d2018-12-16 23:02:22 +0100249}
25099
251"
252
Denys Vlasenko266aa002018-12-16 23:24:25 +0100253testing "bc continue in for" \
254 "bc" \
255 "\
2561
25777
2582
25999
260" \
261 "" "\
262for(i=1; i<3; i++) {
263 i
264 if(i==2) continue
265 77
266}
26799
268"
269
Denys Vlasenko680ccd32018-12-31 19:42:13 +0100270testing "bc ibase" \
271 "bc" \
272 "99\n1295\n1224\n" \
273 "" "a=ZZ;a;ibase=36;a=ZZ;a;ibase=Z;a=ZZ;a"
274
Denys Vlasenkocb7c9552019-01-02 14:00:20 +0100275testing "bc parsing of numbers" \
276 "bc 2>&1 | bc 2>&1 | md5sum 2>&1" \
277 "465d8c01308d0863b6f5669e8a1c69fb -\n" \
278 "" '
279for (b = 2; b <= 16; ++b) {
280 if (b == 10) continue
281 obase = 10
282 print "ibase = A; ibase = ", b, "\n"
283 obase = b
284 for (i = 0; i <= 65536; ++i) {
285 i
286 print "0.", i, "\n"
287 print "1.", i, "\n"
288 print i, ".", i, "\n"
289 }
290}'
291
292testing "bc printing of numbers" \
293 "bc 2>&1 | bc 2>&1 | md5sum 2>&1" \
294 "d884b35d251ca096410712743aeafb9e -\n" \
295 "" '
296for (b = 2; b <= 101; ++b) {
297 if (b == 10) continue
298 s = b * b
299 print "obase = ", b, "\n"
300 for (i = 0; i <= s; ++i) {
301 i
302 print "0.", i, "\n"
303 print "1.", i, "\n"
304 print i, ".", i, "\n"
305 }
306 2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460
307}'
Denys Vlasenko9a23b072018-12-12 21:41:40 +0100308
309for f in bc*.bc; do
310 r="`basename "$f" .bc`_results.txt"
311 test -f "$r" || continue
312 # testing "test name" "command" "expected result" "file input" "stdin"
313 testing "bc -lq $f" \
314 "{ { bc -lq $f 2>&1; echo E:\$? >&2; } | diff -u - $r; echo E:\$?; } 2>&1" \
315 "E:0\nE:0\n" \
316 "" ""
317done
318
319exit $FAILCOUNT