multi_test.sh revision 117900
1247835Skib#!/bin/sh - 2247835Skib# 3247835Skib# Copyright (c) 1992 Diomidis Spinellis. 4247835Skib# Copyright (c) 1992, 1993 5247835Skib# The Regents of the University of California. All rights reserved. 6247835Skib# 7247835Skib# Redistribution and use in source and binary forms, with or without 8247835Skib# modification, are permitted provided that the following conditions 9247835Skib# are met: 10247835Skib# 1. Redistributions of source code must retain the above copyright 11247835Skib# notice, this list of conditions and the following disclaimer. 12247835Skib# 2. Redistributions in binary form must reproduce the above copyright 13247835Skib# notice, this list of conditions and the following disclaimer in the 14247835Skib# documentation and/or other materials provided with the distribution. 15247835Skib# 3. All advertising materials mentioning features or use of this software 16247835Skib# must display the following acknowledgement: 17247835Skib# This product includes software developed by the University of 18247835Skib# California, Berkeley and its contributors. 19247835Skib# 4. Neither the name of the University nor the names of its contributors 20247835Skib# may be used to endorse or promote products derived from this software 21247835Skib# without specific prior written permission. 22247835Skib# 23247835Skib# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24247835Skib# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25247835Skib# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26247835Skib# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27247835Skib# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28247835Skib# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29247835Skib# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30247835Skib# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31247835Skib# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32247835Skib# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33247835Skib# SUCH DAMAGE. 34247835Skib# 35247835Skib# @(#)sed.test 8.1 (Berkeley) 6/6/93 36247835Skib# 37247835Skib# $FreeBSD: head/tools/regression/usr.bin/sed/multitest.t 117900 2003-07-22 19:22:08Z dds $ 38247835Skib# 39247835Skib 40247835Skib# sed Regression Tests 41247835Skib# 42247835Skib# The following files are created: 43247835Skib# lines[1-4], script1, script2 44247835Skib# Two directories *.out contain the test results 45247835Skib 46247835Skibmain() 47247835Skib{ 48247835Skib BASE=/usr/bin/sed 49247835Skib BASELOG=sed.out 50247835Skib TEST=`cd ..; make whereobj`/sed 51247835Skib TESTLOG=nsed.out 52247835Skib DICT=/usr/share/dict/words 53247835Skib 54247835Skib test_error | more 55247835Skib 56247835Skib awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1 57247835Skib awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2 58247835Skib 59247835Skib exec 4>&1 5>&2 60247835Skib 61247835Skib # Set these flags to get messages about known problems 62247835Skib BSD=1 63247835Skib GNU=0 64247835Skib SUN=0 65247835Skib tests $BASE $BASELOG 66247835Skib 67247835Skib BSD=0 68247835Skib GNU=0 69247835Skib SUN=0 70247835Skib tests $TEST $TESTLOG 71247835Skib exec 1>&4 2>&5 72247835Skib diff -c $BASELOG $TESTLOG | more 73247835Skib} 74247835Skib 75247835Skibtests() 76247835Skib{ 77247835Skib SED=$1 78247835Skib DIR=$2 79247835Skib rm -rf $DIR 80247835Skib mkdir $DIR 81247835Skib MARK=100 82247835Skib 83247835Skib test_args 84247835Skib test_addr 85247835Skib echo Testing commands 86247835Skib test_group 87247835Skib test_acid 88247835Skib test_branch 89247835Skib test_pattern 90247835Skib test_print 91247835Skib test_subst 92247835Skib} 93247835Skib 94247835Skibmark() 95247835Skib{ 96247835Skib MARK=`expr $MARK + 1` 97247835Skib exec 1>&4 2>&5 98247835Skib exec >"$DIR/${MARK}_$1" 99247835Skib echo "Test $1:$MARK" 100247835Skib # Uncomment this line to match tests with sed error messages 101247835Skib echo "Test $1:$MARK" >&5 102247835Skib} 103247835Skib 104247835Skibtest_args() 105247835Skib{ 106247835Skib mark '1.1' 107247835Skib echo Testing argument parsing 108247835Skib echo First type 109247835Skib if [ $SUN -eq 1 ] ; then 110247835Skib echo SunOS sed prints only with -n 111247835Skib else 112247835Skib $SED 's/^/e1_/p' lines1 113247835Skib fi 114247835Skib mark '1.2' ; $SED -n 's/^/e1_/p' lines1 115247835Skib mark '1.3' 116247835Skib if [ $SUN -eq 1 ] ; then 117247835Skib echo SunOS sed prints only with -n 118247835Skib else 119247835Skib $SED 's/^/e1_/p' <lines1 120247835Skib fi 121247835Skib mark '1.4' ; $SED -n 's/^/e1_/p' <lines1 122247835Skib echo Second type 123247835Skib mark '1.4.1' 124247835Skib if [ $SUN -eq 1 ] ; then 125247835Skib echo SunOS sed fails this 126247835Skib fi 127247835Skib $SED -e '' <lines1 128247835Skib echo 's/^/s1_/p' >script1 129247835Skib echo 's/^/s2_/p' >script2 130247835Skib mark '1.5' 131247835Skib if [ $SUN -eq 1 ] ; then 132247835Skib echo SunOS sed prints only with -n 133247835Skib else 134247835Skib $SED -f script1 lines1 135247835Skib fi 136247835Skib mark '1.6' 137247835Skib if [ $SUN -eq 1 ] ; then 138247835Skib echo SunOS sed prints only with -n 139247835Skib else 140247835Skib $SED -f script1 <lines1 141247835Skib fi 142247835Skib mark '1.7' 143247835Skib if [ $SUN -eq 1 ] ; then 144247835Skib echo SunOS sed prints only with -n 145247835Skib else 146247835Skib $SED -e 's/^/e1_/p' lines1 147247835Skib fi 148247835Skib mark '1.8' 149247835Skib if [ $SUN -eq 1 ] ; then 150247835Skib echo SunOS sed prints only with -n 151247835Skib else 152247835Skib $SED -e 's/^/e1_/p' <lines1 153247835Skib fi 154247835Skib mark '1.9' ; $SED -n -f script1 lines1 155247835Skib mark '1.10' ; $SED -n -f script1 <lines1 156247835Skib mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1 157247835Skib mark '1.12' 158247835Skib if [ $SUN -eq 1 ] ; then 159247835Skib echo SunOS sed prints only with -n 160247835Skib else 161247835Skib $SED -n -e 's/^/e1_/p' <lines1 162247835Skib fi 163247835Skib mark '1.13' 164247835Skib if [ $SUN -eq 1 ] ; then 165247835Skib echo SunOS sed prints only with -n 166247835Skib else 167247835Skib $SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1 168247835Skib fi 169247835Skib mark '1.14' 170247835Skib if [ $SUN -eq 1 ] ; then 171247835Skib echo SunOS sed prints only with -n 172247835Skib else 173247835Skib $SED -f script1 -f script2 lines1 174247835Skib fi 175247835Skib mark '1.15' 176247835Skib if [ $GNU -eq 1 -o $SUN -eq 1 ] ; then 177247835Skib echo GNU and SunOS sed fail this following older POSIX draft 178247835Skib else 179247835Skib $SED -e 's/^/e1_/p' -f script1 lines1 180247835Skib fi 181247835Skib mark '1.16' 182247835Skib if [ $SUN -eq 1 ] ; then 183247835Skib echo SunOS sed prints only with -n 184247835Skib else 185247835Skib $SED -e 's/^/e1_/p' lines1 lines1 186247835Skib fi 187247835Skib # POSIX D11.2:11251 188247835Skib mark '1.17' ; $SED p <lines1 lines1 189247835Skibcat >script1 <<EOF 190247835Skib#n 191247835Skib# A comment 192247835Skib 193247835Skibp 194247835SkibEOF 195247835Skib mark '1.18' ; $SED -f script1 <lines1 lines1 196247835Skib} 197247835Skib 198247835Skibtest_addr() 199247835Skib{ 200247835Skib echo Testing address ranges 201247835Skib mark '2.1' ; $SED -n -e '4p' lines1 202247835Skib mark '2.2' ; $SED -n -e '20p' lines1 lines2 203247835Skib mark '2.3' ; $SED -n -e '$p' lines1 204247835Skib mark '2.4' ; $SED -n -e '$p' lines1 lines2 205247835Skib mark '2.5' ; $SED -n -e '$a\ 206247835Skibhello' /dev/null 207247835Skib mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2 208247835Skib # Should not print anything 209247835Skib mark '2.7' ; $SED -n -e '20p' lines1 210247835Skib mark '2.8' ; $SED -n -e '0p' lines1 211247835Skib mark '2.9' ; $SED -n '/l1_7/p' lines1 212247835Skib mark '2.10' ; $SED -n ' /l1_7/ p' lines1 213247835Skib mark '2.11' 214247835Skib if [ $BSD -eq 1 ] ; then 215247835Skib echo BSD sed fails this test 216247835Skib fi 217247835Skib if [ $GNU -eq 1 ] ; then 218247835Skib echo GNU sed fails this 219247835Skib fi 220247835Skib $SED -n '\_l1\_7_p' lines1 221247835Skib mark '2.12' ; $SED -n '1,4p' lines1 222247835Skib mark '2.13' ; $SED -n '1,$p' lines1 lines2 223247835Skib mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2 224247835Skib mark '2.15' ; $SED -n '/4/,$p' lines1 lines2 225247835Skib mark '2.16' ; $SED -n '/4/,20p' lines1 lines2 226247835Skib mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2 227247835Skib mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2 228247835Skib mark '2.19' 229247835Skib if [ $GNU -eq 1 ] ; then 230247835Skib echo GNU sed fails this 231247835Skib fi 232247835Skib $SED -n '12,3p' lines1 lines2 233247835Skib mark '2.20' 234247835Skib if [ $GNU -eq 1 ] ; then 235247835Skib echo GNU sed fails this 236247835Skib fi 237247835Skib $SED -n '/l1_7/,3p' lines1 lines2 238247835Skib} 239247835Skib 240247835Skibtest_group() 241247835Skib{ 242247835Skib echo Brace and other grouping 243247835Skib mark '3.1' ; $SED -e ' 244247835Skib4,12 { 245247835Skib s/^/^/ 246247835Skib s/$/$/ 247247835Skib s/_/T/ 248247835Skib}' lines1 249247835Skib mark '3.2' ; $SED -e ' 250247835Skib4,12 { 251247835Skib s/^/^/ 252247835Skib /6/,/10/ { 253247835Skib s/$/$/ 254247835Skib /8/ s/_/T/ 255247835Skib } 256247835Skib}' lines1 257247835Skib mark '3.3' ; $SED -e ' 258247835Skib4,12 !{ 259247835Skib s/^/^/ 260247835Skib /6/,/10/ !{ 261247835Skib s/$/$/ 262247835Skib /8/ !s/_/T/ 263247835Skib } 264247835Skib}' lines1 265247835Skib mark '3.4' ; $SED -e '4,12!s/^/^/' lines1 266247835Skib} 267247835Skib 268247835Skibtest_acid() 269247835Skib{ 270247835Skib echo Testing a c d and i commands 271247835Skib mark '4.1' ; $SED -n -e ' 272247835Skibs/^/before_i/p 273247835Skib20i\ 274247835Skibinserted 275247835Skibs/^/after_i/p 276247835Skib' lines1 lines2 277247835Skib mark '4.2' ; $SED -n -e ' 278247835Skib5,12s/^/5-12/ 279247835Skibs/^/before_a/p 280247835Skib/5-12/a\ 281247835Skibappended 282247835Skibs/^/after_a/p 283247835Skib' lines1 lines2 284247835Skib mark '4.3' 285247835Skib if [ $GNU -eq 1 ] ; then 286247835Skib echo GNU sed fails this 287247835Skib fi 288247835Skib $SED -n -e ' 289247835Skibs/^/^/p 290247835Skib/l1_/a\ 291247835Skibappended 292247835Skib8,10N 293247835Skibs/$/$/p 294247835Skib' lines1 lines2 295247835Skib mark '4.4' ; $SED -n -e ' 296247835Skibc\ 297247835Skibhello 298247835Skib' lines1 299247835Skib mark '4.5' ; $SED -n -e ' 300247835Skib8c\ 301247835Skibhello 302247835Skib' lines1 303247835Skib mark '4.6' ; $SED -n -e ' 304247835Skib3,14c\ 305247835Skibhello 306247835Skib' lines1 307247835Skib# SunOS and GNU sed behave differently. We follow POSIX 308247835Skib# mark '4.7' ; $SED -n -e ' 309247835Skib#8,3c\ 310247835Skib#hello 311247835Skib#' lines1 312247835Skib mark '4.8' ; $SED d <lines1 313247835Skib} 314247835Skib 315247835Skibtest_branch() 316247835Skib{ 317247835Skib echo Testing labels and branching 318247835Skib mark '5.1' ; $SED -n -e ' 319247835Skibb label4 320247835Skib:label3 321247835Skibs/^/label3_/p 322247835Skibb end 323247835Skib:label4 324247835Skib2,12b label1 325247835Skibb label2 326247835Skib:label1 327247835Skibs/^/label1_/p 328247835Skibb 329247835Skib:label2 330247835Skibs/^/label2_/p 331247835Skibb label3 332247835Skib:end 333247835Skib' lines1 334247835Skib mark '5.2' 335247835Skib if [ $BSD -eq 1 ] ; then 336247835Skib echo BSD sed fails this test 337247835Skib fi 338247835Skib $SED -n -e ' 339247835Skibs/l1_/l2_/ 340247835Skibt ok 341247835Skibb 342247835Skib:ok 343247835Skibs/^/tested /p 344247835Skib' lines1 lines2 345247835Skib# SunOS sed behaves differently here. Clarification needed. 346247835Skib# mark '5.3' ; $SED -n -e ' 347247835Skib#5,8b inside 348247835Skib#1,5 { 349247835Skib# s/^/^/p 350247835Skib# :inside 351247835Skib# s/$/$/p 352247835Skib#} 353247835Skib#' lines1 354247835Skib# Check that t clears the substitution done flag 355247835Skib mark '5.4' ; $SED -n -e ' 356247835Skib1,8s/^/^/ 357247835Skibt l1 358247835Skib:l1 359247835Skibt l2 360247835Skibs/$/$/p 361247835Skibb 362247835Skib:l2 363247835Skibs/^/ERROR/ 364247835Skib' lines1 365247835Skib# Check that reading a line clears the substitution done flag 366247835Skib mark '5.5' 367247835Skib if [ $BSD -eq 1 ] ; then 368247835Skib echo BSD sed fails this test 369247835Skib fi 370247835Skib $SED -n -e ' 371247835Skibt l2 372247835Skib1,8s/^/^/p 373247835Skib2,7N 374247835Skibb 375247835Skib:l2 376247835Skibs/^/ERROR/p 377247835Skib' lines1 378247835Skib mark '5.6' ; $SED 5q lines1 379247835Skib mark '5.7' ; $SED -e ' 380247835Skib5i\ 381247835Skibhello 382247835Skib5q' lines1 383247835Skib# Branch across block boundary 384247835Skib mark '5.8' ; $SED -e ' 385247835Skib{ 386247835Skib:b 387247835Skib} 388247835Skibs/l/m/ 389247835Skibtb' lines1 390247835Skib} 391247835Skib 392247835Skibtest_pattern() 393247835Skib{ 394247835Skibecho Pattern space commands 395247835Skib# Check that the pattern space is deleted 396247835Skib mark '6.1' ; $SED -n -e ' 397247835Skibc\ 398247835Skibchanged 399247835Skibp 400247835Skib' lines1 401247835Skib mark '6.2' ; $SED -n -e ' 402247835Skib4d 403247835Skibp 404247835Skib' lines1 405247835Skib# SunOS sed refused to print here 406247835Skib# mark '6.3' ; $SED -e ' 407247835Skib#N 408247835Skib#N 409247835Skib#N 410247835Skib#D 411247835Skib#P 412247835Skib#4p 413247835Skib#' lines1 414247835Skib mark '6.4' ; $SED -e ' 415247835Skib2h 416247835Skib3H 417247835Skib4g 418247835Skib5G 419247835Skib6x 420247835Skib6p 421247835Skib6x 422247835Skib6p 423247835Skib' lines1 424247835Skib mark '6.5' ; $SED -e '4n' lines1 425247835Skib mark '6.6' ; $SED -n -e '4n' lines1 426247835Skib} 427247835Skib 428247835Skibtest_print() 429247835Skib{ 430247835Skib echo Testing print and file routines 431247835Skib awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ 432247835Skib </dev/null >lines3 433247835Skib # GNU and SunOS sed behave differently here 434247835Skib mark '7.1' 435247835Skib $SED -n l lines3 436247835Skib mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 437247835Skib rm -f lines4 438247835Skib mark '7.3' ; $SED -e '3,12w lines4' lines1 439247835Skib echo w results 440247835Skib cat lines4 441247835Skib mark '7.4' ; $SED -e '4r lines2' lines1 442247835Skib mark '7.5' ; $SED -e '5r /dev/dds' lines1 443247835Skib mark '7.6' ; $SED -e '6r /dev/null' lines1 444247835Skib mark '7.7' 445247835Skib if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 446247835Skib echo BSD, GNU and SunOS cannot pass this one 447247835Skib else 448247835Skib sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 449247835Skib rm -rf tmpdir 450247835Skib mkdir tmpdir 451247835Skib $SED -f script1 lines1 452247835Skib cat tmpdir/* 453247835Skib rm -rf tmpdir 454247835Skib fi 455247835Skib mark '7.8' 456247835Skib if [ $BSD -eq 1 ] ; then 457247835Skib echo BSD sed cannot pass 7.7 458247835Skib else 459247835Skib echo line1 > lines3 460247835Skib echo "" >> lines3 461247835Skib $SED -n -e '$p' lines3 /dev/null 462247835Skib fi 463247835Skib 464247835Skib} 465247835Skib 466247835Skibtest_subst() 467247835Skib{ 468247835Skib echo Testing substitution commands 469247835Skib mark '8.1' ; $SED -e 's/./X/g' lines1 470247835Skib mark '8.2' ; $SED -e 's,.,X,g' lines1 471247835Skib# GNU and SunOS sed thinks we are escaping . as wildcard, not as separator 472247835Skib# mark '8.3' ; $SED -e 's.\..X.g' lines1 473247835Skib# POSIX does not say that this should work 474247835Skib# mark '8.4' ; $SED -e 's/[/]/Q/' lines1 475247835Skib mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 476247835Skib mark '8.5' ; $SED -e 's_\__X_' lines1 477247835Skib mark '8.6' ; $SED -e 's/./(&)/g' lines1 478247835Skib mark '8.7' ; $SED -e 's/./(\&)/g' lines1 479247835Skib mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 480247835Skib mark '8.9' ; $SED -e 's/_/u0\ 481247835Skibu1\ 482247835Skibu2/g' lines1 483247835Skib mark '8.10' 484247835Skib if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then 485247835Skib echo 'BSD/GNU sed do not understand digit flags on s commands' 486247835Skib fi 487247835Skib $SED -e 's/./X/4' lines1 488247835Skib rm -f lines4 489247835Skib mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 490247835Skib echo s wfile results 491247835Skib cat lines4 492247835Skib mark '8.12' ; $SED -e 's/[123]/X/g' lines1 493247835Skib mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 494247835Skib mark '8.14' ; 495247835Skib if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 496247835Skib echo BSD/GNU/SUN sed fail this test 497247835Skib else 498247835Skib $SED -e 'y10\123456789198765432\101' lines1 499247835Skib fi 500247835Skib mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 501247835Skib mark '8.16' 502247835Skib echo 'eeefff' | $SED -e ' 503247835Skib p 504247835Skib s/e/X/p 505247835Skib :x 506247835Skib s//Y/p 507247835Skib # Establish limit counter in the hold space 508247835Skib # GNU sed version 3.02 enters into an infinite loop here 509247835Skib x 510247835Skib /.\{10\}/ { 511247835Skib s/.*/ERROR/ 512247835Skib b 513247835Skib } 514247835Skib s/.*/&./ 515247835Skib x 516247835Skib /f/bx 517247835Skib ' 518247835Skib} 519247835Skib 520247835Skibtest_error() 521247835Skib{ 522247835Skib exec 0>&3 4>&1 5>&2 523247835Skib exec 0</dev/null 524247835Skib exec 2>&1 525247835Skib set -x 526247835Skib $TEST -x && exit 1 527247835Skib $TEST -f && exit 1 528247835Skib $TEST -e && exit 1 529247835Skib $TEST -f /dev/dds && exit 1 530247835Skib $TEST p /dev/dds && exit 1 531247835Skib $TEST -f /bin/sh && exit 1 532247835Skib $TEST '{' && exit 1 533247835Skib $TEST '{' && exit 1 534247835Skib $TEST '/hello/' && exit 1 535247835Skib $TEST '1,/hello/' && exit 1 536247835Skib $TEST -e '-5p' && exit 1 537247835Skib $TEST '/jj' && exit 1 538247835Skib $TEST 'a hello' && exit 1 539247835Skib $TEST 'a \ hello' && exit 1 540247835Skib $TEST 'b foo' && exit 1 541247835Skib $TEST 'd hello' && exit 1 542247835Skib $TEST 's/aa' && exit 1 543247835Skib $TEST 's/aa/' && exit 1 544247835Skib $TEST 's/a/b' && exit 1 545247835Skib $TEST 's/a/b/c/d' && exit 1 546247835Skib $TEST 's/a/b/ 1 2' && exit 1 547247835Skib $TEST 's/a/b/ 1 g' && exit 1 548247835Skib $TEST 's/a/b/w' && exit 1 549247835Skib $TEST 'y/aa' && exit 1 550247835Skib $TEST 'y/aa/b/' && exit 1 551247835Skib $TEST 'y/aa/' && exit 1 552247835Skib $TEST 'y/a/b' && exit 1 553247835Skib $TEST 'y/a/b/c/d' && exit 1 554247835Skib $TEST '!' && exit 1 555247835Skib $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius 556247835Skib set +x 557247835Skib exec 0>&3 1>&4 2>&5 558247835Skib} 559247835Skib 560247835Skibmain 561247835Skib