Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/re/ed.tst
1808 views
# regression tests for the POSIX ed utility

KEEP "*.dat"

function DATA
{
	typeset f x=0123456789
	integer i
	typeset -i8 n
	for f
	do	test -f $f && continue
		case $f in
		big.dat)for ((i = 0; i <= 10000; i++))
			do	print $i:$x$x$x$x$x$x$x$x$x$x
			done
			;;
		dem.dat)for ((i = 512; i >= 0; i--))
			do	print $i
			done
			;;
		med.dat)for ((i = 0; i <= 512; i++))
			do	print $i
			done
			;;
		esac > $f
	done
}

TEST 01 'file args'
	DO	DATA big.dat
	EXEC
		NOTE 'no input file'
	EXEC file
		NOTE 'empty input file'
		INPUT file
		OUTPUT - 0
	EXEC big.dat
		NOTE 'big input file'
		INPUT - $'v/^10*:/d\n1,$s/:.*//\n,p\nQ'
		OUTPUT - $'1058997\n1\n10\n100\n1000\n10000'
	EXEC not_a_file
		NOTE 'non-existent input file'
		OUTPUT - '?'
		EXIT '[12]'

TEST 02 '{ = # a c } commands'
	EXEC file
		NOTE '='
		INPUT - g/./.=
		INPUT file $'a\nb\nc'
		OUTPUT - $'6\n1\n2\n3'
	EXEC file
		NOTE '# comments'
		INPUT - $'#n\ng/./.=\n#comment'
	EXEC file
		NOTE 'a top'
		INPUT - $'0a\nz\n.\nw\nq'
		OUTPUT - $'6\n8'
		OUTPUT file $'z\na\nb\nc'
	EXEC file
		NOTE 'a mid'
		INPUT - $'2a\nz\n.\nw\nq'
		OUTPUT file $'a\nb\nz\nc'
	EXEC file
		NOTE 'a bot'
		INPUT - $'$a\nz\n.\nw\nq'
		OUTPUT file $'a\nb\nc\nz'
	EXEC file
		NOTE 'c top'
		INPUT - $'1c\nz\n.\nw\nq'
		OUTPUT - $'6\n6'
		OUTPUT file $'z\nb\nc'
	EXEC file
		NOTE 'c mid'
		INPUT - $'2c\nz\n.\nw\nq'
		OUTPUT file $'a\nz\nc'
	EXEC file
		NOTE 'c bot'
		INPUT - $'$c\nz\n.\nw\nq'
		OUTPUT file $'a\nb\nz'

TEST 03 '{ s } commands'
	EXEC file
		NOTE 'substitute'
		INPUT file $'a\nb\nc'
		INPUT - $'1,$s/./&&/\n1,$s/./&x/\n1,$s/./&y/2\n1,$s/./&z/4\nw\nq'
		OUTPUT file $'axyaz\nbxybz\ncxycz'
		OUTPUT - $'6\n18'
	EXEC file
		NOTE 'substitute g'
		INPUT file $'abcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc'
		INPUT - $'1s/a//g\n2s/b//g\n3s/c//g\n4s/a/X/g\n5s/b/X/g\n6s/c/X/g\n7s/a/XX/g\n8s/b/XX/g\n9s/c/XX/g\nw\nq'
		OUTPUT file $'bcbcbc\nacacac\nababab\nXbcXbcXbc\naXcaXcaXc\nabXabXabX\nXXbcXXbcXXbc\naXXcaXXcaXXc\nabXXabXXabXX'
		OUTPUT - $'90\n90'
	EXEC file
		NOTE 'substitute count'
		INPUT - $'1s/a//2\n2s/b//2\n3s/c//2\n4s/a/X/2\n5s/b/X/2\n6s/c/X/2\n7s/a/XX/2\n8s/b/XX/2\n9s/c/XX/2\nw\nq'
		OUTPUT file $'abcbcabc\nabcacabc\nabcababc\nabcXbcabc\nabcaXcabc\nabcabXabc\nabcXXbcabc\nabcaXXcabc\nabcabXXabc'
		OUTPUT - $'90\n90'
	EXEC file
		NOTE 'substitute null g'
		INPUT file $'123\naaa'
		INPUT - $'1,$s/a*/x/g\nw\nq'
		OUTPUT file $'x1x2x3x\nx'
		OUTPUT - $'8\n10'
	EXEC file
		NOTE 'substitute splice'
		INPUT file $'123\naaa'
		INPUT - $'1,$s/a/&\\\nx/\nw\nq'
		OUTPUT file $'123\na\nxaa'
		OUTPUT - $'8\n10'
	EXEC file
		NOTE 'substitute previous'
		INPUT file $'123\naaa'
		INPUT - $'/aa/p\ns//zz/\nw\nq'
		OUTPUT file $'123\nzza'
		OUTPUT - $'8\naaa\n8'

TEST 04 'global commands'
	EXEC file
		NOTE 'global substitute splice'
		INPUT file $'yyabcyy\n123yyxx\nfoo\nbaryy\nfooyybar'
		INPUT - $'g/yy/s//ex/g\nw\nq'
		OUTPUT file $'exabcex\n123exxx\nfoo\nbarex\nfooexbar'
		OUTPUT - $'35\n35'

TEST 05 '{ t } commands'
	DO	DATA med.dat dem.dat
	EXEC file
		NOTE 'copy'
		INPUT file $'1\n2\n3\n4'
		INPUT - $'-2\n.t.\nw\nq'
		OUTPUT file $'1\n2\n2\n3\n4'
		OUTPUT - $'8\n2\n10'
	EXEC med.dat
		NOTE 'copy reverse'
		INPUT - $'g/./.t0\n514,$d\nw file\nq'
		SAME file dem.dat
		OUTPUT - $'1942\n1942'

TEST 06 '! command'
	EXEC -h file
		NOTE 'no saved command'
		INPUT file
		OUTPUT - $'"file" 0 lines, 0 characters'
		INPUT - $'!!'
		ERROR - $'ed: no saved shell command'
		EXIT 1
	EXEC
		NOTE 'empty command'
		INPUT - $'!'
		ERROR - $'ed: empty shell command'
	EXEC
		NOTE 'to stdout'
		INPUT - $'!echo stdout\n!!'
		OUTPUT - $'"file" 0 lines, 0 characters\nstdout\n!\necho stdout\nstdout\n!'
		ERROR -
		EXIT 0
	EXEC
		NOTE 'to stderr'
		INPUT - $'!echo stderr >&2\n!!'
		OUTPUT - $'"file" 0 lines, 0 characters\n!\necho stderr >&2\n!'
		ERROR - $'stderr\nstderr'

TEST 07 'REs'
	EXEC file
		NOTE 'remembered RE'
		INPUT file $'foo 1\nfoo 2\nfoo 3'
		INPUT - $'/foo\n//\n/'
		OUTPUT - $'18\nfoo 1\nfoo 2\nfoo 3'

TEST 08 '.'
	EXEC file
		NOTE '. before and after'
		INPUT file $'1\n2\n3'
		INPUT - $'.=\n1,$s/^/x/\n.=\n1\n1,$s/^/x/\n.=\ng/[12]/s/^/z/\n.=\nQ'
		OUTPUT - $'6\n3\n3\nx1\n3\n2'