|
|
#!/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
|
|
|
|
|
|
|
|
|
!!!!
|