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