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