[25] | 1 | # This file contains a collection of tests for the procedures in the |
---|
| 2 | # file tclCompExpr.c. Sourcing this file into Tcl runs the tests and |
---|
| 3 | # generates output for errors. No output means no errors were found. |
---|
| 4 | # |
---|
| 5 | # Copyright (c) 1997 Sun Microsystems, Inc. |
---|
| 6 | # Copyright (c) 1998-1999 by Scriptics Corporation. |
---|
| 7 | # |
---|
| 8 | # See the file "license.terms" for information on usage and redistribution |
---|
| 9 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
| 10 | # |
---|
| 11 | # RCS: @(#) $Id: compExpr.test,v 1.17 2008/01/16 21:54:33 dgp Exp $ |
---|
| 12 | |
---|
| 13 | if {[lsearch [namespace children] ::tcltest] == -1} { |
---|
| 14 | package require tcltest |
---|
| 15 | namespace import -force ::tcltest::* |
---|
| 16 | } |
---|
| 17 | |
---|
| 18 | if {[catch {expr T1()} msg] && $msg eq {invalid command name "tcl::mathfunc::T1"}} { |
---|
| 19 | testConstraint testmathfunctions 0 |
---|
| 20 | } else { |
---|
| 21 | testConstraint testmathfunctions 1 |
---|
| 22 | } |
---|
| 23 | |
---|
| 24 | # Constrain memory leak tests |
---|
| 25 | testConstraint memory [llength [info commands memory]] |
---|
| 26 | |
---|
| 27 | catch {unset a} |
---|
| 28 | |
---|
| 29 | test compExpr-1.1 {TclCompileExpr procedure, successful expr parse and compile} { |
---|
| 30 | expr 1+2 |
---|
| 31 | } 3 |
---|
| 32 | test compExpr-1.2 {TclCompileExpr procedure, error parsing expr} -body { |
---|
| 33 | expr 1+2+ |
---|
| 34 | } -returnCodes error -match glob -result * |
---|
| 35 | test compExpr-1.3 {TclCompileExpr procedure, error compiling expr} -body { |
---|
| 36 | list [catch {expr "foo(123)"} msg] $msg |
---|
| 37 | } -match glob -result {1 {* "*foo"}} |
---|
| 38 | |
---|
| 39 | test compExpr-1.4 {TclCompileExpr procedure, expr has no operators} { |
---|
| 40 | set a {0o00123} |
---|
| 41 | expr {$a} |
---|
| 42 | } 83 |
---|
| 43 | |
---|
| 44 | test compExpr-2.1 {CompileSubExpr procedure, TCL_TOKEN_WORD parse token} { |
---|
| 45 | catch {unset a} |
---|
| 46 | set a 27 |
---|
| 47 | expr {"foo$a" < "bar"} |
---|
| 48 | } 0 |
---|
| 49 | test compExpr-2.2 {CompileSubExpr procedure, error compiling TCL_TOKEN_WORD parse token} -body { |
---|
| 50 | expr {"00[expr 1+]" + 17} |
---|
| 51 | } -returnCodes error -match glob -result * |
---|
| 52 | test compExpr-2.3 {CompileSubExpr procedure, TCL_TOKEN_TEXT parse token} { |
---|
| 53 | expr {{12345}} |
---|
| 54 | } 12345 |
---|
| 55 | test compExpr-2.4 {CompileSubExpr procedure, empty TCL_TOKEN_TEXT parse token} { |
---|
| 56 | expr {{}} |
---|
| 57 | } {} |
---|
| 58 | test compExpr-2.5 {CompileSubExpr procedure, TCL_TOKEN_BS parse token} { |
---|
| 59 | expr "\{ \\ |
---|
| 60 | +123 \}" |
---|
| 61 | } 123 |
---|
| 62 | test compExpr-2.6 {CompileSubExpr procedure, TCL_TOKEN_COMMAND parse token} { |
---|
| 63 | expr {[info tclversion] != ""} |
---|
| 64 | } 1 |
---|
| 65 | test compExpr-2.7 {CompileSubExpr procedure, TCL_TOKEN_COMMAND parse token} { |
---|
| 66 | expr {[]} |
---|
| 67 | } {} |
---|
| 68 | test compExpr-2.8 {CompileSubExpr procedure, error in TCL_TOKEN_COMMAND parse token} -body { |
---|
| 69 | expr {[foo "bar"xxx] + 17} |
---|
| 70 | } -returnCodes error -match glob -result * |
---|
| 71 | test compExpr-2.9 {CompileSubExpr procedure, TCL_TOKEN_VARIABLE parse token} { |
---|
| 72 | catch {unset a} |
---|
| 73 | set a 123 |
---|
| 74 | expr {$a*2} |
---|
| 75 | } 246 |
---|
| 76 | test compExpr-2.10 {CompileSubExpr procedure, TCL_TOKEN_VARIABLE parse token} { |
---|
| 77 | catch {unset a} |
---|
| 78 | catch {unset b} |
---|
| 79 | set a(george) martha |
---|
| 80 | set b geo |
---|
| 81 | expr {$a(${b}rge)} |
---|
| 82 | } martha |
---|
| 83 | test compExpr-2.11 {CompileSubExpr procedure, error in TCL_TOKEN_VARIABLE parse token} { |
---|
| 84 | catch {unset a} |
---|
| 85 | list [catch {expr {$a + 17}} msg] $msg |
---|
| 86 | } {1 {can't read "a": no such variable}} |
---|
| 87 | test compExpr-2.12 {CompileSubExpr procedure, TCL_TOKEN_SUB_EXPR parse token} { |
---|
| 88 | expr {27||3? 3<<(1+4) : 4&&9} |
---|
| 89 | } 96 |
---|
| 90 | test compExpr-2.13 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} { |
---|
| 91 | catch {unset a} |
---|
| 92 | set a 15 |
---|
| 93 | list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg |
---|
| 94 | } {0 1} |
---|
| 95 | test compExpr-2.14 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, op found} { |
---|
| 96 | expr {5*6} |
---|
| 97 | } 30 |
---|
| 98 | test compExpr-2.15 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function found} { |
---|
| 99 | format %.6g [expr {sin(2.0)}] |
---|
| 100 | } 0.909297 |
---|
| 101 | test compExpr-2.16 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, math function not found} -body { |
---|
| 102 | list [catch {expr {fred(2.0)}} msg] $msg |
---|
| 103 | } -match glob -result {1 {* "*fred"}} |
---|
| 104 | test compExpr-2.17 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 105 | expr {4*2} |
---|
| 106 | } 8 |
---|
| 107 | test compExpr-2.18 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 108 | expr {4/2} |
---|
| 109 | } 2 |
---|
| 110 | test compExpr-2.19 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 111 | expr {4%2} |
---|
| 112 | } 0 |
---|
| 113 | test compExpr-2.20 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 114 | expr {4<<2} |
---|
| 115 | } 16 |
---|
| 116 | test compExpr-2.21 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 117 | expr {4>>2} |
---|
| 118 | } 1 |
---|
| 119 | test compExpr-2.22 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 120 | expr {4<2} |
---|
| 121 | } 0 |
---|
| 122 | test compExpr-2.23 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 123 | expr {4>2} |
---|
| 124 | } 1 |
---|
| 125 | test compExpr-2.24 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 126 | expr {4<=2} |
---|
| 127 | } 0 |
---|
| 128 | test compExpr-2.25 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 129 | expr {4>=2} |
---|
| 130 | } 1 |
---|
| 131 | test compExpr-2.26 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 132 | expr {4==2} |
---|
| 133 | } 0 |
---|
| 134 | test compExpr-2.27 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 135 | expr {4!=2} |
---|
| 136 | } 1 |
---|
| 137 | test compExpr-2.28 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 138 | expr {4&2} |
---|
| 139 | } 0 |
---|
| 140 | test compExpr-2.29 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 141 | expr {4^2} |
---|
| 142 | } 6 |
---|
| 143 | test compExpr-2.30 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator} { |
---|
| 144 | expr {4|2} |
---|
| 145 | } 6 |
---|
| 146 | test compExpr-2.31 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, 1 operand} { |
---|
| 147 | expr {!4} |
---|
| 148 | } 0 |
---|
| 149 | test compExpr-2.32 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, 1 operand} { |
---|
| 150 | expr {~4} |
---|
| 151 | } -5 |
---|
| 152 | test compExpr-2.33 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, normal operator, comparison} { |
---|
| 153 | catch {unset a} |
---|
| 154 | set a 15 |
---|
| 155 | expr {$a==15} ;# compiled out-of-line to runtime call on Tcl_ExprObjCmd |
---|
| 156 | } 1 |
---|
| 157 | test compExpr-2.34 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 158 | expr {+2} |
---|
| 159 | } 2 |
---|
| 160 | test compExpr-2.35 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} -body { |
---|
| 161 | expr {+[expr 1+]} |
---|
| 162 | } -returnCodes error -match glob -result * |
---|
| 163 | test compExpr-2.36 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 164 | expr {4+2} |
---|
| 165 | } 6 |
---|
| 166 | test compExpr-2.37 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} -body { |
---|
| 167 | expr {[expr 1+]+5} |
---|
| 168 | } -returnCodes error -match glob -result * |
---|
| 169 | test compExpr-2.38 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, error in special operator} -body { |
---|
| 170 | expr {5+[expr 1+]} |
---|
| 171 | } -returnCodes error -match glob -result * |
---|
| 172 | test compExpr-2.39 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 173 | expr {-2} |
---|
| 174 | } -2 |
---|
| 175 | test compExpr-2.40 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 176 | expr {4-2} |
---|
| 177 | } 2 |
---|
| 178 | test compExpr-2.41 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 179 | catch {unset a} |
---|
| 180 | set a true |
---|
| 181 | expr {0||$a} |
---|
| 182 | } 1 |
---|
| 183 | test compExpr-2.42 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} { |
---|
| 184 | catch {unset a} |
---|
| 185 | set a 15 |
---|
| 186 | list [catch {expr {27 || "$a[expr 1+]00"}} msg] $msg |
---|
| 187 | } {0 1} |
---|
| 188 | test compExpr-2.43 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 189 | catch {unset a} |
---|
| 190 | set a false |
---|
| 191 | expr {3&&$a} |
---|
| 192 | } 0 |
---|
| 193 | test compExpr-2.44 {CompileSubExpr procedure, TCL_TOKEN_OPERATOR token, special operator} { |
---|
| 194 | catch {unset a} |
---|
| 195 | set a false |
---|
| 196 | expr {$a||1? 1 : 0} |
---|
| 197 | } 1 |
---|
| 198 | test compExpr-2.45 {CompileSubExpr procedure, error in TCL_TOKEN_SUB_EXPR parse token} { |
---|
| 199 | catch {unset a} |
---|
| 200 | set a 15 |
---|
| 201 | list [catch {expr {1? 54 : "$a[expr 1+]00"}} msg] $msg |
---|
| 202 | } {0 54} |
---|
| 203 | |
---|
| 204 | test compExpr-3.1 {CompileLandOrLorExpr procedure, numeric 1st operand} { |
---|
| 205 | catch {unset a} |
---|
| 206 | set a 2 |
---|
| 207 | expr {[set a]||0} |
---|
| 208 | } 1 |
---|
| 209 | test compExpr-3.2 {CompileLandOrLorExpr procedure, nonnumeric 1st operand} { |
---|
| 210 | catch {unset a} |
---|
| 211 | set a no |
---|
| 212 | expr {$a&&1} |
---|
| 213 | } 0 |
---|
| 214 | test compExpr-3.3 {CompileSubExpr procedure, error in 1st operand} -body { |
---|
| 215 | expr {[expr *2]||0} |
---|
| 216 | } -returnCodes error -match glob -result * |
---|
| 217 | test compExpr-3.4 {CompileLandOrLorExpr procedure, result is 1 or 0} { |
---|
| 218 | catch {unset a} |
---|
| 219 | catch {unset b} |
---|
| 220 | set a no |
---|
| 221 | set b true |
---|
| 222 | expr {$a || $b} |
---|
| 223 | } 1 |
---|
| 224 | test compExpr-3.5 {CompileLandOrLorExpr procedure, short-circuit semantics} { |
---|
| 225 | catch {unset a} |
---|
| 226 | set a yes |
---|
| 227 | expr {$a || [exit]} |
---|
| 228 | } 1 |
---|
| 229 | test compExpr-3.6 {CompileLandOrLorExpr procedure, short-circuit semantics} { |
---|
| 230 | catch {unset a} |
---|
| 231 | set a no |
---|
| 232 | expr {$a && [exit]} |
---|
| 233 | } 0 |
---|
| 234 | test compExpr-3.7 {CompileLandOrLorExpr procedure, numeric 2nd operand} { |
---|
| 235 | catch {unset a} |
---|
| 236 | set a 2 |
---|
| 237 | expr {0||[set a]} |
---|
| 238 | } 1 |
---|
| 239 | test compExpr-3.8 {CompileLandOrLorExpr procedure, nonnumeric 2nd operand} { |
---|
| 240 | catch {unset a} |
---|
| 241 | set a no |
---|
| 242 | expr {1&&$a} |
---|
| 243 | } 0 |
---|
| 244 | test compExpr-3.9 {CompileLandOrLorExpr procedure, error in 2nd operand} -body { |
---|
| 245 | expr {0||[expr %2]} |
---|
| 246 | } -returnCodes error -match glob -result * |
---|
| 247 | test compExpr-3.10 {CompileLandOrLorExpr procedure, long lor/land arm} { |
---|
| 248 | set a "abcdefghijkl" |
---|
| 249 | set i 7 |
---|
| 250 | expr {[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]] || [string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]&&[string compare [format %c $i] [string index $a $i]]} |
---|
| 251 | } 1 |
---|
| 252 | |
---|
| 253 | test compExpr-4.1 {CompileCondExpr procedure, simple test} { |
---|
| 254 | catch {unset a} |
---|
| 255 | set a 2 |
---|
| 256 | expr {($a > 1)? "ok" : "nope"} |
---|
| 257 | } ok |
---|
| 258 | test compExpr-4.2 {CompileCondExpr procedure, complex test, convert to numeric} { |
---|
| 259 | catch {unset a} |
---|
| 260 | set a no |
---|
| 261 | expr {[set a]? 27 : -54} |
---|
| 262 | } -54 |
---|
| 263 | test compExpr-4.3 {CompileCondExpr procedure, error in test} -body { |
---|
| 264 | expr {[expr *2]? +1 : -1} |
---|
| 265 | } -returnCodes error -match glob -result * |
---|
| 266 | test compExpr-4.4 {CompileCondExpr procedure, simple "true" clause} { |
---|
| 267 | catch {unset a} |
---|
| 268 | set a no |
---|
| 269 | expr {1? (27-2) : -54} |
---|
| 270 | } 25 |
---|
| 271 | test compExpr-4.5 {CompileCondExpr procedure, convert "true" clause to numeric} { |
---|
| 272 | catch {unset a} |
---|
| 273 | set a no |
---|
| 274 | expr {1? $a : -54} |
---|
| 275 | } no |
---|
| 276 | test compExpr-4.6 {CompileCondExpr procedure, error in "true" clause} -body { |
---|
| 277 | expr {1? [expr *2] : -127} |
---|
| 278 | } -returnCodes error -match glob -result * |
---|
| 279 | test compExpr-4.7 {CompileCondExpr procedure, simple "false" clause} { |
---|
| 280 | catch {unset a} |
---|
| 281 | set a no |
---|
| 282 | expr {(2-2)? -3.14159 : "nope"} |
---|
| 283 | } nope |
---|
| 284 | test compExpr-4.8 {CompileCondExpr procedure, convert "false" clause to numeric} { |
---|
| 285 | catch {unset a} |
---|
| 286 | set a 0o0123 |
---|
| 287 | expr {0? 42 : $a} |
---|
| 288 | } 83 |
---|
| 289 | test compExpr-4.9 {CompileCondExpr procedure, error in "false" clause} { |
---|
| 290 | list [catch {expr {1? 15 : [expr *2]}} msg] $msg |
---|
| 291 | } {0 15} |
---|
| 292 | |
---|
| 293 | test compExpr-5.1 {CompileMathFuncCall procedure, math function found} { |
---|
| 294 | format %.6g [expr atan2(1.0, 2.0)] |
---|
| 295 | } 0.463648 |
---|
| 296 | test compExpr-5.2 {CompileMathFuncCall procedure, math function not found} -body { |
---|
| 297 | list [catch {expr {do_it()}} msg] $msg |
---|
| 298 | } -match glob -result {1 {* "*do_it"}} |
---|
| 299 | test compExpr-5.3 {CompileMathFuncCall: call registered math function} testmathfunctions { |
---|
| 300 | expr 3*T1()-1 |
---|
| 301 | } 368 |
---|
| 302 | test compExpr-5.4 {CompileMathFuncCall: call registered math function} testmathfunctions { |
---|
| 303 | expr T2()*3 |
---|
| 304 | } 1035 |
---|
| 305 | test compExpr-5.5 {CompileMathFuncCall procedure, too few arguments} -body { |
---|
| 306 | list [catch {expr {atan2(1.0)}} msg] $msg |
---|
| 307 | } -match glob -result {1 {too few arguments for math function*}} |
---|
| 308 | test compExpr-5.6 {CompileMathFuncCall procedure, complex argument} { |
---|
| 309 | format %.6g [expr pow(2.1, 27.5-(24.4*(5%2)))] |
---|
| 310 | } 9.97424 |
---|
| 311 | test compExpr-5.7 {CompileMathFuncCall procedure, error in argument} -body { |
---|
| 312 | expr {sinh(2.*)} |
---|
| 313 | } -returnCodes error -match glob -result * |
---|
| 314 | test compExpr-5.8 {CompileMathFuncCall procedure, too many arguments} -body { |
---|
| 315 | list [catch {expr {sinh(2.0, 3.0)}} msg] $msg |
---|
| 316 | } -match glob -result {1 {too many arguments for math function*}} |
---|
| 317 | test compExpr-5.9 {CompileMathFuncCall procedure, too many arguments} -body { |
---|
| 318 | list [catch {expr {0 <= rand(5.2)}} msg] $msg |
---|
| 319 | } -match glob -result {1 {too many arguments for math function*}} |
---|
| 320 | |
---|
| 321 | test compExpr-6.1 {LogSyntaxError procedure, error in expr longer than 60 chars} -body { |
---|
| 322 | expr {(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)*(+0123456)/} -1 foo 3 |
---|
| 323 | } -returnCodes error -match glob -result * |
---|
| 324 | |
---|
| 325 | test compExpr-7.1 {Memory Leak} -constraints memory -setup { |
---|
| 326 | proc getbytes {} { |
---|
| 327 | set lines [split [memory info] \n] |
---|
| 328 | lindex $lines 3 3 |
---|
| 329 | } |
---|
| 330 | } -body { |
---|
| 331 | set end [getbytes] |
---|
| 332 | for {set i 0} {$i < 5} {incr i} { |
---|
| 333 | interp create slave |
---|
| 334 | slave eval expr 1+2+3+4+5+6+7+8+9+10+11+12+13 |
---|
| 335 | interp delete slave |
---|
| 336 | set tmp $end |
---|
| 337 | set end [getbytes] |
---|
| 338 | } |
---|
| 339 | set leakedBytes [expr {$end - $tmp}] |
---|
| 340 | } -cleanup { |
---|
| 341 | unset end i tmp |
---|
| 342 | rename getbytes {} |
---|
| 343 | } -result 0 |
---|
| 344 | |
---|
| 345 | test compExpr-7.2 {[Bug 1869989]: expr parser memleak} -constraints memory -setup { |
---|
| 346 | proc getbytes {} { |
---|
| 347 | set lines [split [memory info] \n] |
---|
| 348 | lindex $lines 3 3 |
---|
| 349 | } |
---|
| 350 | } -body { |
---|
| 351 | set i 5 |
---|
| 352 | set end [getbytes] |
---|
| 353 | while {[incr i -1]} { |
---|
| 354 | expr ${i}000 |
---|
| 355 | set tmp $end |
---|
| 356 | set end [getbytes] |
---|
| 357 | } |
---|
| 358 | set leakedBytes [expr {$end - $tmp}] |
---|
| 359 | } -cleanup { |
---|
| 360 | unset end i tmp |
---|
| 361 | rename getbytes {} |
---|
| 362 | } -result 0 |
---|
| 363 | |
---|
| 364 | # cleanup |
---|
| 365 | catch {unset a} |
---|
| 366 | catch {unset b} |
---|
| 367 | ::tcltest::cleanupTests |
---|
| 368 | return |
---|