1# regression tests for the POSIX ed utility
2
3KEEP "*.dat"
4
5function DATA
6{
7	typeset f x=0123456789
8	integer i
9	typeset -i8 n
10	for f
11	do	test -f $f && continue
12		case $f in
13		big.dat)for ((i = 0; i <= 10000; i++))
14			do	print $i:$x$x$x$x$x$x$x$x$x$x
15			done
16			;;
17		dem.dat)for ((i = 512; i >= 0; i--))
18			do	print $i
19			done
20			;;
21		med.dat)for ((i = 0; i <= 512; i++))
22			do	print $i
23			done
24			;;
25		esac > $f
26	done
27}
28
29TEST 01 'file args'
30	DO	DATA big.dat
31	EXEC
32		NOTE 'no input file'
33	EXEC file
34		NOTE 'empty input file'
35		INPUT file
36		OUTPUT - 0
37	EXEC big.dat
38		NOTE 'big input file'
39		INPUT - $'v/^10*:/d\n1,$s/:.*//\n,p\nQ'
40		OUTPUT - $'1058997\n1\n10\n100\n1000\n10000'
41	EXEC not_a_file
42		NOTE 'non-existent input file'
43		OUTPUT - '?'
44		EXIT '[12]'
45
46TEST 02 '{ = # a c } commands'
47	EXEC file
48		NOTE '='
49		INPUT - g/./.=
50		INPUT file $'a\nb\nc'
51		OUTPUT - $'6\n1\n2\n3'
52	EXEC file
53		NOTE '# comments'
54		INPUT - $'#n\ng/./.=\n#comment'
55	EXEC file
56		NOTE 'a top'
57		INPUT - $'0a\nz\n.\nw\nq'
58		OUTPUT - $'6\n8'
59		OUTPUT file $'z\na\nb\nc'
60	EXEC file
61		NOTE 'a mid'
62		INPUT - $'2a\nz\n.\nw\nq'
63		OUTPUT file $'a\nb\nz\nc'
64	EXEC file
65		NOTE 'a bot'
66		INPUT - $'$a\nz\n.\nw\nq'
67		OUTPUT file $'a\nb\nc\nz'
68	EXEC file
69		NOTE 'c top'
70		INPUT - $'1c\nz\n.\nw\nq'
71		OUTPUT - $'6\n6'
72		OUTPUT file $'z\nb\nc'
73	EXEC file
74		NOTE 'c mid'
75		INPUT - $'2c\nz\n.\nw\nq'
76		OUTPUT file $'a\nz\nc'
77	EXEC file
78		NOTE 'c bot'
79		INPUT - $'$c\nz\n.\nw\nq'
80		OUTPUT file $'a\nb\nz'
81
82TEST 03 '{ s } commands'
83	EXEC file
84		NOTE 'substitute'
85		INPUT file $'a\nb\nc'
86		INPUT - $'1,$s/./&&/\n1,$s/./&x/\n1,$s/./&y/2\n1,$s/./&z/4\nw\nq'
87		OUTPUT file $'axyaz\nbxybz\ncxycz'
88		OUTPUT - $'6\n18'
89	EXEC file
90		NOTE 'substitute g'
91		INPUT file $'abcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc\nabcabcabc'
92		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'
93		OUTPUT file $'bcbcbc\nacacac\nababab\nXbcXbcXbc\naXcaXcaXc\nabXabXabX\nXXbcXXbcXXbc\naXXcaXXcaXXc\nabXXabXXabXX'
94		OUTPUT - $'90\n90'
95	EXEC file
96		NOTE 'substitute count'
97		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'
98		OUTPUT file $'abcbcabc\nabcacabc\nabcababc\nabcXbcabc\nabcaXcabc\nabcabXabc\nabcXXbcabc\nabcaXXcabc\nabcabXXabc'
99		OUTPUT - $'90\n90'
100	EXEC file
101		NOTE 'substitute null g'
102		INPUT file $'123\naaa'
103		INPUT - $'1,$s/a*/x/g\nw\nq'
104		OUTPUT file $'x1x2x3x\nx'
105		OUTPUT - $'8\n10'
106	EXEC file
107		NOTE 'substitute splice'
108		INPUT file $'123\naaa'
109		INPUT - $'1,$s/a/&\\\nx/\nw\nq'
110		OUTPUT file $'123\na\nxaa'
111		OUTPUT - $'8\n10'
112	EXEC file
113		NOTE 'substitute previous'
114		INPUT file $'123\naaa'
115		INPUT - $'/aa/p\ns//zz/\nw\nq'
116		OUTPUT file $'123\nzza'
117		OUTPUT - $'8\naaa\n8'
118
119TEST 04 'global commands'
120	EXEC file
121		NOTE 'global substitute splice'
122		INPUT file $'yyabcyy\n123yyxx\nfoo\nbaryy\nfooyybar'
123		INPUT - $'g/yy/s//ex/g\nw\nq'
124		OUTPUT file $'exabcex\n123exxx\nfoo\nbarex\nfooexbar'
125		OUTPUT - $'35\n35'
126
127TEST 05 '{ t } commands'
128	DO	DATA med.dat dem.dat
129	EXEC file
130		NOTE 'copy'
131		INPUT file $'1\n2\n3\n4'
132		INPUT - $'-2\n.t.\nw\nq'
133		OUTPUT file $'1\n2\n2\n3\n4'
134		OUTPUT - $'8\n2\n10'
135	EXEC med.dat
136		NOTE 'copy reverse'
137		INPUT - $'g/./.t0\n514,$d\nw file\nq'
138		SAME file dem.dat
139		OUTPUT - $'1942\n1942'
140
141TEST 06 '! command'
142	EXEC -h file
143		NOTE 'no saved command'
144		INPUT file
145		OUTPUT - $'"file" 0 lines, 0 characters'
146		INPUT - $'!!'
147		ERROR - $'ed: no saved shell command'
148		EXIT 1
149	EXEC
150		NOTE 'empty command'
151		INPUT - $'!'
152		ERROR - $'ed: empty shell command'
153	EXEC
154		NOTE 'to stdout'
155		INPUT - $'!echo stdout\n!!'
156		OUTPUT - $'"file" 0 lines, 0 characters\nstdout\n!\necho stdout\nstdout\n!'
157		ERROR -
158		EXIT 0
159	EXEC
160		NOTE 'to stderr'
161		INPUT - $'!echo stderr >&2\n!!'
162		OUTPUT - $'"file" 0 lines, 0 characters\n!\necho stderr >&2\n!'
163		ERROR - $'stderr\nstderr'
164
165TEST 07 'REs'
166	EXEC file
167		NOTE 'remembered RE'
168		INPUT file $'foo 1\nfoo 2\nfoo 3'
169		INPUT - $'/foo\n//\n/'
170		OUTPUT - $'18\nfoo 1\nfoo 2\nfoo 3'
171
172TEST 08 '.'
173	EXEC file
174		NOTE '. before and after'
175		INPUT file $'1\n2\n3'
176		INPUT - $'.=\n1,$s/^/x/\n.=\n1\n1,$s/^/x/\n.=\ng/[12]/s/^/z/\n.=\nQ'
177		OUTPUT - $'6\n3\n3\nx1\n3\n2'
178