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