#!/bin/sh

echo T.expr: tests of miscellaneous expressions

awk=${awk-../a.out}

$awk '
BEGIN {
	FS = "\t"
	awk = "../a.out"
}
NF == 0 || $1 ~ /^#/ {
	next
}
$1 ~ /try/ {	# new test
	nt++
	sub(/try /, "")
	prog = $0
	printf("%3d  %s\n", nt, prog)
	prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog)
	# print "prog is", prog
	nt2 = 0
	while (getline > 0) {
		if (NF == 0)	# blank line terminates a sequence
			break
		input = $1
		for (i = 2; i < NF; i++)	# input data
			input = input "\t" $i
		test = sprintf("./echo '"'"'%s'"'"' | %s >foo1; ",
			input, prog)
		if ($NF == "\"\"")
			output = ">foo2;"
		else
			output = sprintf("./echo '"'"'%s'"'"' >foo2; ", $NF)
		gsub(/\\t/, "\t", output)
		gsub(/\\n/, "\n", output)
		run = sprintf("cmp foo1 foo2 || echo test %d.%d failed",
			nt, ++nt2)
		# print  "input is", input
		# print  "test is", test
		# print  "output is", output
		# print  "run is", run
		system(test output run)
	}
	tt += nt2
}
END { print tt, "tests" }
' <<\!!!!
# General format:
# try program as rest of line
# $1	$2	$3	output1  (\t for tab, \n for newline,
# $1	$2	$3	output2  ("" for null)
# ... terminated by blank line

# try another program...

try { print ($1 == 1) ? "yes" : "no" }
1	yes
1.0	yes
1E0	yes
0.1E1	yes
10E-1	yes
01	yes
10	no
10E-2	no

try $1 > 0
1	1
2	2
0	""
-1	""
1e0	1e0
0e1	""
-2e64	""
3.1e4	3.1e4

try { print NF }
	0
x	1
x	y	2
	y	2
x		2

try { print NF, $NF }
	0 
x	1 x
x	y	2 y
x	yy	zzz	3 zzz

# this horror prints $($2+1)
try { i=1; print ($++$++i) }
1	1
1	2	3	3
abc	abc

# concatenate $1 and ++$2; print new $1 and concatenated value
try { x = $1++++$2; print $1, x }
1	3	2 14

# do we get the precedence of ! right?
try $1 !$2
0	0	0\t0
0	1	0\t1
1	0	1\t0
1	1	1\t1

# another ava special
try { print ($1~/abc/ !$2) }
0	0	01
0	1	00
abc	0	11
xabcd	1	10

try { print !$1 + $2 }
1	3	3
0	3	4
-1	3	3

# aside:  !$1 = $2 is now a syntax error

# the definition of "number" changes with isnumber.
# 2e100 is ok according to strtod.
# try 1 

try { print ($1 == $2) }
0	0	1
0	1	0
0	00	1
0	""	0
+0	-0	1
1	1.0	1
1	1e0	1
2e10	2.00e10	1
2e10	2e+10	1
2e-10	2e-10	1
2e10	2e-10	0
2e10	20e9	1
2e100	2.000e100	1
2e1000	2.0e1000	0

# this one (3 & 4) may "fail" if a negative 0 is printed as -0,
# but i think this might be a type-coercion problem.

try { print $1, +$1, -$1, - -$1 }
1	1 1 -1 1
-1	-1 -1 1 -1
0	0 0 0 0
x	x 0 0 0

try { printf("a%*sb\n", $1, $2) }
1	x	axb
2	x	a xb
3	x	a  xb

try { printf("a%-*sb\n", $1, $2) }
1	x	axb
2	x	ax b
3	x	ax  b

try { printf("a%*.*sb\n", $1, $2, "hello") }
1	1	ahb
2	1	a hb
3	1	a  hb

try { printf("a%-*.*sb\n", $1, $2, "hello") }
1	1	ahb
2	1	ah b
3	1	ah  b

try { printf("%d %ld %lld %zd %jd %hd %hhd\n", $1, $1, $1, $1, $1, $1, $1) }
1	1 1 1 1 1 1 1
10	10 10 10 10 10 10 10
10000	10000 10000 10000 10000 10000 10000 10000

try { printf("%x %lx %llx %zx %jx %hx %hhx\n", $1, $1, $1, $1, $1, $1, $1) }
1	1 1 1 1 1 1 1
10	a a a a a a a
10000	2710 2710 2710 2710 2710 2710 2710

try { if ($1 ~ $2) print 1; else print 0 }
a	\141	1
a	\142	0
a	\x61	1
a	\x061	0
a	\x62	0
0	\060	1
0	\60	1
0	\0060	0
Z	\x5a	1
Z	\x5A	1

try { print $1 ~ $2 }
a	\141	1
a	\142	0
a	\x61	1
a	\x061	0
a	\x62	0
0	\060	1
0	\60	1
0	\0060	0
Z	\x5a	1
Z	\x5A	1

try { print $1 || $2 }
		0
1		1
0	0	0
1	0	1
0	1	1
1	1	1
a	b	1

try { print $1 && $2 }
		0
1		0
0	0	0
1	0	0
0	1	0
1	1	1
a	b	1

try { $1 = $2; $1 = $1; print $1 }
abc	def	def
abc	def	ghi	def

# $f++ => ($f)++
try { f = 1; $f++; print f, $f }
11	22	33	1 12

# $f[1]++ => ($f[1])++
try { f[1]=1; f[2]=2; print $f[1], $f[1]++, $f[2], f[1], f[2] }
111	222	333	111 111 222 2 2


!!!!
