Home | History | Annotate | Line # | Download | only in TEST
sed.test revision 1.1
      1 #!/bin/sh -
      2 #
      3 # Copyright (c) 1992 Diomidis Spinellis.
      4 # Copyright (c) 1992, 1993
      5 #	The Regents of the University of California.  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	8.1 (Berkeley) 6/6/93
     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 # Branch across block boundary
    382 	mark '5.8' ; $SED -e '
    383 {
    384 :b
    385 }
    386 s/l/m/
    387 tb' lines1
    388 }
    389 
    390 test_pattern()
    391 {
    392 echo Pattern space commands
    393 # Check that the pattern space is deleted
    394 	mark '6.1' ; $SED -n -e '
    395 c\
    396 changed
    397 p
    398 ' lines1
    399 	mark '6.2' ; $SED -n -e '
    400 4d
    401 p
    402 ' lines1
    403 # SunOS sed refused to print here
    404 #	mark '6.3' ; $SED -e '
    405 #N
    406 #N
    407 #N
    408 #D
    409 #P
    410 #4p
    411 #' lines1
    412 	mark '6.4' ; $SED -e '
    413 2h
    414 3H
    415 4g
    416 5G
    417 6x
    418 6p
    419 6x
    420 6p
    421 ' lines1
    422 	mark '6.5' ; $SED -e '4n' lines1
    423 	mark '6.6' ; $SED -n -e '4n' lines1
    424 }
    425 
    426 test_print()
    427 {
    428 	echo Testing print and file routines
    429 	awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \
    430 		</dev/null >lines3
    431 	# GNU and SunOS sed behave differently here
    432 	mark '7.1'
    433 	if [ $BSD -eq 1 ] ; then
    434 		echo 'BSD sed drops core on this one; TEST SKIPPED'
    435 	else
    436 		$SED -n l lines3
    437 	fi
    438 	mark '7.2' ; $SED -e '/l2_/=' lines1 lines2
    439 	rm -f lines4
    440 	mark '7.3' ; $SED -e '3,12w lines4' lines1
    441 	echo w results
    442 	cat lines4
    443 	mark '7.4' ; $SED -e '4r lines2' lines1
    444 	mark '7.5' ; $SED -e '5r /dev/dds' lines1
    445 	mark '7.6' ; $SED -e '6r /dev/null' lines1
    446 	mark '7.7'
    447 	if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
    448 		echo BSD, GNU and SunOS cannot pass this one
    449 	else
    450 		sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1
    451 		rm -rf tmpdir
    452 		mkdir tmpdir
    453 		$SED -f script1 lines1
    454 		cat tmpdir/*
    455 		rm -rf tmpdir
    456 	fi
    457 	mark '7.8'
    458 	if [ $BSD -eq 1 ] ; then
    459 		echo BSD sed cannot pass 7.7
    460 	else
    461 		echo line1 > lines3
    462 		echo "" >> lines3
    463 		$SED -n -e '$p' lines3 /dev/null
    464 	fi
    465 		
    466 }
    467 
    468 test_subst()
    469 {
    470 	echo Testing substitution commands
    471 	mark '8.1' ; $SED -e 's/./X/g' lines1
    472 	mark '8.2' ; $SED -e 's,.,X,g' lines1
    473 # GNU and SunOS sed thinks we are escaping . as wildcard, not as separator
    474 #	mark '8.3' ; $SED -e 's.\..X.g' lines1
    475 # POSIX does not say that this should work
    476 #	mark '8.4' ; $SED -e 's/[/]/Q/' lines1
    477 	mark '8.4' ; $SED -e 's/[\/]/Q/' lines1
    478 	mark '8.5' ; $SED -e 's_\__X_' lines1
    479 	mark '8.6' ; $SED -e 's/./(&)/g' lines1
    480 	mark '8.7' ; $SED -e 's/./(\&)/g' lines1
    481 	mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1
    482 	mark '8.9' ; $SED -e 's/_/u0\
    483 u1\
    484 u2/g' lines1
    485 	mark '8.10'
    486 	if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then
    487 		echo 'BSD/GNU sed do not understand digit flags on s commands'
    488 	fi
    489 	$SED -e 's/./X/4' lines1
    490 	rm -f lines4
    491 	mark '8.11' ; $SED -e 's/1/X/w lines4' lines1
    492 	echo s wfile results
    493 	cat lines4
    494 	mark '8.12' ; $SED -e 's/[123]/X/g' lines1
    495 	mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1
    496 	mark '8.14' ; 
    497 	if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
    498 		echo BSD/GNU/SUN sed fail this test
    499 	else
    500 		$SED -e 'y10\123456789198765432\101' lines1
    501 	fi
    502 	mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1
    503 	mark '8.16'
    504 	if [ $BSD -eq 1 ] ; then
    505 		echo 'BSD sed does not handle branch defined REs'
    506 	else
    507 		echo 'eeefff' | $SED -e 'p' -e 's/e/X/p' -e ':x' \
    508 		    -e 's//Y/p' -e '/f/bx'
    509 	fi
    510 }
    511 
    512 test_error()
    513 {
    514 	exec 0>&3 4>&1 5>&2
    515 	exec 0</dev/null
    516 	exec 2>&1
    517 	set -x
    518 	$TEST -x && exit 1
    519 	$TEST -f && exit 1
    520 	$TEST -e && exit 1
    521 	$TEST -f /dev/dds && exit 1
    522 	$TEST p /dev/dds && exit 1
    523 	$TEST -f /bin/sh && exit 1
    524 	$TEST '{' && exit 1
    525 	$TEST '{' && exit 1
    526 	$TEST '/hello/' && exit 1
    527 	$TEST '1,/hello/' && exit 1
    528 	$TEST -e '-5p' && exit 1
    529 	$TEST '/jj' && exit 1
    530 	$TEST 'a hello' && exit 1
    531 	$TEST 'a \ hello' && exit 1
    532 	$TEST 'b foo' && exit 1
    533 	$TEST 'd hello' && exit 1
    534 	$TEST 's/aa' && exit 1
    535 	$TEST 's/aa/' && exit 1
    536 	$TEST 's/a/b' && exit 1
    537 	$TEST 's/a/b/c/d' && exit 1
    538 	$TEST 's/a/b/ 1 2' && exit 1
    539 	$TEST 's/a/b/ 1 g' && exit 1
    540 	$TEST 's/a/b/w' && exit 1
    541 	$TEST 'y/aa' && exit 1
    542 	$TEST 'y/aa/b/' && exit 1
    543 	$TEST 'y/aa/' && exit 1
    544 	$TEST 'y/a/b' && exit 1
    545 	$TEST 'y/a/b/c/d' && exit 1
    546 	$TEST '!' && exit 1
    547 	$TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius
    548 	set +x
    549 	exec 0>&3 1>&4 2>&5
    550 }
    551 
    552 main
    553