Commit | Line | Data |
---|---|---|
c2199a45 AM |
1 | #!/bin/sh - |
2 | # | |
3 | # Copyright (c) 1992 Diomidis Spinellis. | |
4 | # Copyright (c) 1992 The Regents of the University of California. | |
5 | # All rights reserved. | |
6 | # | |
7 | # Redistribution and use in source and binary forms, with or without | |
8 | # modification, are permitted provided that the following conditions | |
9 | # are met: | |
10 | # 1. Redistributions of source code must retain the above copyright | |
11 | # notice, this list of conditions and the following disclaimer. | |
12 | # 2. Redistributions in binary form must reproduce the above copyright | |
13 | # notice, this list of conditions and the following disclaimer in the | |
14 | # documentation and/or other materials provided with the distribution. | |
15 | # 3. All advertising materials mentioning features or use of this software | |
16 | # must display the following acknowledgement: | |
17 | # This product includes software developed by the University of | |
18 | # California, Berkeley and its contributors. | |
19 | # 4. Neither the name of the University nor the names of its contributors | |
20 | # may be used to endorse or promote products derived from this software | |
21 | # without specific prior written permission. | |
22 | # | |
23 | # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
24 | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
25 | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
26 | # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
27 | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
28 | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
29 | # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
30 | # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
31 | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
32 | # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
33 | # SUCH DAMAGE. | |
34 | # | |
35 | # @(#)sed.test 5.6 (Berkeley) 8/28/92 | |
36 | # | |
37 | ||
38 | # sed Regression Tests | |
39 | # | |
40 | # The following files are created: | |
41 | # lines[1-4], script1, script2 | |
42 | # Two directories *.out contain the test results | |
43 | ||
44 | main() | |
45 | { | |
46 | BASE=/usr/old/bin/sed | |
47 | BASELOG=sed.out | |
48 | TEST=../obj/sed | |
49 | TESTLOG=nsed.out | |
50 | DICT=/usr/share/dict/words | |
51 | ||
52 | test_error | more | |
53 | ||
54 | awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1 | |
55 | awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2 | |
56 | ||
57 | exec 4>&1 5>&2 | |
58 | ||
59 | # Set these flags to get messages about known problems | |
60 | BSD=1 | |
61 | GNU=0 | |
62 | SUN=0 | |
63 | tests $BASE $BASELOG | |
64 | ||
65 | BSD=0 | |
66 | GNU=0 | |
67 | SUN=0 | |
68 | tests $TEST $TESTLOG | |
69 | exec 1>&4 2>&5 | |
70 | diff -c $BASELOG $TESTLOG | more | |
71 | } | |
72 | ||
73 | tests() | |
74 | { | |
75 | SED=$1 | |
76 | DIR=$2 | |
77 | rm -rf $DIR | |
78 | mkdir $DIR | |
79 | MARK=100 | |
80 | ||
81 | test_args | |
82 | test_addr | |
83 | echo Testing commands | |
84 | test_group | |
85 | test_acid | |
86 | test_branch | |
87 | test_pattern | |
88 | test_print | |
89 | test_subst | |
90 | } | |
91 | ||
92 | mark() | |
93 | { | |
94 | MARK=`expr $MARK + 1` | |
95 | exec 1>&4 2>&5 | |
96 | exec >"$DIR/${MARK}_$1" | |
97 | echo "Test $1:$MARK" | |
98 | # Uncomment this line to match tests with sed error messages | |
99 | echo "Test $1:$MARK" >&5 | |
100 | } | |
101 | ||
102 | test_args() | |
103 | { | |
104 | mark '1.1' | |
105 | echo Testing argument parsing | |
106 | echo First type | |
107 | if [ $SUN -eq 1 ] ; then | |
108 | echo SunOS sed prints only with -n | |
109 | else | |
110 | $SED 's/^/e1_/p' lines1 | |
111 | fi | |
112 | mark '1.2' ; $SED -n 's/^/e1_/p' lines1 | |
113 | mark '1.3' | |
114 | if [ $SUN -eq 1 ] ; then | |
115 | echo SunOS sed prints only with -n | |
116 | else | |
117 | $SED 's/^/e1_/p' <lines1 | |
118 | fi | |
119 | mark '1.4' ; $SED -n 's/^/e1_/p' <lines1 | |
120 | echo Second type | |
121 | mark '1.4.1' | |
122 | if [ $SUN -eq 1 ] ; then | |
123 | echo SunOS sed fails this | |
124 | fi | |
125 | $SED -e '' <lines1 | |
126 | echo 's/^/s1_/p' >script1 | |
127 | echo 's/^/s2_/p' >script2 | |
128 | mark '1.5' | |
129 | if [ $SUN -eq 1 ] ; then | |
130 | echo SunOS sed prints only with -n | |
131 | else | |
132 | $SED -f script1 lines1 | |
133 | fi | |
134 | mark '1.6' | |
135 | if [ $SUN -eq 1 ] ; then | |
136 | echo SunOS sed prints only with -n | |
137 | else | |
138 | $SED -f script1 <lines1 | |
139 | fi | |
140 | mark '1.7' | |
141 | if [ $SUN -eq 1 ] ; then | |
142 | echo SunOS sed prints only with -n | |
143 | else | |
144 | $SED -e 's/^/e1_/p' lines1 | |
145 | fi | |
146 | mark '1.8' | |
147 | if [ $SUN -eq 1 ] ; then | |
148 | echo SunOS sed prints only with -n | |
149 | else | |
150 | $SED -e 's/^/e1_/p' <lines1 | |
151 | fi | |
152 | mark '1.9' ; $SED -n -f script1 lines1 | |
153 | mark '1.10' ; $SED -n -f script1 <lines1 | |
154 | mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1 | |
155 | mark '1.12' | |
156 | if [ $SUN -eq 1 ] ; then | |
157 | echo SunOS sed prints only with -n | |
158 | else | |
159 | $SED -n -e 's/^/e1_/p' <lines1 | |
160 | fi | |
161 | mark '1.13' | |
162 | if [ $SUN -eq 1 ] ; then | |
163 | echo SunOS sed prints only with -n | |
164 | else | |
165 | $SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1 | |
166 | fi | |
167 | mark '1.14' | |
168 | if [ $SUN -eq 1 ] ; then | |
169 | echo SunOS sed prints only with -n | |
170 | else | |
171 | $SED -f script1 -f script2 lines1 | |
172 | fi | |
173 | mark '1.15' | |
174 | if [ $GNU -eq 1 -o $SUN -eq 1 ] ; then | |
175 | echo GNU and SunOS sed fail this following older POSIX draft | |
176 | else | |
177 | $SED -e 's/^/e1_/p' -f script1 lines1 | |
178 | fi | |
179 | mark '1.16' | |
180 | if [ $SUN -eq 1 ] ; then | |
181 | echo SunOS sed prints only with -n | |
182 | else | |
183 | $SED -e 's/^/e1_/p' lines1 lines1 | |
184 | fi | |
185 | # POSIX D11.2:11251 | |
186 | mark '1.17' ; $SED p <lines1 lines1 | |
187 | cat >script1 <<EOF | |
188 | #n | |
189 | # A comment | |
190 | ||
191 | p | |
192 | EOF | |
193 | mark '1.18' ; $SED -f script1 <lines1 lines1 | |
194 | } | |
195 | ||
196 | test_addr() | |
197 | { | |
198 | echo Testing address ranges | |
199 | mark '2.1' ; $SED -n -e '4p' lines1 | |
200 | mark '2.2' ; $SED -n -e '20p' lines1 lines2 | |
201 | mark '2.3' ; $SED -n -e '$p' lines1 | |
202 | mark '2.4' ; $SED -n -e '$p' lines1 lines2 | |
203 | mark '2.5' ; $SED -n -e '$a\ | |
204 | hello' /dev/null | |
205 | mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2 | |
206 | # Should not print anything | |
207 | mark '2.7' ; $SED -n -e '20p' lines1 | |
208 | mark '2.8' ; $SED -n -e '0p' lines1 | |
209 | mark '2.9' ; $SED -n '/l1_7/p' lines1 | |
210 | mark '2.10' ; $SED -n ' /l1_7/ p' lines1 | |
211 | mark '2.11' | |
212 | if [ $BSD -eq 1 ] ; then | |
213 | echo BSD sed fails this test | |
214 | fi | |
215 | if [ $GNU -eq 1 ] ; then | |
216 | echo GNU sed fails this | |
217 | fi | |
218 | $SED -n '\_l1\_7_p' lines1 | |
219 | mark '2.12' ; $SED -n '1,4p' lines1 | |
220 | mark '2.13' ; $SED -n '1,$p' lines1 lines2 | |
221 | mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2 | |
222 | mark '2.15' ; $SED -n '/4/,$p' lines1 lines2 | |
223 | mark '2.16' ; $SED -n '/4/,20p' lines1 lines2 | |
224 | mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2 | |
225 | mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2 | |
226 | mark '2.19' | |
227 | if [ $GNU -eq 1 ] ; then | |
228 | echo GNU sed fails this | |
229 | fi | |
230 | $SED -n '12,3p' lines1 lines2 | |
231 | mark '2.20' | |
232 | if [ $GNU -eq 1 ] ; then | |
233 | echo GNU sed fails this | |
234 | fi | |
235 | $SED -n '/l1_7/,3p' lines1 lines2 | |
236 | } | |
237 | ||
238 | test_group() | |
239 | { | |
240 | echo Brace and other grouping | |
241 | mark '3.1' ; $SED -e ' | |
242 | 4,12 { | |
243 | s/^/^/ | |
244 | s/$/$/ | |
245 | s/_/T/ | |
246 | }' lines1 | |
247 | mark '3.2' ; $SED -e ' | |
248 | 4,12 { | |
249 | s/^/^/ | |
250 | /6/,/10/ { | |
251 | s/$/$/ | |
252 | /8/ s/_/T/ | |
253 | } | |
254 | }' lines1 | |
255 | mark '3.3' ; $SED -e ' | |
256 | 4,12 !{ | |
257 | s/^/^/ | |
258 | /6/,/10/ !{ | |
259 | s/$/$/ | |
260 | /8/ !s/_/T/ | |
261 | } | |
262 | }' lines1 | |
263 | mark '3.4' ; $SED -e '4,12!s/^/^/' lines1 | |
264 | } | |
265 | ||
266 | test_acid() | |
267 | { | |
268 | echo Testing a c d and i commands | |
269 | mark '4.1' ; $SED -n -e ' | |
270 | s/^/before_i/p | |
271 | 20i\ | |
272 | inserted | |
273 | s/^/after_i/p | |
274 | ' lines1 lines2 | |
275 | mark '4.2' ; $SED -n -e ' | |
276 | 5,12s/^/5-12/ | |
277 | s/^/before_a/p | |
278 | /5-12/a\ | |
279 | appended | |
280 | s/^/after_a/p | |
281 | ' lines1 lines2 | |
282 | mark '4.3' | |
283 | if [ $GNU -eq 1 ] ; then | |
284 | echo GNU sed fails this | |
285 | fi | |
286 | $SED -n -e ' | |
287 | s/^/^/p | |
288 | /l1_/a\ | |
289 | appended | |
290 | 8,10N | |
291 | s/$/$/p | |
292 | ' lines1 lines2 | |
293 | mark '4.4' ; $SED -n -e ' | |
294 | c\ | |
295 | hello | |
296 | ' lines1 | |
297 | mark '4.5' ; $SED -n -e ' | |
298 | 8c\ | |
299 | hello | |
300 | ' lines1 | |
301 | mark '4.6' ; $SED -n -e ' | |
302 | 3,14c\ | |
303 | hello | |
304 | ' lines1 | |
305 | # SunOS and GNU sed behave differently. We follow POSIX | |
306 | # mark '4.7' ; $SED -n -e ' | |
307 | #8,3c\ | |
308 | #hello | |
309 | #' lines1 | |
310 | mark '4.8' ; $SED d <lines1 | |
311 | } | |
312 | ||
313 | test_branch() | |
314 | { | |
315 | echo Testing labels and branching | |
316 | mark '5.1' ; $SED -n -e ' | |
317 | b label4 | |
318 | :label3 | |
319 | s/^/label3_/p | |
320 | b end | |
321 | :label4 | |
322 | 2,12b label1 | |
323 | b label2 | |
324 | :label1 | |
325 | s/^/label1_/p | |
326 | b | |
327 | :label2 | |
328 | s/^/label2_/p | |
329 | b label3 | |
330 | :end | |
331 | ' lines1 | |
332 | mark '5.2' | |
333 | if [ $BSD -eq 1 ] ; then | |
334 | echo BSD sed fails this test | |
335 | fi | |
336 | $SED -n -e ' | |
337 | s/l1_/l2_/ | |
338 | t ok | |
339 | b | |
340 | :ok | |
341 | s/^/tested /p | |
342 | ' lines1 lines2 | |
343 | # SunOS sed behaves differently here. Clarification needed. | |
344 | # mark '5.3' ; $SED -n -e ' | |
345 | #5,8b inside | |
346 | #1,5 { | |
347 | # s/^/^/p | |
348 | # :inside | |
349 | # s/$/$/p | |
350 | #} | |
351 | #' lines1 | |
352 | # Check that t clears the substitution done flag | |
353 | mark '5.4' ; $SED -n -e ' | |
354 | 1,8s/^/^/ | |
355 | t l1 | |
356 | :l1 | |
357 | t l2 | |
358 | s/$/$/p | |
359 | b | |
360 | :l2 | |
361 | s/^/ERROR/ | |
362 | ' lines1 | |
363 | # Check that reading a line clears the substitution done flag | |
364 | mark '5.5' | |
365 | if [ $BSD -eq 1 ] ; then | |
366 | echo BSD sed fails this test | |
367 | fi | |
368 | $SED -n -e ' | |
369 | t l2 | |
370 | 1,8s/^/^/p | |
371 | 2,7N | |
372 | b | |
373 | :l2 | |
374 | s/^/ERROR/p | |
375 | ' lines1 | |
376 | mark '5.6' ; $SED 5q lines1 | |
377 | mark '5.7' ; $SED -e ' | |
378 | 5i\ | |
379 | hello | |
380 | 5q' lines1 | |
381 | } | |
382 | ||
383 | test_pattern() | |
384 | { | |
385 | echo Pattern space commands | |
386 | # Check that the pattern space is deleted | |
387 | mark '6.1' ; $SED -n -e ' | |
388 | c\ | |
389 | changed | |
390 | p | |
391 | ' lines1 | |
392 | mark '6.2' ; $SED -n -e ' | |
393 | 4d | |
394 | p | |
395 | ' lines1 | |
396 | # SunOS sed refused to print here | |
397 | # mark '6.3' ; $SED -e ' | |
398 | #N | |
399 | #N | |
400 | #N | |
401 | #D | |
402 | #P | |
403 | #4p | |
404 | #' lines1 | |
405 | mark '6.4' ; $SED -e ' | |
406 | 2h | |
407 | 3H | |
408 | 4g | |
409 | 5G | |
410 | 6x | |
411 | 6p | |
412 | 6x | |
413 | 6p | |
414 | ' lines1 | |
415 | mark '6.5' ; $SED -e '4n' lines1 | |
416 | mark '6.6' ; $SED -n -e '4n' lines1 | |
417 | } | |
418 | ||
419 | test_print() | |
420 | { | |
421 | echo Testing print and file routines | |
422 | awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ | |
423 | </dev/null >lines3 | |
424 | # GNU and SunOS sed behave differently here | |
425 | mark '7.1' | |
426 | if [ $BSD -eq 1 ] ; then | |
427 | echo 'BSD sed drops core on this one; TEST SKIPPED' | |
428 | else | |
429 | $SED -n l lines3 | |
430 | fi | |
431 | mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 | |
432 | rm -f lines4 | |
433 | mark '7.3' ; $SED -e '3,12w lines4' lines1 | |
434 | echo w results | |
435 | cat lines4 | |
436 | mark '7.4' ; $SED -e '4r lines2' lines1 | |
437 | mark '7.5' ; $SED -e '5r /dev/dds' lines1 | |
438 | mark '7.6' ; $SED -e '6r /dev/null' lines1 | |
439 | mark '7.7' | |
440 | if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then | |
441 | echo BSD, GNU and SunOS cannot pass this one | |
442 | else | |
443 | sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 | |
444 | rm -rf tmpdir | |
445 | mkdir tmpdir | |
446 | $SED -f script1 lines1 | |
447 | cat tmpdir/* | |
448 | rm -rf tmpdir | |
449 | fi | |
450 | mark '7.8' | |
451 | if [ $BSD -eq 1 ] ; then | |
452 | echo BSD sed cannot pass 7.7 | |
453 | else | |
454 | echo line1 > lines3 | |
455 | echo "" >> lines3 | |
456 | $SED -n -e '$p' lines3 /dev/null | |
457 | fi | |
458 | ||
459 | } | |
460 | ||
461 | test_subst() | |
462 | { | |
463 | echo Testing substitution commands | |
464 | mark '8.1' ; $SED -e 's/./X/g' lines1 | |
465 | mark '8.2' ; $SED -e 's,.,X,g' lines1 | |
466 | # GNU and SunOS sed thinks we are escaping . as wildcard, not as separator | |
467 | # mark '8.3' ; $SED -e 's.\..X.g' lines1 | |
468 | # POSIX does not say that this should work | |
469 | # mark '8.4' ; $SED -e 's/[/]/Q/' lines1 | |
470 | mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 | |
471 | mark '8.5' ; $SED -e 's_\__X_' lines1 | |
472 | mark '8.6' ; $SED -e 's/./(&)/g' lines1 | |
473 | mark '8.7' ; $SED -e 's/./(\&)/g' lines1 | |
474 | mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 | |
475 | mark '8.9' ; $SED -e 's/_/u0\ | |
476 | u1\ | |
477 | u2/g' lines1 | |
478 | mark '8.10' | |
479 | if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then | |
480 | echo 'BSD/GNU sed do not understand digit flags on s commands' | |
481 | fi | |
482 | $SED -e 's/./X/4' lines1 | |
483 | rm -f lines4 | |
484 | mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 | |
485 | echo s wfile results | |
486 | cat lines4 | |
487 | mark '8.12' ; $SED -e 's/[123]/X/g' lines1 | |
488 | mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 | |
489 | mark '8.14' ; | |
490 | if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then | |
491 | echo BSD/GNU/SUN sed fail this test | |
492 | else | |
493 | $SED -e 'y10\123456789198765432\101' lines1 | |
494 | fi | |
495 | mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 | |
496 | mark '8.16' | |
497 | if [ $BSD -eq 1 ] ; then | |
498 | echo 'BSD sed does not handle branch defined REs' | |
499 | else | |
500 | echo 'eeefff' | $SED -e 'p' -e 's/e/X/p' -e ':x' \ | |
501 | -e 's//Y/p' -e '/f/bx' | |
502 | fi | |
503 | } | |
504 | ||
505 | test_error() | |
506 | { | |
507 | exec 0>&3 4>&1 5>&2 | |
508 | exec 0</dev/null | |
509 | exec 2>&1 | |
510 | set -x | |
511 | $TEST -x && exit 1 | |
512 | $TEST -f && exit 1 | |
513 | $TEST -e && exit 1 | |
514 | $TEST -f /dev/dds && exit 1 | |
515 | $TEST p /dev/dds && exit 1 | |
516 | $TEST -f /bin/sh && exit 1 | |
517 | $TEST '{' && exit 1 | |
518 | $TEST '{' && exit 1 | |
519 | $TEST '/hello/' && exit 1 | |
520 | $TEST '1,/hello/' && exit 1 | |
521 | $TEST -e '-5p' && exit 1 | |
522 | $TEST '/jj' && exit 1 | |
523 | $TEST 'a hello' && exit 1 | |
524 | $TEST 'a \ hello' && exit 1 | |
525 | $TEST 'b foo' && exit 1 | |
526 | $TEST 'd hello' && exit 1 | |
527 | $TEST 's/aa' && exit 1 | |
528 | $TEST 's/aa/' && exit 1 | |
529 | $TEST 's/a/b' && exit 1 | |
530 | $TEST 's/a/b/c/d' && exit 1 | |
531 | $TEST 's/a/b/ 1 2' && exit 1 | |
532 | $TEST 's/a/b/ 1 g' && exit 1 | |
533 | $TEST 's/a/b/w' && exit 1 | |
534 | $TEST 'y/aa' && exit 1 | |
535 | $TEST 'y/aa/b/' && exit 1 | |
536 | $TEST 'y/aa/' && exit 1 | |
537 | $TEST 'y/a/b' && exit 1 | |
538 | $TEST 'y/a/b/c/d' && exit 1 | |
539 | $TEST '!' && exit 1 | |
540 | $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius | |
541 | set +x | |
542 | exec 0>&3 1>&4 2>&5 | |
543 | } | |
544 | ||
545 | main |