Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/tcl8.5.2/tests/stringObj.test @ 47

Last change on this file since 47 was 25, checked in by landauf, 17 years ago

added tcl to libs

File size: 16.3 KB
Line 
1# Commands covered: none
2#
3# This file contains tests for the procedures in tclStringObj.c
4# that implement the Tcl type manager for the string type.
5#
6# Sourcing this file into Tcl runs the tests and generates output for
7# errors. No output means no errors were found.
8#
9# Copyright (c) 1995-1997 Sun Microsystems, Inc.
10# Copyright (c) 1998-1999 by Scriptics Corporation.
11#
12# See the file "license.terms" for information on usage and redistribution
13# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14#
15# RCS: @(#) $Id: stringObj.test,v 1.16 2004/05/19 20:15:32 dkf Exp $
16
17if {[lsearch [namespace children] ::tcltest] == -1} {
18    package require tcltest
19    namespace import -force ::tcltest::*
20}
21
22testConstraint testobj [llength [info commands testobj]]
23
24test stringObj-1.1 {string type registration} testobj {
25    set t [testobj types]
26    set first [string first "string" $t]
27    set result [expr {$first != -1}]
28} {1}
29
30test stringObj-2.1 {Tcl_NewStringObj} testobj {
31    set result ""
32    lappend result [testobj freeallvars]
33    lappend result [teststringobj set 1 abcd]
34    lappend result [testobj type 1]
35    lappend result [testobj refcount 1]
36} {{} abcd string 2}
37
38test stringObj-3.1 {Tcl_SetStringObj, existing "empty string" object} testobj {
39    set result ""
40    lappend result [testobj freeallvars]
41    lappend result [testobj newobj 1]
42    lappend result [teststringobj set 1 xyz] ;# makes existing obj a string
43    lappend result [testobj type 1]
44    lappend result [testobj refcount 1]
45} {{} {} xyz string 2}
46test stringObj-3.2 {Tcl_SetStringObj, existing non-"empty string" object} testobj {
47    set result ""
48    lappend result [testobj freeallvars]
49    lappend result [testintobj set 1 512]
50    lappend result [teststringobj set 1 foo]  ;# makes existing obj a string
51    lappend result [testobj type 1]
52    lappend result [testobj refcount 1]
53} {{} 512 foo string 2}
54
55test stringObj-4.1 {Tcl_SetObjLength procedure, string gets shorter} testobj {
56    testobj freeallvars
57    teststringobj set 1 test
58    teststringobj setlength 1 3
59    list [teststringobj length 1] [teststringobj length2 1] \
60            [teststringobj get 1]
61} {3 4 tes}
62test stringObj-4.2 {Tcl_SetObjLength procedure, string gets longer} testobj {
63    testobj freeallvars
64    teststringobj set 1 abcdef
65    teststringobj setlength 1 10
66    list [teststringobj length 1] [teststringobj length2 1]
67} {10 10}
68test stringObj-4.3 {Tcl_SetObjLength procedure, string gets longer} testobj {
69    testobj freeallvars
70    teststringobj set 1 abcdef
71    teststringobj append 1 xyzq -1
72    list [teststringobj length 1] [teststringobj length2 1] \
73            [teststringobj get 1]
74} {10 20 abcdefxyzq}
75test stringObj-4.4 {Tcl_SetObjLength procedure, "expty string", length 0} testobj {
76    testobj freeallvars
77    testobj newobj 1
78    teststringobj setlength 1 0
79    list [teststringobj length2 1] [teststringobj get 1]
80} {0 {}}
81
82test stringObj-5.1 {Tcl_AppendToObj procedure, type conversion} testobj {
83    testobj freeallvars
84    testintobj set2 1 43
85    teststringobj append 1 xyz -1
86    teststringobj get 1
87} {43xyz}
88test stringObj-5.2 {Tcl_AppendToObj procedure, length calculation} testobj {
89    testobj freeallvars
90    teststringobj set 1 {x y }
91    teststringobj append 1 bbCCddEE 4
92    teststringobj append 1 123 -1
93    teststringobj get 1
94} {x y bbCC123}
95test stringObj-5.3 {Tcl_AppendToObj procedure, reallocating space} testobj {
96    testobj freeallvars
97    teststringobj set 1 xyz
98    teststringobj setlength 1 15
99    teststringobj setlength 1 2
100    set result {}
101    teststringobj append 1 1234567890123 -1
102    lappend result [teststringobj length 1] [teststringobj length2 1]
103    teststringobj setlength 1 10
104    teststringobj append 1 abcdef -1
105    lappend result [teststringobj length 1] [teststringobj length2 1] \
106            [teststringobj get 1]
107} {15 15 16 32 xy12345678abcdef}
108
109test stringObj-6.1 {Tcl_AppendStringsToObj procedure, type conversion} testobj {
110    testobj freeallvars
111    teststringobj set2 1 [list a b]
112    teststringobj appendstrings 1 xyz { 1234 } foo
113    teststringobj get 1
114} {a bxyz 1234 foo}
115test stringObj-6.2 {Tcl_AppendStringsToObj procedure, counting space} testobj {
116    testobj freeallvars
117    teststringobj set 1 abc
118    teststringobj appendstrings 1
119    list [teststringobj length 1] [teststringobj get 1]
120} {3 abc}
121test stringObj-6.3 {Tcl_AppendStringsToObj procedure, counting space} testobj {
122    testobj freeallvars
123    teststringobj set 1 abc
124    teststringobj appendstrings 1 {} {} {} {}
125    list [teststringobj length 1] [teststringobj get 1]
126} {3 abc}
127test stringObj-6.4 {Tcl_AppendStringsToObj procedure, counting space} testobj {
128    testobj freeallvars
129    teststringobj set 1 abc
130    teststringobj appendstrings 1 { 123 } abcdefg
131    list [teststringobj length 1] [teststringobj get 1]
132} {15 {abc 123 abcdefg}}
133test stringObj-6.5 {Tcl_AppendStringsToObj procedure, don't double space if initial string empty} testobj {
134    testobj freeallvars
135    testobj newobj 1
136    teststringobj appendstrings 1 123 abcdefg
137    list [teststringobj length 1] [teststringobj length2 1] [teststringobj get 1]
138} {10 10 123abcdefg}
139test stringObj-6.6 {Tcl_AppendStringsToObj procedure, space reallocation} testobj {
140    testobj freeallvars
141    teststringobj set 1 abc
142    teststringobj setlength 1 10
143    teststringobj setlength 1 2
144    teststringobj appendstrings 1 34567890
145    list [teststringobj length 1] [teststringobj length2 1] \
146            [teststringobj get 1]
147} {10 10 ab34567890}
148test stringObj-6.7 {Tcl_AppendStringsToObj procedure, space reallocation} testobj {
149    testobj freeallvars
150    teststringobj set 1 abc
151    teststringobj setlength 1 10
152    teststringobj setlength 1 2
153    teststringobj appendstrings 1 34567890x
154    list [teststringobj length 1] [teststringobj length2 1] \
155            [teststringobj get 1]
156} {11 22 ab34567890x}
157test stringObj-6.8 {Tcl_AppendStringsToObj procedure, object totally empty} testobj {
158    testobj freeallvars
159    testobj newobj 1
160    teststringobj appendstrings 1 {}
161    list [teststringobj length2 1] [teststringobj get 1]
162} {0 {}}
163
164test stringObj-7.1 {SetStringFromAny procedure} testobj {
165    testobj freeallvars
166    teststringobj set2 1 [list a b]
167    teststringobj append 1 x -1
168    list [teststringobj length 1] [teststringobj length2 1] \
169            [teststringobj get 1]
170} {4 8 {a bx}}
171test stringObj-7.2 {SetStringFromAny procedure, null object} testobj {
172    testobj freeallvars
173    testobj newobj 1
174    teststringobj appendstrings 1 {}
175    list [teststringobj length 1] [teststringobj length2 1] \
176            [teststringobj get 1]
177} {0 0 {}}
178test stringObj-7.3 {SetStringFromAny called with non-string obj} testobj {
179    set x 2345
180    list [incr x] [testobj objtype $x] [string index $x end] \
181            [testobj objtype $x]
182} {2346 int 6 string}
183test stringObj-7.4 {SetStringFromAny called with string obj} testobj {
184    set x "abcdef"
185    list [string length $x] [testobj objtype $x] \
186            [string length $x] [testobj objtype $x]
187} {6 string 6 string}
188
189test stringObj-8.1 {DupStringInternalRep procedure} testobj {
190    testobj freeallvars
191    teststringobj set 1 {}
192    teststringobj append 1 abcde -1
193    testobj duplicate 1 2
194    list [teststringobj length 1] [teststringobj length2 1] \
195            [teststringobj ualloc 1] [teststringobj get 1] \
196            [teststringobj length 2] [teststringobj length2 2] \
197            [teststringobj ualloc 2] [teststringobj get 2]
198} {5 10 0 abcde 5 5 0 abcde}
199test stringObj-8.2 {DupUnicodeInternalRep, mixed width chars} testobj {
200    set x abcï¿®ghi
201    string length $x
202    set y $x
203    list [testobj objtype $x] [testobj objtype $y] [append x "®¿ï"] \
204            [set y] [testobj objtype $x] [testobj objtype $y]
205} {string string abcï¿®ghi®¿ï abcï¿®ghi string string}
206test stringObj-8.3 {DupUnicodeInternalRep, mixed width chars} testobj {
207    set x abcï¿®ghi
208    set y $x
209    string length $x
210    list [testobj objtype $x] [testobj objtype $y] [append x "®¿ï"] \
211            [set y] [testobj objtype $x] [testobj objtype $y]
212} {string string abcï¿®ghi®¿ï abcï¿®ghi string string}
213test stringObj-8.4 {DupUnicodeInternalRep, all byte-size chars} testobj {
214    set x abcdefghi
215    string length $x
216    set y $x
217    list [testobj objtype $x] [testobj objtype $y] [append x jkl] \
218            [set y] [testobj objtype $x] [testobj objtype $y]
219} {string string abcdefghijkl abcdefghi string string}
220test stringObj-8.5 {DupUnicodeInternalRep, all byte-size chars} testobj {
221    set x abcdefghi
222    set y $x
223    string length $x
224    list [testobj objtype $x] [testobj objtype $y] [append x jkl] \
225            [set y] [testobj objtype $x] [testobj objtype $y]
226} {string string abcdefghijkl abcdefghi string string}
227
228test stringObj-9.1 {TclAppendObjToObj, mixed src & dest} testobj {
229    set x abcï¿®ghi
230    set y ®¿ï
231    string length $x
232    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
233            [set y] [testobj objtype $x] [testobj objtype $y]
234} {string none abcï¿®ghi®¿ï ®¿ï string none}
235test stringObj-9.2 {TclAppendObjToObj, mixed src & dest} testobj {
236    set x abcï¿®ghi
237    string length $x
238    list [testobj objtype $x] [append x $x] [testobj objtype $x] \
239            [append x $x] [testobj objtype $x]
240} {string abcï¿®ghiabcï¿®ghi string\
241abcï¿®ghiabcï¿®ghiabcï¿®ghiabcï¿®ghi\
242string}
243test stringObj-9.3 {TclAppendObjToObj, mixed src & 1-byte dest} testobj {
244    set x abcdefghi
245    set y ®¿ï
246    string length $x
247    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
248            [set y] [testobj objtype $x] [testobj objtype $y]
249} {string none abcdefghi®¿ï ®¿ï string none}
250test stringObj-9.4 {TclAppendObjToObj, 1-byte src & dest} testobj {
251    set x abcdefghi
252    set y jkl
253    string length $x
254    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
255            [set y] [testobj objtype $x] [testobj objtype $y]
256} {string none abcdefghijkl jkl string none}
257test stringObj-9.5 {TclAppendObjToObj, 1-byte src & dest} testobj {
258    set x abcdefghi
259    string length $x
260    list [testobj objtype $x] [append x $x] [testobj objtype $x] \
261            [append x $x] [testobj objtype $x]
262} {string abcdefghiabcdefghi string abcdefghiabcdefghiabcdefghiabcdefghi\
263string}
264test stringObj-9.6 {TclAppendObjToObj, 1-byte src & mixed dest} testobj {
265    set x abcï¿®ghi
266    set y jkl
267    string length $x
268    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
269            [set y] [testobj objtype $x] [testobj objtype $y]
270} {string none abcï¿®ghijkl jkl string none}
271test stringObj-9.7 {TclAppendObjToObj, integer src & dest} testobj {
272    set x [expr {4 * 5}]
273    set y [expr {4 + 5}]
274    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
275            [testobj objtype $x] [append x $y] [testobj objtype $x] \
276            [testobj objtype $y]
277} {int int 209 string 2099 string int}
278test stringObj-9.8 {TclAppendObjToObj, integer src & dest} testobj {
279    set x [expr {4 * 5}]
280    list [testobj objtype $x] [append x $x] [testobj objtype $x] \
281            [append x $x] [testobj objtype $x]
282} {int 2020 string 20202020 string}
283test stringObj-9.9 {TclAppendObjToObj, integer src & 1-byte dest} testobj {
284    set x abcdefghi
285    set y [expr {4 + 5}]
286    string length $x
287    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
288            [set y] [testobj objtype $x] [testobj objtype $y]
289} {string int abcdefghi9 9 string int}
290test stringObj-9.10 {TclAppendObjToObj, integer src & mixed dest} testobj {
291    set x abcï¿®ghi
292    set y [expr {4 + 5}]
293    string length $x
294    list [testobj objtype $x] [testobj objtype $y] [append x $y] \
295            [set y] [testobj objtype $x] [testobj objtype $y]
296} {string int abcï¿®ghi9 9 string int}
297test stringObj-9.11 {TclAppendObjToObj, mixed src & 1-byte dest index check} testobj {
298    # bug 2678, in <=8.2.0, the second obj (the one to append) in
299    # Tcl_AppendObjToObj was not correctly checked to see if it was
300    # all one byte chars, so a unicode string would be added as one
301    # byte chars.
302    set x abcdef
303    set len [string length $x]
304    set y aübåcï
305    set len [string length $y]
306    append x $y
307    string length $x
308    set q {}
309    for {set i 0} {$i < 12} {incr i} {
310        lappend q [string index $x $i]
311    }
312    set q
313} {a b c d e f a ü b å c ï}
314
315test stringObj-10.1 {Tcl_GetRange with all byte-size chars} testobj {
316    set x "abcdef"
317    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
318            [testobj objtype $x] [testobj objtype $y]
319} [list none bcde string string]
320test stringObj-10.2 {Tcl_GetRange with some mixed width chars} testobj {
321    # Because this test does not use \uXXXX notation below instead of
322    # hardcoding the values, it may fail in multibyte locales.  However,
323    # we need to test that the parser produces untyped objects even when there
324    # are high-ASCII characters in the input (like "ï").  I don't know what
325    # else to do but inline those characters here.
326    set x "abcïïdef"
327    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
328            [testobj objtype $x] [testobj objtype $y]
329} [list none "bc\u00EF\u00EFde" string string]
330test stringObj-10.3 {Tcl_GetRange with some mixed width chars} testobj {
331    # set x "abcïïdef"
332    # Use \uXXXX notation below instead of hardcoding the values, otherwise
333    # the test will fail in multibyte locales.
334    set x "abc\u00EF\u00EFdef"
335    string length $x
336    list [testobj objtype $x] [set y [string range $x 1 end-1]] \
337            [testobj objtype $x] [testobj objtype $y]
338} [list string "bc\u00EF\u00EFde" string string]
339test stringObj-10.4 {Tcl_GetRange with some mixed width chars} testobj {
340    # set a "ïa¿b®cï¿d®"
341    # Use \uXXXX notation below instead of hardcoding the values, otherwise
342    # the test will fail in multibyte locales.
343    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
344    set result [list]
345    while {[string length $a] > 0} {
346        set a [string range $a 1 end-1]
347        lappend result $a
348    }
349    set result
350} [list a\u00BFb\u00AEc\u00EF\u00BFd    \
351        \u00BFb\u00AEc\u00EF\u00BF      \
352        b\u00AEc\u00EF                  \
353        \u00AEc                         \
354        {}]
355
356test stringObj-11.1 {UpdateStringOfString} testobj {
357    set x 2345
358    list [string index $x end] [testobj objtype $x] [incr x] \
359            [testobj objtype $x]
360} {5 string 2346 int}
361
362test stringObj-12.1 {Tcl_GetUniChar with byte-size chars} testobj {
363    set x "abcdefghi"
364    list [string index $x 0] [string index $x 1]
365} {a b}
366test stringObj-12.2 {Tcl_GetUniChar with byte-size chars} testobj {
367    set x "abcdefghi"
368    list [string index $x 3] [string index $x end]
369} {d i}
370test stringObj-12.3 {Tcl_GetUniChar with byte-size chars} testobj {
371    set x "abcdefghi"
372    list [string index $x end] [string index $x end-1]
373} {i h}
374test stringObj-12.4 {Tcl_GetUniChar with mixed width chars} testobj {
375    string index "ïa¿b®c®¿dï" 0
376} "ï"
377test stringObj-12.5 {Tcl_GetUniChar} testobj {
378    set x "ïa¿b®c®¿dï"
379    list [string index $x 4] [string index $x 0]
380} {® ï}
381test stringObj-12.6 {Tcl_GetUniChar} testobj {
382    string index "ïa¿b®cï¿d®" end
383} "®"
384
385test stringObj-13.1 {Tcl_GetCharLength with byte-size chars} testobj {
386    set a ""
387    list [string length $a] [string length $a]
388} {0 0}
389test stringObj-13.2 {Tcl_GetCharLength with byte-size chars} testobj {
390    string length "a"
391} 1
392test stringObj-13.3 {Tcl_GetCharLength with byte-size chars} testobj {
393    set a "abcdef"
394    list [string length $a] [string length $a]
395} {6 6}
396test stringObj-13.4 {Tcl_GetCharLength with mixed width chars} testobj {
397    string length "®"
398} 1
399test stringObj-13.5 {Tcl_GetCharLength with mixed width chars} testobj {
400    # string length "○○"
401    # Use \uXXXX notation below instead of hardcoding the values, otherwise
402    # the test will fail in multibyte locales.
403    string length "\u00EF\u00BF\u00AE\u00EF\u00BF\u00AE"
404} 6
405test stringObj-13.6 {Tcl_GetCharLength with mixed width chars} testobj {
406    # set a "ïa¿b®cï¿d®"
407    # Use \uXXXX notation below instead of hardcoding the values, otherwise
408    # the test will fail in multibyte locales.
409    set a "\u00EFa\u00BFb\u00AEc\u00EF\u00BFd\u00AE"
410    list [string length $a] [string length $a]
411} {10 10}
412test stringObj-13.7 {Tcl_GetCharLength with identity nulls} testobj {
413    # SF bug #684699
414    string length [encoding convertfrom identity \x00]
415} 1
416test stringObj-13.8 {Tcl_GetCharLength with identity nulls} testobj {
417    string length [encoding convertfrom identity \x01\x00\x02]
418} 3
419
420test stringObj-14.1 {Tcl_SetObjLength on pure unicode object} testobj {
421    teststringobj set 1 foo
422    teststringobj getunicode 1
423    teststringobj append 1 bar -1
424    teststringobj getunicode 1
425    teststringobj append 1 bar -1
426    teststringobj setlength 1 0
427    teststringobj append 1 bar -1
428    teststringobj get 1
429} {bar}
430
431if {[testConstraint testobj]} {
432    testobj freeallvars
433}
434
435# cleanup
436::tcltest::cleanupTests
437return
Note: See TracBrowser for help on using the repository browser.