1# Functionality covered: this file contains a collection of tests for the
2# procedures in tclObj.c that implement Tcl's basic type support and the
3# type managers for the types boolean, double, and integer.
4#
5# Sourcing this file into Tcl runs the tests and generates output for
6# errors. No output means no errors were found.
7#
8# Copyright © 1995-1996 Sun Microsystems, Inc.
9# Copyright © 1998-1999 Scriptics Corporation.
10#
11# See the file "license.terms" for information on usage and redistribution
12# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13
14if {"::tcltest" ni [namespace children]} {
15    package require tcltest 2.5
16    namespace import -force ::tcltest::*
17}
18
19::tcltest::loadTestedCommands
20catch [list package require -exact tcl::test [info patchlevel]]
21
22testConstraint testobj [llength [info commands testobj]]
23testConstraint longIs32bit [expr {$tcl_platform(wordSize) == 4}]
24testConstraint wideIs64bit [expr {wide(0x8000000000000000) < 0}]
25
26test obj-1.1 {Tcl_AppendAllObjTypes, and InitTypeTable, Tcl_RegisterObjType} testobj {
27    set r 1
28    foreach {t} {
29	bytearray
30	bytecode
31	cmdName
32	dict
33	regexp
34	string
35    } {
36        set first [string first $t [testobj types]]
37        set r [expr {$r && ($first >= 0)}]
38    }
39    set result $r
40} {1}
41
42test obj-2.1 {Tcl_GetObjType error} testobj {
43    list [testintobj set 1 0] [catch {testobj convert 1 foo} msg] $msg
44} {0 1 {no type foo found}}
45test obj-2.2 {Tcl_GetObjType and Tcl_ConvertToType} testobj {
46    set result ""
47    lappend result [testobj freeallvars]
48    lappend result [testintobj set 1 12]
49    lappend result [testobj convert 1 bytearray]
50    lappend result [testobj type 1]
51    lappend result [testobj refcount 1]
52} {{} 12 12 bytearray 3}
53
54test obj-4.1 {Tcl_NewObj and AllocateFreeObjects} testobj {
55    set result ""
56    lappend result [testobj freeallvars]
57    lappend result [testobj newobj 1]
58    lappend result [testobj type 1]
59    lappend result [testobj refcount 1]
60} {{} {} string 2}
61
62test obj-5.1 {Tcl_FreeObj} testobj {
63    set result ""
64    lappend result [testintobj set 1 12345]
65    lappend result [testobj freeallvars]
66    lappend result [catch {testintobj get 1} msg]
67    lappend result $msg
68} {12345 {} 1 {variable 1 is unset (NULL)}}
69
70test obj-6.1 {Tcl_DuplicateObj, object has internal rep} testobj {
71    set result ""
72    lappend result [testobj freeallvars]
73    lappend result [testintobj set 1 47]
74    lappend result [testobj duplicate 1 2]
75    lappend result [testintobj get 2]
76    lappend result [testobj refcount 1]
77    lappend result [testobj refcount 2]
78} {{} 47 47 47 2 3}
79test obj-6.2 {Tcl_DuplicateObj, "empty string" object} testobj {
80    set result ""
81    lappend result [testobj freeallvars]
82    lappend result [testobj newobj 1]
83    lappend result [testobj duplicate 1 2]
84    lappend result [testintobj get 2]
85    lappend result [testobj refcount 1]
86    lappend result [testobj refcount 2]
87} {{} {} {} {} 2 3}
88
89# We assume that testobj is an indicator for test*obj as well
90
91test obj-7.1 {Tcl_GetString, return existing string rep} testobj {
92    set result ""
93    lappend result [testintobj set 1 47]
94    lappend result [testintobj get2 1]
95} {47 47}
96test obj-7.2 {Tcl_GetString, "empty string" object} testobj {
97    set result ""
98    lappend result [testobj newobj 1]
99    lappend result [teststringobj append 1 abc -1]
100    lappend result [teststringobj get2 1]
101} {{} abc abc}
102test obj-7.3 {Tcl_GetString, returns string internal rep (DString)} testobj {
103    set result ""
104    lappend result [teststringobj set 1 xyz]
105    lappend result [teststringobj append 1 abc -1]
106    lappend result [teststringobj get2 1]
107} {xyz xyzabc xyzabc}
108test obj-7.4 {Tcl_GetString, recompute string rep from internal rep} testobj {
109    set result ""
110    lappend result [testintobj set 1 77]
111    lappend result [testintobj mult10 1]
112    lappend result [teststringobj get2 1]
113} {77 770 770}
114
115test obj-8.1 {Tcl_GetStringFromObj, return existing string rep} testobj {
116    set result ""
117    lappend result [testintobj set 1 47]
118    lappend result [testintobj get 1]
119} {47 47}
120test obj-8.2 {Tcl_GetStringFromObj, "empty string" object} testobj {
121    set result ""
122    lappend result [testobj newobj 1]
123    lappend result [teststringobj append 1 abc -1]
124    lappend result [teststringobj get 1]
125} {{} abc abc}
126test obj-8.3 {Tcl_GetStringFromObj, returns string internal rep (DString)} testobj {
127    set result ""
128    lappend result [teststringobj set 1 xyz]
129    lappend result [teststringobj append 1 abc -1]
130    lappend result [teststringobj get 1]
131} {xyz xyzabc xyzabc}
132test obj-8.4 {Tcl_GetStringFromObj, recompute string rep from internal rep} testobj {
133    set result ""
134    lappend result [testintobj set 1 77]
135    lappend result [testintobj mult10 1]
136    lappend result [teststringobj get 1]
137} {77 770 770}
138
139test obj-9.1 {Tcl_NewBooleanObj} testobj {
140    set result ""
141    lappend result [testobj freeallvars]
142    lappend result [testbooleanobj set 1 0]
143    lappend result [testobj type 1]
144    lappend result [testobj refcount 1]
145} {{} 0 int 2}
146
147test obj-10.1 {Tcl_SetBooleanObj, existing "empty string" object} testobj {
148    set result ""
149    lappend result [testobj freeallvars]
150    lappend result [testobj newobj 1]
151    lappend result [testbooleanobj set 1 0]  ;# makes existing obj boolean
152    lappend result [testobj type 1]
153    lappend result [testobj refcount 1]
154} {{} {} 0 int 2}
155test obj-10.2 {Tcl_SetBooleanObj, existing non-"empty string" object} testobj {
156    set result ""
157    lappend result [testobj freeallvars]
158    lappend result [testintobj set 1 98765]
159    lappend result [testbooleanobj set 1 1]  ;# makes existing obj boolean
160    lappend result [testobj type 1]
161    lappend result [testobj refcount 1]
162} {{} 98765 1 int 2}
163
164test obj-11.1 {Tcl_GetBooleanFromObj, existing boolean object} testobj {
165    set result ""
166    lappend result [testbooleanobj set 1 1]
167    lappend result [testbooleanobj not 1]    ;# gets existing boolean rep
168} {1 0}
169test obj-11.2 {Tcl_GetBooleanFromObj, convert to boolean} testobj {
170    set result ""
171    lappend result [testintobj set 1 47]
172    lappend result [testbooleanobj not 1]    ;# must convert to bool
173    lappend result [testobj type 1]
174} {47 0 int}
175test obj-11.3 {Tcl_GetBooleanFromObj, error converting to boolean} testobj {
176    set result ""
177    lappend result [teststringobj set 1 abc]
178    lappend result [catch {testbooleanobj not 1} msg]
179    lappend result $msg
180} {abc 1 {expected boolean value but got "abc"}}
181test obj-11.4 {Tcl_GetBooleanFromObj, error converting from "empty string"} testobj {
182    set result ""
183    lappend result [testobj newobj 1]
184    lappend result [catch {testbooleanobj not 1} msg]
185    lappend result $msg
186} {{} 1 {expected boolean value but got ""}}
187test obj-11.5 {Tcl_GetBooleanFromObj, convert hex to boolean} testobj {
188    set result ""
189    lappend result [teststringobj set 1 0xac]
190    lappend result [testbooleanobj not 1]
191    lappend result [testobj type 1]
192} {0xac 0 int}
193test obj-11.6 {Tcl_GetBooleanFromObj, convert float to boolean} testobj {
194    set result ""
195    lappend result [teststringobj set 1 5.42]
196    lappend result [testbooleanobj not 1]
197    lappend result [testobj type 1]
198} {5.42 0 int}
199
200test obj-12.1 {DupBooleanInternalRep} testobj {
201    set result ""
202    lappend result [testbooleanobj set 1 1]
203    lappend result [testobj duplicate 1 2]   ;# uses DupBooleanInternalRep
204    lappend result [testbooleanobj get 2]
205} {1 1 1}
206
207test obj-13.1 {SetBooleanFromAny, int to boolean special case} testobj {
208    set result ""
209    lappend result [testintobj set 1 1234]
210    lappend result [testbooleanobj not 1]    ;# converts with SetBooleanFromAny
211    lappend result [testobj type 1]
212} {1234 0 int}
213test obj-13.2 {SetBooleanFromAny, double to boolean special case} testobj {
214    set result ""
215    lappend result [testdoubleobj set 1 3.14159]
216    lappend result [testbooleanobj not 1]    ;# converts with SetBooleanFromAny
217    lappend result [testobj type 1]
218} {3.14159 0 int}
219test obj-13.3 {SetBooleanFromAny, special case strings representing booleans} testobj {
220    set result ""
221    foreach s {yes no true false on off} {
222        teststringobj set 1 $s
223        lappend result [testbooleanobj not 1]
224    }
225    lappend result [testobj type 1]
226} {0 1 0 1 0 1 int}
227test obj-13.4 {SetBooleanFromAny, recompute string rep then parse it} testobj {
228    set result ""
229    lappend result [testintobj set 1 456]
230    lappend result [testintobj div10 1]
231    lappend result [testbooleanobj not 1]    ;# converts with SetBooleanFromAny
232    lappend result [testobj type 1]
233} {456 45 0 int}
234test obj-13.5 {SetBooleanFromAny, error parsing string} testobj {
235    set result ""
236    lappend result [teststringobj set 1 abc]
237    lappend result [catch {testbooleanobj not 1} msg]
238    lappend result $msg
239} {abc 1 {expected boolean value but got "abc"}}
240test obj-13.6 {SetBooleanFromAny, error parsing string} testobj {
241    set result ""
242    lappend result [teststringobj set 1 x1.0]
243    lappend result [catch {testbooleanobj not 1} msg]
244    lappend result $msg
245} {x1.0 1 {expected boolean value but got "x1.0"}}
246test obj-13.7 {SetBooleanFromAny, error converting from "empty string"} testobj {
247    set result ""
248    lappend result [testobj newobj 1]
249    lappend result [catch {testbooleanobj not 1} msg]
250    lappend result $msg
251} {{} 1 {expected boolean value but got ""}}
252test obj-13.8 {SetBooleanFromAny, unicode strings} testobj {
253    set result ""
254    lappend result [teststringobj set 1 1睷]
255    lappend result [catch {testbooleanobj not 1} msg]
256    lappend result $msg
257} "1睷 1 {expected boolean value but got \"1睷\"}"
258
259test obj-14.1 {UpdateStringOfBoolean} testobj {
260    set result ""
261    lappend result [testbooleanobj set 1 0]
262    lappend result [testbooleanobj not 1]
263    lappend result [testbooleanobj get 1]    ;# must update string rep
264} {0 1 1}
265
266test obj-15.1 {Tcl_NewDoubleObj} testobj {
267    set result ""
268    lappend result [testobj freeallvars]
269    lappend result [testdoubleobj set 1 3.1459]
270    lappend result [testobj type 1]
271    lappend result [testobj refcount 1]
272} {{} 3.1459 double 2}
273
274test obj-16.1 {Tcl_SetDoubleObj, existing "empty string" object} testobj {
275    set result ""
276    lappend result [testobj freeallvars]
277    lappend result [testobj newobj 1]
278    lappend result [testdoubleobj set 1 0.123]  ;# makes existing obj boolean
279    lappend result [testobj type 1]
280    lappend result [testobj refcount 1]
281} {{} {} 0.123 double 2}
282test obj-16.2 {Tcl_SetDoubleObj, existing non-"empty string" object} testobj {
283    set result ""
284    lappend result [testobj freeallvars]
285    lappend result [testintobj set 1 98765]
286    lappend result [testdoubleobj set 1 27.56]  ;# makes existing obj double
287    lappend result [testobj type 1]
288    lappend result [testobj refcount 1]
289} {{} 98765 27.56 double 2}
290
291test obj-17.1 {Tcl_GetDoubleFromObj, existing double object} testobj {
292    set result ""
293    lappend result [testdoubleobj set 1 16.1]
294    lappend result [testdoubleobj mult10 1]   ;# gets existing double rep
295} {16.1 161.0}
296test obj-17.2 {Tcl_GetDoubleFromObj, convert to double} testobj {
297    set result ""
298    lappend result [testintobj set 1 477]
299    lappend result [testdoubleobj div10 1]    ;# must convert to bool
300    lappend result [testobj type 1]
301} {477 47.7 double}
302test obj-17.3 {Tcl_GetDoubleFromObj, error converting to double} testobj {
303    set result ""
304    lappend result [teststringobj set 1 abc]
305    lappend result [catch {testdoubleobj mult10 1} msg]
306    lappend result $msg
307} {abc 1 {expected floating-point number but got "abc"}}
308test obj-17.4 {Tcl_GetDoubleFromObj, error converting from "empty string"} testobj {
309    set result ""
310    lappend result [testobj newobj 1]
311    lappend result [catch {testdoubleobj div10 1} msg]
312    lappend result $msg
313} {{} 1 {expected floating-point number but got ""}}
314
315test obj-18.1 {DupDoubleInternalRep} testobj {
316    set result ""
317    lappend result [testdoubleobj set 1 17.1]
318    lappend result [testobj duplicate 1 2]      ;# uses DupDoubleInternalRep
319    lappend result [testdoubleobj get 2]
320} {17.1 17.1 17.1}
321
322test obj-19.1 {SetDoubleFromAny, int to double special case} testobj {
323    set result ""
324    lappend result [testintobj set 1 1234]
325    lappend result [testdoubleobj mult10 1] ;# converts with SetDoubleFromAny
326    lappend result [testobj type 1]
327} {1234 12340.0 double}
328test obj-19.2 {SetDoubleFromAny, boolean to double special case} testobj {
329    set result ""
330    lappend result [testbooleanobj set 1 1]
331    lappend result [testdoubleobj mult10 1] ;# converts with SetDoubleFromAny
332    lappend result [testobj type 1]
333} {1 10.0 double}
334test obj-19.3 {SetDoubleFromAny, recompute string rep then parse it} testobj {
335    set result ""
336    lappend result [testintobj set 1 456]
337    lappend result [testintobj div10 1]
338    lappend result [testdoubleobj mult10 1] ;# converts with SetDoubleFromAny
339    lappend result [testobj type 1]
340} {456 45 450.0 double}
341test obj-19.4 {SetDoubleFromAny, error parsing string} testobj {
342    set result ""
343    lappend result [teststringobj set 1 abc]
344    lappend result [catch {testdoubleobj mult10 1} msg]
345    lappend result $msg
346} {abc 1 {expected floating-point number but got "abc"}}
347test obj-19.5 {SetDoubleFromAny, error parsing string} testobj {
348    set result ""
349    lappend result [teststringobj set 1 x1.0]
350    lappend result [catch {testdoubleobj mult10 1} msg]
351    lappend result $msg
352} {x1.0 1 {expected floating-point number but got "x1.0"}}
353test obj-19.6 {SetDoubleFromAny, error converting from "empty string"} testobj {
354    set result ""
355    lappend result [testobj newobj 1]
356    lappend result [catch {testdoubleobj div10 1} msg]
357    lappend result $msg
358} {{} 1 {expected floating-point number but got ""}}
359
360test obj-20.1 {UpdateStringOfDouble} testobj {
361    set result ""
362    lappend result [testdoubleobj set 1 3.14159]
363    lappend result [testdoubleobj mult10 1]
364    lappend result [testdoubleobj get 1]   ;# must update string rep
365} {3.14159 31.4159 31.4159}
366
367test obj-21.1 {Tcl_NewIntObj} testobj {
368    set result ""
369    lappend result [testobj freeallvars]
370    lappend result [testintobj set 1 55]
371    lappend result [testobj type 1]
372    lappend result [testobj refcount 1]
373} {{} 55 int 2}
374
375test obj-22.1 {Tcl_SetIntObj, existing "empty string" object} testobj {
376    set result ""
377    lappend result [testobj freeallvars]
378    lappend result [testobj newobj 1]
379    lappend result [testintobj set 1 77]  ;# makes existing obj int
380    lappend result [testobj type 1]
381    lappend result [testobj refcount 1]
382} {{} {} 77 int 2}
383test obj-22.2 {Tcl_SetIntObj, existing non-"empty string" object} testobj {
384    set result ""
385    lappend result [testobj freeallvars]
386    lappend result [testdoubleobj set 1 12.34]
387    lappend result [testintobj set 1 77]  ;# makes existing obj int
388    lappend result [testobj type 1]
389    lappend result [testobj refcount 1]
390} {{} 12.34 77 int 2}
391
392test obj-23.1 {Tcl_GetIntFromObj, existing int object} testobj {
393    set result ""
394    lappend result [testintobj set 1 22]
395    lappend result [testintobj mult10 1]   ;# gets existing int rep
396} {22 220}
397test obj-23.2 {Tcl_GetIntFromObj, convert to int} testobj {
398    set result ""
399    lappend result [testintobj set 1 477]
400    lappend result [testintobj div10 1]    ;# must convert to bool
401    lappend result [testobj type 1]
402} {477 47 int}
403test obj-23.3 {Tcl_GetIntFromObj, error converting to int} testobj {
404    set result ""
405    lappend result [teststringobj set 1 abc]
406    lappend result [catch {testintobj mult10 1} msg]
407    lappend result $msg
408} {abc 1 {expected integer but got "abc"}}
409test obj-23.4 {Tcl_GetIntFromObj, error converting from "empty string"} testobj {
410    set result ""
411    lappend result [testobj newobj 1]
412    lappend result [catch {testintobj div10 1} msg]
413    lappend result $msg
414} {{} 1 {expected integer but got ""}}
415test obj-23.5 {Tcl_GetIntFromObj, integer too large to represent as non-long error} {testobj} {
416    set result ""
417    lappend result [testobj newobj 1]
418    lappend result [testintobj inttoobigtest 1]
419} {{} 1}
420
421test obj-24.1 {DupIntInternalRep} testobj {
422    set result ""
423    lappend result [testintobj set 1 23]
424    lappend result [testobj duplicate 1 2]    ;# uses DupIntInternalRep
425    lappend result [testintobj get 2]
426} {23 23 23}
427
428test obj-25.1 {SetIntFromAny, int to int special case} testobj {
429    set result ""
430    lappend result [testintobj set 1 1234]
431    lappend result [testintobj mult10 1]  ;# converts with SetIntFromAny
432    lappend result [testobj type 1]
433} {1234 12340 int}
434test obj-25.2 {SetIntFromAny, boolean to int special case} testobj {
435    set result ""
436    lappend result [testbooleanobj set 1 1]
437    lappend result [testintobj mult10 1]  ;# converts with SetIntFromAny
438    lappend result [testobj type 1]
439} {1 10 int}
440test obj-25.3 {SetIntFromAny, recompute string rep then parse it} testobj {
441    set result ""
442    lappend result [testintobj set 1 456]
443    lappend result [testintobj div10 1]
444    lappend result [testintobj mult10 1]  ;# converts with SetIntFromAny
445    lappend result [testobj type 1]
446} {456 45 450 int}
447test obj-25.4 {SetIntFromAny, error parsing string} testobj {
448    set result ""
449    lappend result [teststringobj set 1 abc]
450    lappend result [catch {testintobj mult10 1} msg]
451    lappend result $msg
452} {abc 1 {expected integer but got "abc"}}
453test obj-25.5 {SetIntFromAny, error parsing string} testobj {
454    set result ""
455    lappend result [teststringobj set 1 x17]
456    lappend result [catch {testintobj mult10 1} msg]
457    lappend result $msg
458} {x17 1 {expected integer but got "x17"}}
459test obj-25.6 {SetIntFromAny, integer too large} {testobj} {
460    set result ""
461    lappend result [teststringobj set 1 123456789012345678901]
462    lappend result [catch {testintobj mult10 1} msg]
463    lappend result $msg
464} {123456789012345678901 1 {integer value too large to represent}}
465test obj-25.7 {SetIntFromAny, error converting from "empty string"} testobj {
466    set result ""
467    lappend result [testobj newobj 1]
468    lappend result [catch {testintobj div10 1} msg]
469    lappend result $msg
470} {{} 1 {expected integer but got ""}}
471
472test obj-26.1 {UpdateStringOfInt} testobj {
473    set result ""
474    lappend result [testintobj set 1 512]
475    lappend result [testintobj mult10 1]
476    lappend result [testintobj get 1]       ;# must update string rep
477} {512 5120 5120}
478
479test obj-27.1 {Tcl_NewWideObj} testobj {
480    set result ""
481    lappend result [testobj freeallvars]
482    testintobj setmax 1
483    lappend result [testintobj ismax 1]
484    lappend result [testobj type 1]
485    lappend result [testobj refcount 1]
486} {{} 1 int 1}
487
488test obj-28.1 {Tcl_SetLongObj, existing "empty string" object} testobj {
489    set result ""
490    lappend result [testobj freeallvars]
491    lappend result [testobj newobj 1]
492    lappend result [testintobj setint 1 77]  ;# makes existing obj int
493    lappend result [testobj type 1]
494    lappend result [testobj refcount 1]
495} {{} {} 77 int 2}
496test obj-28.2 {Tcl_SetLongObj, existing non-"empty string" object} testobj {
497    set result ""
498    lappend result [testobj freeallvars]
499    lappend result [testdoubleobj set 1 12.34]
500    lappend result [testintobj setint 1 77]  ;# makes existing obj int
501    lappend result [testobj type 1]
502    lappend result [testobj refcount 1]
503} {{} 12.34 77 int 2}
504
505test obj-29.1 {Tcl_GetWideIntFromObj, existing int object} testobj {
506    set result ""
507    lappend result [testintobj setint 1 22]
508    lappend result [testintobj mult10 1]   ;# gets existingint rep
509} {22 220}
510test obj-29.2 {Tcl_GetWideIntFromObj, convert to int} testobj {
511    set result ""
512    lappend result [testintobj setint 1 477]
513    lappend result [testintobj div10 1]    ;# must convert to bool
514    lappend result [testobj type 1]
515} {477 47 int}
516test obj-29.3 {Tcl_GetWideIntFromObj, error converting to int} testobj {
517    set result ""
518    lappend result [teststringobj set 1 abc]
519    lappend result [catch {testintobj ismax 1} msg] ;# cvts to long int
520    lappend result $msg
521} {abc 1 {expected integer but got "abc"}}
522test obj-29.4 {Tcl_GetWideIntFromObj, error converting from "empty string"} testobj {
523    set result ""
524    lappend result [testobj newobj 1]
525    lappend result [catch {testintobj ismax 1} msg] ;# cvts to long int
526    lappend result $msg
527} {{} 1 {expected integer but got ""}}
528
529test obj-30.1 {Ref counting and object deletion, simple types} testobj {
530    set result ""
531    lappend result [testobj freeallvars]
532    lappend result [testintobj set 1 1024]
533    lappend result [testobj assign 1 2]     ;# vars 1 and 2 share the int obj
534    lappend result [testobj type 2]
535    lappend result [testobj refcount 1]
536    lappend result [testobj refcount 2]
537    lappend result [testbooleanobj set 2 0] ;# must copy on write, now 2 objs
538    lappend result [testobj type 2]
539    lappend result [testobj refcount 1]
540    lappend result [testobj refcount 2]
541} {{} 1024 1024 int 4 4 0 int 3 2}
542
543test obj-32.1 {freeing very large object trees} {
544    set x {}
545    for {set i 0} {$i<100000} {incr i} {
546	set x [list $x {}]
547    }
548    unset x
549} {}
550
551test obj-33.1 {integer overflow on input} {longIs32bit wideIs64bit} {
552    set x 0x8000; append x 0000
553    list [string is integer $x] [expr { wide($x) }]
554} {1 2147483648}
555test obj-33.2 {integer overflow on input} {longIs32bit wideIs64bit} {
556    set x 0xffff; append x ffff
557    list [string is integer $x] [expr { wide($x) }]
558} {1 4294967295}
559test obj-33.3 {integer overflow on input} {
560    set x 0x10000; append x 0000
561    list [string is integer $x] [expr { wide($x) }]
562} {1 4294967296}
563test obj-33.4 {integer overflow on input} {longIs32bit wideIs64bit} {
564    set x -0x8000; append x 0000
565    list [string is integer $x] [expr { wide($x) }]
566} {1 -2147483648}
567test obj-33.5 {integer overflow on input} {longIs32bit wideIs64bit} {
568    set x -0x8000; append x 0001
569    list [string is integer $x] [expr { wide($x) }]
570} {1 -2147483649}
571test obj-33.6 {integer overflow on input} {longIs32bit wideIs64bit} {
572    set x -0xffff; append x ffff
573    list [string is integer $x] [expr { wide($x) }]
574} {1 -4294967295}
575test obj-33.7 {integer overflow on input} {
576    set x -0x10000; append x 0000
577    list [string is integer $x] [expr { wide($x) }]
578} {1 -4294967296}
579
580test obj-34.1 {mp_iseven} testobj {
581    set result ""
582    lappend result [testbignumobj set 1 0]
583    lappend result [testbignumobj iseven 1]    ;
584    lappend result [testobj type 1]
585} {0 1 int}
586test obj-34.2 {mp_radix_size} testobj {
587    set result ""
588    lappend result [testbignumobj set 1 9]
589    lappend result [testbignumobj radixsize 1]    ;
590    lappend result [testobj type 1]
591} {9 2 int}
592
593if {[testConstraint testobj]} {
594    testobj freeallvars
595}
596
597# cleanup
598::tcltest::cleanupTests
599return
600