# Commands covered: ::dom::treeWalker # # This file contains a collection of tests for one or more of the # TclDOM commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 2000 Ajuba Solutions # Copyright (c) 2002 Zveno Pty Ltd # # $Id: treewalker.test,v 1.3 2002/08/11 11:22:48 balls Exp $ package require tcltest; namespace import -force ::tcltest::* source testutils.tcl testPackage dom set xml1 { This is text.aaabbbaaa2cccdddccc2aaa3} test treewalker-2.1 {argument parsing} -constraints {dom_c} -body { list [catch {dom::treeWalker} msg] $msg } -result {1 {wrong # args: should be "dom::treeWalker method handle ?arg ...?"}} test treewalker-2.2 {argument parsing} -constraints {dom_c} -body { list [catch {dom::treeWalker foo} msg] $msg } -result {1 {bad method "foo": must be cget, configure, parentNode, firstChild, lastChild, previousSibling, nextSibling, previousNode, or nextNode}} test treewalker-2.3 {argument parsing} -constraints {dom_c} -body { list [catch {dom::treeWalker cget blah} msg] $msg } -result {1 {token not found}} test treewalker-1.1 {treewalker creation} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { }] set result [catch {dom::DocumentTraversal createTreeWalker $document} \ treewalker] set handle [string range $treewalker 0 9] list $result $handle } -result {0 treewalker} test treewalker-1.2 {treewalker creation} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { }] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {dom::treeWalker nextNode $treewalker} first] set handle [string range $first 0 3] list $result $handle } -result {0 node} test treewalker-2.1 {treewalker cget -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ [list element textNode]] set result [catch {::dom::treeWalker cget $treewalker -show} value] list $result $value } -result {0 {element textNode}} test treewalker-2.2 {treewalker configure -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ [list element textNode]] set result [catch {::dom::treeWalker configure $treewalker -show} value] list $result $value } -result {0 {element textNode}} test treewalker-2.3 {treewalker configure -show readonly} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ [list element textNode]] set result [catch {::dom::treeWalker configure $treewalker \ -show [list element]} value] list $result $value } -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} test treewalker-2.4 {treewalker cget -filter} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result [catch {::dom::treeWalker cget $treewalker -filter} value] list $result $value } -result {0 nodeFilter} test treewalker-2.5 {treewalker configure -filter} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result [catch {::dom::treeWalker configure $treewalker -filter} value] list $result $value } -result {0 nodeFilter} test treewalker-2.6 {treewalker configure -filter readonly} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result [catch {::dom::treeWalker configure $treewalker \ -filter someFilter} value] list $result $value } -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} test treewalker-2.7 {treewalker cget -expandEntities} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {::dom::treeWalker cget $treewalker \ -expandEntities} value] list $result $value } -result {0 0} test treewalker-2.8 {treewalker configure -expandEntities} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {::dom::treeWalker configure $treewalker \ -expandEntities} value] list $result $value } -result {0 0} test treewalker-2.9 {treewalker configure -expandEntities readonly} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {::dom::treeWalker configure $treewalker \ -expandEntities 1} value] list $result $value } -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} test treewalker-2.10 {treewalker cget -currentNode} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {::dom::treeWalker cget $treewalker \ -currentNode} value] list $result [string compare $document $value] } {0 0} test treewalker-2.10 {treewalker configure -currentNode} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result [catch {::dom::treeWalker configure $treewalker \ -currentNode} value] list $result [string compare $document $value] } -result {0 0} test treewalker-2.10 {treewalker configure -currentNode writable} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse {}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set topNode [dom::document cget $document -documentElement] set result [catch {::dom::treeWalker configure $treewalker \ -currentNode $topNode} value] set result [catch {::dom::treeWalker configure $treewalker \ -currentNode} value] list $result [string compare $topNode $value] } -result {0 0} test treewalker-3.1 {basic iteration} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; lappend result [dom::node cget $node -nodeType] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] } set result } -result {documentType Test {} element Test {} textNode #text {This } element b {} textNode #text is textNode #text text.} test treewalker-3.2 {basic iteration with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list element textNode]] set result {} for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; lappend result [dom::node cget $node -nodeType] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] } set result } -result {element Test {} textNode #text {This } element b {} textNode #text is textNode #text text.} test treewalker-3.3 {basic reverse iteration} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker previousNode $treewalker] if {$node == ""} break; lappend result [dom::node cget $node -nodeType] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] } set result } -result {textNode #text is element b {} textNode #text {This } element Test {} documentType Test {} document #document {}} test treewalker-3.4 {basic reverse iteration with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list element textNode]] set result {} for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } for {set i 0} {$i < 9} {incr i} { set node [dom::treeWalker previousNode $treewalker] if {$node == ""} break; lappend result [dom::node cget $node -nodeType] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] } set result } -result {textNode #text is element b {} textNode #text {This } element Test {}} test treewalker-3.5 {complex iteration} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.6 {complex iteration} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker previousNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {ccc2 ddd D ccc C aaa2 bbb B aaa A { text.} is b {This } Test Test #document} test treewalker-3.7 {basic iteration both directions} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker nextNode $treewalker] lappend result [dom::node cget $node -nodeName] set node [dom::treeWalker previousNode $treewalker] lappend result [dom::node cget $node -nodeName] set result } -result {Test #document} test treewalker-3.8 {backup before start of list} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker previousNode $treewalker] set node } -result {} test treewalker-3.9 {backup before start of list then forward} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { This istext.}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker previousNode $treewalker] set node [dom::treeWalker previousNode $treewalker] set node [dom::treeWalker previousNode $treewalker] set node [dom::treeWalker previousNode $treewalker] set node [dom::treeWalker nextNode $treewalker] lappend result [dom::node cget $node -nodeName] set result } -result {Test} test treewalker-3.10 {inserts while iterating} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name if {$name == "A"} { set new [dom::document createTextNode $document "New Text"] dom::node insertBefore $node $new \ [dom::node cget $node -firstChild] } } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {Test Test {This } b is { text.} A {New Text} aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.11 {deletions while iterating} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name if {$name == "A"} { dom::node removeChild $node [dom::node cget $node -firstChild] } } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {Test Test {This } b is { text.} A B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.12 {reference node deletion while iterating} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name if {$name == "B"} { dom::node removeChild [dom::node cget $node -parent] $node } } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {Test Test {This } b is { text.} A aaa B aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.13 {reference node deletion while iterating II} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name if {$name == "C"} { set nodeToDelete $node } elseif {$name == "D"} { dom::node removeChild [dom::node cget $nodeToDelete -parent] \ $nodeToDelete } } else { lappend result [dom::node cget $node -nodeValue] } } set result } -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D aaa3} test treewalker-3.14 {deletion of trailing reference node} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse { xxx}] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node {} for {set i 0} {$i < 9} {incr i} { set refNode $node set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } set node [dom::treeWalker previousNode $treewalker] dom::node removeChild [dom::node cget $refNode -parent] $refNode set node [dom::treeWalker previousNode $treewalker] lappend result [dom::node cget $node -nodeName] set result } -result {Test} test treewalker-3.15 {complex iteration with filter} -constraints {dom_c} -body { proc nodeFilter {node} { set value [dom::node cget $node -nodeValue] if {$value == "aaa"} { return $::dom::skip } else { return $::dom::accept } } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result } -result {Test Test {This } b is { text.} A B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.16 {firstChild} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker firstChild $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {Test {}} test treewalker-3.17 {firstChild with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show textNode] set result {} set node [dom::treeWalker firstChild $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {#text {This }} test treewalker-3.18 {parentNode} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker firstChild $treewalker] set node [dom::treeWalker nextSibling $treewalker] set node [dom::treeWalker firstChild $treewalker] set node [dom::treeWalker parentNode $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {Test {}} test treewalker-3.19 {parentNode with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list document textNode]] set result {} set node [dom::treeWalker firstChild $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set node [dom::treeWalker parentNode $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {#text {This } #document {}} test treewalker-3.20 {nextSibling with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list document textNode]] set result {} set node [dom::treeWalker firstChild $treewalker] lappend result [dom::node cget $node -nodeValue] while {1} { set node [dom::treeWalker nextSibling $treewalker] if {$node == ""} break lappend result [dom::node cget $node -nodeValue] } set result } -result {{This } is { text.} aaa bbb aaa2 ccc ddd ccc2 aaa3} test treewalker-3.21 {lastChild} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document] set result {} set node [dom::treeWalker lastChild $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {Test {}} test treewalker-3.22 {lastChild with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show textNode] set result {} set node [dom::treeWalker lastChild $treewalker] lappend result [dom::node cget $node -nodeName] lappend result [dom::node cget $node -nodeValue] set result } -result {#text aaa3} test treewalker-3.23 {previousSibling with -show} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list document textNode]] set result {} set node [dom::treeWalker lastChild $treewalker] lappend result [dom::node cget $node -nodeValue] while {1} { set node [dom::treeWalker previousSibling $treewalker] if {$node == ""} break lappend result [dom::node cget $node -nodeValue] } set result } -result {aaa3 ccc2 ddd ccc aaa2 bbb aaa { text.} is {This }} test treewalker-3.24 {iteration with skip filter} -constraints {dom_c} -body { proc nodeFilter {node} { set value [dom::node cget $node -nodeName] if {$value == "A"} { return $::dom::skip } else { return $::dom::accept } } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result } -result {Test Test {This } b is { text.} aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-3.25 {iteration with reject filter} -constraints {dom_c} -body { proc nodeFilter {node} { set value [dom::node cget $node -nodeName] if {$value == "A"} { return $::dom::reject } else { return $::dom::accept } } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result } -result {Test Test {This } b is { text.}} test treewalker-3.26 {reverse iteration with skip filter} -constraints {dom_c} -body { proc nodeFilter {node} { set value [dom::node cget $node -nodeName] if {$value == "A"} { return $::dom::skip } else { return $::dom::accept } } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker previousNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result } -result {ccc2 ddd D ccc C aaa2 bbb B aaa { text.} is b {This } Test Test #document} test treewalker-3.27 {reverse iteration with reject filter} -constraints {dom_c} -body { # filter is noop while we go to last node proc nodeFilter {node} { return $::dom::accept } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} # advance to last node for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; } proc nodeFilter {node} { set value [dom::node cget $node -nodeName] if {$value == "A"} { return $::dom::reject } else { return $::dom::accept } } for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker previousNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result # child nodes of filtered element appear because we're going # backwards } -result {ccc2 ddd D ccc C aaa2 bbb B aaa { text.} is b {This } Test Test #document} test treewalker-3.28 {iteration with deletion in filter} -constraints {dom_c} -body { # this example isn't good coding practice, but we need to test that the # code at least holds up proc nodeFilter {node} { set value [dom::node cget $node -nodeName] if {$value == "A"} { set parent [dom::node cget $node -parentNode] if {$parent != {}} { dom::node removeChild $parent $node } return $::dom::accept } else { return $::dom::accept } } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set result {} for {set i 0} {$i < 40} {incr i} { set node [dom::treeWalker nextNode $treewalker] if {$node == ""} break; set name [dom::node cget $node -nodeName] if {$name != "#text"} { lappend result $name } else { lappend result [dom::node cget $node -nodeValue] } } rename nodeFilter {} set result } -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} test treewalker-4.1 {treewalker deletion} -constraints {dom_c} -body { set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -show [list document textNode]] set result [catch {::dom::DocumentTraversal destroy $treewalker} errmsg] list $result $errmsg } -result {0 {}} test treewalker-5.1 {delete document in filter proc} -constraints {dom_c} -body { proc nodeFilter {node} { global document dom::DOMImplementation destroy $document return $::dom::accept } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set node [dom::treeWalker nextNode $treewalker] set result [catch {dom::node cget $node -nodeName} errmsg] rename nodeFilter {} list $result $errmsg } -result {1 {token not found}} test treewalker-5.2 {delete document in filter proc} -constraints {dom_c} -body { proc nodeFilter {node} { global document dom::DOMImplementation destroy $document return $::dom::accept } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] set node [dom::treeWalker nextNode $treewalker] set result [catch {dom::treeWalker nextNode $treewalker} errmsg] rename nodeFilter {} list $result $errmsg } -result {0 {}} test treewalker-5.3 {delete treewalker in filter proc} -constraints {dom_c} -body { proc nodeFilter {node} { global treewalker ::dom::DocumentTraversal destroy $treewalker return $::dom::accept } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] # first invocation succeeds set node [dom::treeWalker nextNode $treewalker] set result [catch {dom::treeWalker nextNode $treewalker} errmsg] rename nodeFilter {} list $result $errmsg } -result {1 {token not found}} test treewalker-5.4 {recursively invoke filter proc} -constraints {dom_c} -body { proc nodeFilter {node} { global treewalker set node [dom::treeWalker nextNode $treewalker] return $::dom::accept } set document [::dom::DOMImplementation parse $xml1] set treewalker [dom::DocumentTraversal createTreeWalker $document \ -filter nodeFilter] expectError { dom::treeWalker nextNode $treewalker } {too many nested calls * (infinite loop?)} rename nodeFilter {} ok } -result {} ::tcltest::cleanupTests return