# 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'