OpenFPGA/libs/EXTERNAL/tcl8.6.12/tests/dict.test

2066 lines
60 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This test file covers the dictionary object type and the dict command used
# to work with values of that type.
#
# This file contains a collection of tests for one or more of the Tcl built-in
# commands. Sourcing this file into Tcl runs the tests and generates output
# for errors. No output means no errors were found.
#
# Copyright (c) 2003-2009 Donal K. Fellows
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
if {"::tcltest" ni [namespace children]} {
package require tcltest 2.5
namespace import -force ::tcltest::*
}
# Used for constraining memory leak tests
testConstraint memory [llength [info commands memory]]
if {[testConstraint memory]} {
proc memtest script {
set end [lindex [split [memory info] \n] 3 3]
for {set i 0} {$i < 5} {incr i} {
uplevel 1 $script
set tmp $end
set end [lindex [split [memory info] \n] 3 3]
}
expr {$end - $tmp}
}
}
test dict-1.1 {dict command basic syntax} -returnCodes error -body {
dict
} -result {wrong # args: should be "dict subcommand ?arg ...?"}
test dict-1.2 {dict command basic syntax} -returnCodes error -body {
dict ?
} -match glob -result {unknown or ambiguous subcommand "?": must be *}
test dict-2.1 {dict create command} {
dict create
} {}
test dict-2.2 {dict create command} {
dict create a b
} {a b}
test dict-2.3 {dict create command} -body {
set result {}
set dict [dict create a b c d]
# Can't compare directly as ordering of values is undefined
foreach key {a c} {
set idx [lsearch -exact $dict $key]
if {$idx & 1} {
error "found $key at odd index $idx in $dict"
}
lappend result [lindex $dict [expr {$idx+1}]]
}
return $result
} -cleanup {
unset result dict key idx
} -result {b d}
test dict-2.4 {dict create command} -returnCodes error -body {
dict create a
} -result {wrong # args: should be "dict create ?key value ...?"}
test dict-2.5 {dict create command} -returnCodes error -body {
dict create a b c
} -result {wrong # args: should be "dict create ?key value ...?"}
test dict-2.6 {dict create command - initialse refcount field!} -body {
# Bug 715751 will show up in memory debuggers like purify
for {set i 0} {$i<10} {incr i} {
set dictv [dict create a 0]
set share [dict values $dictv]
list [dict incr dictv a]
}
} -cleanup {
unset i dictv share
} -result {}
test dict-2.7 {dict create command - #-quoting in string rep} {
dict create # #comment
} {{#} #comment}
test dict-2.8 {dict create command - #-quoting in string rep} -body {
dict create #a x #b x
} -match glob -result {{#?} x #? x}
test dict-2.9 {dict create command: compilation} {
apply {{} {dict create [format a] b}}
} {a b}
test dict-2.10 {dict create command: compilation} {
apply {{} {dict create [format a] b c d}}
} {a b c d}
test dict-2.11 {dict create command: compilation} {
apply {{} {dict create [format a] b c d a x}}
} {a x c d}
test dict-2.12 {dict create command: non-compilation} {
dict create [format a] b
} {a b}
test dict-2.13 {dict create command: non-compilation} {
dict create [format a] b c d
} {a b c d}
test dict-2.14 {dict create command: non-compilation} {
dict create [format a] b c d a x
} {a x c d}
test dict-3.1 {dict get command} {dict get {a b} a} b
test dict-3.2 {dict get command} {dict get {a b c d} a} b
test dict-3.3 {dict get command} {dict get {a b c d} c} d
test dict-3.4 {dict get command} -returnCodes error -body {
dict get {a b c d} b
} -result {key "b" not known in dictionary}
test dict-3.5 {dict get command} {dict get {a {p q r s} b {u v x y}} a p} q
test dict-3.6 {dict get command} {dict get {a {p q r s} b {u v x y}} a r} s
test dict-3.7 {dict get command} {dict get {a {p q r s} b {u v x y}} b u} v
test dict-3.8 {dict get command} {dict get {a {p q r s} b {u v x y}} b x} y
test dict-3.9 {dict get command} -returnCodes error -body {
dict get {a {p q r s} b {u v x y}} a z
} -result {key "z" not known in dictionary}
test dict-3.10 {dict get command} -returnCodes error -body {
dict get {a {p q r s} b {u v x y}} c z
} -result {key "c" not known in dictionary}
test dict-3.11 {dict get command} {dict get [dict create a b c d] a} b
test dict-3.12 {dict get command} -returnCodes error -body {
dict get
} -result {wrong # args: should be "dict get dictionary ?key ...?"}
test dict-3.13 {dict get command} -body {
set dict [dict get {a b c d}]
if {$dict eq "a b c d"} {
return OK
} elseif {$dict eq "c d a b"} {
return reordered
} else {
return $dict
}
} -cleanup {
unset dict
} -result OK
test dict-3.14 {dict get command} -returnCodes error -body {
dict get {a b c d} a c
} -result {missing value to go with key}
test dict-3.15 {compiled dict get error cleanliness - Bug 2431847} -body {
apply {{} {
dict set a(z) b c
dict get $a(z) d
}}
} -returnCodes error -result {key "d" not known in dictionary}
test dict-3.16 {dict/list shimmering - Bug 3004007} {set l [list p 1 p 2 q 3];dict get $l q;set l} {p 1 p 2 q 3}
test dict-3.17 {dict/list shimmering - Bug 3004007} {set l [list p 1 p 2 q 3];dict get $l q;llength $l} 6
test dict-4.1 {dict replace command} {
dict replace {a b c d}
} {a b c d}
test dict-4.2 {dict replace command} {
dict replace {a b c d} e f
} {a b c d e f}
test dict-4.3 {dict replace command} {
dict replace {a b c d} c f
} {a b c f}
test dict-4.4 {dict replace command} {
dict replace {a b c d} c x a y
} {a y c x}
test dict-4.5 {dict replace command} -returnCodes error -body {
dict replace
} -result {wrong # args: should be "dict replace dictionary ?key value ...?"}
test dict-4.6 {dict replace command} -returnCodes error -body {
dict replace {a a} a
} -result {wrong # args: should be "dict replace dictionary ?key value ...?"}
test dict-4.7 {dict replace command} -returnCodes error -body {
dict replace {a a a} a b
} -result {missing value to go with key}
test dict-4.8 {dict replace command} -returnCodes error -body {
dict replace [list a a a] a b
} -result {missing value to go with key}
test dict-4.9 {dict replace command} {dict replace [list a a] a b} {a b}
test dict-4.10 {dict replace command} {dict replace [list a a] a b a c} {a c}
test dict-4.11 {dict replace command: canonicality is forced} {
dict replace { a b c d }
} {a b c d}
test dict-4.12 {dict replace command: canonicality is forced} {
dict replace {a b c d a e}
} {a e c d}
test dict-4.13 {dict replace command: type check is mandatory} -body {
dict replace { a b c d e }
} -returnCodes error -result {missing value to go with key}
test dict-4.13a {dict replace command: type check is mandatory} {
catch {dict replace { a b c d e }} -> opt
dict get $opt -errorcode
} {TCL VALUE DICTIONARY}
test dict-4.14 {dict replace command: type check is mandatory} -body {
dict replace { a b {}c d }
} -returnCodes error -result {dict element in braces followed by "c" instead of space}
test dict-4.14a {dict replace command: type check is mandatory} {
catch {dict replace { a b {}c d }} -> opt
dict get $opt -errorcode
} {TCL VALUE DICTIONARY JUNK}
test dict-4.15 {dict replace command: type check is mandatory} -body {
dict replace { a b ""c d }
} -returnCodes error -result {dict element in quotes followed by "c" instead of space}
test dict-4.15a {dict replace command: type check is mandatory} {
catch {dict replace { a b ""c d }} -> opt
dict get $opt -errorcode
} {TCL VALUE DICTIONARY JUNK}
test dict-4.16 {dict replace command: type check is mandatory} -body {
dict replace " a b \"c d "
} -returnCodes error -result {unmatched open quote in dict}
test dict-4.16a {dict replace command: type check is mandatory} {
catch {dict replace " a b \"c d "} -> opt
dict get $opt -errorcode
} {TCL VALUE DICTIONARY QUOTE}
test dict-4.17 {dict replace command: type check is mandatory} -body {
dict replace " a b \{c d "
} -returnCodes error -result {unmatched open brace in dict}
test dict-4.17a {dict replace command: type check is mandatory} {
catch {dict replace " a b \{c d "} -> opt
dict get $opt -errorcode
} {TCL VALUE DICTIONARY BRACE}
test dict-4.18 {dict replace command: canonicality forcing doesn't leak} {
set example { a b c d }
list $example [dict replace $example]
} {{ a b c d } {a b c d}}
test dict-5.1 {dict remove command} {dict remove {a b c d} a} {c d}
test dict-5.2 {dict remove command} {dict remove {a b c d} c} {a b}
test dict-5.3 {dict remove command} {dict remove {a b c d} a c} {}
test dict-5.4 {dict remove command} {dict remove {a b c d} c a} {}
test dict-5.5 {dict remove command} {
dict remove {a b c d}
} {a b c d}
test dict-5.6 {dict remove command} {dict remove {a b} c} {a b}
test dict-5.7 {dict remove command} -returnCodes error -body {
dict remove
} -result {wrong # args: should be "dict remove dictionary ?key ...?"}
test dict-5.8 {dict remove command: canonicality is forced} {
dict remove { a b c d }
} {a b c d}
test dict-5.9 {dict remove command: canonicality is forced} {
dict remove {a b c d a e}
} {a e c d}
test dict-5.10 {dict remove command: canonicality forced by update} {
dict remove { a b c d } c
} {a b}
test dict-5.11 {dict remove command: type check is mandatory} -body {
dict remove { a b c d e }
} -returnCodes error -result {missing value to go with key}
test dict-5.12 {dict remove command: type check is mandatory} -body {
dict remove { a b {}c d }
} -returnCodes error -result {dict element in braces followed by "c" instead of space}
test dict-5.13 {dict remove command: canonicality forcing doesn't leak} {
set example { a b c d }
list $example [dict remove $example]
} {{ a b c d } {a b c d}}
test dict-6.1 {dict keys command} {dict keys {a b}} a
test dict-6.2 {dict keys command} {dict keys {c d}} c
test dict-6.3 {dict keys command} {lsort [dict keys {a b c d}]} {a c}
test dict-6.4 {dict keys command} {dict keys {a b c d} a} a
test dict-6.5 {dict keys command} {dict keys {a b c d} c} c
test dict-6.6 {dict keys command} {dict keys {a b c d} e} {}
test dict-6.7 {dict keys command} {lsort [dict keys {a b c d ca da} c*]} {c ca}
test dict-6.8 {dict keys command} -returnCodes error -body {
dict keys
} -result {wrong # args: should be "dict keys dictionary ?pattern?"}
test dict-6.9 {dict keys command} -returnCodes error -body {
dict keys {} a b
} -result {wrong # args: should be "dict keys dictionary ?pattern?"}
test dict-6.10 {dict keys command} -returnCodes error -body {
dict keys a
} -result {missing value to go with key}
test dict-7.1 {dict values command} {dict values {a b}} b
test dict-7.2 {dict values command} {dict values {c d}} d
test dict-7.3 {dict values command} {lsort [dict values {a b c d}]} {b d}
test dict-7.4 {dict values command} {dict values {a b c d} b} b
test dict-7.5 {dict values command} {dict values {a b c d} d} d
test dict-7.6 {dict values command} {dict values {a b c d} e} {}
test dict-7.7 {dict values command} {lsort [dict values {a b c d ca da} d*]} {d da}
test dict-7.8 {dict values command} -returnCodes error -body {
dict values
} -result {wrong # args: should be "dict values dictionary ?pattern?"}
test dict-7.9 {dict values command} -returnCodes error -body {
dict values {} a b
} -result {wrong # args: should be "dict values dictionary ?pattern?"}
test dict-7.10 {dict values command} -returnCodes error -body {
dict values a
} -result {missing value to go with key}
test dict-8.1 {dict size command} {dict size {}} 0
test dict-8.2 {dict size command} {dict size {a b}} 1
test dict-8.3 {dict size command} {dict size {a b c d}} 2
test dict-8.4 {dict size command} -returnCodes error -body {
dict size
} -result {wrong # args: should be "dict size dictionary"}
test dict-8.5 {dict size command} -returnCodes error -body {
dict size a b
} -result {wrong # args: should be "dict size dictionary"}
test dict-8.6 {dict size command} -returnCodes error -body {
dict size a
} -result {missing value to go with key}
test dict-9.1 {dict exists command} {dict exists {a b} a} 1
test dict-9.2 {dict exists command} {dict exists {a b} b} 0
test dict-9.3 {dict exists command} {dict exists {a {b c}} a b} 1
test dict-9.4 {dict exists command} {dict exists {a {b c}} a c} 0
test dict-9.5 {dict exists command} {dict exists {a {b c}} b c} 0
test dict-9.6 {dict exists command} {dict exists {a {b c d}} a c} 0
test dict-9.7 {dict exists command} -returnCodes error -body {
dict exists
} -result {wrong # args: should be "dict exists dictionary key ?key ...?"}
test dict-9.8 {dict exists command} -returnCodes error -body {
dict exists {}
} -result {wrong # args: should be "dict exists dictionary key ?key ...?"}
test dict-10.1 {dict info command} -body {
# Actual string returned by this command is undefined; it is
# intended for human consumption and not for use by scripts.
dict info {}
} -match glob -result *
test dict-10.2 {dict info command} -returnCodes error -body {
dict info
} -result {wrong # args: should be "dict info dictionary"}
test dict-10.3 {dict info command} -returnCodes error -body {
dict info {} x
} -result {wrong # args: should be "dict info dictionary"}
test dict-10.4 {dict info command} -returnCodes error -body {
dict info x
} -result {missing value to go with key}
test dict-11.1 {dict incr command: unshared value} -body {
set dictv [dict create \
a [string index "=0=" 1] \
b [expr {1+2}] \
c [expr {wide(0x80000000)+1}]]
dict incr dictv a
} -cleanup {
unset dictv
} -result {a 1 b 3 c 2147483649}
test dict-11.2 {dict incr command: unshared value} -body {
set dictv [dict create \
a [string index "=0=" 1] \
b [expr {1+2}] \
c [expr {wide(0x80000000)+1}]]
dict incr dictv b
} -cleanup {
unset dictv
} -result {a 0 b 4 c 2147483649}
test dict-11.3 {dict incr command: unshared value} -body {
set dictv [dict create \
a [string index "=0=" 1] \
b [expr {1+2}] \
c [expr {wide(0x80000000)+1}]]
dict incr dictv c
} -cleanup {
unset dictv
} -result {a 0 b 3 c 2147483650}
test dict-11.4 {dict incr command: shared value} -body {
set dictv [dict create a 0 b [expr {1+2}] c [expr {wide(0x80000000)+1}]]
set sharing [dict values $dictv]
dict incr dictv a
} -cleanup {
unset dictv sharing
} -result {a 1 b 3 c 2147483649}
test dict-11.5 {dict incr command: shared value} -body {
set dictv [dict create a 0 b [expr {1+2}] c [expr {wide(0x80000000)+1}]]
set sharing [dict values $dictv]
dict incr dictv b
} -cleanup {
unset dictv sharing
} -result {a 0 b 4 c 2147483649}
test dict-11.6 {dict incr command: shared value} -body {
set dictv [dict create a 0 b [expr {1+2}] c [expr {wide(0x80000000)+1}]]
set sharing [dict values $dictv]
dict incr dictv c
} -cleanup {
unset dictv sharing
} -result {a 0 b 3 c 2147483650}
test dict-11.7 {dict incr command: unknown values} -body {
set dictv [dict create a 0 b [expr {1+2}] c [expr {wide(0x80000000)+1}]]
dict incr dictv d
} -cleanup {
unset dictv
} -result {a 0 b 3 c 2147483649 d 1}
test dict-11.8 {dict incr command} -body {
set dictv {a 1}
dict incr dictv a 2
} -cleanup {
unset dictv
} -result {a 3}
test dict-11.9 {dict incr command} -returnCodes error -body {
set dictv {a dummy}
dict incr dictv a
} -cleanup {
unset dictv
} -result {expected integer but got "dummy"}
test dict-11.10 {dict incr command} -returnCodes error -body {
set dictv {a 1}
dict incr dictv a dummy
} -cleanup {
unset dictv
} -result {expected integer but got "dummy"}
test dict-11.11 {dict incr command} -setup {
unset -nocomplain dictv
} -body {
dict incr dictv a
} -cleanup {
unset dictv
} -result {a 1}
test dict-11.12 {dict incr command} -returnCodes error -body {
set dictv a
dict incr dictv a
} -cleanup {
unset dictv
} -result {missing value to go with key}
test dict-11.13 {dict incr command} -returnCodes error -body {
set dictv a
dict incr dictv a a a
} -cleanup {
unset dictv
} -result {wrong # args: should be "dict incr dictVarName key ?increment?"}
test dict-11.14 {dict incr command} -returnCodes error -body {
set dictv a
dict incr dictv
} -cleanup {
unset dictv
} -result {wrong # args: should be "dict incr dictVarName key ?increment?"}
test dict-11.15 {dict incr command: write failure} -setup {
unset -nocomplain dictVar
} -body {
set dictVar(block) {}
dict incr dictVar a
} -returnCodes error -cleanup {
unset dictVar
} -result {can't set "dictVar": variable is array}
test dict-11.16 {dict incr command: compilation} {
apply {{} {
set v {a 0 b 0 c 0}
dict incr v a
dict incr v b 1
dict incr v c 2
dict incr v d 3
list [dict get $v a] [dict get $v b] [dict get $v c] [dict get $v d]
}}
} {1 1 2 3}
test dict-11.17 {dict incr command: compilation} {
apply {{} {
set dictv {a 1}
dict incr dictv a 2
}}
} {a 3}
test dict-12.1 {dict lappend command} -body {
set dictv {a a}
dict lappend dictv a
} -cleanup {
unset dictv
} -result {a a}
test dict-12.2 {dict lappend command} -body {
set dictv {a a}
set sharing [dict values $dictv]
dict lappend dictv a b
} -cleanup {
unset dictv sharing
} -result {a {a b}}
test dict-12.3 {dict lappend command} -body {
set dictv {a a}
dict lappend dictv a b c
} -cleanup {
unset dictv
} -result {a {a b c}}
test dict-12.2.1 {dict lappend command} -body {
set dictv [dict create a [string index =a= 1]]
dict lappend dictv a b
} -cleanup {
unset dictv
} -result {a {a b}}
test dict-12.4 {dict lappend command} -body {
set dictv {}
dict lappend dictv a x y z
} -cleanup {
unset dictv
} -result {a {x y z}}
test dict-12.5 {dict lappend command} -body {
unset -nocomplain dictv
dict lappend dictv a b
} -cleanup {
unset dictv
} -result {a b}
test dict-12.6 {dict lappend command} -returnCodes error -body {
set dictv a
dict lappend dictv a a
} -cleanup {
unset dictv
} -result {missing value to go with key}
test dict-12.7 {dict lappend command} -returnCodes error -body {
dict lappend
} -result {wrong # args: should be "dict lappend dictVarName key ?value ...?"}
test dict-12.8 {dict lappend command} -returnCodes error -body {
dict lappend dictv
} -result {wrong # args: should be "dict lappend dictVarName key ?value ...?"}
test dict-12.9 {dict lappend command} -returnCodes error -body {
set dictv [dict create a "\{"]
dict lappend dictv a a
} -cleanup {
unset dictv
} -result {unmatched open brace in list}
test dict-12.10 {dict lappend command: write failure} -setup {
unset -nocomplain dictVar
} -body {
set dictVar(block) {}
dict lappend dictVar a x
} -returnCodes error -cleanup {
unset dictVar
} -result {can't set "dictVar": variable is array}
test dict-12.11 {compiled dict append: invalidate string rep - Bug 3079830} {
apply {{} {set d {a 1 b 2 c 3}; dict lappend d b 22}}
} {a 1 b {2 22} c 3}
test dict-13.1 {dict append command} -body {
set dictv {a a}
dict append dictv a
} -cleanup {
unset dictv
} -result {a a}
test dict-13.2 {dict append command} -body {
set dictv {a a}
set sharing [dict values $dictv]
dict append dictv a b
} -cleanup {
unset dictv sharing
} -result {a ab}
test dict-13.3 {dict append command} -body {
set dictv {a a}
dict append dictv a b c
} -cleanup {
unset dictv
} -result {a abc}
test dict-13.2.1 {dict append command} -body {
set dictv [dict create a [string index =a= 1]]
dict append dictv a b
} -cleanup {
unset dictv
} -result {a ab}
test dict-13.4 {dict append command} -body {
set dictv {}
dict append dictv a x y z
} -cleanup {
unset dictv
} -result {a xyz}
test dict-13.5 {dict append command} -body {
unset -nocomplain dictv
dict append dictv a b
} -cleanup {
unset dictv
} -result {a b}
test dict-13.6 {dict append command} -returnCodes error -body {
set dictv a
dict append dictv a a
} -cleanup {
unset dictv
} -result {missing value to go with key}
test dict-13.7 {dict append command} -returnCodes error -body {
dict append
} -result {wrong # args: should be "dict append dictVarName key ?value ...?"}
test dict-13.8 {dict append command} -returnCodes error -body {
dict append dictv
} -result {wrong # args: should be "dict append dictVarName key ?value ...?"}
test dict-13.9 {dict append command: write failure} -setup {
unset -nocomplain dictVar
} -body {
set dictVar(block) {}
dict append dictVar a x
} -returnCodes error -cleanup {
unset dictVar
} -result {can't set "dictVar": variable is array}
test dict-13.10 {compiled dict append: crash case} {
apply {{} {dict append dictVar a o k}}
} {a ok}
test dict-13.11 {compiled dict append: invalidate string rep - Bug 3079830} {
apply {{} {set d {a 1 b 2 c 3}; dict append d b 22}}
} {a 1 b 222 c 3}
test dict-14.1 {dict for command: syntax} -returnCodes error -body {
dict for
} -result {wrong # args: should be "dict for {keyVarName valueVarName} dictionary script"}
test dict-14.2 {dict for command: syntax} -returnCodes error -body {
dict for x
} -result {wrong # args: should be "dict for {keyVarName valueVarName} dictionary script"}
test dict-14.3 {dict for command: syntax} -returnCodes error -body {
dict for x x
} -result {wrong # args: should be "dict for {keyVarName valueVarName} dictionary script"}
test dict-14.4 {dict for command: syntax} -returnCodes error -body {
dict for x x x x
} -result {wrong # args: should be "dict for {keyVarName valueVarName} dictionary script"}
test dict-14.5 {dict for command: syntax} -returnCodes error -body {
dict for x x x
} -result {must have exactly two variable names}
test dict-14.6 {dict for command: syntax} -returnCodes error -body {
dict for {x x x} x x
} -result {must have exactly two variable names}
test dict-14.7 {dict for command: syntax} -returnCodes error -body {
dict for "\{x" x x
} -result {unmatched open brace in list}
test dict-14.8 {dict for command} -body {
# This test confirms that [dict keys], [dict values] and [dict for]
# all traverse a dictionary in the same order.
set dictv {a A b B c C}
set keys {}
set values {}
dict for {k v} $dictv {
lappend keys $k
lappend values $v
}
set result [expr {
$keys eq [dict keys $dictv] && $values eq [dict values $dictv]
}]
expr {$result ? "YES" : [list "NO" $dictv $keys $values]}
} -cleanup {
unset result keys values k v dictv
} -result YES
test dict-14.9 {dict for command} {
dict for {k v} {} {
error "unexpected execution of 'dict for' body"
}
} {}
test dict-14.10 {dict for command: script results} -body {
set times 0
dict for {k v} {a a b b} {
incr times
continue
error "shouldn't get here"
}
return $times
} -cleanup {
unset times k v
} -result 2
test dict-14.11 {dict for command: script results} -body {
set times 0
dict for {k v} {a a b b} {
incr times
break
error "shouldn't get here"
}
return $times
} -cleanup {
unset times k v
} -result 1
test dict-14.12 {dict for command: script results} -body {
set times 0
list [catch {
dict for {k v} {a a b b} {
incr times
error test
}
} msg] $msg $times $::errorInfo
} -cleanup {
unset times k v msg
} -result {1 test 1 {test
while executing
"error test"
("dict for" body line 3)
invoked from within
"dict for {k v} {a a b b} {
incr times
error test
}"}}
test dict-14.13 {dict for command: script results} {
apply {{} {
dict for {k v} {a b} {
return ok,$k,$v
error "skipped return completely"
}
error "return didn't go far enough"
}}
} ok,a,b
test dict-14.14 {dict for command: handle representation loss} -body {
set dictVar {a b c d e f g h}
set keys {}
set values {}
dict for {k v} $dictVar {
if {[llength $dictVar]} {
lappend keys $k
lappend values $v
}
}
list [lsort $keys] [lsort $values]
} -cleanup {
unset dictVar keys values k v
} -result {{a c e g} {b d f h}}
test dict-14.15 {dict for command: keys are unique and iterated over once only} -setup {
unset -nocomplain accum
array set accum {}
} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict for {k v} $dictVar {
append accum($k) $v,
}
set result [lsort [array names accum]]
lappend result :
foreach k $result {
catch {lappend result $accum($k)}
}
return $result
} -cleanup {
unset dictVar k v result accum
} -result {a1 a2 b1 b2 bar foo : a, b, c, d, foo, bar,}
test dict-14.16 {dict for command in compilation context} {
apply {{} {
set res {x x x x x x}
dict for {k v} {a 0 b 1 c 2 d 3 e 4 f 5} {
lset res $v $k
continue
}
return $res
}}
} {a b c d e f}
test dict-14.17 {dict for command in compilation context} {
# Bug 1379349
apply {{} {
set d [dict create a 1] ;# Dict must be unshared!
dict for {k v} $d {
dict set d $k 0 ;# Any modification will do
}
return $d
}}
} {a 0}
test dict-14.18 {dict for command in compilation context} {
# Bug 1382528
apply {{} {
dict for {k v} {} {} ;# Note empty dict
catch { error foo } ;# Note compiled [catch]
}}
} 1
test dict-14.19 {dict for and invalid dicts: bug 1531184} -body {
di[list]ct for {k v} x {}
} -returnCodes 1 -result {missing value to go with key}
test dict-14.20 {dict for stack space compilation: bug 1903325} {
apply {{x y args} {
dict for {a b} $x {}
concat "c=$y,$args"
}} {} 1 2 3
} {c=1,2 3}
test dict-14.21 {compiled dict for and break} {
apply {{} {
dict for {a b} {c d e f} {
lappend result $a,$b
break
}
return $result
}}
} c,d
test dict-14.22 {dict for and exception range depths: Bug 3614382} {
apply {{} {
dict for {a b} {c d} {
dict for {e f} {g h} {
return 5
}
}
}}
} 5
# There's probably a lot more tests to add here. Really ought to use a
# coverage tool for this job...
test dict-15.1 {dict set command} -body {
set dictVar {}
dict set dictVar a x
} -cleanup {
unset dictVar
} -result {a x}
test dict-15.2 {dict set command} -body {
set dictvar {a {}}
dict set dictvar a b x
} -cleanup {
unset dictvar
} -result {a {b x}}
test dict-15.3 {dict set command} -body {
set dictvar {a {b {}}}
dict set dictvar a b c x
} -cleanup {
unset dictvar
} -result {a {b {c x}}}
test dict-15.4 {dict set command} -body {
set dictVar {a y}
dict set dictVar a x
} -cleanup {
unset dictVar
} -result {a x}
test dict-15.5 {dict set command} -body {
set dictVar {a {b y}}
dict set dictVar a b x
} -cleanup {
unset dictVar
} -result {a {b x}}
test dict-15.6 {dict set command} -body {
set dictVar {a {b {c y}}}
dict set dictVar a b c x
} -cleanup {
unset dictVar
} -result {a {b {c x}}}
test dict-15.7 {dict set command: path creation} -body {
set dictVar {}
dict set dictVar a b x
} -cleanup {
unset dictVar
} -result {a {b x}}
test dict-15.8 {dict set command: creates variables} -setup {
unset -nocomplain dictVar
} -body {
dict set dictVar a x
return $dictVar
} -cleanup {
unset dictVar
} -result {a x}
test dict-15.9 {dict set command: write failure} -setup {
unset -nocomplain dictVar
} -body {
set dictVar(block) {}
dict set dictVar a x
} -returnCodes error -cleanup {
unset dictVar
} -result {can't set "dictVar": variable is array}
test dict-15.10 {dict set command: syntax} -returnCodes error -body {
dict set
} -result {wrong # args: should be "dict set dictVarName key ?key ...? value"}
test dict-15.11 {dict set command: syntax} -returnCodes error -body {
dict set a
} -result {wrong # args: should be "dict set dictVarName key ?key ...? value"}
test dict-15.12 {dict set command: syntax} -returnCodes error -body {
dict set a a
} -result {wrong # args: should be "dict set dictVarName key ?key ...? value"}
test dict-15.13 {dict set command} -returnCodes error -body {
set dictVar a
dict set dictVar b c
} -cleanup {
unset dictVar
} -result {missing value to go with key}
test dict-16.1 {dict unset command} -body {
set dictVar {a b c d}
dict unset dictVar a
} -cleanup {
unset dictVar
} -result {c d}
test dict-16.2 {dict unset command} -body {
set dictVar {a b c d}
dict unset dictVar c
} -cleanup {
unset dictVar
} -result {a b}
test dict-16.3 {dict unset command} -body {
set dictVar {a b}
dict unset dictVar c
} -cleanup {
unset dictVar
} -result {a b}
test dict-16.4 {dict unset command} -body {
set dictVar {a {b c d e}}
dict unset dictVar a b
} -cleanup {
unset dictVar
} -result {a {d e}}
test dict-16.5 {dict unset command} -returnCodes error -body {
set dictVar a
dict unset dictVar a
} -cleanup {
unset dictVar
} -result {missing value to go with key}
test dict-16.6 {dict unset command} -returnCodes error -body {
set dictVar {a b}
dict unset dictVar c d
} -cleanup {
unset dictVar
} -result {key "c" not known in dictionary}
test dict-16.7 {dict unset command} -setup {
unset -nocomplain dictVar
} -body {
list [info exists dictVar] [dict unset dictVar a] [info exists dictVar]
} -cleanup {
unset dictVar
} -result {0 {} 1}
test dict-16.8 {dict unset command} -returnCodes error -body {
dict unset dictVar
} -result {wrong # args: should be "dict unset dictVarName key ?key ...?"}
test dict-16.9 {dict unset command: write failure} -setup {
unset -nocomplain dictVar
} -body {
set dictVar(block) {}
dict unset dictVar a
} -returnCodes error -cleanup {
unset dictVar
} -result {can't set "dictVar": variable is array}
# Now test with an LVT present (i.e., the bytecoded version).
test dict-16.10 {dict unset command} -body {
apply {{} {
set dictVar {a b c d}
dict unset dictVar a
}}
} -result {c d}
test dict-16.11 {dict unset command} -body {
apply {{} {
set dictVar {a b c d}
dict unset dictVar c
}}
} -result {a b}
test dict-16.12 {dict unset command} -body {
apply {{} {
set dictVar {a b}
dict unset dictVar c
}}
} -result {a b}
test dict-16.13 {dict unset command} -body {
apply {{} {
set dictVar {a {b c d e}}
dict unset dictVar a b
}}
} -result {a {d e}}
test dict-16.14 {dict unset command} -returnCodes error -body {
apply {{} {
set dictVar a
dict unset dictVar a
}}
} -result {missing value to go with key}
test dict-16.15 {dict unset command} -returnCodes error -body {
apply {{} {
set dictVar {a b}
dict unset dictVar c d
}}
} -result {key "c" not known in dictionary}
test dict-16.16 {dict unset command} -body {
apply {{} {list [info exists dictVar] [dict unset dictVar a] [info exists dictVar]}}
} -result {0 {} 1}
test dict-16.17 {dict unset command} -returnCodes error -body {
apply {{} {dict unset dictVar}}
} -result {wrong # args: should be "dict unset dictVarName key ?key ...?"}
test dict-16.18 {dict unset command: write failure} -body {
apply {{} {
set dictVar(block) {}
dict unset dictVar a
}}
} -returnCodes error -result {can't set "dictVar": variable is array}
test dict-17.1 {dict filter command: key} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict filter $dictVar key a2
} -cleanup {
unset dictVar
} -result {a2 b}
test dict-17.2 {dict filter command: key} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict size [dict filter $dictVar key *]
} -cleanup {
unset dictVar
} -result 6
test dict-17.3 {dict filter command: key} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict filter $dictVar key ???
} -cleanup {
unset dictVar
} -result {foo bar bar foo}
test dict-17.4 {dict filter command: key - no patterns} {
dict filter {a b c d} key
} {}
test dict-17.4.1 {dict filter command: key - many patterns} {
dict filter {a1 a a2 b b1 c b2 d foo bar bar foo} key a? b?
} {a1 a a2 b b1 c b2 d}
test dict-17.5 {dict filter command: key - bad dict} -returnCodes error -body {
dict filter {a b c} key
} -result {missing value to go with key}
test dict-17.6 {dict filter command: value} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict filter $dictVar value c
} -cleanup {
unset dictVar
} -result {b1 c}
test dict-17.7 {dict filter command: value} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict size [dict filter $dictVar value *]
} -cleanup {
unset dictVar
} -result 6
test dict-17.8 {dict filter command: value} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict filter $dictVar value ???
} -cleanup {
unset dictVar
} -result {foo bar bar foo}
test dict-17.9 {dict filter command: value - no patterns} {
dict filter {a b c d} value
} {}
test dict-17.9.1 {dict filter command: value - many patterns} {
dict filter {a a1 b a2 c b1 foo bar bar foo d b2} value a? b?
} {a a1 b a2 c b1 d b2}
test dict-17.10 {dict filter command: value - bad dict} -body {
dict filter {a b c} value a
} -returnCodes error -result {missing value to go with key}
test dict-17.11 {dict filter command: script} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
set n 0
list [dict filter $dictVar script {k v} {
incr n
expr {[string length $k] == [string length $v]}
}] $n
} -cleanup {
unset dictVar n k v
} -result {{foo bar bar foo} 6}
test dict-17.12 {dict filter command: script} -returnCodes error -body {
dict filter {a b} script {k v} {
concat $k $v
}
} -cleanup {
unset k v
} -result {expected boolean value but got "a b"}
test dict-17.13 {dict filter command: script} -body {
list [catch {dict filter {a b} script {k v} {error x}} msg] $msg \
$::errorInfo
} -cleanup {
unset k v msg
} -result {1 x {x
while executing
"error x"
("dict filter" script line 1)
invoked from within
"dict filter {a b} script {k v} {error x}"}}
test dict-17.14 {dict filter command: script} -setup {
set n 0
} -body {
list [dict filter {a b c d} script {k v} {
incr n
break
error boom!
}] $n
} -cleanup {
unset n k v
} -result {{} 1}
test dict-17.15 {dict filter command: script} -setup {
set n 0
} -body {
list [dict filter {a b c d} script {k v} {
incr n
continue
error boom!
}] $n
} -cleanup {
unset n k v
} -result {{} 2}
test dict-17.16 {dict filter command: script} {
apply {{} {
dict filter {a b} script {k v} {
return ok,$k,$v
error "skipped return completely"
}
error "return didn't go far enough"
}}
} ok,a,b
test dict-17.17 {dict filter command: script} -body {
dict filter {a b} script {k k} {continue}
return $k
} -cleanup {
unset k
} -result b
test dict-17.18 {dict filter command: script} -returnCodes error -body {
dict filter {a b} script {k k}
} -result {wrong # args: should be "dict filter dictionary script {keyVarName valueVarName} filterScript"}
test dict-17.19 {dict filter command: script} -returnCodes error -body {
dict filter {a b} script k {continue}
} -result {must have exactly two variable names}
test dict-17.20 {dict filter command: script} -returnCodes error -body {
dict filter {a b} script "\{k v" {continue}
} -result {unmatched open brace in list}
test dict-17.21 {dict filter command} -returnCodes error -body {
dict filter {a b}
} -result {wrong # args: should be "dict filter dictionary filterType ?arg ...?"}
test dict-17.22 {dict filter command} -returnCodes error -body {
dict filter {a b} JUNK
} -result {bad filterType "JUNK": must be key, script, or value}
test dict-17.23 {dict filter command} -returnCodes error -body {
dict filter a key *
} -result {missing value to go with key}
test dict-18.1 {dict-list relationship} -body {
# Test that any internal conversion between list and dict does not change
# the object
set l [list 1 2 3 4 5 6 7 8 9 0 q w e r t y]
dict values $l
return $l
} -cleanup {
unset l
} -result {1 2 3 4 5 6 7 8 9 0 q w e r t y}
test dict-18.2 {dict-list relationship} -body {
# Test that the dictionary is a valid list
set d [dict create "abc def" 0 "a\{b" 1 "c\}d" 2]
for {set t 0} {$t < 5} {incr t} {
llength $d
dict lappend d "abc def" "\}\{"
dict append d "a\{b" "\}"
dict incr d "c\}d" 1
}
llength $d
} -cleanup {
unset d t
} -result 6
test dict-18.3 {dict-list relationship} -body {
set ld [list a b c d c e f g]
list [string length $ld] [dict size $ld] [llength $ld]
} -cleanup {
unset ld
} -result {15 3 8}
test dict-18.4 {dict-list relationship} -body {
set ld [list a b c d c e f g]
list [llength $ld] [dict size $ld] [llength $ld]
} -cleanup {
unset ld
} -result {8 3 8}
# This is a test for a specific bug.
# It shows a bad ref counter when running with memdebug on.
test dict-19.1 {memory bug} {
apply {{} {
set successors [dict create x {c d}]
dict set successors x a b
dict get $successors x
}}
} [dict create c d a b]
test dict-19.2 {dict: testing for leaks} -constraints memory -body {
# This test is made to stress object reference management
memtest {
apply {{} {
# A shared invalid dictinary
set apa {a {}b c d}
set bepa $apa
catch {dict replace $apa e f}
catch {dict remove $apa c d}
catch {dict incr apa a 5}
catch {dict lappend apa a 5}
catch {dict append apa a 5}
catch {dict set apa a 5}
catch {dict unset apa a}
# A shared valid dictionary, invalid incr
set apa {a b c d}
set bepa $apa
catch {dict incr bepa a 5}
# An error during write to an unshared object, incr
set apa {a 1 b 2}
set bepa [lrange $apa 0 end]
trace add variable bepa write {error hej}
catch {dict incr bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to a shared object, incr
set apa {a 1 b 2}
set bepa $apa
trace add variable bepa write {error hej}
catch {dict incr bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# A shared valid dictionary, invalid lappend
set apa [list a {{}b} c d]
set bepa $apa
catch {dict lappend bepa a 5}
# An error during write to an unshared object, lappend
set apa {a 1 b 2}
set bepa [lrange $apa 0 end]
trace add variable bepa write {error hej}
catch {dict lappend bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to a shared object, lappend
set apa {a 1 b 2}
set bepa $apa
trace add variable bepa write {error hej}
catch {dict lappend bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to an unshared object, append
set apa {a 1 b 2}
set bepa [lrange $apa 0 end]
trace add variable bepa write {error hej}
catch {dict append bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to a shared object, append
set apa {a 1 b 2}
set bepa $apa
trace add variable bepa write {error hej}
catch {dict append bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to an unshared object, set
set apa {a 1 b 2}
set bepa [lrange $apa 0 end]
trace add variable bepa write {error hej}
catch {dict set bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to a shared object, set
set apa {a 1 b 2}
set bepa $apa
trace add variable bepa write {error hej}
catch {dict set bepa a 5}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to an unshared object, unset
set apa {a 1 b 2}
set bepa [lrange $apa 0 end]
trace add variable bepa write {error hej}
catch {dict unset bepa a}
trace remove variable bepa write {error hej}
unset bepa
# An error during write to a shared object, unset
set apa {a 1 b 2}
set bepa $apa
trace add variable bepa write {error hej}
catch {dict unset bepa a}
trace remove variable bepa write {error hej}
unset bepa
}}
}
} -result 0
test dict-19.3 {testing for leaks - Bug 2874678} -constraints memory -body {
set d aDictVar; # Force interpreted [dict incr]
memtest {
dict incr $d aKey 0
unset $d
}
} -cleanup {
unset d
} -result 0
test dict-20.1 {dict merge command} {
dict merge
} {}
test dict-20.2 {dict merge command} {
dict merge {a b c d e f}
} {a b c d e f}
test dict-20.3 {dict merge command} -body {
dict merge {a b c d e}
} -result {missing value to go with key} -returnCodes error
test dict-20.4 {dict merge command} {
dict merge {a b c d} {e f g h}
} {a b c d e f g h}
test dict-20.5 {dict merge command} -body {
dict merge {a b c d e} {e f g h}
} -result {missing value to go with key} -returnCodes error
test dict-20.6 {dict merge command} -body {
dict merge {a b c d} {e f g h i}
} -result {missing value to go with key} -returnCodes error
test dict-20.7 {dict merge command} {
dict merge {a b c d e f} {e x g h}
} {a b c d e x g h}
test dict-20.8 {dict merge command} {
dict merge {a b c d} {a x c y}
} {a x c y}
test dict-20.9 {dict merge command} {
dict merge {a b c d} {c y a x}
} {a x c y}
test dict-20.10 {dict merge command} {
dict merge {a b c d e f} {a x 1 2 3 4} {a - 1 -}
} {a - c d e f 1 - 3 4}
test dict-20.11 {dict merge command} {
apply {{} {dict merge}}
} {}
test dict-20.12 {dict merge command} {
apply {{} {dict merge {a b c d e f}}}
} {a b c d e f}
test dict-20.13 {dict merge command} -body {
apply {{} {dict merge {a b c d e}}}
} -result {missing value to go with key} -returnCodes error
test dict-20.14 {dict merge command} {
apply {{} {dict merge {a b c d} {e f g h}}}
} {a b c d e f g h}
test dict-20.15 {dict merge command} -body {
apply {{} {dict merge {a b c d e} {e f g h}}}
} -result {missing value to go with key} -returnCodes error
test dict-20.16 {dict merge command} -body {
apply {{} {dict merge {a b c d} {e f g h i}}}
} -result {missing value to go with key} -returnCodes error
test dict-20.17 {dict merge command} {
apply {{} {dict merge {a b c d e f} {e x g h}}}
} {a b c d e x g h}
test dict-20.18 {dict merge command} {
apply {{} {dict merge {a b c d} {a x c y}}}
} {a x c y}
test dict-20.19 {dict merge command} {
apply {{} {dict merge {a b c d} {c y a x}}}
} {a x c y}
test dict-20.20 {dict merge command} {
apply {{} {dict merge {a b c d e f} {a x 1 2 3 4} {a - 1 -}}}
} {a - c d e f 1 - 3 4}
test dict-20.21 {dict merge command: canonicality not forced} {
dict merge { a b c d }
} { a b c d }
test dict-20.22 {dict merge command: canonicality not forced} {
dict merge { a b c d } {}
} { a b c d }
test dict-20.23 {dict merge command: canonicality forced by update} {
dict merge { a b c d } {a b}
} {a b c d}
test dict-20.24 {dict merge command: type check is mandatory} -body {
dict merge { a b c d e }
} -returnCodes error -result {missing value to go with key}
test dict-20.25 {dict merge command: type check is mandatory} -body {
dict merge { a b {}c d }
} -returnCodes error -result {dict element in braces followed by "c" instead of space}
test dict-21.1 {dict update command} -returnCodes 1 -body {
dict update
} -result {wrong # args: should be "dict update dictVarName key varName ?key varName ...? script"}
test dict-21.2 {dict update command} -returnCodes 1 -body {
dict update v
} -result {wrong # args: should be "dict update dictVarName key varName ?key varName ...? script"}
test dict-21.3 {dict update command} -returnCodes 1 -body {
dict update v k
} -result {wrong # args: should be "dict update dictVarName key varName ?key varName ...? script"}
test dict-21.4 {dict update command} -returnCodes 1 -body {
dict update v k v
} -result {wrong # args: should be "dict update dictVarName key varName ?key varName ...? script"}
test dict-21.5 {dict update command} -body {
set a {b c}
set result {}
set bb {}
dict update a b bb {
lappend result $a $bb
}
lappend result $a
} -cleanup {
unset a result bb
} -result {{b c} c {b c}}
test dict-21.6 {dict update command} -body {
set a {b c}
set result {}
set bb {}
dict update a b bb {
lappend result $a $bb [set bb d]
}
lappend result $a
} -cleanup {
unset a result bb
} -result {{b c} c d {b d}}
test dict-21.7 {dict update command} -body {
set a {b c}
set result {}
set bb {}
dict update a b bb {
lappend result $a $bb [unset bb]
}
lappend result $a
} -cleanup {
unset a result
} -result {{b c} c {} {}}
test dict-21.8 {dict update command} -body {
set a {b c d e}
dict update a b v1 d v2 {
lassign "$v1 $v2" v2 v1
}
return $a
} -cleanup {
unset a v1 v2
} -result {b e d c}
test dict-21.9 {dict update command} -body {
set a {b c d e}
dict update a b v1 d v2 {unset a}
info exist a
} -cleanup {
unset v1 v2
} -result 0
test dict-21.10 {dict update command} -body {
set a {b {c d}}
dict update a b v1 {
dict update v1 c v2 {
set v2 foo
}
}
return $a
} -cleanup {
unset a v1 v2
} -result {b {c foo}}
test dict-21.11 {dict update command} -body {
set a {b c d e}
dict update a b v1 d v2 {
dict set a f g
}
return $a
} -cleanup {
unset a v1 v2
} -result {b c d e f g}
test dict-21.12 {dict update command} -body {
set a {b c d e}
dict update a b v1 d v2 f v3 {
set v3 g
}
return $a
} -cleanup {
unset a v1 v2 v3
} -result {b c d e f g}
test dict-21.13 {dict update command: compilation} {
apply {d {
while 1 {
dict update d a alpha b beta {
set beta $alpha
unset alpha
break
}
}
return $d
}} {a 1 c 2}
} {c 2 b 1}
test dict-21.14 {dict update command: compilation} {
apply {x {
set indices {2 3}
trace add variable aa write "string length \$indices ;#"
dict update x k aa l bb {}
}} {k 1 l 2}
} {}
test dict-21.15 {dict update command: compilation} {
apply {x {
set indices {2 3}
trace add variable aa read "string length \$indices ;#"
dict update x k aa l bb {}
}} {k 1 l 2}
} {}
test dict-21.16 {dict update command: no recursive structures [Bug 1786481]} -body {
set foo {a {b {c {d {e 1}}}}}
dict update foo a t {
dict update t b t {
dict update t c t {
dict update t d t {
dict incr t e
}
}
}
}
string range [append foo OK] end-1 end
} -cleanup {
unset foo t
} -result OK
test dict-21.17 {dict update command: no recursive structures [Bug 1786481]} {
apply {{} {
set foo {a {b {c {d {e 1}}}}}
dict update foo a t {
dict update t b t {
dict update t c t {
dict update t d t {
dict incr t e
}
}
}
}
string range [append foo OK] end-1 end
}}
} OK
test dict-22.1 {dict with command} -body {
dict with
} -returnCodes 1 -result {wrong # args: should be "dict with dictVarName ?key ...? script"}
test dict-22.2 {dict with command} -body {
dict with v
} -returnCodes 1 -result {wrong # args: should be "dict with dictVarName ?key ...? script"}
test dict-22.3 {dict with command} -body {
unset -nocomplain v
dict with v {error "in body"}
} -returnCodes 1 -result {can't read "v": no such variable}
test dict-22.4 {dict with command} -body {
set a {b c d e}
unset -nocomplain b d
set result [list [info exist b] [info exist d]]
dict with a {
lappend result [info exist b] [info exist d] $b $d
}
return $result
} -cleanup {
unset a b d result
} -result {0 0 1 1 c e}
test dict-22.5 {dict with command} -body {
set a {b c d e}
dict with a {
lassign "$b $d" d b
}
return $a
} -cleanup {
unset a b d
} -result {b e d c}
test dict-22.6 {dict with command} -body {
set a {b c d e}
dict with a {
unset b
# This *won't* go into the dict...
set f g
}
return $a
} -cleanup {
unset a d f
} -result {d e}
test dict-22.7 {dict with command} -body {
set a {b c d e}
dict with a {
dict unset a b
}
return $a
} -cleanup {
unset a
} -result {d e b c}
test dict-22.8 {dict with command} -body {
set a [dict create b c]
dict with a {
set b $a
}
return $a
} -cleanup {
unset a b
} -result {b {b c}}
test dict-22.9 {dict with command} -body {
set a {b {c d}}
dict with a b {
set c $c$c
}
return $a
} -cleanup {
unset a c
} -result {b {c dd}}
test dict-22.10 {dict with command: result handling tricky case} -body {
set a {b {c d}}
foreach i {0 1} {
if {$i} break
dict with a b {
set a {}
# We're checking to see if we lose this break
break
}
}
list $i $a
} -cleanup {
unset a i c
} -result {0 {}}
test dict-22.11 {dict with command: no recursive structures [Bug 1786481]} -body {
set foo {t {t {t {inner 1}}}}
dict with foo {
dict with t {
dict with t {
dict with t {
incr inner
}
}
}
}
string range [append foo OK] end-1 end
} -cleanup {
unset foo t inner
} -result OK
test dict-22.12 {dict with: compiled} {
apply {{} {
set d {a 1 b 2}
list [dict with d {
set a $b
unset b
dict set d c 3
list ok
}] $d
}}
} {ok {a 2 c 3}}
test dict-22.13 {dict with: compiled} {
apply {i {
set d($i) {a 1 b 2}
list [dict with d($i) {
set a $b
unset b
dict set d($i) c 3
list ok
}] [array get d]
}} e
} {ok {e {a 2 c 3}}}
test dict-22.14 {dict with: compiled} {
apply {{} {
set d {a 1 b 2}
foreach x {1 2 3} {
dict with d {
incr a $b
if {$x == 2} break
}
unset a b
}
list $a $b $x $d
}}
} {5 2 2 {a 5 b 2}}
test dict-22.15 {dict with: compiled} {
apply {i {
set d($i) {a 1 b 2}
foreach x {1 2 3} {
dict with d($i) {
incr a $b
if {$x == 2} break
}
unset a b
}
list $a $b $x [array get d]
}} e
} {5 2 2 {e {a 5 b 2}}}
test dict-22.16 {dict with: compiled} {
apply {{} {
set d {p {q {a 1 b 2}}}
dict with d p q {
set a $b.$a
}
return $d
}}
} {p {q {a 2.1 b 2}}}
test dict-22.17 {dict with: compiled} {
apply {i {
set d($i) {p {q {a 1 b 2}}}
dict with d($i) p q {
set a $b.$a
}
array get d
}} e
} {e {p {q {a 2.1 b 2}}}}
test dict-22.18 {dict with: compiled} {
set ::d {a 1 b 2}
apply {{} {
dict with ::d {
set a $b.$a
}
return $::d
}}
} {a 2.1 b 2}
test dict-22.19 {dict with: compiled} {
set ::d {p {q {r {a 1 b 2}}}}
apply {{} {
dict with ::d p q r {
set a $b.$a
}
return $::d
}}
} {p {q {r {a 2.1 b 2}}}}
test dict-22.20 {dict with: compiled} {
apply {d {
dict with d {
}
return $a,$b
}} {a 1 b 2}
} 1,2
test dict-22.21 {dict with: compiled} {
apply {d {
dict with d p q {
}
return $a,$b
}} {p {q {a 1 b 2}}}
} 1,2
test dict-22.22 {dict with: compiled} {
set ::d {a 1 b 2}
apply {{} {
dict with ::d {
}
return $a,$b
}}
} 1,2
test dict-22.23 {dict with: compiled} {
set ::d {p {q {a 1 b 2}}}
apply {{} {
dict with ::d p q {
}
return $a,$b
}}
} 1,2
proc linenumber {} {
dict get [info frame -1] line
}
test dict-23.1 {dict compilation crash: Bug 3487626} {
apply {{} {apply {n {
set e {}
set k {}
dict for {a b} {c {d {e {f g}}}} {
::tcl::dict::for {h i} $b {
dict update i e j {
::tcl::dict::update j f k {
return [expr {$n - [linenumber]}]
}
}
}
}
}} [linenumber]}}
} 5
test dict-23.2 {dict compilation crash: Bug 3487626} {
# Something isn't quite right in line number and continuation line
# tracking; at time of writing, this test produces 7, not 5, which
# indicates that the extra newlines in the non-script argument are
# confusing things.
apply {{} {apply {n {
set e {}
set k {}
dict for {a {
b
}} {c {d {e {f g}}}} {
::tcl::dict::for {h {
i
}} ${
b
} {
dict update {
i
} e {
j
} {
::tcl::dict::update {
j
} f k {
return [expr {$n - [linenumber]}]
}
}
}
}
}} [linenumber]}}
} 5
rename linenumber {}
test dict-24.1 {dict map command: syntax} -returnCodes error -body {
dict map
} -result {wrong # args: should be "dict map {keyVarName valueVarName} dictionary script"}
test dict-24.2 {dict map command: syntax} -returnCodes error -body {
dict map x
} -result {wrong # args: should be "dict map {keyVarName valueVarName} dictionary script"}
test dict-24.3 {dict map command: syntax} -returnCodes error -body {
dict map x x
} -result {wrong # args: should be "dict map {keyVarName valueVarName} dictionary script"}
test dict-24.4 {dict map command: syntax} -returnCodes error -body {
dict map x x x x
} -result {wrong # args: should be "dict map {keyVarName valueVarName} dictionary script"}
test dict-24.5 {dict map command: syntax} -returnCodes error -body {
dict map x x x
} -result {must have exactly two variable names}
test dict-24.6 {dict map command: syntax} -returnCodes error -body {
dict map {x x x} x x
} -result {must have exactly two variable names}
test dict-24.7 {dict map command: syntax} -returnCodes error -body {
dict map "\{x" x x
} -result {unmatched open brace in list}
test dict-24.8 {dict map command} -setup {
set values {}
set keys {}
} -body {
# This test confirms that [dict keys], [dict values] and [dict map]
# all traverse a dictionary in the same order.
set dictv {a A b B c C}
dict map {k v} $dictv {
lappend keys $k
lappend values $v
}
set result [expr {
$keys eq [dict keys $dictv] && $values eq [dict values $dictv]
}]
expr {$result ? "YES" : [list "NO" $dictv $keys $values]}
} -cleanup {
unset result keys values k v dictv
} -result YES
test dict-24.9 {dict map command} {
dict map {k v} {} {
error "unexpected execution of 'dict map' body"
}
} {}
test dict-24.10 {dict map command: script results} -body {
set times 0
dict map {k v} {a a b b} {
incr times
continue
error "shouldn't get here"
}
return $times
} -cleanup {
unset times k v
} -result 2
test dict-24.11 {dict map command: script results} -body {
set times 0
dict map {k v} {a a b b} {
incr times
break
error "shouldn't get here"
}
return $times
} -cleanup {
unset times k v
} -result 1
test dict-24.12 {dict map command: script results} -body {
set times 0
list [catch {
dict map {k v} {a a b b} {
incr times
error test
}
} msg] $msg $times $::errorInfo
} -cleanup {
unset times k v msg
} -result {1 test 1 {test
while executing
"error test"
("dict map" body line 3)
invoked from within
"dict map {k v} {a a b b} {
incr times
error test
}"}}
test dict-24.13 {dict map command: script results} {
apply {{} {
dict map {k v} {a b} {
return ok,$k,$v
error "skipped return completely"
}
error "return didn't go far enough"
}}
} ok,a,b
test dict-24.14 {dict map command: handle representation loss} -setup {
set keys {}
set values {}
} -body {
set dictVar {a b c d e f g h}
list [dict size [dict map {k v} $dictVar {
if {[llength $dictVar]} {
lappend keys $k
lappend values $v
return -level 0 $k
}
}]] [lsort $keys] [lsort $values]
} -cleanup {
unset dictVar keys values k v
} -result {4 {a c e g} {b d f h}}
test dict-24.14a {dict map command: handle representation loss} -body {
apply {{} {
set dictVar {a b c d e f g h}
list [dict size [dict map {k v} $dictVar {
if {[llength $dictVar]} {
lappend keys $k
lappend values $v
return -level 0 $k
}
}]] [lsort $keys] [lsort $values]
}}
} -result {4 {a c e g} {b d f h}}
test dict-24.15 {dict map command: keys are unique and iterated over once only} -setup {
unset -nocomplain accum
array set accum {}
} -body {
set dictVar {a1 a a2 b b1 c b2 d foo bar bar foo}
dict map {k v} $dictVar {
append accum($k) $v,
}
set result [lsort [array names accum]]
lappend result :
foreach k $result {
catch {lappend result $accum($k)}
}
return $result
} -cleanup {
unset dictVar k v result accum
} -result {a1 a2 b1 b2 bar foo : a, b, c, d, foo, bar,}
test dict-24.16 {dict map command in compilation context} {
apply {{} {
set res {x x x x x x}
dict map {k v} {a 0 b 1 c 2 d 3 e 4 f 5} {
lset res $v $k
continue
}
return $res
}}
} {a b c d e f}
test dict-24.17 {dict map command in compilation context} {
# Bug 1379349 (dict for)
apply {{} {
set d [dict create a 1] ;# Dict must be unshared!
dict map {k v} $d {
dict set d $k 0 ;# Any modification will do
}
return $d
}}
} {a 0}
test dict-24.17a {dict map command in compilation context} {
# Bug 1379349 (dict for)
apply {{} {
set d [dict create a 1] ;# Dict must be unshared!
dict map {k v} $d {
dict set d $k 0 ;# Any modification will do
}
}}
} {a {a 0}}
test dict-24.18 {dict map command in compilation context} {
# Bug 1382528 (dict for)
apply {{} {
dict map {k v} {} {} ;# Note empty dict
catch { error foo } ;# Note compiled [catch]
}}
} 1
test dict-24.19 {dict map and invalid dicts: 'dict for' bug 1531184} -body {
di[list]ct map {k v} x {}
} -returnCodes 1 -result {missing value to go with key}
test dict-24.20 {dict map stack space compilation: 'dict for' bug 1903325} {
apply {{x y args} {
dict map {a b} $x {}
concat "c=$y,$args"
}} {} 1 2 3
} {c=1,2 3}
proc linenumber {} {
dict get [info frame -1] line
}
test dict-24.20.1 {dict compilation crash: 'dict for' bug 3487626} {
apply {{} {apply {n {
set e {}
set k {}
dict map {a b} {c {d {e {f g}}}} {
::tcl::dict::map {h i} $b {
dict update i e j {
::tcl::dict::update j f k {
return [expr {$n - [linenumber]}]
}
}
}
}
}} [linenumber]}}
} 5
test dict-24.21 {dict compilation crash: 'dict for' bug 3487626} {
apply {{} {apply {n {
set e {}
set k {}
dict map {a {
b
}} {c {d {e {f g}}}} {
::tcl::dict::map {h {
i
}} ${
b
} {
dict update {
i
} e {
j
} {
::tcl::dict::update {
j
} f k {
return [expr {$n - [linenumber]}]
}
}
}
}
}} [linenumber]}}
} 5
test dict-23.3 {CompileWord OBOE} {
# segfault when buggy
apply {{} {tcl::dict::lappend foo bar \
[format baz]}}
} {bar baz}
test dict-23.4 {CompileWord OBOE} {
apply {n {
dict set foo {*}{
} [return [incr n -[linenumber]]] val
}} [linenumber]
} 1
test dict-23.5 {CompileWord OBOE} {
# segfault when buggy
apply {{} {tcl::dict::incr foo \
[format bar]}}
} {bar 1}
test dict-23.6 {CompileWord OBOE} {
apply {n {
dict get {a b} {*}{
} [return [incr n -[linenumber]]]
}} [linenumber]
} 1
test dict-23.7 {CompileWord OBOE} {
apply {n {
dict for {a b} [return [incr n -[linenumber]]] {*}{
} {}
}} [linenumber]
} 2
test dict-23.8 {CompileWord OBOE} {
apply {n {
dict update foo {*}{
} [return [incr n -[linenumber]]] x {}
}} [linenumber]
} 1
test dict-23.9 {CompileWord OBOE} {
apply {n {
dict exists {} {*}{
} [return [incr n -[linenumber]]]
}} [linenumber]
} 1
test dict-23.10 {CompileWord OBOE} {
apply {n {
dict with foo {*}{
} [return [incr n -[linenumber]]] {}
}} [linenumber]
} 1
test dict-23.11 {CompileWord OBOE} {
apply {n {
dict with ::foo {*}{
} [return [incr n -[linenumber]]] {}
}} [linenumber]
} 1
test dict-23.12 {CompileWord OBOE} {
apply {n {
dict with {*}{
} [return [incr n -[linenumber]]] {}
}} [linenumber]
} 1
test dict-23.13 {CompileWord OBOE} {
apply {n {
dict with {*}{
} [return [incr n -[linenumber]]] {bar}
}} [linenumber]
} 1
test dict-23.14 {CompileWord OBOE} {
apply {n {
dict with foo {*}{
} [return [incr n -[linenumber]]] {bar}
}} [linenumber]
} 1
rename linenumber {}
test dict-24.22 {dict map results (non-compiled)} {
dict map {k v} [dict map {k v} {a 1 b 2 c 3 d 4} { list $v $k }] {
return -level 0 "$k,$v"
}
} {a {a,1 a} b {b,2 b} c {c,3 c} d {d,4 d}}
test dict-24.23 {dict map results (compiled)} {
apply {{} {
dict map {k v} [dict map {k v} {a 1 b 2 c 3 d 4} { list $v $k }] {
return -level 0 "$k,$v"
}
}}
} {a {a,1 a} b {b,2 b} c {c,3 c} d {d,4 d}}
test dict-24.23a {dict map results (compiled)} {
apply {{list} {
dict map {k v} [dict map {k v} $list { list $v $k }] {
return -level 0 "$k,$v"
}
}} {a 1 b 2 c 3 d 4}
} {a {a,1 a} b {b,2 b} c {c,3 c} d {d,4 d}}
test dict-24.24 {dict map with huge dict (non-compiled)} {
tcl::mathop::+ {*}[dict map {k v} [lsearch -all [lrepeat 100000 x] x] {
expr { $k * $v }
}]
} 166666666600000
test dict-24.25 {dict map with huge dict (compiled)} {
apply {{n} {
tcl::mathop::+ {*}[dict map {k v} [lsearch -all [lrepeat $n y] y] {
expr { $k * $v }
}]
}} 100000
} 166666666600000
test dict-25.1 {compiled dict update with low-refcount values [Bug d553228d9f]} {
# Test crashes on failure
apply {{} {
lassign {} item
dict update item item item two two {}
}}
} {}
# cleanup
::tcltest::cleanupTests
return
# Local Variables:
# mode: tcl
# End: