summaryrefslogtreecommitdiffstats
path: root/tests/stringComp.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/stringComp.test')
-rw-r--r--tests/stringComp.test626
1 files changed, 356 insertions, 270 deletions
diff --git a/tests/stringComp.test b/tests/stringComp.test
index fc2214c..165ef20 100644
--- a/tests/stringComp.test
+++ b/tests/stringComp.test
@@ -10,31 +10,48 @@
# their equivalent number in string.test.
#
# Copyright (c) 2001 by ActiveState Corporation.
+# Copyright (c) 2001 by Kevin B. Kenny. All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
-#
-# RCS: @(#) $Id: stringComp.test,v 1.3 2001/08/25 00:08:46 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
namespace import -force ::tcltest::*
}
-# Some tests require the testobj command
+::tcltest::loadTestedCommands
+catch [list package require -exact Tcltest [info patchlevel]]
-set ::tcltest::testConstraints(testobj) \
- [expr {[info commands testobj] != {}}]
+# Some tests require the testobj command
-test string-1.1 {error conditions} {
+testConstraint testobj [expr {[info commands testobj] != {}}]
+testConstraint memory [llength [info commands memory]]
+if {[testConstraint memory]} {
+ proc getbytes {} {
+ set lines [split [memory info] \n]
+ return [lindex $lines 3 3]
+ }
+ proc leaktest {script {iterations 3}} {
+ set end [getbytes]
+ for {set i 0} {$i < $iterations} {incr i} {
+ uplevel 1 $script
+ set tmp $end
+ set end [getbytes]
+ }
+ return [expr {$end - $tmp}]
+ }
+}
+
+test stringComp-1.1 {error conditions} {
proc foo {} {string gorp a b}
list [catch {foo} msg] $msg
-} {1 {bad option "gorp": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, tolower, toupper, totitle, trim, trimleft, trimright, wordend, or wordstart}}
-test string-1.2 {error conditions} {
+} {1 {unknown or ambiguous subcommand "gorp": must be bytelength, compare, equal, first, index, is, last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart}}
+test stringComp-1.2 {error conditions} {
proc foo {} {string}
list [catch {foo} msg] $msg
-} {1 {wrong # args: should be "string option arg ?arg ...?"}}
-test string-1.3 {error condition - undefined method during compile} {
+} {1 {wrong # args: should be "string subcommand ?arg ...?"}}
+test stringComp-1.3 {error condition - undefined method during compile} {
# We don't want this to complain about 'never' because it may never
# be called, or string may get redefined. This must compile OK.
proc foo {str i} {
@@ -44,283 +61,281 @@ test string-1.3 {error condition - undefined method during compile} {
foo abc 0
} a
-test string-2.1 {string compare, too few args} {
- proc foo {} {string compare a}
- list [catch {foo} msg] $msg
-} {1 {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"}}
-test string-2.2 {string compare, bad args} {
- proc foo {} {string compare a b c}
- list [catch {foo} msg] $msg
-} {1 {bad option "a": must be -nocase or -length}}
-test string-2.3 {string compare, bad args} {
- list [catch {string compare -length -nocase str1 str2} msg] $msg
-} {1 {expected integer but got "-nocase"}}
-test string-2.4 {string compare, too many args} {
- list [catch {string compare -length 10 -nocase str1 str2 str3} msg] $msg
-} {1 {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"}}
-test string-2.5 {string compare with length unspecified} {
- list [catch {string compare -length 10 10} msg] $msg
-} {1 {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"}}
-test string-2.6 {string compare} {
- proc foo {} {string compare abcde abdef}
- foo
-} -1
-test string-2.7 {string compare, shortest method name} {
- proc foo {} {string c abcde ABCDE}
- foo
-} 1
-test string-2.8 {string compare} {
- proc foo {} {string compare abcde abcde}
- foo
-} 0
-test string-2.9 {string compare with length} {
- proc foo {} {string compare -length 2 abcde abxyz}
- foo
-} 0
-test string-2.10 {string compare with special index} {
- proc foo {} {string compare -length end-3 abcde abxyz}
- list [catch {foo} msg] $msg
-} {1 {expected integer but got "end-3"}}
-test string-2.11 {string compare, unicode} {
- proc foo {} {string compare ab\u7266 ab\u7267}
- foo
-} -1
-test string-2.12 {string compare, high bit} {
- # This test will fail if the underlying comparaison
- # is using signed chars instead of unsigned chars.
- # (like SunOS's default memcmp thus the compat/memcmp.c)
- proc foo {} {string compare "\x80" "@"}
- foo
- # Nb this tests works also in utf8 space because \x80 is
- # translated into a 2 or more bytelength but whose first byte has
- # the high bit set.
-} 1
-test string-2.13 {string compare -nocase} {
- proc foo {} {string compare -nocase abcde abdef}
- foo
-} -1
-test string-2.14 {string compare -nocase} {
- proc foo {} {string c -nocase abcde ABCDE}
- foo
-} 0
-test string-2.15 {string compare -nocase} {
- proc foo {} {string compare -nocase abcde abcde}
- foo
-} 0
-test string-2.16 {string compare -nocase with length} {
- proc foo {} {string compare -length 2 -nocase abcde Abxyz}
- foo
-} 0
-test string-2.17 {string compare -nocase with length} {
- proc foo {} {string compare -nocase -length 3 abcde Abxyz}
- foo
-} -1
-test string-2.18 {string compare -nocase with length <= 0} {
- proc foo {} {string compare -nocase -length -1 abcde AbCdEf}
- foo
-} -1
-test string-2.19 {string compare -nocase with excessive length} {
- proc foo {} {string compare -nocase -length 50 AbCdEf abcde}
- foo
-} 1
-test string-2.20 {string compare -len unicode} {
- # These are strings that are 6 BYTELENGTH long, but the length
- # shouldn't make a different because there are actually 3 CHARS long
- proc foo {} {string compare -len 5 \334\334\334 \334\334\374}
- foo
-} -1
-test string-2.21 {string compare -nocase with special index} {
- proc foo {} {string compare -nocase -length end-3 Abcde abxyz}
- list [catch {foo} msg] $msg
-} {1 {expected integer but got "end-3"}}
-test string-2.22 {string compare, null strings} {
- proc foo {} {string compare "" ""}
- foo
-} 0
-test string-2.23 {string compare, null strings} {
- proc foo {} {string compare "" foo}
- foo
-} -1
-test string-2.24 {string compare, null strings} {
- proc foo {} {string compare foo ""}
- foo
-} 1
-test string-2.25 {string compare -nocase, null strings} {
- proc foo {} {string compare -nocase "" ""}
- foo
-} 0
-test string-2.26 {string compare -nocase, null strings} {
- proc foo {} {string compare -nocase "" foo}
- foo
-} -1
-test string-2.27 {string compare -nocase, null strings} {
- proc foo {} {string compare -nocase foo ""}
- foo
-} 1
-test string-2.28 {string compare with length, unequal strings} {
- proc foo {} {string compare -length 2 abc abde}
- foo
-} 0
-test string-2.29 {string compare with length, unequal strings} {
- proc foo {} {string compare -length 2 ab abde}
- foo
-} 0
-test string-2.30 {string compare with NUL character vs. other ASCII} {
- # Be careful here, since UTF-8 rep comparison with memcmp() of
- # these puts chars in the wrong order
- proc foo {} {string compare \x00 \x01}
- foo
-} -1
+## Test string compare|equal over equal constraints
+## Use result for string compare, and negate it for string equal
+## The body will be tested both in and outside a proc
+set i 0
+foreach {tname tbody tresult tcode} {
+ {too few args} {
+ string compare a
+ } {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"} {error}
+ {bad args} {
+ string compare a b c
+ } {bad option "a": must be -nocase or -length} {error}
+ {bad args} {
+ string compare -length -nocase str1 str2
+ } {expected integer but got "-nocase"} {error}
+ {too many args} {
+ string compare -length 10 -nocase str1 str2 str3
+ } {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"} {error}
+ {compare with length unspecified} {
+ string compare -length 10 10
+ } {wrong # args: should be "string compare ?-nocase? ?-length int? string1 string2"} {error}
+ {basic operation fail} {
+ string compare abcde abdef
+ } {-1} {}
+ {basic operation success} {
+ string compare abcde abcde
+ } {0} {}
+ {with length} {
+ string compare -length 2 abcde abxyz
+ } {0} {}
+ {with special index} {
+ string compare -length end-3 abcde abxyz
+ } {expected integer but got "end-3"} {error}
+ {unicode} {
+ string compare ab\u7266 ab\u7267
+ } {-1} {}
+ {unicode} {string compare \334 \u00dc} 0 {}
+ {unicode} {string compare \334 \u00fc} -1 {}
+ {unicode} {string compare \334\334\334\374\374 \334\334\334\334\334} 1 {}
+ {high bit} {
+ # This test will fail if the underlying comparaison
+ # is using signed chars instead of unsigned chars.
+ # (like SunOS's default memcmp thus the compat/memcmp.c)
+ string compare "\x80" "@"
+ # Nb this tests works also in utf8 space because \x80 is
+ # translated into a 2 or more bytelength but whose first byte has
+ # the high bit set.
+ } {1} {}
+ {-nocase 1} {string compare -nocase abcde abdef} {-1} {}
+ {-nocase 2} {string compare -nocase abcde Abdef} {-1} {}
+ {-nocase 3} {string compare -nocase abcde ABCDE} {0} {}
+ {-nocase 4} {string compare -nocase abcde abcde} {0} {}
+ {-nocase unicode} {
+ string compare -nocase \334 \u00dc
+ } 0 {}
+ {-nocase unicode} {
+ string compare -nocase \334\334\334\374\u00fc \334\334\334\334\334
+ } 0 {}
+ {-nocase with length} {
+ string compare -length 2 -nocase abcde Abxyz
+ } {0} {}
+ {-nocase with length} {
+ string compare -nocase -length 3 abcde Abxyz
+ } {-1} {}
+ {-nocase with length <= 0} {
+ string compare -nocase -length -1 abcde AbCdEf
+ } {-1} {}
+ {-nocase with excessive length} {
+ string compare -nocase -length 50 AbCdEf abcde
+ } {1} {}
+ {-len unicode} {
+ # These are strings that are 6 BYTELENGTH long, but the length
+ # shouldn't make a different because there are actually 3 CHARS long
+ string compare -len 5 \334\334\334 \334\334\374
+ } -1 {}
+ {-nocase with special index} {
+ string compare -nocase -length end-3 Abcde abxyz
+ } {expected integer but got "end-3"} error
+ {null strings} {
+ string compare "" ""
+ } 0 {}
+ {null strings} {
+ string compare "" foo
+ } -1 {}
+ {null strings} {
+ string compare foo ""
+ } 1 {}
+ {-nocase null strings} {
+ string compare -nocase "" ""
+ } 0 {}
+ {-nocase null strings} {
+ string compare -nocase "" foo
+ } -1 {}
+ {-nocase null strings} {
+ string compare -nocase foo ""
+ } 1 {}
+ {with length, unequal strings} {
+ string compare -length 2 abc abde
+ } 0 {}
+ {with length, unequal strings} {
+ string compare -length 2 ab abde
+ } 0 {}
+ {with NUL character vs. other ASCII} {
+ # Be careful here, since UTF-8 rep comparison with memcmp() of
+ # these puts chars in the wrong order
+ string compare \x00 \x01
+ } -1 {}
+ {high bit} {
+ string compare "a\x80" "a@"
+ } 1 {}
+ {high bit} {
+ string compare "a\x00" "a\x01"
+ } -1 {}
+ {high bit} {
+ string compare "\x00\x00" "\x00\x01"
+ } -1 {}
+ {binary equal} {
+ string compare [binary format a100 0] [binary format a100 0]
+ } 0 {}
+ {binary neq} {
+ string compare [binary format a100a 0 1] [binary format a100a 0 0]
+ } 1 {}
+ {binary neq inequal length} {
+ string compare [binary format a20a 0 1] [binary format a100a 0 0]
+ } 1 {}
+} {
+ if {$tname eq ""} { continue }
+ if {$tcode eq ""} { set tcode ok }
+ test stringComp-2.[incr i] "string compare, $tname" \
+ -body [list eval $tbody] \
+ -returnCodes $tcode -result $tresult
+ test stringComp-2.[incr i] "string compare bc, $tname" \
+ -body "[list proc foo {} $tbody];foo" \
+ -returnCodes $tcode -result $tresult
+ if {"error" ni $tcode} {
+ set tresult [expr {!$tresult}]
+ } else {
+ set tresult [string map {compare equal} $tresult]
+ }
+ set tbody [string map {compare equal} $tbody]
+ test stringComp-2.[incr i] "string equal, $tname" \
+ -body [list eval $tbody] \
+ -returnCodes $tcode -result $tresult
+ test stringComp-2.[incr i] "string equal bc, $tname" \
+ -body "[list proc foo {} $tbody];foo" \
+ -returnCodes $tcode -result $tresult
+}
-# only need a few tests on equal, since it uses the same code as
-# string compare, but just modifies the return output
-test string-3.1 {string equal} {
- proc foo {} {string equal abcde abdef}
- foo
-} 0
-test string-3.2 {string equal} {
- proc foo {} {string eq abcde ABCDE}
- foo
-} 0
-test string-3.3 {string equal} {
- proc foo {} {string equal abcde abcde}
- foo
-} 1
-test string-3.4 {string equal -nocase} {
- proc foo {} {string equal -nocase \334\334\334\334\374\374\374\374 \334\334\334\334\334\334\334\334}
+# need a few extra tests short abbr cmd
+test stringComp-3.1 {string compare, shortest method name} {
+ proc foo {} {string c abcde ABCDE}
foo
} 1
-test string-3.5 {string equal -nocase} {
- proc foo {} {string equal -nocase abcde abdef}
+test stringComp-3.2 {string equal, shortest method name} {
+ proc foo {} {string e abcde ABCDE}
foo
} 0
-test string-3.6 {string equal -nocase} {
+test stringComp-3.3 {string equal -nocase} {
proc foo {} {string eq -nocase abcde ABCDE}
foo
} 1
-test string-3.7 {string equal -nocase} {
- proc foo {} {string equal -nocase abcde abcde}
- foo
-} 1
-test string-3.8 {string equal with length, unequal strings} {
- proc foo {} {string equal -length 2 abc abde}
- foo
-} 1
-test string-4.1 {string first, too few args} {
+test stringComp-4.1 {string first, too few args} {
proc foo {} {string first a}
list [catch {foo} msg] $msg
-} {1 {wrong # args: should be "string first subString string ?startIndex?"}}
-test string-4.2 {string first, bad args} {
+} {1 {wrong # args: should be "string first needleString haystackString ?startIndex?"}}
+test stringComp-4.2 {string first, bad args} {
proc foo {} {string first a b c}
list [catch {foo} msg] $msg
-} {1 {bad index "c": must be integer or end?-integer?}}
-test string-4.3 {string first, too many args} {
+} {1 {bad index "c": must be integer?[+-]integer? or end?[+-]integer?}}
+test stringComp-4.3 {string first, too many args} {
proc foo {} {string first a b 5 d}
list [catch {foo} msg] $msg
-} {1 {wrong # args: should be "string first subString string ?startIndex?"}}
-test string-4.4 {string first} {
+} {1 {wrong # args: should be "string first needleString haystackString ?startIndex?"}}
+test stringComp-4.4 {string first} {
proc foo {} {string first bq abcdefgbcefgbqrs}
foo
} 12
-test string-4.5 {string first} {
+test stringComp-4.5 {string first} {
proc foo {} {string fir bcd abcdefgbcefgbqrs}
foo
} 1
-test string-4.6 {string first} {
+test stringComp-4.6 {string first} {
proc foo {} {string f b abcdefgbcefgbqrs}
foo
} 1
-test string-4.7 {string first} {
+test stringComp-4.7 {string first} {
proc foo {} {string first xxx x123xx345xxx789xxx012}
foo
} 9
-test string-4.8 {string first} {
+test stringComp-4.8 {string first} {
proc foo {} {string first "" x123xx345xxx789xxx012}
foo
} -1
-test string-4.9 {string first, unicode} {
+test stringComp-4.9 {string first, unicode} {
proc foo {} {string first x abc\u7266x}
foo
} 4
-test string-4.10 {string first, unicode} {
+test stringComp-4.10 {string first, unicode} {
proc foo {} {string first \u7266 abc\u7266x}
foo
} 3
-test string-4.11 {string first, start index} {
+test stringComp-4.11 {string first, start index} {
proc foo {} {string first \u7266 abc\u7266x 3}
foo
} 3
-test string-4.12 {string first, start index} {
+test stringComp-4.12 {string first, start index} {
proc foo {} {string first \u7266 abc\u7266x 4}
foo
} -1
-test string-4.13 {string first, start index} {
+test stringComp-4.13 {string first, start index} {
proc foo {} {string first \u7266 abc\u7266x end-2}
foo
} 3
-test string-4.14 {string first, negative start index} {
+test stringComp-4.14 {string first, negative start index} {
proc foo {} {string first b abc -1}
foo
} 1
-test string-5.1 {string index} {
+test stringComp-5.1 {string index} {
proc foo {} {string index}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string index string charIndex"}}
-test string-5.2 {string index} {
+test stringComp-5.2 {string index} {
proc foo {} {string index a b c}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string index string charIndex"}}
-test string-5.3 {string index} {
+test stringComp-5.3 {string index} {
proc foo {} {string index abcde 0}
foo
} a
-test string-5.4 {string index} {
+test stringComp-5.4 {string index} {
proc foo {} {string in abcde 4}
foo
} e
-test string-5.5 {string index} {
+test stringComp-5.5 {string index} {
proc foo {} {string index abcde 5}
foo
} {}
-test string-5.6 {string index} {
+test stringComp-5.6 {string index} {
proc foo {} {string index abcde -10}
list [catch {foo} msg] $msg
} {0 {}}
-test string-5.7 {string index} {
+test stringComp-5.7 {string index} {
proc foo {} {string index a xyz}
list [catch {foo} msg] $msg
-} {1 {bad index "xyz": must be integer or end?-integer?}}
-test string-5.8 {string index} {
+} {1 {bad index "xyz": must be integer?[+-]integer? or end?[+-]integer?}}
+test stringComp-5.8 {string index} {
proc foo {} {string index abc end}
foo
} c
-test string-5.9 {string index} {
+test stringComp-5.9 {string index} {
proc foo {} {string index abc end-1}
foo
} b
-test string-5.10 {string index, unicode} {
+test stringComp-5.10 {string index, unicode} {
proc foo {} {string index abc\u7266d 4}
foo
} d
-test string-5.11 {string index, unicode} {
+test stringComp-5.11 {string index, unicode} {
proc foo {} {string index abc\u7266d 3}
foo
} \u7266
-test string-5.12 {string index, unicode over char length, under byte length} {
+test stringComp-5.12 {string index, unicode over char length, under byte length} {
proc foo {} {string index \334\374\334\374 6}
foo
} {}
-test string-5.13 {string index, bytearray object} {
+test stringComp-5.13 {string index, bytearray object} {
proc foo {} {string index [binary format a5 fuz] 0}
foo
} f
-test string-5.14 {string index, bytearray object} {
+test stringComp-5.14 {string index, bytearray object} {
proc foo {} {string index [binary format I* {0x50515253 0x52}] 3}
foo
} S
-test string-5.15 {string index, bytearray object} {
+test stringComp-5.15 {string index, bytearray object} {
proc foo {} {
set b [binary format I* {0x50515253 0x52}]
set i1 [string index $b end-6]
@@ -329,7 +344,7 @@ test string-5.15 {string index, bytearray object} {
}
foo
} 0
-test string-5.16 {string index, bytearray object with string obj shimmering} {
+test stringComp-5.16 {string index, bytearray object with string obj shimmering} {
proc foo {} {
set str "0123456789\x00 abcdedfghi"
binary scan $str H* dump
@@ -337,19 +352,19 @@ test string-5.16 {string index, bytearray object with string obj shimmering} {
}
foo
} 0
-test string-5.17 {string index, bad integer} {
- proc foo {} {string index "abc" 08}
+test stringComp-5.17 {string index, bad integer} -body {
+ proc foo {} {string index "abc" 0o8}
list [catch {foo} msg] $msg
-} {1 {bad index "08": must be integer or end?-integer? (looks like invalid octal number)}}
-test string-5.18 {string index, bad integer} {
- proc foo {} {string index "abc" end-00289}
+} -match glob -result {1 {*invalid octal number*}}
+test stringComp-5.18 {string index, bad integer} -body {
+ proc foo {} {string index "abc" end-0o0289}
list [catch {foo} msg] $msg
-} {1 {expected integer but got "-00289" (looks like invalid octal number)}}
-test string-5.19 {string index, bytearray object out of bounds} {
+} -match glob -result {1 {*invalid octal number*}}
+test stringComp-5.19 {string index, bytearray object out of bounds} {
proc foo {} {string index [binary format I* {0x50515253 0x52}] -1}
foo
} {}
-test string-5.20 {string index, bytearray object out of bounds} {
+test stringComp-5.20 {string index, bytearray object out of bounds} {
proc foo {} {string index [binary format I* {0x50515253 0x52}] 20}
foo
} {}
@@ -374,50 +389,50 @@ catch {rename largest_int {}}
## string length
## not yet bc
-test string-8.1 {string bytelength} {
+test stringComp-8.1 {string bytelength} {
proc foo {} {string bytelength}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string bytelength string"}}
-test string-8.2 {string bytelength} {
+test stringComp-8.2 {string bytelength} {
proc foo {} {string bytelength a b}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string bytelength string"}}
-test string-8.3 {string bytelength} {
+test stringComp-8.3 {string bytelength} {
proc foo {} {string bytelength "\u00c7"}
foo
} 2
-test string-8.4 {string bytelength} {
+test stringComp-8.4 {string bytelength} {
proc foo {} {string b ""}
foo
} 0
## string length
##
-test string-9.1 {string length} {
+test stringComp-9.1 {string length} {
proc foo {} {string length}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string length string"}}
-test string-9.2 {string length} {
+test stringComp-9.2 {string length} {
proc foo {} {string length a b}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string length string"}}
-test string-9.3 {string length} {
+test stringComp-9.3 {string length} {
proc foo {} {string length "a little string"}
foo
} 15
-test string-9.4 {string length} {
+test stringComp-9.4 {string length} {
proc foo {} {string le ""}
foo
} 0
-test string-9.5 {string length, unicode} {
+test stringComp-9.5 {string length, unicode} {
proc foo {} {string le "abcd\u7266"}
foo
} 5
-test string-9.6 {string length, bytearray object} {
+test stringComp-9.6 {string length, bytearray object} {
proc foo {} {string length [binary format a5 foo]}
foo
} 5
-test string-9.7 {string length, bytearray object} {
+test stringComp-9.7 {string length, bytearray object} {
proc foo {} {string length [binary format I* {0x50515253 0x52}]}
foo
} 8
@@ -427,218 +442,284 @@ test string-9.7 {string length, bytearray object} {
## string match
##
-test string-11.1 {string match, too few args} {
+test stringComp-11.1 {string match, too few args} {
proc foo {} {string match a}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
-test string-11.2 {string match, too many args} {
+test stringComp-11.2 {string match, too many args} {
proc foo {} {string match a b c d}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "string match ?-nocase? pattern string"}}
-test string-11.3 {string match} {
+test stringComp-11.3 {string match} {
proc foo {} {string match abc abc}
foo
} 1
-test string-11.4 {string match} {
+test stringComp-11.4 {string match} {
proc foo {} {string mat abc abd}
foo
} 0
-test string-11.5 {string match} {
+test stringComp-11.5 {string match} {
proc foo {} {string match ab*c abc}
foo
} 1
-test string-11.6 {string match} {
+test stringComp-11.6 {string match} {
proc foo {} {string match ab**c abc}
foo
} 1
-test string-11.7 {string match} {
+test stringComp-11.7 {string match} {
proc foo {} {string match ab* abcdef}
foo
} 1
-test string-11.8 {string match} {
+test stringComp-11.8 {string match} {
proc foo {} {string match *c abc}
foo
} 1
-test string-11.9 {string match} {
+test stringComp-11.9 {string match} {
proc foo {} {string match *3*6*9 0123456789}
foo
} 1
-test string-11.10 {string match} {
+test stringComp-11.10 {string match} {
proc foo {} {string match *3*6*9 01234567890}
foo
} 0
-test string-11.11 {string match} {
+test stringComp-11.11 {string match} {
proc foo {} {string match a?c abc}
foo
} 1
-test string-11.12 {string match} {
+test stringComp-11.12 {string match} {
proc foo {} {string match a??c abc}
foo
} 0
-test string-11.13 {string match} {
+test stringComp-11.13 {string match} {
proc foo {} {string match ?1??4???8? 0123456789}
foo
} 1
-test string-11.14 {string match} {
+test stringComp-11.14 {string match} {
proc foo {} {string match {[abc]bc} abc}
foo
} 1
-test string-11.15 {string match} {
+test stringComp-11.15 {string match} {
proc foo {} {string match {a[abc]c} abc}
foo
} 1
-test string-11.16 {string match} {
+test stringComp-11.16 {string match} {
proc foo {} {string match {a[xyz]c} abc}
foo
} 0
-test string-11.17 {string match} {
+test stringComp-11.17 {string match} {
proc foo {} {string match {12[2-7]45} 12345}
foo
} 1
-test string-11.18 {string match} {
+test stringComp-11.18 {string match} {
proc foo {} {string match {12[ab2-4cd]45} 12345}
foo
} 1
-test string-11.19 {string match} {
+test stringComp-11.19 {string match} {
proc foo {} {string match {12[ab2-4cd]45} 12b45}
foo
} 1
-test string-11.20 {string match} {
+test stringComp-11.20 {string match} {
proc foo {} {string match {12[ab2-4cd]45} 12d45}
foo
} 1
-test string-11.21 {string match} {
+test stringComp-11.21 {string match} {
proc foo {} {string match {12[ab2-4cd]45} 12145}
foo
} 0
-test string-11.22 {string match} {
+test stringComp-11.22 {string match} {
proc foo {} {string match {12[ab2-4cd]45} 12545}
foo
} 0
-test string-11.23 {string match} {
+test stringComp-11.23 {string match} {
proc foo {} {string match {a\*b} a*b}
foo
} 1
-test string-11.24 {string match} {
+test stringComp-11.24 {string match} {
proc foo {} {string match {a\*b} ab}
foo
} 0
-test string-11.25 {string match} {
+test stringComp-11.25 {string match} {
proc foo {} {string match {a\*\?\[\]\\\x} "a*?\[\]\\x"}
foo
} 1
-test string-11.26 {string match} {
+test stringComp-11.26 {string match} {
proc foo {} {string match ** ""}
foo
} 1
-test string-11.27 {string match} {
+test stringComp-11.27 {string match} {
proc foo {} {string match *. ""}
foo
} 0
-test string-11.28 {string match} {
+test stringComp-11.28 {string match} {
proc foo {} {string match "" ""}
foo
} 1
-test string-11.29 {string match} {
+test stringComp-11.29 {string match} {
proc foo {} {string match \[a a}
foo
} 1
-test string-11.30 {string match, bad args} {
+test stringComp-11.30 {string match, bad args} {
proc foo {} {string match - b c}
list [catch {foo} msg] $msg
} {1 {bad option "-": must be -nocase}}
-test string-11.31 {string match case} {
+test stringComp-11.31 {string match case} {
proc foo {} {string match a A}
foo
} 0
-test string-11.32 {string match nocase} {
+test stringComp-11.32 {string match nocase} {
proc foo {} {string match -n a A}
foo
} 1
-test string-11.33 {string match nocase} {
+test stringComp-11.33 {string match nocase} {
proc foo {} {string match -nocase a\334 A\374}
foo
} 1
-test string-11.34 {string match nocase} {
+test stringComp-11.34 {string match nocase} {
proc foo {} {string match -nocase a*f ABCDEf}
foo
} 1
-test string-11.35 {string match case, false hope} {
+test stringComp-11.35 {string match case, false hope} {
# This is true because '_' lies between the A-Z and a-z ranges
proc foo {} {string match {[A-z]} _}
foo
} 1
-test string-11.36 {string match nocase range} {
+test stringComp-11.36 {string match nocase range} {
# This is false because although '_' lies between the A-Z and a-z ranges,
# we lower case the end points before checking the ranges.
proc foo {} {string match -nocase {[A-z]} _}
foo
} 0
-test string-11.37 {string match nocase} {
+test stringComp-11.37 {string match nocase} {
proc foo {} {string match -nocase {[A-fh-Z]} g}
foo
} 0
-test string-11.38 {string match case, reverse range} {
+test stringComp-11.38 {string match case, reverse range} {
proc foo {} {string match {[A-fh-Z]} g}
foo
} 1
-test string-11.39 {string match, *\ case} {
+test stringComp-11.39 {string match, *\ case} {
proc foo {} {string match {*\abc} abc}
foo
} 1
-test string-11.40 {string match, *special case} {
+test stringComp-11.40 {string match, *special case} {
proc foo {} {string match {*[ab]} abc}
foo
} 0
-test string-11.41 {string match, *special case} {
+test stringComp-11.41 {string match, *special case} {
proc foo {} {string match {*[ab]*} abc}
foo
} 1
-test string-11.42 {string match, *special case} {
+test stringComp-11.42 {string match, *special case} {
proc foo {} {string match "*\\" "\\"}
foo
} 0
-test string-11.43 {string match, *special case} {
+test stringComp-11.43 {string match, *special case} {
proc foo {} {string match "*\\\\" "\\"}
foo
} 1
-test string-11.44 {string match, *special case} {
+test stringComp-11.44 {string match, *special case} {
proc foo {} {string match "*???" "12345"}
foo
} 1
-test string-11.45 {string match, *special case} {
+test stringComp-11.45 {string match, *special case} {
proc foo {} {string match "*???" "12"}
foo
} 0
-test string-11.46 {string match, *special case} {
+test stringComp-11.46 {string match, *special case} {
proc foo {} {string match "*\\*" "abc*"}
foo
} 1
-test string-11.47 {string match, *special case} {
+test stringComp-11.47 {string match, *special case} {
proc foo {} {string match "*\\*" "*"}
foo
} 1
-test string-11.48 {string match, *special case} {
+test stringComp-11.48 {string match, *special case} {
proc foo {} {string match "*\\*" "*abc"}
foo
} 0
-test string-11.49 {string match, *special case} {
+test stringComp-11.49 {string match, *special case} {
proc foo {} {string match "?\\*" "a*"}
foo
} 1
-test string-11.50 {string match, *special case} {
+test stringComp-11.50 {string match, *special case} {
proc foo {} {string match "\\" "\\"}
foo
} 0
+test stringComp-11.51 {string match; *, -nocase and UTF-8} {
+ proc foo {} {string match -nocase [binary format I 717316707] \
+ [binary format I 2028036707]}
+ foo
+} 1
+test stringComp-11.52 {string match, null char in string} {
+ proc foo {} {
+ set ptn "*abc*"
+ foreach elem [list "\u0000@abc" "@abc" "\u0000@abc\u0000" "blahabcblah"] {
+ lappend out [string match $ptn $elem]
+ }
+ set out
+ }
+ foo
+} {1 1 1 1}
+test stringComp-11.53 {string match, null char in pattern} {
+ proc foo {} {
+ set out ""
+ foreach {ptn elem} [list \
+ "*\u0000abc\u0000" "\u0000abc\u0000" \
+ "*\u0000abc\u0000" "\u0000abc\u0000ef" \
+ "*\u0000abc\u0000*" "\u0000abc\u0000ef" \
+ "*\u0000abc\u0000" "@\u0000abc\u0000ef" \
+ "*\u0000abc\u0000*" "@\u0000abc\u0000ef" \
+ ] {
+ lappend out [string match $ptn $elem]
+ }
+ set out
+ }
+ foo
+} {1 0 1 0 1}
+test stringComp-11.54 {string match, failure} {
+ proc foo {} {
+ set longString ""
+ for {set i 0} {$i < 10} {incr i} {
+ append longString "abcdefghijklmnopqrstuvwxy\u0000z01234567890123"
+ }
+ list [string match *cba* $longString] \
+ [string match *a*l*\u0000* $longString] \
+ [string match *a*l*\u0000*123 $longString] \
+ [string match *a*l*\u0000*123* $longString] \
+ [string match *a*l*\u0000*cba* $longString] \
+ [string match *===* $longString]
+ }
+ foo
+} {0 1 1 1 0 0}
## string range
-## not yet bc
+test stringComp-12.1 {Bug 3588366: end-offsets before start} {
+ apply {s {
+ string range $s 0 end-5
+ }} 12345
+} {}
## string repeat
## not yet bc
## string replace
-## not yet bc
+test stringComp-14.1 {Bug 82e7f67325} {
+ apply {x {
+ set a [join $x {}]
+ lappend b [string length [string replace ___! 0 2 $a]]
+ lappend b [string length [string replace ___! 0 2 $a[unset a]]]
+ }} {a b}
+} {3 3}
+test stringComp-14.2 {Bug 82e7f67325} memory {
+ # As in stringComp-14.1, but make sure we don't retain too many refs
+ leaktest {
+ apply {x {
+ set a [join $x {}]
+ lappend b [string length [string replace ___! 0 2 $a]]
+ lappend b [string length [string replace ___! 0 2 $a[unset a]]]
+ }} {a b}
+ }
+} {0}
## string tolower
## not yet bc
@@ -654,7 +735,12 @@ test string-11.50 {string match, *special case} {
## string word*
## not yet bc
-
+
# cleanup
+catch {rename foo {}}
::tcltest::cleanupTests
return
+
+# Local Variables:
+# mode: tcl
+# End: