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