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