build: Check for 32-bit time_t at configure time
[jimtcl.git] / tests / string.test
blob48451e40b694667b0267b84a4e78ab6115e5100f
1 # Commands covered:  string
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.
7 # Copyright (c) 1991-1993 The Regents of the University of California.
8 # Copyright (c) 1994 Sun Microsystems, Inc.
9 # Copyright (c) 1998-1999 by Scriptics Corporation.
11 # See the file "license.terms" for information on usage and redistribution
12 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 # RCS: @(#) $Id: string.test,v 1.23.2.1 2001/04/03 22:54:38 hobbs Exp $
16 source [file dirname [info script]]/testing.tcl
18 # Some tests require the testobj command
20 test string-1.1 {error conditions} {
21     list [catch {string gorp a b} msg]
22 } {1}
23 test string-1.2 {error conditions} {
24     list [catch {string} msg]
25 } {1}
27 test string-2.1 {string compare, too few args} {
28     list [catch {string compare a} msg]
29 } {1}
30 test string-2.2 {string compare, bad args} {
31     list [catch {string compare a b c} msg]
32 } {1}
33 test string-2.3 {string compare, bad args} {
34     list [catch {string compare -length -nocase str1 str2} msg]
35 } {1}
36 test string-2.4 {string compare, too many args} {
37     list [catch {string compare -length 10 -nocase str1 str2 str3} msg]
38 } {1}
39 test string-2.5 {string compare with length unspecified} {
40     list [catch {string compare -length 10 10} msg]
41 } {1}
42 test string-2.6 {string compare} {
43     string compare abcde abdef
44 } -1
45 test string-2.7 {string compare, shortest method name} {
46     string co abcde ABCDE
47 } 1
48 test string-2.8 {string compare} {
49     string compare abcde abcde
50 } 0
51 test string-2.9 {string compare with length} {
52     string compare -length 2 abcde abxyz
53 } 0
54 test string-2.10 {string compare with special index} {
55     list [catch {string compare -length end-3 abcde abxyz} msg]
56 } {1}
57 test string-2.12 {string compare, high bit} {
58     # This test will fail if the underlying comparaison
59     # is using signed chars instead of unsigned chars.
60     # (like SunOS's default memcmp thus the compat/memcmp.c)
61     string compare "\x80" "@"
62     # Nb this tests works also in utf8 space because \x80 is
63     # translated into a 2 or more bytelength but whose first byte has
64     # the high bit set.
65 } 1
66 test string-2.13 {string compare -nocase} {
67     string compare -nocase abcde abdef
68 } -1
69 test string-2.14 {string compare -nocase} {
70     string co -nocase abcde ABCDE
71 } 0
72 test string-2.15 {string compare -nocase} {
73     string compare -nocase abcde abcde
74 } 0
75 test string-2.16 {string compare -nocase with length} {
76     string compare -length 2 -nocase abcde Abxyz
77 } 0
78 test string-2.17 {string compare -nocase with length} {
79     string compare -nocase -length 3 abcde Abxyz
80 } -1
81 test string-2.18 {string compare -nocase with length <= 0} {
82     string compare -nocase -length -1 abcde AbCdEf
83 } -1
84 test string-2.19 {string compare -nocase with excessive length} {
85     string compare -nocase -length 50 AbCdEf abcde
86 } 1
87 test string-2.20 {string compare -len unicode} {
88     # These are strings that are 6 BYTELENGTH long, but the length
89     # shouldn't make a different because there are actually 3 CHARS long
90     string compare -len 5 \334\334\334 \334\334\374
91 } -1
92 test string-2.21 {string compare -nocase with special index} {
93     list [catch {string compare -nocase -length end-3 Abcde abxyz} msg]
94 } {1}
95 test string-2.22 {string compare, null strings} {
96     string compare "" ""
97 } 0
98 test string-2.23 {string compare, null strings} {
99     string compare "" foo
100 } -1
101 test string-2.24 {string compare, null strings} {
102     string compare foo ""
103 } 1
104 test string-2.25 {string compare -nocase, null strings} {
105     string compare -nocase "" ""
106 } 0
107 test string-2.26 {string compare -nocase, null strings} {
108     string compare -nocase "" foo
109 } -1
110 test string-2.27 {string compare -nocase, null strings} {
111     string compare -nocase foo ""
112 } 1
113 test string-2.28 {string equal with length, unequal strings} {
114     string compare -length 2 abc abde
115 } 0
116 test string-2.29 {string equal with length, unequal strings} {
117     string compare -length 2 ab abde
118 } 0
119 test string-2.30 {string compare - bytes vs chars} {
120     string compare abcd\u1000\u1100\u1200x abcd\u1000\u1100\u1200y
121 } -1
122 test string-2.31 {string compare - embedded nulls} {
123     string compare ab\0ghi0 ab\0ghi1
124 } -1
125 test string-2.31 {string compare - embedded nulls, nocase} {
126     string compare -nocase ab\0ghi0 AB\0GHi1
127 } -1
128 # only need a few tests on equal, since it uses the same code as
129 # string compare, but just modifies the return output
130 test string-3.1 {string equal} {
131     string equal abcde abdef
132 } 0
133 test string-3.2 {string equal} {
134     string eq abcde ABCDE
135 } 0
136 test string-3.3 {string equal} {
137     string equal abcde abcde
138 } 1
139 test string-3.4 {string equal -nocase} utf8 {
140     string equal -nocase \u00dc\u00dc\u00dc\u00dc\u00fc\u00fc\u00fc\u00fc \u00dc\u00dc\u00dc\u00dc\u00dc\u00dc\u00dc\u00dc
141 } 1
142 test string-3.5 {string equal -nocase} {
143     string equal -nocase abcde abdef
144 } 0
145 test string-3.6 {string equal -nocase} {
146     string eq -nocase abcde ABCDE
147 } 1
148 test string-3.7 {string equal -nocase} {
149     string equal -nocase abcde abcde
150 } 1
151 test string-3.8 {string equal with length, unequal strings} {
152     string equal -length 2 abc abde
153 } 1
154 test string-4.1 {string first, too few args} {
155     list [catch {string first a} msg]
156 } {1}
157 test string-4.2 {string first, bad args} {
158     list [catch {string first a b c} msg]
159 } {1}
160 test string-4.3 {string first, too many args} {
161     list [catch {string first a b 5 d} msg]
162 } {1}
163 test string-4.4 {string first} {
164     string first bq abcdefgbcefgbqrs
165 } 12
166 test string-4.5 {string first} {
167     string fir bcd abcdefgbcefgbqrs
168 } 1
169 test string-4.6 {string first} {
170     string f b abcdefgbcefgbqrs
171 } 1
172 test string-4.7 {string first} {
173     string first xxx x123xx345xxx789xxx012
174 } 9
175 test string-4.8 {string first} {
176     string first "" x123xx345xxx789xxx012
177 } -1
178 test string-4.14 {string first, start index} {
179     string first a abcabc end-4
180 } 3
181 test string-4.15 {string first, empty needle} {
182     string first "" b
183 } -1
184 test string-4.16 {string first, empty haystack} {
185     string first a ""
186 } -1
187 test string-4.17 {string first, needle bigger than haystack} {
188     string first aaa b
189 } -1
190 test string-4.18 {string first, negative index} {
191     string first a aaa -4
192 } 0
193 test string-4.19 {string first, not found} {
194     string first a bcd
195 } -1
197 test string-5.1 {string index} {
198     list [catch {string index} msg]
199 } {1}
200 test string-5.2 {string index} {
201     list [catch {string index a b c} msg]
202 } {1}
203 test string-5.3 {string index} {
204     string index abcde 0
205 } a
206 test string-5.4 {string index} {
207     string in abcde 4
208 } e
209 test string-5.5 {string index} {
210     string index abcde 5
211 } {}
212 test string-5.6 {string index} {
213     list [catch {string index abcde -10} msg]
214 } {0}
215 test string-5.7 {string index} {
216     list [catch {string index a xyz} msg]
217 } {1}
218 test string-5.8 {string index} {
219     string index abc end
220 } c
221 test string-5.9 {string index} {
222     string index abc end-1
223 } b
224 test string-5.17 {string index, bad integer} tcl {
225     list [catch {string index "abc" 08} msg]
226 } {1}
227 test string-5.18 {string index, bad integer} tcl {
228     list [catch {string index "abc" end-00289} msg]
229 } {1}
230 test string-6.1 {string is, too few args} jim {
231     list [catch {string is} msg] $msg
232 } {1 {wrong # args: should be "string is class ?-strict? str"}}
233 test string-6.2 {string is, too few args} jim {
234     list [catch {string is alpha} msg] $msg
235 } {1 {wrong # args: should be "string is class ?-strict? str"}}
236 test string-6.3 {string is, bad args} jim {
237     list [catch {string is alpha -failin str} msg] $msg
238 } {1 {wrong # args: should be "string is class ?-strict? str"}}
239 test string-6.4 {string is, too many args} jim {
240     list [catch {string is alpha -failin var -strict str more} msg] $msg
241 } {1 {wrong # args: should be "string is class ?-strict? str"}}
242 test string-6.5 {string is, class check} jim {
243     list [catch {string is bogus str} msg] $msg
244 } {1 {bad class "bogus": must be alnum, alpha, ascii, boolean, control, digit, double, graph, integer, lower, print, punct, space, upper, or xdigit}}
245 test string-6.6 {string is, ambiguous class} jim {
246     list [catch {string is al str} msg] $msg
247 } {1 {ambiguous class "al": must be alnum, alpha, ascii, boolean, control, digit, double, graph, integer, lower, print, punct, space, upper, or xdigit}}
248 test string-6.10 {string is, ok on empty} {
249     string is alpha {}
250 } 1
251 test string-6.11 {string is, -strict check against empty} {
252     string is alpha -strict {}
253 } 0
254 test string-6.12 {string is alnum, true} {
255     string is alnum abc123
256 } 1
257 test string-6.15 {string is alpha, true} {
258     string is alpha abc
259 } 1
260 test string-6.16 {string is ascii, true} {
261     string is ascii abc123
262 } 1
263 test string-6.17 {string is ascii, false} {
264     string is ascii 0123Ü567
265 } 0
266 test string-6.24 {string is digit, true} {
267     string is digit 0123456789
268 } 1
269 test string-6.25 {string is digit, false} {
270     list [string is digit 0123Ü567]
271 } {0}
272 test string-6.26 {string is digit, false} {
273     list [string is digit +123567]
274 } {0}
275 test string-6.27 {string is double, true} {
276     string is double 1
277 } 1
278 test string-6.28 {string is double, true} {
279     string is double [expr double(1)]
280 } 1
281 test string-6.29 {string is double, true} {
282     string is double 1.0
283 } 1
284 test string-6.30 {string is double, true} {
285     string is double [string compare a a]
286 } 1
287 test string-6.31 {string is double, true} {
288     string is double "   +1.0e-1  "
289 } 1
290 test string-6.32 {string is double, true} {
291     string is double "\n1.0\v"
292 } 1
293 test string-6.33 {string is double, false} {
294     list [string is double  1abc]
295 } {0}
296 test string-6.34 {string is double, false} {
297     list [string is double  abc]
298 } {0}
299 test string-6.35 {string is double, false} {
300     list [string is double  "   1.0e4e4  "]
301 } {0}
302 test string-6.36 {string is double, false} {
303     list [string is double  "\n"]
304 } {0}
305 test string-6.38 {string is double, false on underflow} jim {
306     list [string is double  123e-9999]
307 } {0}
308 test string-6.39 {string is double, false} {
309     # This test is non-portable because IRIX thinks 
310     # that .e1 is a valid double - this is really a bug
311     # on IRIX as .e1 should NOT be a valid double
313     list [string is double  .e1]
314 } {0}
315 test string-6.48 {string is integer, true} {
316     string is integer +1234567890
317 } 1
318 test string-6.49 {string is integer, true on type} {
319     string is integer [expr int(50.0)]
320 } 1
321 test string-6.50 {string is integer, true} {
322     string is integer [list -10]
323 } 1
324 test string-6.51 {string is integer, true as hex} {
325     string is integer 0xabcdef
326 } 1
327 test string-6.52 {string is integer, true as octal} {
328     string is integer 012345
329 } 1
330 test string-6.53 {string is integer, true with whitespace} {
331     string is integer "  \n1234\v"
332 } 1
333 test string-6.54 {string is integer, false} {
334     list [string is integer  123abc]
335 } 0
336 test string-6.56 {string is integer, false} {
337     list [string is integer  [expr double(1)]]
338 } 0
339 test string-6.57 {string is integer, false} {
340     list [string is integer  "    "]
341 } 0
342 test string-6.58 {string is integer, false on bad octal} jim {
343     list [string is integer  036963]
344 } 1
345 test string-6.59 {string is integer, false on bad octal} tcl {
346     list [string is integer  036963]
347 } 0
348 test string-6.60 {string is integer, false on bad hex} {
349     list [string is integer  0X345XYZ]
350 } 0
351 test string-6.61 {string is lower, true} {
352     string is lower abc
353 } 1
354 test string-6.62 {string is lower, false} {
355     list [string is lower  aBc]
356 } 0
357 test string-6.63 {string is lower, false} {
358     list [string is lower  abc1]
359 } 0
360 test string-6.64 {string is lower, unicode false} {
361     list [string is lower  abÜUE]
362 } 0
363 test string-6.65 {string is space, true} {
364     string is space " \t\n\v\f"
365 } 1
366 test string-6.66 {string is space, false} {
367     list [string is space  " \t\n\v1\f"]
368 } 0
369 test string-6.75 {string is upper, true} {
370     string is upper ABC
371 } 1
372 test string-6.77 {string is upper, false} {
373     list [string is upper  AbC]
374 } 0
375 test string-6.78 {string is upper, false} {
376     list [string is upper  AB2C]
377 } 0
378 test string-6.84 {string is control} {
379     ## Control chars are in the ranges
380     ## 00..1F && 7F..9F
381     list [string is control  \x00\x01\x10\x1F\x7F\x80\x9F\x60]
382 } 0
383 test string-6.85 {string is control} tcl {
384     string is control \u0100
385 } 0
386 test string-6.86 {string is graph} {
387     ## graph is any print char, except space
388     list [string is gra  "0123abc!@#\$ "]
389 } 0
390 test string-6.87 {string is print} {
391     ## basically any printable char
392     list [string is print  "0123abc!@#\$ \010"]
393 } 0
394 test string-6.88 {string is punct} {
395     ## any graph char that isn't alnum
396     list [string is punct  "_!@#\000beq0"]
397 } 0
398 test string-6.89 {string is xdigit} {
399     list [string is xdigit  0123456789\u0061bcdefABCDEFg]
400 } 0
401 test string-6.90 {string is boolean, true} {
402     list [string is boolean 0]
403 } 1
404 test string-6.91 {string is boolean, true} {
405     list [string is boolean false]
406 } 1
407 test string-6.92 {string is boolean, true} {
408     list [string is boolean no]
409 } 1
410 test string-6.93 {string is boolean, true} {
411     list [string is boolean off]
412 } 1
413 test string-6.94 {string is boolean, true} {
414     list [string is boolean 1]
415 } 1
416 test string-6.95 {string is boolean, true} {
417     list [string is boolean true]
418 } 1
419 test string-6.96 {string is boolean, true} {
420     list [string is boolean yes]
421 } 1
422 test string-6.97 {string is boolean, true} {
423     list [string is boolean on]
424 } 1
425 test string-6.98 {string is boolean, not boolean string, false} {
426     list [string is boolean a]
427 } 0
428 test string-6.99 {string is boolean, special character, false} {
429     list [string is boolean -]
430 } 0
431 test string-6.10 {string is boolean, mixed case, false} {
432     list [string is boolean True]
433 } 0
434 test string-7.1 {string last, too few args} {
435     list [catch {string last a} msg]
436 } {1}
437 test string-7.2 {string last, bad args} {
438     list [catch {string last a b c} msg]
439 } {1}
440 test string-7.3 {string last, too many args} {
441     list [catch {string last a b c d} msg]
442 } {1}
443 test string-7.4 {string last} {
444     string la xxx xxxx123xx345x678
445 } 1
446 test string-7.5 {string last} {
447     string last xx xxxx123xx345x678
448 } 7
449 test string-7.6 {string last} {
450     string las x xxxx123xx345x678
451 } 12
452 test string-7.13 {string last, start index} {
453     ## Constrain to last 'a' should work
454     string last ba badbad end-1
455 } 3
456 test string-7.14 {string last, start index} {
457     ## Constrain to last 'b' should skip last 'ba'
458     string last ba badbad end-2
459 } 0
460 test string-7.15 {string last, start index} {
461     string last \u00dca \u00dcad\u00dcad 0
462 } -1
463 test string-7.16 {string last, start index} utf8 {
464     string last \u00dca \u00dcad\u00dcad end-1
465 } 3
466 test string-7.17 {string last, too few args} {
467     string last abc def
468 } -1
469 test string-9.1 {string length} {
470     list [catch {string length} msg]
471 } {1}
472 test string-9.2 {string length} {
473     list [catch {string length a b} msg]
474 } {1}
475 test string-9.3 {string length} {
476     string length "a little string"
477 } 15
478 test string-9.4 {string length} {
479     string le ""
480 } 0
482 test string-10.1 {string map, too few args} {
483     list [catch {string map} msg]
484 } {1}
485 test string-10.2 {string map, bad args} {
486     list [catch {string map {a b} abba oops} msg]
487 } {1}
488 test string-10.3 {string map, too many args} {
489     list [catch {string map -nocase {a b} str1 str2} msg]
490 } {1}
491 test string-10.4 {string map} {
492     string map {a b} abba
493 } {bbbb}
494 test string-10.5 {string map} {
495     string map {a b} a
496 } {b}
497 test string-10.6 {string map -nocase} {
498     string map -nocase {a b} Abba
499 } {bbbb}
500 test string-10.7 {string map} {
501     string map {abc 321 ab * a A} aabcabaababcab
502 } {A321*A*321*}
503 test string-10.8 {string map -nocase} {
504     string map -nocase {aBc 321 Ab * a A} aabcabaababcab
505 } {A321*A*321*}
506 test string-10.9 {string map -nocase} {
507     string map -no {abc 321 Ab * a A} aAbCaBaAbAbcAb
508 } {A321*A*321*}
509 test string-10.10 {string map} {
510     list [catch {string map {a b c} abba} msg]
511 } {1}
512 test string-10.11 {string map, nulls} {
513     string map {\x00 NULL blah \x00nix} {qwerty}
514 } {qwerty}
515 test string-10.12 {string map, unicode} {
516     string map [list \u00fc ue UE \u00dc] "a\u00fcueUE\000EU"
517 } aueue\u00dc\0EU
518 test string-10.13 {string map, -nocase unicode} {
519     string map -nocase [list \u00fc ue UE \u00dc] "a\u00fcueUE\000EU"
520 } aue\u00dc\u00dc\0EU
521 test string-10.14 {string map, -nocase null arguments} {
522     string map -nocase {{} abc} foo
523 } foo
524 test string-10.15 {string map, one pair case} {
525     string map -nocase {abc 32} aAbCaBaAbAbcAb
526 } {a32aBaAb32Ab}
527 test string-10.16 {string map, one pair case} {
528     string map -nocase {ab 4321} aAbCaBaAbAbcAb
529 } {a4321C4321a43214321c4321}
530 test string-10.17 {string map, one pair case} {
531     string map {Ab 4321} aAbCaBaAbAbcAb
532 } {a4321CaBa43214321c4321}
533 test string-10.18 {string map, nulls in string} {
534     string map {a bc} ade\0ghia\0jkl
535 } "bcde\0ghibc\0jkl"
536 test string-10.19 {string map, nulls in map source} {
537     string map {\0 bc} ade\0ghia\0jkl
538 } "adebcghiabcjkl"
539 test string-10.20 {string map, nulls in map dest} {
540     string map {a A\0A} adeghiajkl
541 } "A\0AdeghiA\0Ajkl"
542 test string-10.21 {string map, null bytes} {
543     string map "\u0000afternull #" foo\u0000afternull\u0000123456789bar
544 } foo#\u0000123456789bar
546 test string-11.1 {string match, too few args} {
547     list [catch {string match a} msg]
548 } {1}
549 test string-11.2 {string match, too many args} {
550     list [catch {string match a b c d} msg]
551 } {1}
552 test string-11.3 {string match} {
553     string match abc abc
554 } 1
555 test string-11.4 {string match} {
556     string mat abc abd
557 } 0
558 test string-11.5 {string match} {
559     string match ab*c abc
560 } 1
561 test string-11.6 {string match} {
562     string match ab**c abc
563 } 1
564 test string-11.7 {string match} {
565     string match ab* abcdef
566 } 1
567 test string-11.8 {string match} {
568     string match *c abc
569 } 1
570 test string-11.9 {string match} {
571     string match *3*6*9 0123456789
572 } 1
573 test string-11.10 {string match} {
574     string match *3*6*9 01234567890
575 } 0
576 test string-11.11 {string match} {
577     string match a?c abc
578 } 1
579 test string-11.12 {string match} {
580     string match a??c abc
581 } 0
582 test string-11.13 {string match} {
583     string match ?1??4???8? 0123456789
584 } 1
585 test string-11.14 {string match} {
586     string match {[abc]bc} abc
587 } 1
588 test string-11.15 {string match} {
589     string match {a[abc]c} abc
590 } 1
591 test string-11.16 {string match} {
592     string match {a[xyz]c} abc
593 } 0
594 test string-11.17 {string match} {
595     string match {12[2-7]45} 12345
596 } 1
597 test string-11.18 {string match} {
598     string match {12[ab2-4cd]45} 12345
599 } 1
600 test string-11.19 {string match} {
601     string match {12[ab2-4cd]45} 12b45
602 } 1
603 test string-11.20 {string match} {
604     string match {12[ab2-4cd]45} 12d45
605 } 1
606 test string-11.21 {string match} {
607     string match {12[ab2-4cd]45} 12145
608 } 0
609 test string-11.22 {string match} {
610     string match {12[ab2-4cd]45} 12545
611 } 0
612 test string-11.23 {string match} {
613     string match {a\*b} a*b
614 } 1
615 test string-11.24 {string match} {
616     string match {a\*b} ab
617 } 0
618 test string-11.25 {string match} {
619     string match {a\*\?\[\]\\\x} "a*?\[\]\\x"
620 } 1
621 test string-11.26 {string match} {
622     string match ** ""
623 } 1
624 test string-11.27 {string match} {
625     string match *. ""
626 } 0
627 test string-11.28 {string match} {
628     string match "" ""
629 } 1
630 test string-11.29 {string match} {
631     string match \[a a
632 } 1
633 test string-11.30 {string match, bad args} {
634     list [catch {string match - b c} msg]
635 } {1}
636 test string-11.31 {string match case} {
637     string match a A
638 } 0
639 test string-11.32 {string match nocase} {
640     string match -nocase a A
641 } 1
642 test string-11.34 {string match nocase} {
643     string match -nocase a*f ABCDEf
644 } 1
645 test string-11.35 {string match case, false hope} {
646     # This is true because '_' lies between the A-Z and a-z ranges
647     string match {[A-z]} _
648 } 1
649 test string-11.36 {string match nocase range} {
650     # This is false because although '_' lies between the A-Z and a-z ranges,
651     # we lower case the end points before checking the ranges.
652     string match -nocase {[A-z]} _
653 } 0
654 test string-11.37 {string match nocase} {
655     string match -nocase {[A-fh-Z]} g
656 } 0
657 test string-11.38 {string match case, reverse range} {
658     string match {[A-fh-Z]} g
659 } 1
660 test string-11.39 {string match, *\ case} {
661     string match {*\abc} abc
662 } 1
663 test string-11.40 {string match, *special case} {
664     string match {*[ab]} abc
665 } 0
666 test string-11.41 {string match, *special case} {
667     string match {*[ab]*} abc
668 } 1
669 # I don't see why this shouldn't match. Ignored for jim
670 test string-11.42 {string match, *special case} tcl {
671     string match "*\\" "\\"
672 } 0
673 test string-11.43 {string match, *special case} {
674     string match "*\\\\" "\\"
675 } 1
676 test string-11.44 {string match, *special case} {
677     string match "*???" "12345"
678 } 1
679 test string-11.45 {string match, *special case} {
680     string match "*???" "12"
681 } 0
682 test string-11.46 {string match, *special case} {
683     string match "*\\*" "abc*"
684 } 1
685 test string-11.47 {string match, *special case} {
686     string match "*\\*" "*"
687 } 1
688 test string-11.48 {string match, *special case} {
689     string match "*\\*" "*abc"
690 } 0
691 test string-11.49 {string match, *special case} {
692     string match "?\\*" "a*"
693 } 1
694 # I don't see why this shouldn't match. Ignored for jim
695 test string-11.50 {string match, *special case} tcl {
696     string match "\\" "\\"
697 } 0
700 test string-12.1 {string range} {
701     list [catch {string range} msg]
702 } {1}
703 test string-12.2 {string range} {
704     list [catch {string range a 1} msg]
705 } {1}
706 test string-12.3 {string range} {
707     list [catch {string range a 1 2 3} msg]
708 } {1}
709 test string-12.4 {string range} {
710     string range abcdefghijklmnop 2 14
711 } {cdefghijklmno}
712 test string-12.5 {string range, last > length} {
713     string range abcdefghijklmnop 7 1000
714 } {hijklmnop}
715 test string-12.6 {string range} {
716     string range abcdefghijklmnop 10 end
717 } {klmnop}
718 test string-12.7 {string range, last < first} {
719     string range abcdefghijklmnop 10 9
720 } {}
721 test string-12.8 {string range, first < 0} {
722     string range abcdefghijklmnop -3 2
723 } {abc}
724 test string-12.9 {string range} {
725     string range abcdefghijklmnop -3 -2
726 } {}
727 test string-12.10 {string range} {
728     string range abcdefghijklmnop 1000 1010
729 } {}
730 test string-12.11 {string range} {
731     string range abcdefghijklmnop -100 end
732 } {abcdefghijklmnop}
733 test string-12.12 {string range} {
734     list [catch {string range abc abc 1} msg]
735 } {1}
736 test string-12.13 {string range} {
737     list [catch {string range abc 1 eof} msg]
738 } {1}
739 test string-12.14 {string range} {
740     string range abcdefghijklmnop end-1 end
741 } {op}
742 test string-12.15 {string range} {
743     string range abcdefghijklmnop end 1000
744 } {p}
745 test string-12.16 {string range} {
746     string range abcdefghijklmnop end end-1
747 } {}
749 test string-13.1 {string repeat} {
750     list [catch {string repeat} msg]
751 } {1}
752 test string-13.2 {string repeat} {
753     list [catch {string repeat abc 10 oops} msg]
754 } {1}
755 test string-13.3 {string repeat} {
756     string repeat {} 100
757 } {}
758 test string-13.4 {string repeat} {
759     string repeat { } 5
760 } {     }
761 test string-13.5 {string repeat} {
762     string repeat abc 3
763 } {abcabcabc}
764 test string-13.6 {string repeat} {
765     string repeat abc -1
766 } {}
767 test string-13.7 {string repeat} {
768     list [catch {string repeat abc end} msg]
769 } {1}
770 test string-13.8 {string repeat} {
771     string repeat {} -1000
772 } {}
773 test string-13.9 {string repeat} {
774     string repeat {} 0
775 } {}
776 test string-13.10 {string repeat} {
777     string repeat def 0
778 } {}
779 test string-13.11 {string repeat} {
780     string repeat def 1
781 } def
782 test string-13.12 {string repeat} {
783     string repeat ab\u7266cd 3
784 } ab\u7266cdab\u7266cdab\u7266cd
785 test string-13.13 {string repeat} {
786     string repeat \x00 3
787 } \x00\x00\x00
789 test string-14.1 {string replace} {
790     list [catch {string replace} msg] $msg
791 } {1 {wrong # args: should be "string replace string first last ?string?"}}
792 test string-14.2 {string replace} {
793     list [catch {string replace a 1} msg] $msg
794 } {1 {wrong # args: should be "string replace string first last ?string?"}}
795 test string-14.3 {string replace} {
796     list [catch {string replace a 1 2 3 4} msg] $msg
797 } {1 {wrong # args: should be "string replace string first last ?string?"}}
798 test string-14.4 {string replace} {
799 } {}
800 test string-14.5 {string replace} {
801     string replace abcdefghijklmnop 2 14
802 } {abp}
803 test string-14.6 {string replace} {
804     string replace abcdefghijklmnop 7 1000
805 } {abcdefg}
806 test string-14.7 {string replace} {
807     string replace abcdefghijklmnop 10 end
808 } {abcdefghij}
809 test string-14.8 {string replace} {
810     string replace abcdefghijklmnop 10 9
811 } {abcdefghijklmnop}
812 test string-14.9 {string replace} {
813     string replace abcdefghijklmnop -3 2
814 } {defghijklmnop}
815 test string-14.10 {string replace} {
816     string replace abcdefghijklmnop -3 -2
817 } {abcdefghijklmnop}
818 test string-14.11 {string replace} {
819     string replace abcdefghijklmnop 1000 1010
820 } {abcdefghijklmnop}
821 test string-14.12 {string replace} {
822     string replace abcdefghijklmnop -100 end
823 } {}
824 test string-14.13 {string replace} {
825     list [catch {string replace abc abc 1} msg] $msg
826 } {1 {bad index "abc": must be integer?[+-]integer? or end?[+-]integer?}}
827 test string-14.14 {string replace} {
828     list [catch {string replace abc 1 eof} msg] $msg
829 } {1 {bad index "eof": must be integer?[+-]integer? or end?[+-]integer?}}
830 test string-14.15 {string replace} {
831     string replace abcdefghijklmnop end-10 end-2 NEW
832 } {abcdeNEWop}
833 test string-14.16 {string replace} {
834     string replace abcdefghijklmnop 0 end foo
835 } {foo}
836 test string-14.17 {string replace} {
837     string replace abcdefghijklmnop end end-1
838 } {abcdefghijklmnop}
840 test string-15.1 {string tolower too few args} {
841     list [catch {string tolower} msg]
842 } {1}
843 test string-15.2 {string tolower bad args} {
844     list [catch {string tolower a b} msg]
845 } {1}
846 test string-15.3 {string tolower too many args} {
847     list [catch {string tolower ABC 1 end oops} msg]
848 } {1}
849 test string-15.4 {string tolower} {
850     string tolower ABCDeF
851 } {abcdef}
852 test string-15.5 {string tolower} {
853     string tolower "ABC  XyZ"
854 } {abc  xyz}
855 test string-15.6 {string tolower} {
856     string tolower {123#$&*()}
857 } {123#$&*()}
859 test string-16.1 {string toupper} {
860     list [catch {string toupper} msg]
861 } {1}
862 test string-16.2 {string toupper} {
863     list [catch {string toupper a b} msg]
864 } {1}
865 test string-16.4 {string toupper} {
866     string toupper abCDEf
867 } {ABCDEF}
868 test string-16.5 {string toupper} {
869     string toupper "abc xYz"
870 } {ABC XYZ}
871 test string-16.6 {string toupper} {
872     string toupper {123#$&*()}
873 } {123#$&*()}
875 test string-17.1 {string totitle} -body {
876     string totitle
877 }  -returnCodes error -match glob -result {wrong # args: should be "string totitle string*}
878 test string-17.3 {string totitle} {
879     string totitle abCDEf
880 } {Abcdef}
881 test string-17.4 {string totitle} {
882     string totitle "abc xYz"
883 } {Abc xyz}
884 test string-17.5 {string totitle} {
885     string totitle {123#$&*()}
886 } {123#$&*()}
888 test string-18.1 {string trim} {
889     list [catch {string trim} msg]
890 } {1}
891 test string-18.2 {string trim} {
892     list [catch {string trim a b c} msg]
893 } {1}
894 test string-18.3 {string trim} {
895     string trim "    XYZ      "
896 } {XYZ}
897 test string-18.4 {string trim} {
898     string trim "\t\nXYZ\t\n\r\n"
899 } {XYZ}
900 test string-18.5 {string trim} {
901     string trim "  A XYZ A    "
902 } {A XYZ A}
903 test string-18.6 {string trim} {
904     string trim "XXYYZZABC XXYYZZ" ZYX
905 } {ABC }
906 test string-18.7 {string trim} {
907     string trim "    \t\r      "
908 } {}
909 test string-18.8 {string trim} {
910     string trim {abcdefg} {}
911 } {abcdefg}
912 test string-18.9 {string trim} {
913     string trim {}
914 } {}
915 test string-18.10 {string trim} {
916     string trim ABC DEF
917 } {ABC}
918 test string-18.11 {string trim, unicode} {
919     string trim "\xe7\xe8 AB\xe7C \xe8\xe7" \xe7\xe8
920 } " AB\xe7C "
922 test string-19.1 {string trimleft} {
923     list [catch {string trimleft} msg]
924 } {1}
925 test string-19.2 {string trimleft} {
926     string trimleft "    XYZ      "
927 } {XYZ      }
929 test string-20.1 {string trimright errors} {
930     list [catch {string trimright} msg]
931 } {1}
932 test string-20.2 {string trimright errors} {
933     list [catch {string trimg a} msg]
934 } {1}
935 test string-20.3 {string trimright} {
936     string trimright "    XYZ      "
937 } {    XYZ}
938 test string-20.4 {string trimright} {
939     string trimright "   "
940 } {}
941 test string-20.5 {string trimright} {
942     string trimright ""
943 } {}
945 # Test for 8-bit clean and utf-8 trim chars
946 test string-21.1 {string trim embedded nulls} {
947     string trim " abc\x00def "
948 } "abc\x00def"
949 test string-21.2 {string trimleft embedded nulls} {
950     string trimleft " abc\x00def "
951 } "abc\x00def "
952 test string-21.3 {string trimright embedded nulls} {
953     string trimright " abc\x00def "
954 } " abc\x00def"
955 test string-21.4 {string trim utf-8} {
956     string trim "\u00b5\u00b6abc\x00def\u00b5\u00b5" "\u00b5\u00b6"
957 } "abc\x00def"
959 test string-22.1 {string replace} {
960     string replace //test.net/path/path2?query=url?otherquery 21 end
961 } {//test.net/path/path2}
963 test string-23.1 {string cat} {
964     string cat
965 } {}
967 test string-23.2 {string cat} {
968     string cat abc
969 } {abc}
971 test string-23.3 {string cat} {
972     string cat abc def
973 } {abcdef}
975 test string-23.4 {string cat} {
976     set abc 123
977     string cat $abc (def)
978 } {123(def)}
980 testreport