multi_test.sh revision 167549
1250003Sadrian#!/bin/sh - 2250003Sadrian# 3250003Sadrian# Copyright (c) 1992 Diomidis Spinellis. 4250003Sadrian# Copyright (c) 1992, 1993 5250003Sadrian# The Regents of the University of California. All rights reserved. 6250003Sadrian# 7250003Sadrian# Redistribution and use in source and binary forms, with or without 8250003Sadrian# modification, are permitted provided that the following conditions 9250003Sadrian# are met: 10250003Sadrian# 1. Redistributions of source code must retain the above copyright 11250003Sadrian# notice, this list of conditions and the following disclaimer. 12250003Sadrian# 2. Redistributions in binary form must reproduce the above copyright 13250003Sadrian# notice, this list of conditions and the following disclaimer in the 14250003Sadrian# documentation and/or other materials provided with the distribution. 15250003Sadrian# 4. Neither the name of the University nor the names of its contributors 16250003Sadrian# may be used to endorse or promote products derived from this software 17250003Sadrian# without specific prior written permission. 18250003Sadrian# 19250003Sadrian# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20250003Sadrian# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21250003Sadrian# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22250003Sadrian# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23250003Sadrian# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24250003Sadrian# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25250003Sadrian# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26250003Sadrian# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27250003Sadrian# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28250003Sadrian# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29250003Sadrian# SUCH DAMAGE. 30250003Sadrian# 31250003Sadrian# @(#)sed.test 8.1 (Berkeley) 6/6/93 32250003Sadrian# 33250003Sadrian# $FreeBSD: head/tools/regression/usr.bin/sed/multitest.t 167549 2007-03-14 11:03:00Z dds $ 34250003Sadrian# 35250003Sadrian 36250003Sadrian# sed Regression Tests 37250003Sadrian# 38250003Sadrian# The following files are created: 39250003Sadrian# lines[1-4], script1, script2 40250003Sadrian# Two directories *.out contain the test results 41250003Sadrian 42250003Sadrianmain() 43250003Sadrian{ 44250003Sadrian #BASE=/usr/bin/sed 45250003Sadrian BASE=/usr/ports/textproc/gsed/work/sed-4.1.5/sed/sed 46250003Sadrian BASELOG=sed.out 47250003Sadrian #TEST=`cd ..; make whereobj`/sed 48250003Sadrian TEST=/home/dds/src/fbsd-head/sed/sed 49250003Sadrian TESTLOG=nsed.out 50250003Sadrian DICT=/usr/share/dict/words 51250003Sadrian 52250003Sadrian #test_error | more 53250003Sadrian 54250003Sadrian awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1 55250003Sadrian awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2 56250003Sadrian 57250003Sadrian exec 4>&1 5>&2 58250003Sadrian 59250003Sadrian # Set these flags to get messages about known problems 60250003Sadrian BSD=0 61250003Sadrian GNU=1 62250003Sadrian SUN=0 63250003Sadrian tests $BASE $BASELOG 64250003Sadrian 65250003Sadrian BSD=1 66250003Sadrian GNU=0 67250003Sadrian SUN=0 68250003Sadrian tests $TEST $TESTLOG 69250003Sadrian exec 1>&4 2>&5 70250003Sadrian diff -c $BASELOG $TESTLOG | more 71250003Sadrian} 72250003Sadrian 73250003Sadriantests() 74250003Sadrian{ 75250003Sadrian SED=$1 76250003Sadrian DIR=$2 77250003Sadrian rm -rf $DIR 78250003Sadrian mkdir $DIR 79250003Sadrian MARK=100 80250003Sadrian 81250003Sadrian test_args 82250003Sadrian test_addr 83250003Sadrian echo Testing commands 84250003Sadrian test_group 85250003Sadrian test_acid 86250003Sadrian test_branch 87250003Sadrian test_pattern 88250003Sadrian test_print 89250003Sadrian test_subst 90250003Sadrian} 91250003Sadrian 92250003Sadrianmark() 93250003Sadrian{ 94250003Sadrian MARK=`expr $MARK + 1` 95250003Sadrian exec 1>&4 2>&5 96250003Sadrian exec >"$DIR/${MARK}_$1" 97250003Sadrian echo "Test $1:$MARK" 98250003Sadrian # Uncomment this line to match tests with sed error messages 99250003Sadrian echo "Test $1:$MARK" >&5 100250003Sadrian} 101250003Sadrian 102250003Sadriantest_args() 103250003Sadrian{ 104250003Sadrian mark '1.1' 105250003Sadrian echo Testing argument parsing 106250003Sadrian echo First type 107250003Sadrian $SED 's/^/e1_/p' lines1 108250003Sadrian mark '1.2' ; $SED -n 's/^/e1_/p' lines1 109250003Sadrian mark '1.3' 110250003Sadrian $SED 's/^/e1_/p' <lines1 111250003Sadrian mark '1.4' ; $SED -n 's/^/e1_/p' <lines1 112250003Sadrian echo Second type 113250003Sadrian mark '1.4.1' 114250003Sadrian $SED -e '' <lines1 115250003Sadrian echo 's/^/s1_/p' >script1 116250003Sadrian echo 's/^/s2_/p' >script2 117250003Sadrian mark '1.5' 118250003Sadrian $SED -f script1 lines1 119250003Sadrian mark '1.6' 120250003Sadrian $SED -f script1 <lines1 121250003Sadrian mark '1.7' 122250003Sadrian $SED -e 's/^/e1_/p' lines1 123250003Sadrian mark '1.8' 124250003Sadrian $SED -e 's/^/e1_/p' <lines1 125250003Sadrian mark '1.9' ; $SED -n -f script1 lines1 126250003Sadrian mark '1.10' ; $SED -n -f script1 <lines1 127250003Sadrian mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1 128250003Sadrian mark '1.12' 129250003Sadrian $SED -n -e 's/^/e1_/p' <lines1 130250003Sadrian mark '1.13' 131250003Sadrian $SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1 132250003Sadrian mark '1.14' 133250003Sadrian $SED -f script1 -f script2 lines1 134250003Sadrian mark '1.15' 135250003Sadrian if [ $SUN -eq 1 ] ; then 136250003Sadrian echo SunOS sed fails this following older POSIX draft 137250003Sadrian else 138250003Sadrian $SED -e 's/^/e1_/p' -f script1 lines1 139250003Sadrian fi 140250003Sadrian mark '1.16' 141250003Sadrian $SED -e 's/^/e1_/p' lines1 lines1 142250003Sadrian # POSIX D11.2:11251 143250003Sadrian mark '1.17' ; $SED p <lines1 lines1 144250003Sadriancat >script1 <<EOF 145250003Sadrian#n 146250003Sadrian# A comment 147250003Sadrian 148250003Sadrianp 149250003SadrianEOF 150250003Sadrian mark '1.18' ; $SED -f script1 <lines1 lines1 151250003Sadrian} 152250003Sadrian 153250003Sadriantest_addr() 154250003Sadrian{ 155250003Sadrian echo Testing address ranges 156250003Sadrian mark '2.1' ; $SED -n -e '4p' lines1 157250003Sadrian mark '2.2' ; $SED -n -e '20p' lines1 lines2 158250003Sadrian mark '2.3' ; $SED -n -e '$p' lines1 159250003Sadrian mark '2.4' ; $SED -n -e '$p' lines1 lines2 160250003Sadrian mark '2.5' ; $SED -n -e '$a\ 161250003Sadrianhello' /dev/null 162250003Sadrian mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2 163250003Sadrian # Should not print anything 164250003Sadrian mark '2.7' ; $SED -n -e '20p' lines1 165250003Sadrian mark '2.8' ; $SED -n -e '/NOTFOUND/p' lines1 166250003Sadrian mark '2.9' ; $SED -n '/l1_7/p' lines1 167250003Sadrian mark '2.10' ; $SED -n ' /l1_7/ p' lines1 168250003Sadrian mark '2.11' ; $SED -n '\_l1\_7_p' lines1 169250003Sadrian mark '2.12' ; $SED -n '1,4p' lines1 170250003Sadrian mark '2.13' ; $SED -n '1,$p' lines1 lines2 171250003Sadrian mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2 172250003Sadrian mark '2.15' ; $SED -n '/4/,$p' lines1 lines2 173250003Sadrian mark '2.16' ; $SED -n '/4/,20p' lines1 lines2 174250003Sadrian mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2 175250003Sadrian mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2 176250003Sadrian mark '2.19' ; $SED -n '12,3p' lines1 lines2 177250003Sadrian mark '2.20' ; $SED -n '/l1_7/,3p' lines1 lines2 178250003Sadrian} 179250003Sadrian 180250003Sadriantest_group() 181250003Sadrian{ 182250003Sadrian echo Brace and other grouping 183250003Sadrian mark '3.1' ; $SED -e ' 184250003Sadrian4,12 { 185250003Sadrian s/^/^/ 186250003Sadrian s/$/$/ 187250003Sadrian s/_/T/ 188250003Sadrian}' lines1 189250003Sadrian mark '3.2' ; $SED -e ' 190250003Sadrian4,12 { 191250003Sadrian s/^/^/ 192250003Sadrian /6/,/10/ { 193250003Sadrian s/$/$/ 194250003Sadrian /8/ s/_/T/ 195250003Sadrian } 196250003Sadrian}' lines1 197250003Sadrian mark '3.3' ; $SED -e ' 198250003Sadrian4,12 !{ 199250003Sadrian s/^/^/ 200250003Sadrian /6/,/10/ !{ 201250003Sadrian s/$/$/ 202250003Sadrian /8/ !s/_/T/ 203250003Sadrian } 204250003Sadrian}' lines1 205250003Sadrian mark '3.4' ; $SED -e '4,12!s/^/^/' lines1 206250003Sadrian} 207250003Sadrian 208250003Sadriantest_acid() 209250003Sadrian{ 210250003Sadrian echo Testing a c d and i commands 211250003Sadrian mark '4.1' ; $SED -n -e ' 212250003Sadrians/^/before_i/p 213250003Sadrian20i\ 214250003Sadrianinserted 215250003Sadrians/^/after_i/p 216250003Sadrian' lines1 lines2 217250003Sadrian mark '4.2' ; $SED -n -e ' 218250003Sadrian5,12s/^/5-12/ 219250003Sadrians/^/before_a/p 220250003Sadrian/5-12/a\ 221250003Sadrianappended 222250003Sadrians/^/after_a/p 223250003Sadrian' lines1 lines2 224250003Sadrian mark '4.3' 225250003Sadrian $SED -n -e ' 226250003Sadrians/^/^/p 227250003Sadrian/l1_/a\ 228250003Sadrianappended 229250003Sadrian8,10N 230250003Sadrians/$/$/p 231250003Sadrian' lines1 lines2 232250003Sadrian mark '4.4' ; $SED -n -e ' 233250003Sadrianc\ 234250003Sadrianhello 235250003Sadrian' lines1 236250003Sadrian mark '4.5' ; $SED -n -e ' 237250003Sadrian8c\ 238250003Sadrianhello 239250003Sadrian' lines1 240250003Sadrian mark '4.6' ; $SED -n -e ' 241250003Sadrian3,14c\ 242250003Sadrianhello 243250003Sadrian' lines1 244250003Sadrian# SunOS and GNU sed behave differently. We follow POSIX 245250003Sadrian mark '4.7' ; $SED -n -e ' 246250003Sadrian8,3c\ 247250003Sadrianhello 248250003Sadrian' lines1 249250003Sadrian mark '4.8' ; $SED d <lines1 250250003Sadrian} 251250003Sadrian 252250003Sadriantest_branch() 253250003Sadrian{ 254250003Sadrian echo Testing labels and branching 255250003Sadrian mark '5.1' ; $SED -n -e ' 256250003Sadrianb label4 257250003Sadrian:label3 258250003Sadrians/^/label3_/p 259250003Sadrianb end 260250003Sadrian:label4 261250003Sadrian2,12b label1 262250003Sadrianb label2 263250003Sadrian:label1 264250003Sadrians/^/label1_/p 265250003Sadrianb 266250003Sadrian:label2 267250003Sadrians/^/label2_/p 268250003Sadrianb label3 269250003Sadrian:end 270250003Sadrian' lines1 271250003Sadrian mark '5.2' 272250003Sadrian $SED -n -e ' 273250003Sadrians/l1_/l2_/ 274250003Sadriant ok 275250003Sadrianb 276250003Sadrian:ok 277250003Sadrians/^/tested /p 278250003Sadrian' lines1 lines2 279250003Sadrian# SunOS and GNU sed behave differently here. Clarification needed. 280250003Sadrian mark '5.3' ; $SED -n -e ' 281250003Sadrian5,8b inside 282250003Sadrian1,5 { 283250003Sadrian s/^/^/p 284250003Sadrian :inside 285250003Sadrian s/$/$/p 286250003Sadrian} 287250003Sadrian' lines1 288250003Sadrian# Check that t clears the substitution done flag 289250003Sadrian mark '5.4' ; $SED -n -e ' 290250003Sadrian1,8s/^/^/ 291250003Sadriant l1 292250003Sadrian:l1 293250003Sadriant l2 294250003Sadrians/$/$/p 295250003Sadrianb 296250003Sadrian:l2 297250003Sadrians/^/ERROR/ 298250003Sadrian' lines1 299250003Sadrian# Check that reading a line clears the substitution done flag 300250003Sadrian mark '5.5' 301250003Sadrian $SED -n -e ' 302250003Sadriant l2 303250003Sadrian1,8s/^/^/p 304250003Sadrian2,7N 305250003Sadrianb 306250003Sadrian:l2 307250003Sadrians/^/ERROR/p 308250003Sadrian' lines1 309250003Sadrian mark '5.6' ; $SED 5q lines1 310250003Sadrian mark '5.7' ; $SED -e ' 311250003Sadrian5i\ 312250003Sadrianhello 313250003Sadrian5q' lines1 314250003Sadrian# Branch across block boundary 315250003Sadrian mark '5.8' ; $SED -e ' 316250003Sadrian{ 317250003Sadrian:b 318250003Sadrian} 319250003Sadrians/l/m/ 320250003Sadriantb' lines1 321250003Sadrian} 322250003Sadrian 323250003Sadriantest_pattern() 324250003Sadrian{ 325250003Sadrianecho Pattern space commands 326250003Sadrian# Check that the pattern space is deleted 327250003Sadrian mark '6.1' ; $SED -n -e ' 328250003Sadrianc\ 329250003Sadrianchanged 330250003Sadrianp 331250003Sadrian' lines1 332250003Sadrian mark '6.2' ; $SED -n -e ' 333250003Sadrian4d 334250003Sadrianp 335250003Sadrian' lines1 336250003Sadrian mark '6.3' 337250003Sadrian if [ $GNU -eq 1 ] ; then 338250003Sadrian echo GNU sed cannot pass 6.3 339250003Sadrian else 340250003Sadrian $SED -e 'N;N;N;D' lines1 341250003Sadrian fi 342250003Sadrian mark '6.4' ; $SED -e ' 343250003Sadrian2h 344250003Sadrian3H 345250003Sadrian4g 346250003Sadrian5G 347250003Sadrian6x 348250003Sadrian6p 349250003Sadrian6x 350250003Sadrian6p 351250003Sadrian' lines1 352250003Sadrian mark '6.5' ; $SED -e '4n' lines1 353250003Sadrian mark '6.6' ; $SED -n -e '4n' lines1 354250003Sadrian} 355250003Sadrian 356250003Sadriantest_print() 357250003Sadrian{ 358250003Sadrian echo Testing print and file routines 359250003Sadrian awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ 360250003Sadrian </dev/null >lines3 361250003Sadrian # GNU and SunOS sed behave differently here 362250003Sadrian mark '7.1' 363250003Sadrian $SED -n l lines3 364250003Sadrian mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 365250003Sadrian rm -f lines4 366250003Sadrian mark '7.3' ; $SED -e '3,12w lines4' lines1 367250003Sadrian echo w results 368250003Sadrian cat lines4 369250003Sadrian mark '7.4' ; $SED -e '4r lines2' lines1 370250003Sadrian mark '7.5' ; $SED -e '5r /dev/dds' lines1 371250003Sadrian mark '7.6' ; $SED -e '6r /dev/null' lines1 372250003Sadrian mark '7.7' 373250003Sadrian sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 374250003Sadrian rm -rf tmpdir 375250003Sadrian mkdir tmpdir 376250003Sadrian $SED -f script1 lines1 377250003Sadrian cat tmpdir/* 378250003Sadrian rm -rf tmpdir 379250003Sadrian mark '7.8' 380250003Sadrian if [ $BSD -eq 1 ] ; then 381250003Sadrian echo BSD sed cannot pass 7.8 382250003Sadrian else 383250003Sadrian echo line1 > lines3 384250003Sadrian echo "" >> lines3 385250003Sadrian $SED -n -e '$p' lines3 /dev/null 386250003Sadrian fi 387250003Sadrian 388250003Sadrian} 389250003Sadrian 390250003Sadriantest_subst() 391250003Sadrian{ 392250003Sadrian echo Testing substitution commands 393250003Sadrian mark '8.1' ; $SED -e 's/./X/g' lines1 394250003Sadrian mark '8.2' ; $SED -e 's,.,X,g' lines1 395250003Sadrian# SunOS sed thinks we are escaping . as wildcard, not as separator 396250003Sadrian mark '8.3' 397250003Sadrian if [ $SUN -eq 1 ] ; then 398250003Sadrian echo SUN sed fails test 8.3 399250003Sadrian else 400250003Sadrian $SED -e 's.\..X.g' lines1 401250003Sadrian fi 402250003Sadrian mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 403250003Sadrian mark '8.5' ; $SED -e 's_\__X_' lines1 404250003Sadrian mark '8.6' ; $SED -e 's/./(&)/g' lines1 405250003Sadrian mark '8.7' ; $SED -e 's/./(\&)/g' lines1 406250003Sadrian mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 407250003Sadrian mark '8.9' ; $SED -e 's/_/u0\ 408250003Sadrianu1\ 409250003Sadrianu2/g' lines1 410250003Sadrian mark '8.10' 411250003Sadrian $SED -e 's/./X/4' lines1 412250003Sadrian rm -f lines4 413250003Sadrian mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 414250003Sadrian echo s wfile results 415250003Sadrian cat lines4 416250003Sadrian mark '8.12' ; $SED -e 's/[123]/X/g' lines1 417250003Sadrian mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 418250003Sadrian mark '8.14' ; 419250003Sadrian $SED -e 'y10\123456789198765432\101' lines1 420250003Sadrian mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 421250003Sadrian mark '8.16' 422250003Sadrian echo 'eeefff' | $SED -e ' 423250003Sadrian p 424250003Sadrian s/e/X/p 425250003Sadrian :x 426250003Sadrian s//Y/p 427250003Sadrian # Establish limit counter in the hold space 428250003Sadrian # GNU sed version 3.02 enters into an infinite loop here 429250003Sadrian x 430250003Sadrian /.\{10\}/ { 431250003Sadrian s/.*/ERROR/ 432250003Sadrian b 433250003Sadrian } 434250003Sadrian s/.*/&./ 435250003Sadrian x 436250003Sadrian /f/bx 437250003Sadrian ' 438250003Sadrian # POSIX does not say that this should work, 439250003Sadrian # but it does for GNU, BSD, and SunOS 440250003Sadrian mark '8.17' ; $SED -e 's/[/]/Q/' lines1 441250003Sadrian} 442250003Sadrian 443250003Sadriantest_error() 444250003Sadrian{ 445250003Sadrian exec 0>&3 4>&1 5>&2 446250003Sadrian exec 0</dev/null 447250003Sadrian exec 2>&1 448250003Sadrian set -x 449250003Sadrian $TEST -x && exit 1 450250003Sadrian $TEST -f && exit 1 451250003Sadrian $TEST -e && exit 1 452250003Sadrian $TEST -f /dev/dds && exit 1 453250003Sadrian $TEST p /dev/dds && exit 1 454250003Sadrian $TEST -f /bin/sh && exit 1 455250003Sadrian $TEST '{' && exit 1 456250003Sadrian $TEST '{' && exit 1 457250003Sadrian $TEST '/hello/' && exit 1 458250003Sadrian $TEST '1,/hello/' && exit 1 459250003Sadrian $TEST -e '-5p' && exit 1 460250003Sadrian $TEST '/jj' && exit 1 461250003Sadrian $TEST 'a hello' && exit 1 462250003Sadrian $TEST 'a \ hello' && exit 1 463250003Sadrian $TEST 'b foo' && exit 1 464250003Sadrian $TEST 'd hello' && exit 1 465250003Sadrian $TEST 's/aa' && exit 1 466250003Sadrian $TEST 's/aa/' && exit 1 467250003Sadrian $TEST 's/a/b' && exit 1 468250003Sadrian $TEST 's/a/b/c/d' && exit 1 469250003Sadrian $TEST 's/a/b/ 1 2' && exit 1 470250003Sadrian $TEST 's/a/b/ 1 g' && exit 1 471250003Sadrian $TEST 's/a/b/w' && exit 1 472278741Sadrian $TEST 'y/aa' && exit 1 473250003Sadrian $TEST 'y/aa/b/' && exit 1 474250003Sadrian $TEST 'y/aa/' && exit 1 475250003Sadrian $TEST 'y/a/b' && exit 1 476250003Sadrian $TEST 'y/a/b/c/d' && exit 1 477250003Sadrian $TEST '!' && exit 1 478250003Sadrian $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius 479250003Sadrian set +x 480250003Sadrian exec 0>&3 1>&4 2>&5 481250003Sadrian} 482250003Sadrian 483250003Sadrianmain 484250003Sadrian