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