1# Commands covered: set 2# 3# This file contains a collection of tests for one or more of the Tcl 4# built-in commands. Sourcing this file into Tcl runs the tests and 5# generates output for errors. No output means no errors were found. 6# 7# Copyright (c) 1996 Sun Microsystems, Inc. 8# Copyright (c) 1998-1999 by Scriptics Corporation. 9# 10# See the file "license.terms" for information on usage and redistribution 11# of this file, and for a DISCLAIMER OF ALL WARRANTIES. 12# 13# RCS: @(#) $Id: set.test,v 1.8 2000/04/10 17:19:04 ericm Exp $ 14 15if {[lsearch [namespace children] ::tcltest] == -1} { 16 package require tcltest 17 namespace import -force ::tcltest::* 18} 19 20catch {unset x} 21catch {unset i} 22 23test set-1.1 {TclCompileSetCmd: missing variable name} { 24 list [catch {set} msg] $msg 25} {1 {wrong # args: should be "set varName ?newValue?"}} 26test set-1.2 {TclCompileSetCmd: simple variable name} { 27 set i 10 28 list [set i] $i 29} {10 10} 30test set-1.3 {TclCompileSetCmd: error compiling variable name} { 31 set i 10 32 catch {set "i"xxx} msg 33 set msg 34} {extra characters after close-quote} 35test set-1.4 {TclCompileSetCmd: simple variable name in quotes} { 36 set i 17 37 list [set "i"] $i 38} {17 17} 39test set-1.5 {TclCompileSetCmd: simple variable name in braces} { 40 catch {unset {a simple var}} 41 set {a simple var} 27 42 list [set {a simple var}] ${a simple var} 43} {27 27} 44test set-1.6 {TclCompileSetCmd: simple array variable name} { 45 catch {unset a} 46 set a(foo) 37 47 list [set a(foo)] $a(foo) 48} {37 37} 49test set-1.7 {TclCompileSetCmd: non-simple (computed) variable name} { 50 set x "i" 51 set i 77 52 list [set $x] $i 53} {77 77} 54test set-1.8 {TclCompileSetCmd: non-simple (computed) variable name} { 55 set x "i" 56 set i 77 57 list [set [set x] 2] $i 58} {2 2} 59 60test set-1.9 {TclCompileSetCmd: 3rd arg => assignment} { 61 set i "abcdef" 62 list [set i] $i 63} {abcdef abcdef} 64test set-1.10 {TclCompileSetCmd: only two args => just getting value} { 65 set i {one two} 66 set i 67} {one two} 68 69test set-1.11 {TclCompileSetCmd: simple global name} { 70 proc p {} { 71 global i 72 set i 54 73 set i 74 } 75 p 76} {54} 77test set-1.12 {TclCompileSetCmd: simple local name} { 78 proc p {bar} { 79 set foo $bar 80 set foo 81 } 82 p 999 83} {999} 84test set-1.13 {TclCompileSetCmd: simple but new (unknown) local name} { 85 proc p {} { 86 set bar 87 } 88 catch {p} msg 89 set msg 90} {can't read "bar": no such variable} 91test set-1.14 {TclCompileSetCmd: simple local name, >255 locals} { 92 proc 260locals {} { 93 # create 260 locals (the last ones with index > 255) 94 set a0 0; set a1 0; set a2 0; set a3 0; set a4 0 95 set a5 0; set a6 0; set a7 0; set a8 0; set a9 0 96 set b0 0; set b1 0; set b2 0; set b3 0; set b4 0 97 set b5 0; set b6 0; set b7 0; set b8 0; set b9 0 98 set c0 0; set c1 0; set c2 0; set c3 0; set c4 0 99 set c5 0; set c6 0; set c7 0; set c8 0; set c9 0 100 set d0 0; set d1 0; set d2 0; set d3 0; set d4 0 101 set d5 0; set d6 0; set d7 0; set d8 0; set d9 0 102 set e0 0; set e1 0; set e2 0; set e3 0; set e4 0 103 set e5 0; set e6 0; set e7 0; set e8 0; set e9 0 104 set f0 0; set f1 0; set f2 0; set f3 0; set f4 0 105 set f5 0; set f6 0; set f7 0; set f8 0; set f9 0 106 set g0 0; set g1 0; set g2 0; set g3 0; set g4 0 107 set g5 0; set g6 0; set g7 0; set g8 0; set g9 0 108 set h0 0; set h1 0; set h2 0; set h3 0; set h4 0 109 set h5 0; set h6 0; set h7 0; set h8 0; set h9 0 110 set i0 0; set i1 0; set i2 0; set i3 0; set i4 0 111 set i5 0; set i6 0; set i7 0; set i8 0; set i9 0 112 set j0 0; set j1 0; set j2 0; set j3 0; set j4 0 113 set j5 0; set j6 0; set j7 0; set j8 0; set j9 0 114 set k0 0; set k1 0; set k2 0; set k3 0; set k4 0 115 set k5 0; set k6 0; set k7 0; set k8 0; set k9 0 116 set l0 0; set l1 0; set l2 0; set l3 0; set l4 0 117 set l5 0; set l6 0; set l7 0; set l8 0; set l9 0 118 set m0 0; set m1 0; set m2 0; set m3 0; set m4 0 119 set m5 0; set m6 0; set m7 0; set m8 0; set m9 0 120 set n0 0; set n1 0; set n2 0; set n3 0; set n4 0 121 set n5 0; set n6 0; set n7 0; set n8 0; set n9 0 122 set o0 0; set o1 0; set o2 0; set o3 0; set o4 0 123 set o5 0; set o6 0; set o7 0; set o8 0; set o9 0 124 set p0 0; set p1 0; set p2 0; set p3 0; set p4 0 125 set p5 0; set p6 0; set p7 0; set p8 0; set p9 0 126 set q0 0; set q1 0; set q2 0; set q3 0; set q4 0 127 set q5 0; set q6 0; set q7 0; set q8 0; set q9 0 128 set r0 0; set r1 0; set r2 0; set r3 0; set r4 0 129 set r5 0; set r6 0; set r7 0; set r8 0; set r9 0 130 set s0 0; set s1 0; set s2 0; set s3 0; set s4 0 131 set s5 0; set s6 0; set s7 0; set s8 0; set s9 0 132 set t0 0; set t1 0; set t2 0; set t3 0; set t4 0 133 set t5 0; set t6 0; set t7 0; set t8 0; set t9 0 134 set u0 0; set u1 0; set u2 0; set u3 0; set u4 0 135 set u5 0; set u6 0; set u7 0; set u8 0; set u9 0 136 set v0 0; set v1 0; set v2 0; set v3 0; set v4 0 137 set v5 0; set v6 0; set v7 0; set v8 0; set v9 0 138 set w0 0; set w1 0; set w2 0; set w3 0; set w4 0 139 set w5 0; set w6 0; set w7 0; set w8 0; set w9 0 140 set x0 0; set x1 0; set x2 0; set x3 0; set x4 0 141 set x5 0; set x6 0; set x7 0; set x8 0; set x9 0 142 set y0 0; set y1 0; set y2 0; set y3 0; set y4 0 143 set y5 0; set y6 0; set y7 0; set y8 0; set y9 0 144 set z0 0; set z1 0; set z2 0; set z3 0; set z4 0 145 set z5 0; set z6 0; set z7 0; set z8 0; set z9 1234 146 } 147 260locals 148} {1234} 149test set-1.15 {TclCompileSetCmd: variable is array} { 150 catch {unset a} 151 set x 27 152 set x [set a(foo) 11] 153 catch {unset a} 154 set x 155} 11 156test set-1.16 {TclCompileSetCmd: variable is array, elem substitutions} { 157 catch {unset a} 158 set i 5 159 set x 789 160 set a(foo5) 27 161 set x [set a(foo$i)] 162 catch {unset a} 163 set x 164} 27 165 166test set-1.17 {TclCompileSetCmd: doing assignment, simple int} { 167 set i 5 168 set i 123 169} 123 170test set-1.18 {TclCompileSetCmd: doing assignment, simple int} { 171 set i 5 172 set i -100 173} -100 174test set-1.19 {TclCompileSetCmd: doing assignment, simple but not int} { 175 set i 5 176 set i 0x12MNOP 177 set i 178} {0x12MNOP} 179test set-1.20 {TclCompileSetCmd: doing assignment, in quotes} { 180 set i 25 181 set i "-100" 182} -100 183test set-1.21 {TclCompileSetCmd: doing assignment, in braces} { 184 set i 24 185 set i {126} 186} 126 187test set-1.22 {TclCompileSetCmd: doing assignment, large int} { 188 set i 5 189 set i 200000 190} 200000 191test set-1.23 {TclCompileSetCmd: doing assignment, formatted int != int} { 192 set i 25 193 set i 000012345 ;# an octal literal == 5349 decimal 194 list $i [incr i] 195} {000012345 5350} 196 197test set-1.24 {TclCompileSetCmd: too many arguments} { 198 set i 10 199 catch {set i 20 30} msg 200 set msg 201} {wrong # args: should be "set varName ?newValue?"} 202 203test set-1.25 {TclCompileSetCmd: var is array, braced (no subs)} { 204 # This was a known error in 8.1a* - 8.2.1 205 catch {unset array} 206 set {array($foo)} 5 207} 5 208test set-1.26 {TclCompileSetCmd: various array constructs} { 209 # Test all kinds of array constructs that TclCompileSetCmd 210 # may feel inclined to tamper with. 211 proc p {} { 212 set a x 213 set be(hej) 1 ; # hej 214 set be($a) 1 ; # x 215 set {be($a)} 1 ; # $a 216 set be($a,hej) 1 ; # x,hej 217 set be($a,$a) 5 ; # x,x 218 set be(c($a) 1 ; # c(x 219 set be(\w\w) 1 ; # ww 220 set be(a:$a) [set be(x,$a)] ; # a:x 221 set be(hej,$be($a,hej),hej) 1 ; # hej,1,hej 222 set be([string range hugge 0 2]) 1 ; # hug 223 set be(a\ a) 1 ; # a a 224 set be($a\ ,[string range hugge 1 3],hej) 1 ; # x ,ugg,hej 225 set be($a,h"ej) 1 ; # x,h"ej 226 set be([string range "a b c" 2 end]) 1 ; # b c 227 set [string range bet 0 1](foo) 1 ; # foo 228 set be([set be(a:$a)][set b\e($a)]) 1 ; # 51 229 return [lsort [array names be]] 230 } 231 p 232} [lsort {hej x $a x,hej x,x c(x ww a:x hej,1,hej hug {a a} {x ,ugg,hej} x,h"ej 233{b c} foo 51}]; # " just a matching end quote 234 235test set-2.1 {set command: runtime error, bad variable name} { 236 list [catch {set {"foo}} msg] $msg $errorInfo 237} {1 {can't read ""foo": no such variable} {can't read ""foo": no such variable 238 while executing 239"set {"foo}"}} 240test set-2.2 {set command: runtime error, not array variable} { 241 catch {unset b} 242 set b 44 243 list [catch {set b(123)} msg] $msg 244} {1 {can't read "b(123)": variable isn't array}} 245test set-2.3 {set command: runtime error, errors in reading variables} { 246 catch {unset a} 247 set a(6) 44 248 list [catch {set a(18)} msg] $msg 249} {1 {can't read "a(18)": no such element in array}} 250test set-2.4 {set command: runtime error, readonly variable} { 251 proc readonly args {error "variable is read-only"} 252 set x 123 253 trace var x w readonly 254 list [catch {set x 1} msg] $msg $errorInfo 255} {1 {can't set "x": variable is read-only} {can't set "x": variable is read-only 256 while executing 257"set x 1"}} 258test set-2.5 {set command: runtime error, basic array operations} { 259 list [catch {set a(other)} msg] $msg 260} {1 {can't read "a(other)": no such element in array}} 261test set-2.6 {set command: runtime error, basic array operations} { 262 list [catch {set a} msg] $msg 263} {1 {can't read "a": variable is array}} 264 265# Test the uncompiled version of set 266 267catch {unset a} 268catch {unset b} 269catch {unset i} 270catch {unset x} 271 272test set-3.1 {uncompiled set command: missing variable name} { 273 set z set 274 list [catch {$z} msg] $msg 275} {1 {wrong # args: should be "set varName ?newValue?"}} 276test set-3.2 {uncompiled set command: simple variable name} { 277 set z set 278 $z i 10 279 list [$z i] $i 280} {10 10} 281test set-3.3 {uncompiled set command: error compiling variable name} { 282 set z set 283 $z i 10 284 catch {$z "i"xxx} msg 285 $z msg 286} {extra characters after close-quote} 287test set-3.4 {uncompiled set command: simple variable name in quotes} { 288 set z set 289 $z i 17 290 list [$z "i"] $i 291} {17 17} 292test set-3.5 {uncompiled set command: simple variable name in braces} { 293 set z set 294 catch {unset {a simple var}} 295 $z {a simple var} 27 296 list [$z {a simple var}] ${a simple var} 297} {27 27} 298test set-3.6 {uncompiled set command: simple array variable name} { 299 set z set 300 catch {unset a} 301 $z a(foo) 37 302 list [$z a(foo)] $a(foo) 303} {37 37} 304test set-3.7 {uncompiled set command: non-simple (computed) variable name} { 305 set z set 306 $z x "i" 307 $z i 77 308 list [$z $x] $i 309} {77 77} 310test set-3.8 {uncompiled set command: non-simple (computed) variable name} { 311 set z set 312 $z x "i" 313 $z i 77 314 list [$z [$z x] 2] $i 315} {2 2} 316 317test set-3.9 {uncompiled set command: 3rd arg => assignment} { 318 set z set 319 $z i "abcdef" 320 list [$z i] $i 321} {abcdef abcdef} 322test set-3.10 {uncompiled set command: only two args => just getting value} { 323 set z set 324 $z i {one two} 325 $z i 326} {one two} 327 328test set-3.11 {uncompiled set command: simple global name} { 329 proc p {} { 330 set z set 331 global i 332 $z i 54 333 $z i 334 } 335 p 336} {54} 337test set-3.12 {uncompiled set command: simple local name} { 338 proc p {bar} { 339 set z set 340 $z foo $bar 341 $z foo 342 } 343 p 999 344} {999} 345test set-3.13 {uncompiled set command: simple but new (unknown) local name} { 346 set z set 347 proc p {} { 348 set z set 349 $z bar 350 } 351 catch {p} msg 352 $z msg 353} {can't read "bar": no such variable} 354test set-3.14 {uncompiled set command: simple local name, >255 locals} { 355 proc 260locals {} { 356 set z set 357 # create 260 locals (the last ones with index > 255) 358 $z a0 0; $z a1 0; $z a2 0; $z a3 0; $z a4 0 359 $z a5 0; $z a6 0; $z a7 0; $z a8 0; $z a9 0 360 $z b0 0; $z b1 0; $z b2 0; $z b3 0; $z b4 0 361 $z b5 0; $z b6 0; $z b7 0; $z b8 0; $z b9 0 362 $z c0 0; $z c1 0; $z c2 0; $z c3 0; $z c4 0 363 $z c5 0; $z c6 0; $z c7 0; $z c8 0; $z c9 0 364 $z d0 0; $z d1 0; $z d2 0; $z d3 0; $z d4 0 365 $z d5 0; $z d6 0; $z d7 0; $z d8 0; $z d9 0 366 $z e0 0; $z e1 0; $z e2 0; $z e3 0; $z e4 0 367 $z e5 0; $z e6 0; $z e7 0; $z e8 0; $z e9 0 368 $z f0 0; $z f1 0; $z f2 0; $z f3 0; $z f4 0 369 $z f5 0; $z f6 0; $z f7 0; $z f8 0; $z f9 0 370 $z g0 0; $z g1 0; $z g2 0; $z g3 0; $z g4 0 371 $z g5 0; $z g6 0; $z g7 0; $z g8 0; $z g9 0 372 $z h0 0; $z h1 0; $z h2 0; $z h3 0; $z h4 0 373 $z h5 0; $z h6 0; $z h7 0; $z h8 0; $z h9 0 374 $z i0 0; $z i1 0; $z i2 0; $z i3 0; $z i4 0 375 $z i5 0; $z i6 0; $z i7 0; $z i8 0; $z i9 0 376 $z j0 0; $z j1 0; $z j2 0; $z j3 0; $z j4 0 377 $z j5 0; $z j6 0; $z j7 0; $z j8 0; $z j9 0 378 $z k0 0; $z k1 0; $z k2 0; $z k3 0; $z k4 0 379 $z k5 0; $z k6 0; $z k7 0; $z k8 0; $z k9 0 380 $z l0 0; $z l1 0; $z l2 0; $z l3 0; $z l4 0 381 $z l5 0; $z l6 0; $z l7 0; $z l8 0; $z l9 0 382 $z m0 0; $z m1 0; $z m2 0; $z m3 0; $z m4 0 383 $z m5 0; $z m6 0; $z m7 0; $z m8 0; $z m9 0 384 $z n0 0; $z n1 0; $z n2 0; $z n3 0; $z n4 0 385 $z n5 0; $z n6 0; $z n7 0; $z n8 0; $z n9 0 386 $z o0 0; $z o1 0; $z o2 0; $z o3 0; $z o4 0 387 $z o5 0; $z o6 0; $z o7 0; $z o8 0; $z o9 0 388 $z p0 0; $z p1 0; $z p2 0; $z p3 0; $z p4 0 389 $z p5 0; $z p6 0; $z p7 0; $z p8 0; $z p9 0 390 $z q0 0; $z q1 0; $z q2 0; $z q3 0; $z q4 0 391 $z q5 0; $z q6 0; $z q7 0; $z q8 0; $z q9 0 392 $z r0 0; $z r1 0; $z r2 0; $z r3 0; $z r4 0 393 $z r5 0; $z r6 0; $z r7 0; $z r8 0; $z r9 0 394 $z s0 0; $z s1 0; $z s2 0; $z s3 0; $z s4 0 395 $z s5 0; $z s6 0; $z s7 0; $z s8 0; $z s9 0 396 $z t0 0; $z t1 0; $z t2 0; $z t3 0; $z t4 0 397 $z t5 0; $z t6 0; $z t7 0; $z t8 0; $z t9 0 398 $z u0 0; $z u1 0; $z u2 0; $z u3 0; $z u4 0 399 $z u5 0; $z u6 0; $z u7 0; $z u8 0; $z u9 0 400 $z v0 0; $z v1 0; $z v2 0; $z v3 0; $z v4 0 401 $z v5 0; $z v6 0; $z v7 0; $z v8 0; $z v9 0 402 $z w0 0; $z w1 0; $z w2 0; $z w3 0; $z w4 0 403 $z w5 0; $z w6 0; $z w7 0; $z w8 0; $z w9 0 404 $z x0 0; $z x1 0; $z x2 0; $z x3 0; $z x4 0 405 $z x5 0; $z x6 0; $z x7 0; $z x8 0; $z x9 0 406 $z y0 0; $z y1 0; $z y2 0; $z y3 0; $z y4 0 407 $z y5 0; $z y6 0; $z y7 0; $z y8 0; $z y9 0 408 $z z0 0; $z z1 0; $z z2 0; $z z3 0; $z z4 0 409 $z z5 0; $z z6 0; $z z7 0; $z z8 0; $z z9 1234 410 } 411 260locals 412} {1234} 413test set-3.15 {uncompiled set command: variable is array} { 414 set z set 415 catch {unset a} 416 $z x 27 417 $z x [$z a(foo) 11] 418 catch {unset a} 419 $z x 420} 11 421test set-3.16 {uncompiled set command: variable is array, elem substitutions} { 422 set z set 423 catch {unset a} 424 $z i 5 425 $z x 789 426 $z a(foo5) 27 427 $z x [$z a(foo$i)] 428 catch {unset a} 429 $z x 430} 27 431 432test set-3.17 {uncompiled set command: doing assignment, simple int} { 433 set z set 434 $z i 5 435 $z i 123 436} 123 437test set-3.18 {uncompiled set command: doing assignment, simple int} { 438 set z set 439 $z i 5 440 $z i -100 441} -100 442test set-3.19 {uncompiled set command: doing assignment, simple but not int} { 443 set z set 444 $z i 5 445 $z i 0x12MNOP 446 $z i 447} {0x12MNOP} 448test set-3.20 {uncompiled set command: doing assignment, in quotes} { 449 set z set 450 $z i 25 451 $z i "-100" 452} -100 453test set-3.21 {uncompiled set command: doing assignment, in braces} { 454 set z set 455 $z i 24 456 $z i {126} 457} 126 458test set-3.22 {uncompiled set command: doing assignment, large int} { 459 set z set 460 $z i 5 461 $z i 200000 462} 200000 463test set-3.23 {uncompiled set command: doing assignment, formatted int != int} { 464 set z set 465 $z i 25 466 $z i 000012345 ;# an octal literal == 5349 decimal 467 list $i [incr i] 468} {000012345 5350} 469 470test set-3.24 {uncompiled set command: too many arguments} { 471 set z set 472 $z i 10 473 catch {$z i 20 30} msg 474 $z msg 475} {wrong # args: should be "set varName ?newValue?"} 476 477test set-4.1 {uncompiled set command: runtime error, bad variable name} { 478 set z set 479 list [catch {$z {"foo}} msg] $msg $errorInfo 480} {1 {can't read ""foo": no such variable} {can't read ""foo": no such variable 481 while executing 482"$z {"foo}"}} 483test set-4.2 {uncompiled set command: runtime error, not array variable} { 484 set z set 485 catch {unset b} 486 $z b 44 487 list [catch {$z b(123)} msg] $msg 488} {1 {can't read "b(123)": variable isn't array}} 489test set-4.3 {uncompiled set command: runtime error, errors in reading variables} { 490 set z set 491 catch {unset a} 492 $z a(6) 44 493 list [catch {$z a(18)} msg] $msg 494} {1 {can't read "a(18)": no such element in array}} 495test set-4.4 {uncompiled set command: runtime error, readonly variable} { 496 set z set 497 proc readonly args {error "variable is read-only"} 498 $z x 123 499 trace var x w readonly 500 list [catch {$z x 1} msg] $msg $errorInfo 501} {1 {can't set "x": variable is read-only} {can't set "x": variable is read-only 502 while executing 503"$z x 1"}} 504test set-4.5 {uncompiled set command: runtime error, basic array operations} { 505 set z set 506 list [catch {$z a(other)} msg] $msg 507} {1 {can't read "a(other)": no such element in array}} 508test set-4.6 {set command: runtime error, basic array operations} { 509 set z set 510 list [catch {$z a} msg] $msg 511} {1 {can't read "a": variable is array}} 512 513# cleanup 514catch {unset a} 515catch {unset b} 516catch {unset i} 517catch {unset x} 518catch {unset z} 519::tcltest::cleanupTests 520return 521