1# Commands covered: ::dom::treeWalker 2# 3# This file contains a collection of tests for one or more of the 4# TclDOM commands. Sourcing this file into Tcl runs the tests and 5# generates output for errors. No output means no errors were found. 6# 7# Copyright (c) 2000 Ajuba Solutions 8# Copyright (c) 2002 Zveno Pty Ltd 9# 10# $Id: treewalker.test,v 1.3 2002/08/11 11:22:48 balls Exp $ 11 12package require tcltest; namespace import -force ::tcltest::* 13source testutils.tcl 14testPackage dom 15 16set xml1 {<?xml version="1.0"?> 17<!DOCTYPE Test> 18<Test>This <b>is</b> text.<A>aaa<B>bbb</B>aaa2<C>ccc<D>ddd</D>ccc2</C>aaa3</A></Test>} 19 20test treewalker-2.1 {argument parsing} -constraints {dom_c} -body { 21 list [catch {dom::treeWalker} msg] $msg 22} -result {1 {wrong # args: should be "dom::treeWalker method handle ?arg ...?"}} 23test treewalker-2.2 {argument parsing} -constraints {dom_c} -body { 24 list [catch {dom::treeWalker foo} msg] $msg 25} -result {1 {bad method "foo": must be cget, configure, parentNode, firstChild, lastChild, previousSibling, nextSibling, previousNode, or nextNode}} 26test treewalker-2.3 {argument parsing} -constraints {dom_c} -body { 27 list [catch {dom::treeWalker cget blah} msg] $msg 28} -result {1 {token not found}} 29 30 31test treewalker-1.1 {treewalker creation} -constraints {dom_c} -body { 32 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 33<!DOCTYPE Test> 34<Test></Test>}] 35 set result [catch {dom::DocumentTraversal createTreeWalker $document} \ 36 treewalker] 37 set handle [string range $treewalker 0 9] 38 list $result $handle 39} -result {0 treewalker} 40 41test treewalker-1.2 {treewalker creation} -constraints {dom_c} -body { 42 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 43<!DOCTYPE Test> 44<Test></Test>}] 45 set treewalker [dom::DocumentTraversal createTreeWalker $document] 46 set result [catch {dom::treeWalker nextNode $treewalker} first] 47 set handle [string range $first 0 3] 48 list $result $handle 49} -result {0 node} 50 51test treewalker-2.1 {treewalker cget -show} -constraints {dom_c} -body { 52 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 53 set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ 54 [list element textNode]] 55 set result [catch {::dom::treeWalker cget $treewalker -show} value] 56 list $result $value 57} -result {0 {element textNode}} 58 59test treewalker-2.2 {treewalker configure -show} -constraints {dom_c} -body { 60 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 61 set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ 62 [list element textNode]] 63 set result [catch {::dom::treeWalker configure $treewalker -show} value] 64 list $result $value 65} -result {0 {element textNode}} 66 67test treewalker-2.3 {treewalker configure -show readonly} -constraints {dom_c} -body { 68 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 69 set treewalker [dom::DocumentTraversal createTreeWalker $document -show \ 70 [list element textNode]] 71 set result [catch {::dom::treeWalker configure $treewalker \ 72 -show [list element]} value] 73 list $result $value 74} -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} 75 76test treewalker-2.4 {treewalker cget -filter} -constraints {dom_c} -body { 77 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 78 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 79 -filter nodeFilter] 80 set result [catch {::dom::treeWalker cget $treewalker -filter} value] 81 list $result $value 82} -result {0 nodeFilter} 83 84test treewalker-2.5 {treewalker configure -filter} -constraints {dom_c} -body { 85 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 86 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 87 -filter nodeFilter] 88 set result [catch {::dom::treeWalker configure $treewalker -filter} value] 89 list $result $value 90} -result {0 nodeFilter} 91 92test treewalker-2.6 {treewalker configure -filter readonly} -constraints {dom_c} -body { 93 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 94 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 95 -filter nodeFilter] 96 set result [catch {::dom::treeWalker configure $treewalker \ 97 -filter someFilter} value] 98 list $result $value 99} -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} 100 101test treewalker-2.7 {treewalker cget -expandEntities} -constraints {dom_c} -body { 102 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 103 set treewalker [dom::DocumentTraversal createTreeWalker $document] 104 set result [catch {::dom::treeWalker cget $treewalker \ 105 -expandEntities} value] 106 list $result $value 107} -result {0 0} 108 109test treewalker-2.8 {treewalker configure -expandEntities} -constraints {dom_c} -body { 110 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 111 set treewalker [dom::DocumentTraversal createTreeWalker $document] 112 set result [catch {::dom::treeWalker configure $treewalker \ 113 -expandEntities} value] 114 list $result $value 115} -result {0 0} 116 117test treewalker-2.9 {treewalker configure -expandEntities readonly} -constraints {dom_c} -body { 118 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 119 set treewalker [dom::DocumentTraversal createTreeWalker $document] 120 set result [catch {::dom::treeWalker configure $treewalker \ 121 -expandEntities 1} value] 122 list $result $value 123} -result {1 {no modification allowed error: an attempt was made to modify an object where modifications are not allowed}} 124 125test treewalker-2.10 {treewalker cget -currentNode} -constraints {dom_c} -body { 126 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 127 set treewalker [dom::DocumentTraversal createTreeWalker $document] 128 set result [catch {::dom::treeWalker cget $treewalker \ 129 -currentNode} value] 130 list $result [string compare $document $value] 131} {0 0} 132 133test treewalker-2.10 {treewalker configure -currentNode} -constraints {dom_c} -body { 134 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 135 set treewalker [dom::DocumentTraversal createTreeWalker $document] 136 set result [catch {::dom::treeWalker configure $treewalker \ 137 -currentNode} value] 138 list $result [string compare $document $value] 139} -result {0 0} 140 141test treewalker-2.10 {treewalker configure -currentNode writable} -constraints {dom_c} -body { 142 set document [::dom::DOMImplementation parse {<?xml version="1.0"?><A></A>}] 143 set treewalker [dom::DocumentTraversal createTreeWalker $document] 144 set topNode [dom::document cget $document -documentElement] 145 set result [catch {::dom::treeWalker configure $treewalker \ 146 -currentNode $topNode} value] 147 set result [catch {::dom::treeWalker configure $treewalker \ 148 -currentNode} value] 149 list $result [string compare $topNode $value] 150} -result {0 0} 151 152 153test treewalker-3.1 {basic iteration} -constraints {dom_c} -body { 154 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 155<!DOCTYPE Test> 156<Test>This <b>is</b>text.</Test>}] 157 set treewalker [dom::DocumentTraversal createTreeWalker $document] 158 set result {} 159 for {set i 0} {$i < 9} {incr i} { 160 set node [dom::treeWalker nextNode $treewalker] 161 if {$node == ""} break; 162 lappend result [dom::node cget $node -nodeType] 163 lappend result [dom::node cget $node -nodeName] 164 lappend result [dom::node cget $node -nodeValue] 165 } 166 set result 167} -result {documentType Test {} element Test {} textNode #text {This } element b {} textNode #text is textNode #text text.} 168 169test treewalker-3.2 {basic iteration with -show} -constraints {dom_c} -body { 170 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 171<!DOCTYPE Test> 172<Test>This <b>is</b>text.</Test>}] 173 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 174 -show [list element textNode]] 175 set result {} 176 for {set i 0} {$i < 9} {incr i} { 177 set node [dom::treeWalker nextNode $treewalker] 178 if {$node == ""} break; 179 lappend result [dom::node cget $node -nodeType] 180 lappend result [dom::node cget $node -nodeName] 181 lappend result [dom::node cget $node -nodeValue] 182 } 183 set result 184} -result {element Test {} textNode #text {This } element b {} textNode #text is textNode #text text.} 185 186test treewalker-3.3 {basic reverse iteration} -constraints {dom_c} -body { 187 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 188<!DOCTYPE Test> 189<Test>This <b>is</b>text.</Test>}] 190 set treewalker [dom::DocumentTraversal createTreeWalker $document] 191 set result {} 192 for {set i 0} {$i < 9} {incr i} { 193 set node [dom::treeWalker nextNode $treewalker] 194 if {$node == ""} break; 195 } 196 for {set i 0} {$i < 9} {incr i} { 197 set node [dom::treeWalker previousNode $treewalker] 198 if {$node == ""} break; 199 lappend result [dom::node cget $node -nodeType] 200 lappend result [dom::node cget $node -nodeName] 201 lappend result [dom::node cget $node -nodeValue] 202 } 203 set result 204} -result {textNode #text is element b {} textNode #text {This } element Test {} documentType Test {} document #document {}} 205 206test treewalker-3.4 {basic reverse iteration with -show} -constraints {dom_c} -body { 207 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 208<!DOCTYPE Test> 209<Test>This <b>is</b>text.</Test>}] 210 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 211 -show [list element textNode]] 212 set result {} 213 for {set i 0} {$i < 9} {incr i} { 214 set node [dom::treeWalker nextNode $treewalker] 215 if {$node == ""} break; 216 } 217 for {set i 0} {$i < 9} {incr i} { 218 set node [dom::treeWalker previousNode $treewalker] 219 if {$node == ""} break; 220 lappend result [dom::node cget $node -nodeType] 221 lappend result [dom::node cget $node -nodeName] 222 lappend result [dom::node cget $node -nodeValue] 223 } 224 set result 225} -result {textNode #text is element b {} textNode #text {This } element Test {}} 226 227test treewalker-3.5 {complex iteration} -constraints {dom_c} -body { 228 set document [::dom::DOMImplementation parse $xml1] 229 set treewalker [dom::DocumentTraversal createTreeWalker $document] 230 set result {} 231 for {set i 0} {$i < 40} {incr i} { 232 set node [dom::treeWalker nextNode $treewalker] 233 if {$node == ""} break; 234 set name [dom::node cget $node -nodeName] 235 if {$name != "#text"} { 236 lappend result $name 237 } else { 238 lappend result [dom::node cget $node -nodeValue] 239 } 240 } 241 set result 242} -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} 243 244test treewalker-3.6 {complex iteration} -constraints {dom_c} -body { 245 set document [::dom::DOMImplementation parse $xml1] 246 set treewalker [dom::DocumentTraversal createTreeWalker $document] 247 set result {} 248 for {set i 0} {$i < 40} {incr i} { 249 set node [dom::treeWalker nextNode $treewalker] 250 if {$node == ""} break; 251 } 252 for {set i 0} {$i < 40} {incr i} { 253 set node [dom::treeWalker previousNode $treewalker] 254 if {$node == ""} break; 255 set name [dom::node cget $node -nodeName] 256 if {$name != "#text"} { 257 lappend result $name 258 } else { 259 lappend result [dom::node cget $node -nodeValue] 260 } 261 } 262 set result 263} -result {ccc2 ddd D ccc C aaa2 bbb B aaa A { text.} is b {This } Test Test #document} 264 265test treewalker-3.7 {basic iteration both directions} -constraints {dom_c} -body { 266 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 267<!DOCTYPE Test> 268<Test>This <b>is</b>text.</Test>}] 269 set treewalker [dom::DocumentTraversal createTreeWalker $document] 270 set result {} 271 set node [dom::treeWalker nextNode $treewalker] 272 lappend result [dom::node cget $node -nodeName] 273 set node [dom::treeWalker previousNode $treewalker] 274 lappend result [dom::node cget $node -nodeName] 275 set result 276} -result {Test #document} 277 278test treewalker-3.8 {backup before start of list} -constraints {dom_c} -body { 279 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 280<!DOCTYPE Test> 281<Test>This <b>is</b>text.</Test>}] 282 set treewalker [dom::DocumentTraversal createTreeWalker $document] 283 set result {} 284 set node [dom::treeWalker previousNode $treewalker] 285 set node 286} -result {} 287 288test treewalker-3.9 {backup before start of list then forward} -constraints {dom_c} -body { 289 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 290<!DOCTYPE Test> 291<Test>This <b>is</b>text.</Test>}] 292 set treewalker [dom::DocumentTraversal createTreeWalker $document] 293 set result {} 294 set node [dom::treeWalker previousNode $treewalker] 295 set node [dom::treeWalker previousNode $treewalker] 296 set node [dom::treeWalker previousNode $treewalker] 297 set node [dom::treeWalker previousNode $treewalker] 298 set node [dom::treeWalker nextNode $treewalker] 299 lappend result [dom::node cget $node -nodeName] 300 set result 301} -result {Test} 302 303test treewalker-3.10 {inserts while iterating} -constraints {dom_c} -body { 304 set document [::dom::DOMImplementation parse $xml1] 305 set treewalker [dom::DocumentTraversal createTreeWalker $document] 306 set result {} 307 for {set i 0} {$i < 40} {incr i} { 308 set node [dom::treeWalker nextNode $treewalker] 309 if {$node == ""} break 310 set name [dom::node cget $node -nodeName] 311 if {$name != "#text"} { 312 lappend result $name 313 if {$name == "A"} { 314 set new [dom::document createTextNode $document "New Text"] 315 dom::node insertBefore $node $new \ 316 [dom::node cget $node -firstChild] 317 } 318 } else { 319 lappend result [dom::node cget $node -nodeValue] 320 } 321 } 322 set result 323} -result {Test Test {This } b is { text.} A {New Text} aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} 324 325test treewalker-3.11 {deletions while iterating} -constraints {dom_c} -body { 326 set document [::dom::DOMImplementation parse $xml1] 327 set treewalker [dom::DocumentTraversal createTreeWalker $document] 328 set result {} 329 for {set i 0} {$i < 40} {incr i} { 330 set node [dom::treeWalker nextNode $treewalker] 331 if {$node == ""} break 332 set name [dom::node cget $node -nodeName] 333 if {$name != "#text"} { 334 lappend result $name 335 if {$name == "A"} { 336 dom::node removeChild $node [dom::node cget $node -firstChild] 337 } 338 } else { 339 lappend result [dom::node cget $node -nodeValue] 340 } 341 } 342 set result 343} -result {Test Test {This } b is { text.} A B bbb aaa2 C ccc D ddd ccc2 aaa3} 344 345test treewalker-3.12 {reference node deletion while iterating} -constraints {dom_c} -body { 346 set document [::dom::DOMImplementation parse $xml1] 347 set treewalker [dom::DocumentTraversal createTreeWalker $document] 348 set result {} 349 for {set i 0} {$i < 40} {incr i} { 350 set node [dom::treeWalker nextNode $treewalker] 351 if {$node == ""} break 352 set name [dom::node cget $node -nodeName] 353 if {$name != "#text"} { 354 lappend result $name 355 if {$name == "B"} { 356 dom::node removeChild [dom::node cget $node -parent] $node 357 } 358 } else { 359 lappend result [dom::node cget $node -nodeValue] 360 } 361 } 362 set result 363} -result {Test Test {This } b is { text.} A aaa B aaa2 C ccc D ddd ccc2 aaa3} 364 365test treewalker-3.13 {reference node deletion while iterating II} -constraints {dom_c} -body { 366 set document [::dom::DOMImplementation parse $xml1] 367 set treewalker [dom::DocumentTraversal createTreeWalker $document] 368 set result {} 369 for {set i 0} {$i < 40} {incr i} { 370 set node [dom::treeWalker nextNode $treewalker] 371 if {$node == ""} break 372 set name [dom::node cget $node -nodeName] 373 if {$name != "#text"} { 374 lappend result $name 375 if {$name == "C"} { 376 set nodeToDelete $node 377 } elseif {$name == "D"} { 378 dom::node removeChild [dom::node cget $nodeToDelete -parent] \ 379 $nodeToDelete 380 } 381 } else { 382 lappend result [dom::node cget $node -nodeValue] 383 } 384 } 385 set result 386} -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D aaa3} 387 388test treewalker-3.14 {deletion of trailing reference node} -constraints {dom_c} -body { 389 set document [::dom::DOMImplementation parse {<?xml version="1.0"?> 390<!DOCTYPE Test><Test>xxx<A/></Test>}] 391 set treewalker [dom::DocumentTraversal createTreeWalker $document] 392 set result {} 393 set node {} 394 for {set i 0} {$i < 9} {incr i} { 395 set refNode $node 396 set node [dom::treeWalker nextNode $treewalker] 397 if {$node == ""} break; 398 } 399 set node [dom::treeWalker previousNode $treewalker] 400 dom::node removeChild [dom::node cget $refNode -parent] $refNode 401 set node [dom::treeWalker previousNode $treewalker] 402 lappend result [dom::node cget $node -nodeName] 403 set result 404} -result {Test} 405 406test treewalker-3.15 {complex iteration with filter} -constraints {dom_c} -body { 407 proc nodeFilter {node} { 408 set value [dom::node cget $node -nodeValue] 409 if {$value == "aaa"} { 410 return $::dom::skip 411 } else { 412 return $::dom::accept 413 } 414 } 415 416 set document [::dom::DOMImplementation parse $xml1] 417 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 418 -filter nodeFilter] 419 set result {} 420 for {set i 0} {$i < 40} {incr i} { 421 set node [dom::treeWalker nextNode $treewalker] 422 if {$node == ""} break; 423 set name [dom::node cget $node -nodeName] 424 if {$name != "#text"} { 425 lappend result $name 426 } else { 427 lappend result [dom::node cget $node -nodeValue] 428 } 429 } 430 rename nodeFilter {} 431 set result 432} -result {Test Test {This } b is { text.} A B bbb aaa2 C ccc D ddd ccc2 aaa3} 433 434test treewalker-3.16 {firstChild} -constraints {dom_c} -body { 435 set document [::dom::DOMImplementation parse $xml1] 436 set treewalker [dom::DocumentTraversal createTreeWalker $document] 437 set result {} 438 set node [dom::treeWalker firstChild $treewalker] 439 lappend result [dom::node cget $node -nodeName] 440 lappend result [dom::node cget $node -nodeValue] 441 set result 442} -result {Test {}} 443 444test treewalker-3.17 {firstChild with -show} -constraints {dom_c} -body { 445 set document [::dom::DOMImplementation parse $xml1] 446 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 447 -show textNode] 448 set result {} 449 set node [dom::treeWalker firstChild $treewalker] 450 lappend result [dom::node cget $node -nodeName] 451 lappend result [dom::node cget $node -nodeValue] 452 set result 453} -result {#text {This }} 454 455test treewalker-3.18 {parentNode} -constraints {dom_c} -body { 456 set document [::dom::DOMImplementation parse $xml1] 457 set treewalker [dom::DocumentTraversal createTreeWalker $document] 458 set result {} 459 set node [dom::treeWalker firstChild $treewalker] 460 set node [dom::treeWalker nextSibling $treewalker] 461 set node [dom::treeWalker firstChild $treewalker] 462 set node [dom::treeWalker parentNode $treewalker] 463 lappend result [dom::node cget $node -nodeName] 464 lappend result [dom::node cget $node -nodeValue] 465 set result 466} -result {Test {}} 467 468test treewalker-3.19 {parentNode with -show} -constraints {dom_c} -body { 469 set document [::dom::DOMImplementation parse $xml1] 470 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 471 -show [list document textNode]] 472 set result {} 473 set node [dom::treeWalker firstChild $treewalker] 474 lappend result [dom::node cget $node -nodeName] 475 lappend result [dom::node cget $node -nodeValue] 476 set node [dom::treeWalker parentNode $treewalker] 477 lappend result [dom::node cget $node -nodeName] 478 lappend result [dom::node cget $node -nodeValue] 479 set result 480} -result {#text {This } #document {}} 481 482test treewalker-3.20 {nextSibling with -show} -constraints {dom_c} -body { 483 set document [::dom::DOMImplementation parse $xml1] 484 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 485 -show [list document textNode]] 486 set result {} 487 set node [dom::treeWalker firstChild $treewalker] 488 lappend result [dom::node cget $node -nodeValue] 489 while {1} { 490 set node [dom::treeWalker nextSibling $treewalker] 491 if {$node == ""} break 492 lappend result [dom::node cget $node -nodeValue] 493 } 494 set result 495} -result {{This } is { text.} aaa bbb aaa2 ccc ddd ccc2 aaa3} 496 497test treewalker-3.21 {lastChild} -constraints {dom_c} -body { 498 set document [::dom::DOMImplementation parse $xml1] 499 set treewalker [dom::DocumentTraversal createTreeWalker $document] 500 set result {} 501 set node [dom::treeWalker lastChild $treewalker] 502 lappend result [dom::node cget $node -nodeName] 503 lappend result [dom::node cget $node -nodeValue] 504 set result 505} -result {Test {}} 506 507test treewalker-3.22 {lastChild with -show} -constraints {dom_c} -body { 508 set document [::dom::DOMImplementation parse $xml1] 509 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 510 -show textNode] 511 set result {} 512 set node [dom::treeWalker lastChild $treewalker] 513 lappend result [dom::node cget $node -nodeName] 514 lappend result [dom::node cget $node -nodeValue] 515 set result 516} -result {#text aaa3} 517 518test treewalker-3.23 {previousSibling with -show} -constraints {dom_c} -body { 519 set document [::dom::DOMImplementation parse $xml1] 520 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 521 -show [list document textNode]] 522 set result {} 523 set node [dom::treeWalker lastChild $treewalker] 524 lappend result [dom::node cget $node -nodeValue] 525 while {1} { 526 set node [dom::treeWalker previousSibling $treewalker] 527 if {$node == ""} break 528 lappend result [dom::node cget $node -nodeValue] 529 } 530 set result 531} -result {aaa3 ccc2 ddd ccc aaa2 bbb aaa { text.} is {This }} 532 533test treewalker-3.24 {iteration with skip filter} -constraints {dom_c} -body { 534 proc nodeFilter {node} { 535 set value [dom::node cget $node -nodeName] 536 if {$value == "A"} { 537 return $::dom::skip 538 } else { 539 return $::dom::accept 540 } 541 } 542 543 set document [::dom::DOMImplementation parse $xml1] 544 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 545 -filter nodeFilter] 546 set result {} 547 for {set i 0} {$i < 40} {incr i} { 548 set node [dom::treeWalker nextNode $treewalker] 549 if {$node == ""} break; 550 set name [dom::node cget $node -nodeName] 551 if {$name != "#text"} { 552 lappend result $name 553 } else { 554 lappend result [dom::node cget $node -nodeValue] 555 } 556 } 557 rename nodeFilter {} 558 set result 559} -result {Test Test {This } b is { text.} aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} 560 561test treewalker-3.25 {iteration with reject filter} -constraints {dom_c} -body { 562 proc nodeFilter {node} { 563 set value [dom::node cget $node -nodeName] 564 if {$value == "A"} { 565 return $::dom::reject 566 } else { 567 return $::dom::accept 568 } 569 } 570 571 set document [::dom::DOMImplementation parse $xml1] 572 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 573 -filter nodeFilter] 574 set result {} 575 for {set i 0} {$i < 40} {incr i} { 576 set node [dom::treeWalker nextNode $treewalker] 577 if {$node == ""} break; 578 set name [dom::node cget $node -nodeName] 579 if {$name != "#text"} { 580 lappend result $name 581 } else { 582 lappend result [dom::node cget $node -nodeValue] 583 } 584 } 585 rename nodeFilter {} 586 set result 587} -result {Test Test {This } b is { text.}} 588 589test treewalker-3.26 {reverse iteration with skip filter} -constraints {dom_c} -body { 590 proc nodeFilter {node} { 591 set value [dom::node cget $node -nodeName] 592 if {$value == "A"} { 593 return $::dom::skip 594 } else { 595 return $::dom::accept 596 } 597 } 598 599 set document [::dom::DOMImplementation parse $xml1] 600 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 601 -filter nodeFilter] 602 set result {} 603 for {set i 0} {$i < 40} {incr i} { 604 set node [dom::treeWalker nextNode $treewalker] 605 if {$node == ""} break; 606 } 607 for {set i 0} {$i < 40} {incr i} { 608 set node [dom::treeWalker previousNode $treewalker] 609 if {$node == ""} break; 610 set name [dom::node cget $node -nodeName] 611 if {$name != "#text"} { 612 lappend result $name 613 } else { 614 lappend result [dom::node cget $node -nodeValue] 615 } 616 } 617 rename nodeFilter {} 618 set result 619} -result {ccc2 ddd D ccc C aaa2 bbb B aaa { text.} is b {This } Test Test #document} 620 621test treewalker-3.27 {reverse iteration with reject filter} -constraints {dom_c} -body { 622 # filter is noop while we go to last node 623 proc nodeFilter {node} { 624 return $::dom::accept 625 } 626 627 set document [::dom::DOMImplementation parse $xml1] 628 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 629 -filter nodeFilter] 630 set result {} 631 # advance to last node 632 for {set i 0} {$i < 40} {incr i} { 633 set node [dom::treeWalker nextNode $treewalker] 634 if {$node == ""} break; 635 } 636 proc nodeFilter {node} { 637 set value [dom::node cget $node -nodeName] 638 if {$value == "A"} { 639 return $::dom::reject 640 } else { 641 return $::dom::accept 642 } 643 } 644 for {set i 0} {$i < 40} {incr i} { 645 set node [dom::treeWalker previousNode $treewalker] 646 if {$node == ""} break; 647 set name [dom::node cget $node -nodeName] 648 if {$name != "#text"} { 649 lappend result $name 650 } else { 651 lappend result [dom::node cget $node -nodeValue] 652 } 653 } 654 rename nodeFilter {} 655 set result 656 # child nodes of filtered element appear because we're going 657 # backwards 658} -result {ccc2 ddd D ccc C aaa2 bbb B aaa { text.} is b {This } Test Test #document} 659 660test treewalker-3.28 {iteration with deletion in filter} -constraints {dom_c} -body { 661 # this example isn't good coding practice, but we need to test that the 662 # code at least holds up 663 proc nodeFilter {node} { 664 set value [dom::node cget $node -nodeName] 665 if {$value == "A"} { 666 set parent [dom::node cget $node -parentNode] 667 if {$parent != {}} { 668 dom::node removeChild $parent $node 669 } 670 return $::dom::accept 671 } else { 672 return $::dom::accept 673 } 674 } 675 676 set document [::dom::DOMImplementation parse $xml1] 677 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 678 -filter nodeFilter] 679 set result {} 680 for {set i 0} {$i < 40} {incr i} { 681 set node [dom::treeWalker nextNode $treewalker] 682 if {$node == ""} break; 683 set name [dom::node cget $node -nodeName] 684 if {$name != "#text"} { 685 lappend result $name 686 } else { 687 lappend result [dom::node cget $node -nodeValue] 688 } 689 } 690 rename nodeFilter {} 691 set result 692} -result {Test Test {This } b is { text.} A aaa B bbb aaa2 C ccc D ddd ccc2 aaa3} 693 694 695test treewalker-4.1 {treewalker deletion} -constraints {dom_c} -body { 696 set document [::dom::DOMImplementation parse $xml1] 697 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 698 -show [list document textNode]] 699 set result [catch {::dom::DocumentTraversal destroy $treewalker} errmsg] 700 701 list $result $errmsg 702} -result {0 {}} 703 704test treewalker-5.1 {delete document in filter proc} -constraints {dom_c} -body { 705 proc nodeFilter {node} { 706 global document 707 dom::DOMImplementation destroy $document 708 return $::dom::accept 709 } 710 711 set document [::dom::DOMImplementation parse $xml1] 712 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 713 -filter nodeFilter] 714 set node [dom::treeWalker nextNode $treewalker] 715 set result [catch {dom::node cget $node -nodeName} errmsg] 716 rename nodeFilter {} 717 list $result $errmsg 718} -result {1 {token not found}} 719 720test treewalker-5.2 {delete document in filter proc} -constraints {dom_c} -body { 721 proc nodeFilter {node} { 722 global document 723 dom::DOMImplementation destroy $document 724 return $::dom::accept 725 } 726 727 set document [::dom::DOMImplementation parse $xml1] 728 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 729 -filter nodeFilter] 730 set node [dom::treeWalker nextNode $treewalker] 731 set result [catch {dom::treeWalker nextNode $treewalker} errmsg] 732 rename nodeFilter {} 733 list $result $errmsg 734} -result {0 {}} 735 736 737test treewalker-5.3 {delete treewalker in filter proc} -constraints {dom_c} -body { 738 proc nodeFilter {node} { 739 global treewalker 740 ::dom::DocumentTraversal destroy $treewalker 741 return $::dom::accept 742 } 743 744 set document [::dom::DOMImplementation parse $xml1] 745 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 746 -filter nodeFilter] 747 # first invocation succeeds 748 set node [dom::treeWalker nextNode $treewalker] 749 set result [catch {dom::treeWalker nextNode $treewalker} errmsg] 750 rename nodeFilter {} 751 list $result $errmsg 752} -result {1 {token not found}} 753 754test treewalker-5.4 {recursively invoke filter proc} -constraints {dom_c} -body { 755 proc nodeFilter {node} { 756 global treewalker 757 set node [dom::treeWalker nextNode $treewalker] 758 return $::dom::accept 759 } 760 761 set document [::dom::DOMImplementation parse $xml1] 762 set treewalker [dom::DocumentTraversal createTreeWalker $document \ 763 -filter nodeFilter] 764 expectError { 765 dom::treeWalker nextNode $treewalker 766 } {too many nested calls * (infinite loop?)} 767 rename nodeFilter {} 768 ok 769} -result {} 770 771::tcltest::cleanupTests 772return 773