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