1e6d6c189SCody Peter Mello#!/bin/sh
2e6d6c189SCody Peter Mello
3e6d6c189SCody Peter Melloif [[ -z "$AWK" || -z "$WORKDIR" ]]; then
4e6d6c189SCody Peter Mello    printf '$AWK and $WORKDIR must be set\n' >&2
5e6d6c189SCody Peter Mello    exit 1
6e6d6c189SCody Peter Mellofi
7e6d6c189SCody Peter Mello
8e6d6c189SCody Peter MelloTEMP1=$WORKDIR/test.temp.1
9e6d6c189SCody Peter MelloTEMP2=$WORKDIR/test.temp.2
10e6d6c189SCody Peter Mello
11e6d6c189SCody Peter Melloecho T.expr: tests of miscellaneous expressions
12e6d6c189SCody Peter Mello
13e6d6c189SCody Peter Mello$AWK '
14e6d6c189SCody Peter MelloBEGIN {
15e6d6c189SCody Peter Mello	FS = "\t"
16e6d6c189SCody Peter Mello	awk = ENVIRON["AWK"]
17e6d6c189SCody Peter Mello}
18e6d6c189SCody Peter MelloNF == 0 || $1 ~ /^#/ {
19e6d6c189SCody Peter Mello	next
20e6d6c189SCody Peter Mello}
21e6d6c189SCody Peter Mello$1 ~ /try/ {	# new test
22e6d6c189SCody Peter Mello	nt++
23e6d6c189SCody Peter Mello	sub(/try /, "")
24e6d6c189SCody Peter Mello	prog = $0
25e6d6c189SCody Peter Mello	printf("%3d  %s\n", nt, prog)
26e6d6c189SCody Peter Mello	prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog)
27e6d6c189SCody Peter Mello	# print "prog is", prog
28e6d6c189SCody Peter Mello	nt2 = 0
29e6d6c189SCody Peter Mello	while (getline > 0) {
30e6d6c189SCody Peter Mello		if (NF == 0)	# blank line terminates a sequence
31e6d6c189SCody Peter Mello			break
32e6d6c189SCody Peter Mello		input = $1
33e6d6c189SCody Peter Mello		for (i = 2; i < NF; i++)	# input data
34e6d6c189SCody Peter Mello			input = input "\t" $i
35e6d6c189SCody Peter Mello		test = sprintf("printf %%s\\\\n '"'"'%s'"'"' | %s > '$TEMP1'; ",
36e6d6c189SCody Peter Mello			input, prog)
37e6d6c189SCody Peter Mello		gsub(/\\t/, "\t", $NF)
38e6d6c189SCody Peter Mello		gsub(/\\n/, "\n", $NF)
39e6d6c189SCody Peter Mello		if ($NF == "\"\"")
40e6d6c189SCody Peter Mello			output = "> '$TEMP2';"
41e6d6c189SCody Peter Mello		else
42e6d6c189SCody Peter Mello			output = sprintf("printf %%s\\\\n '"'"'%s'"'"' > '$TEMP2'; ", $NF)
43e6d6c189SCody Peter Mello		run = sprintf("diff '$TEMP1' '$TEMP2'")
44e6d6c189SCody Peter Mello		msg = sprintf("test %d.%d failed", nt, ++nt2);
45e6d6c189SCody Peter Mello		# print  "input is", input
46e6d6c189SCody Peter Mello		# print  "test is", test
47e6d6c189SCody Peter Mello		# print  "output is", output
48e6d6c189SCody Peter Mello		# print  "run is", run
49e6d6c189SCody Peter Mello		tcode = system(test output run)
50e6d6c189SCody Peter Mello		if (tcode > 0) {
51e6d6c189SCody Peter Mello			print msg
52e6d6c189SCody Peter Mello			ecode = tcode
53e6d6c189SCody Peter Mello		}
54e6d6c189SCody Peter Mello	}
55e6d6c189SCody Peter Mello	tt += nt2
56e6d6c189SCody Peter Mello}
57e6d6c189SCody Peter MelloEND {
58e6d6c189SCody Peter Mello	print tt, "tests"
59e6d6c189SCody Peter Mello	exit ecode
60e6d6c189SCody Peter Mello}
61e6d6c189SCody Peter Mello' <<\!!!!
62e6d6c189SCody Peter Mello# General format:
63e6d6c189SCody Peter Mello# try program as rest of line
64e6d6c189SCody Peter Mello# $1	$2	$3	output1  (\t for tab, \n for newline,
65e6d6c189SCody Peter Mello# $1	$2	$3	output2  ("" for null)
66e6d6c189SCody Peter Mello# ... terminated by blank line
67e6d6c189SCody Peter Mello
68e6d6c189SCody Peter Mello# try another program...
69e6d6c189SCody Peter Mello
70e6d6c189SCody Peter Mellotry { print ($1 == 1) ? "yes" : "no" }
71e6d6c189SCody Peter Mello1	yes
72e6d6c189SCody Peter Mello1.0	yes
73e6d6c189SCody Peter Mello1E0	yes
74e6d6c189SCody Peter Mello0.1E1	yes
75e6d6c189SCody Peter Mello10E-1	yes
76e6d6c189SCody Peter Mello01	yes
77e6d6c189SCody Peter Mello10	no
78e6d6c189SCody Peter Mello10E-2	no
79e6d6c189SCody Peter Mello
80e6d6c189SCody Peter Mellotry $1 > 0
81e6d6c189SCody Peter Mello1	1
82e6d6c189SCody Peter Mello2	2
83e6d6c189SCody Peter Mello0	""
84e6d6c189SCody Peter Mello-1	""
85e6d6c189SCody Peter Mello1e0	1e0
86e6d6c189SCody Peter Mello0e1	""
87e6d6c189SCody Peter Mello-2e64	""
88e6d6c189SCody Peter Mello3.1e4	3.1e4
89e6d6c189SCody Peter Mello
90e6d6c189SCody Peter Mellotry { print NF }
91e6d6c189SCody Peter Mello	0
92e6d6c189SCody Peter Mellox	1
93e6d6c189SCody Peter Mellox	y	2
94e6d6c189SCody Peter Mello	y	2
95e6d6c189SCody Peter Mellox		2
96e6d6c189SCody Peter Mello
97e6d6c189SCody Peter Mellotry { print NF, $NF }
98e6d6c189SCody Peter Mello	0
99e6d6c189SCody Peter Mellox	1 x
100e6d6c189SCody Peter Mellox	y	2 y
101e6d6c189SCody Peter Mellox	yy	zzz	3 zzz
102e6d6c189SCody Peter Mello
103e6d6c189SCody Peter Mello# this horror prints $($2+1)
104e6d6c189SCody Peter Mellotry { i=1; print ($++$++i) }
105e6d6c189SCody Peter Mello1	1
106e6d6c189SCody Peter Mello1	2	3	3
107e6d6c189SCody Peter Melloabc	abc
108e6d6c189SCody Peter Mello
109e6d6c189SCody Peter Mello# concatenate $1 and ++$2; print new $1 and concatenated value
110e6d6c189SCody Peter Mellotry { x = $1++++$2; print $1, x }
111e6d6c189SCody Peter Mello1	3	2 14
112e6d6c189SCody Peter Mello
113*3ee4fc2aSCody Peter Mello# do we get the precedence of ! right?
114*3ee4fc2aSCody Peter Mellotry $1 !$2
115*3ee4fc2aSCody Peter Mello0	0	0\t0
116*3ee4fc2aSCody Peter Mello0	1	0\t1
117*3ee4fc2aSCody Peter Mello1	0	1\t0
118*3ee4fc2aSCody Peter Mello1	1	1\t1
119*3ee4fc2aSCody Peter Mello
120*3ee4fc2aSCody Peter Mello# another ava special
121*3ee4fc2aSCody Peter Mellotry { print ($1~/abc/ !$2) }
122*3ee4fc2aSCody Peter Mello0	0	01
123*3ee4fc2aSCody Peter Mello0	1	00
124*3ee4fc2aSCody Peter Melloabc	0	11
125*3ee4fc2aSCody Peter Melloxabcd	1	10
126*3ee4fc2aSCody Peter Mello
127*3ee4fc2aSCody Peter Mellotry { print !$1 + $2 }
128*3ee4fc2aSCody Peter Mello1	3	3
129*3ee4fc2aSCody Peter Mello0	3	4
130*3ee4fc2aSCody Peter Mello-1	3	3
131*3ee4fc2aSCody Peter Mello
132e6d6c189SCody Peter Mello# aside:  !$1 = $2 is now a syntax error
133e6d6c189SCody Peter Mello
134e6d6c189SCody Peter Mello# the definition of "number" changes with isnumber.
135e6d6c189SCody Peter Mello# 2e100 is ok according to strtod.
136e6d6c189SCody Peter Mello# try 1
137e6d6c189SCody Peter Mello
138e6d6c189SCody Peter Mellotry { print ($1 == $2) }
139e6d6c189SCody Peter Mello0	0	1
140e6d6c189SCody Peter Mello0	1	0
141e6d6c189SCody Peter Mello0	00	1
142e6d6c189SCody Peter Mello0	""	0
143e6d6c189SCody Peter Mello+0	-0	1
144e6d6c189SCody Peter Mello1	1.0	1
145e6d6c189SCody Peter Mello1	1e0	1
146e6d6c189SCody Peter Mello2e10	2.00e10	1
147e6d6c189SCody Peter Mello2e10	2e+10	1
148e6d6c189SCody Peter Mello2e-10	2e-10	1
149e6d6c189SCody Peter Mello2e10	2e-10	0
150e6d6c189SCody Peter Mello2e10	20e9	1
151*3ee4fc2aSCody Peter Mello2e100	2.000e100	1
152e6d6c189SCody Peter Mello2e1000	2.0e1000	0
153e6d6c189SCody Peter Mello
154e6d6c189SCody Peter Mello# this one (3 & 4) may "fail" if a negative 0 is printed as -0,
155e6d6c189SCody Peter Mello# but i think this might be a type-coercion problem.
156e6d6c189SCody Peter Mello
157e6d6c189SCody Peter Mellotry { print $1, +$1, -$1, - -$1 }
158e6d6c189SCody Peter Mello1	1 1 -1 1
159e6d6c189SCody Peter Mello-1	-1 -1 1 -1
160*3ee4fc2aSCody Peter Mello0	0 0 0 0
161*3ee4fc2aSCody Peter Mellox	x 0 0 0
162e6d6c189SCody Peter Mello
163e6d6c189SCody Peter Mellotry { printf("a%*sb\n", $1, $2) }
164e6d6c189SCody Peter Mello1	x	axb
165e6d6c189SCody Peter Mello2	x	a xb
166e6d6c189SCody Peter Mello3	x	a  xb
167e6d6c189SCody Peter Mello
168e6d6c189SCody Peter Mellotry { printf("a%-*sb\n", $1, $2) }
169e6d6c189SCody Peter Mello1	x	axb
170e6d6c189SCody Peter Mello2	x	ax b
171e6d6c189SCody Peter Mello3	x	ax  b
172e6d6c189SCody Peter Mello
173e6d6c189SCody Peter Mellotry { printf("a%*.*sb\n", $1, $2, "hello") }
174e6d6c189SCody Peter Mello1	1	ahb
175e6d6c189SCody Peter Mello2	1	a hb
176e6d6c189SCody Peter Mello3	1	a  hb
177e6d6c189SCody Peter Mello
178e6d6c189SCody Peter Mellotry { printf("a%-*.*sb\n", $1, $2, "hello") }
179e6d6c189SCody Peter Mello1	1	ahb
180e6d6c189SCody Peter Mello2	1	ah b
181e6d6c189SCody Peter Mello3	1	ah  b
182e6d6c189SCody Peter Mello
183e6d6c189SCody Peter Mellotry { printf("%d %ld\n", $1, $1) }
184e6d6c189SCody Peter Mello1	1 1
185e6d6c189SCody Peter Mello10	10 10
186e6d6c189SCody Peter Mello10000	10000 10000
187e6d6c189SCody Peter Mello
188e6d6c189SCody Peter Mellotry { printf("%x %lx\n", $1, $1) }
189e6d6c189SCody Peter Mello1	1 1
190e6d6c189SCody Peter Mello10	a a
191e6d6c189SCody Peter Mello10000	2710 2710
192e6d6c189SCody Peter Mello
193e6d6c189SCody Peter Mellotry { if ($1 ~ $2) print 1; else print 0 }
194e6d6c189SCody Peter Melloa	\141	1
195e6d6c189SCody Peter Melloa	\142	0
196*3ee4fc2aSCody Peter Melloa	\x61	1
197e6d6c189SCody Peter Melloa	\x061	0
198e6d6c189SCody Peter Melloa	\x62	0
199e6d6c189SCody Peter Mello0	\060	1
200e6d6c189SCody Peter Mello0	\60	1
201e6d6c189SCody Peter Mello0	\0060	0
202*3ee4fc2aSCody Peter MelloZ	\x5a	1
203*3ee4fc2aSCody Peter MelloZ	\x5A	1
204e6d6c189SCody Peter Mello
205e6d6c189SCody Peter Mellotry { print $1 ~ $2 }
206e6d6c189SCody Peter Melloa	\141	1
207e6d6c189SCody Peter Melloa	\142	0
208*3ee4fc2aSCody Peter Melloa	\x61	1
209e6d6c189SCody Peter Melloa	\x061	0
210e6d6c189SCody Peter Melloa	\x62	0
211e6d6c189SCody Peter Mello0	\060	1
212e6d6c189SCody Peter Mello0	\60	1
213e6d6c189SCody Peter Mello0	\0060	0
214*3ee4fc2aSCody Peter MelloZ	\x5a	1
215*3ee4fc2aSCody Peter MelloZ	\x5A	1
216e6d6c189SCody Peter Mello
217e6d6c189SCody Peter Mellotry { print $1 || $2 }
218e6d6c189SCody Peter Mello		0
219e6d6c189SCody Peter Mello1		1
220e6d6c189SCody Peter Mello0	0	0
221e6d6c189SCody Peter Mello1	0	1
222e6d6c189SCody Peter Mello0	1	1
223e6d6c189SCody Peter Mello1	1	1
224e6d6c189SCody Peter Melloa	b	1
225e6d6c189SCody Peter Mello
226e6d6c189SCody Peter Mellotry { print $1 && $2 }
227e6d6c189SCody Peter Mello		0
228e6d6c189SCody Peter Mello1		0
229e6d6c189SCody Peter Mello0	0	0
230e6d6c189SCody Peter Mello1	0	0
231e6d6c189SCody Peter Mello0	1	0
232e6d6c189SCody Peter Mello1	1	1
233e6d6c189SCody Peter Melloa	b	1
234e6d6c189SCody Peter Mello
235e6d6c189SCody Peter Mellotry { $1 = $2; $1 = $1; print $1 }
236e6d6c189SCody Peter Melloabc	def	def
237e6d6c189SCody Peter Melloabc	def	ghi	def
238e6d6c189SCody Peter Mello
239e6d6c189SCody Peter Mello# $f++ => ($f)++
240e6d6c189SCody Peter Mellotry { f = 1; $f++; print f, $f }
241e6d6c189SCody Peter Mello11	22	33	1 12
242e6d6c189SCody Peter Mello
243e6d6c189SCody Peter Mello# $f[1]++ => ($f[1])++
244e6d6c189SCody Peter Mellotry { f[1]=1; f[2]=2; print $f[1], $f[1]++, $f[2], f[1], f[2] }
245e6d6c189SCody Peter Mello111	222	333	111 111 222 2 2
246e6d6c189SCody Peter Mello
247e6d6c189SCody Peter Mello
248e6d6c189SCody Peter Mello!!!!
249