1# Features covered: domDoc and docObj command
2#
3# This file contains a collection of tests for the two interfaces to
4# DOM docs, the token interface (the domDoc command) and the tcl
5# command interface ([$docObj method ...]).
6#
7#    domDoc-1.*:  asXML, asHTML
8#    domDoc-2.*:  publicId, systemId
9#    domDoc-3.*:  toXSLTcmd
10#    domDoc-4.*:  asText
11#    domDoc-5.*:  normalize
12#    domDoc-6.*:  nodetype
13#    domDoc-7.*:  insertBefore
14#    domDoc-8.*:  insertBeforeFromScript
15#    domDoc-9.*:  replaceChild
16#    domDoc-10.*: getElementById
17#    domDoc-11.*: firstChild
18#    domDoc-12.*: lastChild
19#    domDoc-13.*: appendChild
20#    domDoc-14.*: removeChild
21#    domDoc-15.*: hasChildNodes
22#    domDoc-16.*: childNodes
23#    domDoc-17.*: ownerDocument
24#    domDoc-18.*: appendFromList
25#    domDoc-19.*: appendXML
26#    domDoc-20.*: selectNodes
27#    domDoc-21.*: baseURI
28#    domDoc-22.*: appendFromScript
29#    domDoc-23.*: getElementsByTagNameNS
30#    domDoc-24.*: cdataSectionElements
31#    domDoc-25.*: selectNodesNamespaces
32#    domDoc-26.*: fragments list
33#    domDoc-27.*: deleteXPathCache
34#    domDoc-28.*: createElementNS
35#
36# Copyright (c) 2004 - 2007 Rolf Ade.
37
38source [file join [file dir [info script]] loadtdom.tcl]
39
40test domDoc-1.1 {asXML -escapeNonASCII} {need_i18n} {
41    set doc [dom parse [tdom::xmlReadFile \
42            [file join [file dir [info script]] data/i18n_1.xml]]]
43    set result [$doc asXML -escapeNonASCII]
44    $doc delete
45    set result
46} {<test>&#1072;&#1073;&#1074;&#1075;&#1076;&#1077;&#1078;&#1079;&#1080;&#1081;</test>
47}
48
49test domDoc-1.2 {asXML -escapeNonASCII; comments and PI's are not altered} {need_i18n} {
50    set doc [dom parse [tdom::xmlReadFile \
51            [file join [file dir [info script]] data/i18n_2.xml]]]
52    set result [$doc asXML -indent none -escapeNonASCII]
53    $doc delete
54    set result
55} "<root withUmlauts=\"&#228;&#246;&#252;&#223;\"><!-- A comment with german umlauts: \u00E4\u00F6\u00FC\u00DF --><?\u00E4\u00F6\u00FC\u00DF A processing node with german umlauts?>
56german umlauts: &#228;&#246;&#252;&#223;
57</root>"
58
59test domDoc-1.3 {asHTML -escapeNonASCII -htmlEntities} {need_i18n} {
60    set doc [dom parse {<html><body>&#228;&#xfc;&#8222;&#8223;&#8224;</body></html>}]
61    set result [$doc asHTML -escapeNonASCII -htmlEntities]
62    $doc delete
63    set result
64} {<html><body>&auml;&uuml;&bdquo;&#8223;&dagger;</body></html>}
65
66
67set doc [dom parse <root/>]
68
69test domDoc-1.4 {asXML -doctypeDeclaration} {
70    $doc asXML -doctypeDeclaration 1
71} {<!DOCTYPE root>
72<root/>
73}
74
75test domDoc-1.5 {asXML -doctypeDeclaration without boolean value (error)} {
76    set errMsg ""
77    catch {$doc asXML -doctypeDeclaration} errMsg
78    set errMsg
79} {-doctypeDeclaration must have a boolean value as argument}
80
81test domDoc-1.6 {asXML -doctypeDeclaration 0} {
82    $doc asXML -doctypeDeclaration 0
83} {<root/>
84}
85
86$doc delete
87
88test domDoc-1.7 {asXML -doctypeDeclaration} {
89    set doc [dom parse {<!DOCTYPE root PUBLIC "-//foo//DTD bar x.y//EN"
90                                       "file:///boo.baz"><root/>}]
91    set result [$doc asXML -doctypeDeclaration 1]
92    $doc delete
93    set result
94} {<!DOCTYPE root PUBLIC "-//foo//DTD bar x.y//EN" "file:///boo.baz">
95<root/>
96}
97
98test domDoc-1.8 {asXML -doctypeDeclaration} {
99    set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
100    set result [$doc asXML -doctypeDeclaration 1]
101    $doc delete
102    set result
103} {<!DOCTYPE root SYSTEM "file:///boo.baz">
104<root/>
105}
106
107test domDoc-1.9 {asXML -doctypeDeclaration} {
108    set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
109    set result [$doc asXML -doctypeDeclaration true]
110    $doc delete
111    set result
112} {<!DOCTYPE root SYSTEM "file:///boo.baz">
113<root/>
114}
115
116test domDoc-1.10 {asXML - unknown option} {
117    set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
118    set errMsg ""
119    catch {$doc asXML -fooOption 1} errMsg
120    $doc delete
121    set errMsg
122} {bad option "-fooOption": must be -indent, -channel, -escapeNonASCII, -doctypeDeclaration, -xmlDeclaration, -encString, -escapeAllQuot, -indentAttrs, -nogtescape, or -noEmptyElementTag}
123
124test domDoc-1.11 {asXML - non boolean value to -doctypeDeclaration} {
125    set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
126    set errMsg ""
127    catch {$doc asXML -doctypeDeclaration foo} errMsg
128    $doc delete
129    set errMsg
130} {expected boolean value but got "foo"}
131
132test domDoc-1.12 {asXML - shortened option} {
133    set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
134    set result [$doc asXML -doctype 1]
135    $doc delete
136    set result
137} {<!DOCTYPE root SYSTEM "file:///boo.baz">
138<root/>
139}
140
141test domDoc-1.13 {asHTML -doctypeDeclaration} {
142    set doc [dom createDocument HTML]
143    set result [$doc asHTML -doctypeDeclaration 1]
144    $doc delete
145    set result
146} {<!DOCTYPE HTML>
147<html></html>}
148
149test domDoc-1.14 {asHTML -doctypeDeclaration} {
150    set doc [dom parse {<!DOCTYPE HTML
151    PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
152    "http://www.w3.org/TR/REC-html40/loose.dtd">
153    <html><body><p>boo</p></body></html>}]
154    set result [$doc asHTML -doctypeDeclaration 1]
155    $doc delete
156    set result
157} {<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
158<html><body><p>boo</p></body></html>}
159
160test domDoc-1.15 {asXML - processing-instruction without pi value} {
161    set doc [dom parse {<doc><?p?></doc>}]
162    set result [$doc asXML -indent none]
163    $doc delete
164    set result
165} {<doc><?p ?></doc>}
166
167test domDoc-1.16 {asXML - processing-instruction without pi value} {
168    set doc [dom parse {<doc><?p ?></doc>}]
169    set result [$doc asXML -indent none]
170    $doc delete
171    set result
172} {<doc><?p ?></doc>}
173
174test domDoc-1.17 {asHTML - content of script/style tags} {
175    set doc [dom parse {
176        <html><script>a &amp; b</script><style>foo &lt; bar</style></html>
177    }]
178    set result [$doc asHTML]
179    $doc delete
180    set result
181} {<html>
182<script>a & b</script><style>foo < bar</style>
183</html>}
184
185test domDoc-1.18 {asXML -escapeAllQuot} {
186    set doc [dom parse {<doc>This is "strange"</doc>}]
187    set result [$doc asXML -escapeAllQuot]
188    $doc delete
189    set result
190} {<doc>This is &quot;strange&quot;</doc>
191}
192
193test domDoc-1.19 {asXML -escapeAllQuot} {
194    set doc [dom parse {<doc>This is "strange"</doc>}]
195    set result [$doc asXML]
196    $doc delete
197    set result
198} {<doc>This is "strange"</doc>
199}
200
201test domDoc-1.20 {asXML - indentation of comments} {
202    set doc [dom parse {<doc>
203<!--Comment 1-->
204<e1/>
205<!--Comment 2--></doc>}]
206    set result [$doc asXML -indent 4]
207    $doc delete
208    set result
209} {<doc>
210    <!--Comment 1-->
211    <e1/>
212    <!--Comment 2-->
213</doc>
214}
215
216test domDoc-1.21 {asXML -indentAttrs} {
217    set doc [dom parse {<Element attr1="val1" attr2="val2"/>}]
218    set result [$doc asXML -indentAttrs 4]
219    $doc delete
220    set result
221} {<Element
222    attr1="val1"
223    attr2="val2"/>
224}
225
226test domDoc-1.22 {asXML} {
227    set doc [dom createDocument doc]
228    set result [$doc asXML]
229    $doc delete
230    set result
231} {<doc/>
232}
233
234test domDoc-1.23 {asXML -xmlDeclaration} {
235    set doc [dom createDocument doc]
236    set result [$doc asXML -xmlDeclaration 1]
237    $doc delete
238    set result
239} {<?xml version="1.0"?>
240<doc/>
241}
242
243test domDoc-1.23 {asXML -xmlDeclaration} {
244    set doc [dom createDocument doc]
245    set result [$doc asXML -xmlDeclaration 1]
246    $doc delete
247    set result
248} {<?xml version="1.0"?>
249<doc/>
250}
251
252test domDoc-1.24 {asXML just -encString without -xmlDeclaration} {
253    set doc [dom createDocument doc]
254    set result [$doc asXML -encString foo]
255    $doc delete
256    set result
257} {<doc/>
258}
259
260test domDoc-1.25 {asXML -xmlDeclaration -encString} {
261    set doc [dom createDocument doc]
262    set result [$doc asXML -xmlDeclaration 1 -encString foo]
263    $doc delete
264    set result
265} {<?xml version="1.0" encoding="foo"?>
266<doc/>
267}
268
269test domDoc-1.26 {asXML -xmlDeclaration, encoding set by encoding method} {
270    set doc [dom createDocument doc]
271    $doc encoding "foo"
272    set result [$doc asXML -xmlDeclaration 1]
273    $doc delete
274    set result
275} {<?xml version="1.0" encoding="foo"?>
276<doc/>
277}
278
279test domDoc-1.27 {asXML -xmlDeclaration -encString} {
280    set doc [dom createDocument doc]
281    set result [catch {
282        [$doc asXML -xmlDeclaration 1 -encString foo \
283             -encString bar -wrongOption]
284    }]
285    $doc delete
286    set result
287} 1
288
289test domDoc-1.28 {asXML -xmlDeclaration not xml compliant -encString} {
290    set doc [dom createDocument doc]
291    set result [$doc asXML -xmlDeclaration 1 -encString 1\u2345]
292    $doc delete
293    set result
294} [subst -nocommands -novariables {<?xml version="1.0" encoding="1\u2345"?>
295<doc/>
296}]
297
298test domDoc-1.29 {asXML -nogtescape} {
299    set doc [dom parse {<doc attr="foo>bar">></doc>}]
300    set result [$doc asXML -nogtescape -indent none]
301    $doc delete
302    set result
303} {<doc attr="foo>bar">></doc>}
304
305test domDoc-1.30 {asXML -noEmptyElementTag} {
306    set doc [dom parse {<doc><elm/></doc>}]
307    set result [$doc asXML -noEmptyElementTag -indent none]
308    $doc delete
309    set result
310} {<doc><elm></elm></doc>}
311
312test domDoc-1.31 {asXML '"' in attribute value} {
313    # emacs: "
314    set doc [dom createDocument doc]
315    set root [$doc documentElement]
316    $root setAttribute attr "foo\"bar"
317    set result [$doc asXML -indent none]
318    $doc delete
319    set result
320} {<doc attr="foo&quot;bar"/>}
321
322set doc [dom parse <root/>]
323
324test domDoc-2.1 {publicId - no publicId there} {
325    $doc publicId
326} {}
327
328test domDoc-2.2 {systemId - no systemId there} {
329    $doc systemId
330} {}
331
332$doc delete
333set doc [dom parse {<!DOCTYPE root PUBLIC "-//foo//DTD bar x.y//EN" "file:///boo.baz"><root/>}]
334
335test domDoc-2.3 {publicId from parsed document} {
336    $doc publicId
337} {-//foo//DTD bar x.y//EN}
338
339test domDoc-2.4 {systemId from parsed document} {
340    $doc systemId
341} {file:///boo.baz}
342
343$doc delete
344set doc [dom parse {<!DOCTYPE root SYSTEM "file:///boo.baz"><root/>}]
345
346test domDoc-2.5 {publicId but document has only SYSTEM} {
347    $doc publicId
348} {}
349
350test domDoc-2.6 {systemId, document has only SYSTEM} {
351    $doc systemId
352} {file:///boo.baz}
353
354test domDoc-2.7 {publicId - set public identifier} {
355    set result [$doc publicId "file:///woo.hoo"]
356    append result " [$doc publicId]"
357} { file:///woo.hoo}
358
359test domDoc-2.8 {publicId - set public identifier} {
360    $doc publicId "http://www.tdom.org"
361    $doc asXML -indent no -doctypeDeclaration 1
362} {<!DOCTYPE root PUBLIC "http://www.tdom.org" "file:///boo.baz">
363<root/>}
364
365test domDoc-2.9 {systemId - set system identifier} {
366    set result [$doc systemId "file:///woo.hoo"]
367    append result " [$doc systemId]"
368} {file:///boo.baz file:///woo.hoo}
369
370test domDoc-2.10 {systemId - set system identifier} {
371    $doc systemId "file:///whooze.moo"
372    $doc asXML -indent no -doctypeDeclaration 1
373} {<!DOCTYPE root PUBLIC "http://www.tdom.org" "file:///whooze.moo">
374<root/>}
375
376test domDoc-2.11 {publicId - set to empty string} {
377    $doc publicId ""
378    $doc asXML -indent no -doctypeDeclaration 1
379} {<!DOCTYPE root SYSTEM "file:///whooze.moo">
380<root/>}
381
382test domDoc-2.12 {systemId - set to empty string} {
383    $doc systemId ""
384    $doc asXML -indent no -doctypeDeclaration 1
385} {<!DOCTYPE root>
386<root/>}
387
388$doc delete
389
390
391set doc [dom parse <root/>]
392
393set xslt1 {
394<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
395    <xsl:param name="param1" select="'param1Default'"/>
396    <xsl:param name="param2" select="'param2Default'"/>
397    <xsl:param name="param3" select="'param3Default'"/>
398    <xsl:template match="/">
399        <xsl:value-of select="$param1"/>
400        <xsl:text> </xsl:text>
401        <xsl:value-of select="$param2"/>
402        <xsl:text> </xsl:text>
403        <xsl:value-of select="$param3"/>
404        <xsl:text> </xsl:text>
405    </xsl:template>
406</xsl:stylesheet>}
407
408test domDoc-3.1 {toXSLTcmd} {
409    set xslt [dom parse -keepEmpties $xslt1]
410    set xsltCmd [$xslt toXSLTcmd]
411
412    $xsltCmd -parameters {param2 newValue param3 "this Value"} $doc resultDoc
413    set result [$resultDoc asXML -indent none]
414    $resultDoc delete
415    $xsltCmd -parameters {param1 "that Value"} $doc resultDoc
416    append result [$resultDoc asXML -indent none]
417    $resultDoc delete
418    $xsltCmd -parameters {param3 "another" param1 "and this"} $doc resultDoc
419    append result [$resultDoc asXML -indent none]
420    $resultDoc delete
421    rename $xsltCmd {}
422    set result
423} {param1Default newValue this Value that Value param2Default param3Default and this param2Default another }
424
425set xslt2 {
426<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
427    <xsl:template match="/">
428        <xsl:text>dummy result</xsl:text>
429        <xsl:message>This is from xsl:message</xsl:message>
430    </xsl:template>
431</xsl:stylesheet>}
432
433proc msgCmd1 {msg terminate} {
434    global result
435    append result "msgCmd1: $msg "
436}
437
438proc msgCmd2 {msg terminate} {
439    global result
440    append result "msgCmd2: $msg"
441}
442
443test domDoc-3.2 {toXSLTcmd} {
444    set xslt [dom parse -keepEmpties $xslt2]
445    set xsltCmd [$xslt toXSLTcmd]
446
447    set result ""
448    $xsltCmd -xsltmessagecmd msgCmd1 $doc resultDoc
449    $resultDoc delete
450    $xsltCmd -xsltmessagecmd msgCmd2 $doc resultDoc
451    $resultDoc delete
452    rename $xsltCmd {}
453    set result
454} {msgCmd1: This is from xsl:message msgCmd2: This is from xsl:message}
455
456test domDoc-3.3 {toXSLTcmd} {
457    set xslt [dom parse -keepEmpties $xslt1]
458    set xsltCmd [$xslt toXSLTcmd]
459
460    set result [catch {$xsltCmd -bogusOption foo $doc resultDoc} errMsg]
461    lappend result $errMsg
462    lappend result [catch {$xsltCmd $doc resultDoc}]
463    lappend result [$resultDoc asXML -indent none]
464    $resultDoc delete
465    rename $xsltCmd {}
466    set result
467} {1 {bad option "-bogusOption": must be -parameters, -ignoreUndeclaredParameters, -maxApplyDepth, or -xsltmessagecmd} 0 {param1Default param2Default param3Default }}
468
469test domDoc-3.4 {toXSLTcmd} {
470    set xslt [dom parse -keepEmpties $xslt1]
471    set xsltCmd [$xslt toXSLTcmd]
472
473    set result [catch {$xsltCmd -xsltmessagecmd msgCmd1} errMsg]
474    rename $xsltCmd {}
475    lappend result $errMsg
476} {1 {wrong # args: should be "?-parameters parameterList? ?-ignoreUndeclaredParameters? ?-maxApplyDepth int? ?-xsltmessagecmd cmd? <xmlDocObj> ?objVar?"}}
477
478test domDoc-3.5 {toXSLTcmd} {
479    set xslt [dom parse -keepEmpties $xslt1]
480    set xsltCmd [$xslt toXSLTcmd]
481
482    set result [catch {$xsltCmd $doc resultDoc bogus} errMsg]
483    rename $xsltCmd {}
484    lappend result $errMsg
485} {1 {wrong # args: should be "?-parameters parameterList? ?-ignoreUndeclaredParameters? ?-maxApplyDepth int? ?-xsltmessagecmd cmd? <xmlDocObj> ?objVar?"}}
486
487test domDoc-3.6 {toXSLTcmd} {
488    set xslt [dom parse -keepEmpties $xslt1]
489    set xsltCmd [$xslt toXSLTcmd]
490
491    set result [catch {$xsltCmd -parameters {param1 foo} -parameters {param2 foo} $doc resultDoc} errMsg]
492    rename $xsltCmd {}
493    lappend result $errMsg
494} {1 {only one -parameters option allowed}}
495
496test domDoc-3.7 {toXSLTcmd} {
497    set xslt [dom parse -keepEmpties $xslt1]
498    set xsltCmd [$xslt toXSLTcmd]
499
500    set result [catch {$xsltCmd}]
501    $xsltCmd delete
502    set result
503} {1}
504
505test domDoc-3.8 {toXSLTcmd} {
506    set xslt [dom parse -keepEmpties $xslt1]
507    set xsltCmd [$xslt toXSLTcmd]
508
509    set result [catch {$xsltCmd delete bogus}]
510    $xsltCmd delete
511    set result
512} {1}
513
514test domDoc-3.9 {toXSLTcmd} {
515    set xslt [dom parse -keepEmpties $xslt1]
516    set xsltCmd [$xslt toXSLTcmd]
517
518    set result [catch {$xsltCmd transform} errMsg]
519    $xsltCmd delete
520    set result
521} {1}
522
523test domDoc-3.10 {toXSLTcmd} {
524    set xslt [dom parse -keepEmpties $xslt1]
525    set xsltCmd [$xslt toXSLTcmd]
526    $xsltCmd transform $doc resultDoc
527    set result [$resultDoc asXML -indent none]
528    $resultDoc delete
529    $xsltCmd delete
530    set result
531} {param1Default param2Default param3Default }
532
533set xslt3 {<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
534    version="1.0">
535    <xsl:output cdata-section-elements="foo
536    doc b   bar"/>
537    <xsl:template match="/">
538        <doc>mixed element <b>this is</b> more text</doc>
539    </xsl:template>
540</xsl:stylesheet>}
541
542test domDoc-3.11 {toXSLTcmd} {
543    set xslt [dom parse -keepEmpties $xslt3]
544    set xsltCmd [$xslt toXSLTcmd]
545    set result [list]
546    for {set x 0} {$x < 2} {incr x} {
547        $xsltCmd $doc resultDoc
548        lappend result [lsort [$resultDoc cdataSectionElements *]]
549        lappend result [$resultDoc asXML -indent none]
550        $resultDoc delete
551    }
552    $xsltCmd delete
553    set result
554} {{b bar doc foo} {<doc><![CDATA[mixed element ]]><b><![CDATA[this is]]></b><![CDATA[ more text]]></doc>} {b bar doc foo} {<doc><![CDATA[mixed element ]]><b><![CDATA[this is]]></b><![CDATA[ more text]]></doc>}}
555
556$doc delete
557
558test domDoc-4.1 {asText - syntax check} {
559    dom parse <root/> doc
560    set result [catch {$doc asText foo}]
561    $doc delete
562    set result
563} {1}
564
565test domDoc-4.2 {asText} {
566    dom parse {<root>pcdata <child>foo bar grill</child></root>} doc
567    set result [$doc asText]
568    $doc delete
569    set result
570} {pcdata foo bar grill}
571
572test domDoc-4.3 {asText} {
573    dom parse {<root>pcdata <![CDATA[<greeting>Hello, world!</greeting>]]>
574        more pcdata</root>} doc
575    set result [$doc asText]
576    $doc delete
577    set result
578} {pcdata <greeting>Hello, world!</greeting>
579        more pcdata}
580
581test domDoc-4.4 {asText} {
582    dom parse {<root>pcdata</root>} doc
583    $doc documentElement root
584    set newCDATAnode \
585        [$doc createCDATASection "<greeting>Hello, world!</greeting>"]
586    $root appendChild $newCDATAnode
587    set result [$doc asText]
588    $doc delete
589    set result
590} {pcdata}
591
592test domDoc-4.5 {asText} {
593    dom parse {<root>encoded chars: &gt; &lt; &amp; &quot; &apos;</root>} doc
594    set result [$doc asText]
595    $doc delete
596    set result
597} {encoded chars: > < & " '}
598# emacs: "
599
600test domDoc-5.1 {normalize} {
601    set doc [dom parse <root><child>text</child></root>]
602    $doc documentElement root
603    set cdataNode [$doc createCDATASection "cdata section text"]
604    set child [$root firstChild]
605    $child appendChild $cdataNode
606    $doc normalize
607    set result [llength [$child childNodes]]
608    lappend result [[$child firstChild] data]
609    $doc delete
610    set result
611} {2 text}
612
613test domDoc-5.2 {normalize} {
614    set doc [dom parse <root><child>text</child></root>]
615    $doc documentElement root
616    set cdataNode [$doc createCDATASection "cdata section text"]
617    set child [$root firstChild]
618    $child appendChild $cdataNode
619    $doc normalize -forXPath
620    set result [llength [$child childNodes]]
621    lappend result [[$child firstChild] data]
622    $doc delete
623    set result
624} {1 {textcdata section text}}
625
626test domDoc-5.3 {normalize} {
627    set doc [dom parse <root><child/></root>]
628    $doc documentElement root
629    set cdataNode [$doc createCDATASection "cdata section text"]
630    set textNode [$doc createTextNode text]
631    set child [$root firstChild]
632    $child appendChild $cdataNode
633    $child appendChild $textNode
634    set result [llength [$child childNodes]]
635    $doc normalize -forXPath
636    lappend result [llength [$child childNodes]]
637    lappend result [[$child firstChild] data]
638    $doc delete
639    set result
640} {2 1 {cdata section texttext}}
641
642test domDoc-5.4 {normalize} {
643    set doc [dom parse <root><child/></root>]
644    $doc documentElement root
645    set cdataNode [$doc createCDATASection "cdata section text"]
646    set child [$root firstChild]
647    $child appendChild $cdataNode
648    $doc normalize
649    set result [$cdataNode nodeType]
650    $doc normalize -forXPath
651    lappend result [$cdataNode nodeType]
652    $doc delete
653    set result
654} {CDATA_SECTION_NODE TEXT_NODE}
655
656test domDoc-5.5 {normalize} {
657    set doc [dom parse <root><child/></root>]
658    $doc documentElement root
659    set textNode [$doc createTextNode ""]
660    set child [$root firstChild]
661    $child appendChild $textNode
662    set result [llength [$child childNodes]]
663    $doc normalize
664    lappend result [llength [$child childNodes]]
665    $doc delete
666    set result
667} {1 0}
668
669test domDoc-5.6 {normalize} {
670    set doc [dom parse <root><child/></root>]
671    $doc documentElement root
672    set cdataNode [$doc createCDATASection ""]
673    set child [$root firstChild]
674    $child appendChild $cdataNode
675    $doc normalize
676    set result [llength [$child childNodes]]
677    $doc normalize -forXPath
678    lappend result [llength [$child childNodes]]
679    $doc delete
680    set result
681} {1 0}
682
683test domDoc-6.1 {nodeType} {
684    set doc [dom parse <root/>]
685    set result [$doc nodeType]
686    $doc delete
687    set result
688} {DOCUMENT_NODE}
689
690test domDoc-6.2 {nodeType} {
691    set doc [dom parse <root/>]
692    set result [catch {$doc nodeType foo}]
693    $doc delete
694    set result
695} {1}
696
697test domDoc-7.1 {insertBefore} {
698    set doc [dom parse {<!-- Comment --><root/>}]
699    set root [$doc documentElement]
700    set newPI [$doc createProcessingInstruction myPI pivalue]
701    $doc insertBefore $newPI $root
702    set result [$doc asXML -indent none]
703    $doc delete
704    set result
705} {<!-- Comment --><?myPI pivalue?><root/>}
706
707test domDoc-7.2 {insertBefore} {
708    set doc [dom parse {<!-- Comment --><root/>}]
709    set newPI [$doc createProcessingInstruction myPI pivalue]
710    $doc insertBefore $newPI ""
711    set result [$doc asXML -indent none]
712    $doc delete
713    set result
714} {<!-- Comment --><root/><?myPI pivalue?>}
715
716test domDoc-7.3 {insertBefore} {
717    set doc [dom parse {<!-- Comment --><root><child/></root>}]
718    set newPI [$doc createProcessingInstruction myPI pivalue]
719    set root [$doc documentElement]
720    set child [$root firstChild]
721    set result [catch {$doc insertBefore $newPI $child} errMsg]
722    lappend result $errMsg
723    $doc delete
724    set result
725} {1 NOT_FOUND_ERR}
726
727namespace eval nodeCmds {
728    dom createNodeCmd elementNode e1
729    dom createNodeCmd elementNode e2
730    dom createNodeCmd commentNode c
731    dom createNodeCmd textNode    t
732    dom createNodeCmd cdataNode   cdata
733    dom createNodeCmd piNode      pi
734    dom createNodeCmd parserNode  parser
735}
736
737test domDoc-8.1 {insertBeforeFromScript} {
738    set doc [dom parse {<root><child/></root>}]
739    $doc documentElement root
740    $doc insertBeforeFromScript {
741        nodeCmds::e1
742    } $root
743    set result [$doc asXML -indent none]
744    $doc delete
745    set result
746} {<e1/><root><child/></root>}
747
748test domDoc-8.2 {insertBeforeFromScript} {
749    set doc [dom parse {<root><child/></root>}]
750    $doc insertBeforeFromScript {
751        nodeCmds::e1
752    } ""
753    set result [$doc asXML -indent none]
754    $doc delete
755    set result
756} {<root><child/></root><e1/>}
757
758test domDoc-8.3 {insertBeforeFromScript} {
759    set doc [dom parse {<root><child/></root>}]
760    $doc documentElement root
761    set result [catch {$root insertBeforeFromScript {
762        nodeCmds::e1
763        nodeCmds::e1 {
764            # This is intentionally wrong
765            set foo 1 + 1
766        }
767    } $root}]
768    lappend result [$doc asXML -indent none]
769    $doc delete
770    set result
771} {1 <root><child/></root>}
772
773test domDoc-9.1 {replaceChild} {
774    set doc [dom parse {<!-- Comment --><root><child/></root>}]
775    set root [$doc documentElement]
776    set newNode [$doc createElement newNode]
777    $doc replaceChild $newNode $root
778    set result [$doc asXML -indent none]
779    lappend result [[$doc documentElement] nodeName]
780    $doc delete
781    set result
782} {<!-- Comment --><newNode/> newNode}
783
784set getElementByIdSetup {
785    set doc [dom parse {
786        <!DOCTYPE root [
787                        <!ELEMENT root (elem*)>
788                        <!ELEMENT elem ANY>
789                        <!ATTLIST elem
790                        id      ID      #IMPLIED
791                        name    CDATA   #IMPLIED>
792                       ]>
793        <root>
794        <elem id="7" name="this"/>
795        <elem id="4a" name="that"/>
796        <elem name="and"/>
797        <elem id="a2" name="this"/>
798        </root>}]
799}
800
801test domDoc-10.1 {getElementById} -setup $getElementByIdSetup -body {
802    set result [[$doc getElementById "4a"] @name]
803    lappend result [$doc getElementById "dontexists"]
804} -cleanup {
805    $doc delete
806} -result {that {}}
807
808test domDoc-10.2 {getElementById - only IDs at parsing time will be found} \
809    -setup $getElementByIdSetup -body {
810        set root [$doc documentElement]
811        set elemNode [$root selectNodes {elem[3]}]
812        if {[$elemNode hasAttribute id]} {
813            error "error in the test code"
814        }
815        $elemNode setAttribute id "new"
816        $doc getElementById "new"
817    } -cleanup {
818        $doc delete
819    } -result {}
820
821test domDoc-10.3 {getElementById} -setup $getElementByIdSetup -body {
822    set root [$doc documentElement]
823    set elemNode [$root selectNodes {elem[2]}]
824    if {![$elemNode hasAttribute id]} {
825        error "error in the test code"
826    }
827    $elemNode setAttribute id "new"
828    [$doc getElementById "new"] getAttribute name
829} -cleanup {
830    $doc delete
831} -result that
832
833test domDoc-10.4 {getElementById} -setup $getElementByIdSetup -body {
834    set root [$doc documentElement]
835    set elemNode [$root selectNodes {elem[2]}]
836    if {![$elemNode hasAttribute id]} {
837        error "error in the test code"
838    }
839    $root removeChild $elemNode
840    [$doc getElementById "4a"] getAttribute name
841} -cleanup {
842    $doc delete
843} -result that
844
845test domDoc-10.5 {getElementById} -setup $getElementByIdSetup -body {
846    set root [$doc documentElement]
847    set elemNode [$root selectNodes {elem[2]}]
848    if {![$elemNode hasAttribute id]} {
849        error "error in the test code"
850    }
851    $elemNode removeAttribute id
852    $doc getElementById "4a"
853} -cleanup {
854    $doc delete
855} -result {}
856
857test domDoc-11.1 {firstChild} {
858    set doc [dom createDocumentNode]
859    set result [$doc firstChild]
860    $doc delete
861    set result
862} {}
863
864test domDoc-11.2 {firstChild} {
865    set doc [dom parse <root/>]
866    set result [[$doc firstChild] nodeName]
867    $doc delete
868    set result
869} {root}
870
871test domDoc-11.3 {firstChild} {
872    set doc [dom parse {<?beforeRoot this?><root/><?afterRoot that?>}]
873    set result [[$doc firstChild] nodeName]
874    $doc delete
875    set result
876} {beforeRoot}
877
878test domDoc-11.4 {firstChild} {
879    set doc [dom parse {<root/>}]
880    set node [$doc firstChild]
881    set newNode [$doc createElement newNode]
882    $doc insertBefore $newNode $node
883    set result [[$doc firstChild] nodeName]
884    $doc delete
885    set result
886} {newNode}
887
888test domDoc-11.5 {Delete top level node} {
889    set doc [dom parse {<!---comment on top level--><root/>}]
890    [$doc firstChild] delete
891    set result [$doc asXML -indent none]
892    $doc delete
893    set result
894} {<root/>}
895
896test domDoc-11.6 {Delete top level node} {
897    set doc [dom parse {<!---comment on top level--><root/>}]
898    [$doc documentElement] delete
899    set result [$doc asXML -indent none]
900    $doc delete
901    set result
902} {<!---comment on top level-->}
903
904test domDoc-12.1 {lastChild} {
905    set doc [dom createDocumentNode]
906    set result [$doc lastChild]
907    $doc delete
908    set result
909} {}
910
911test domDoc-12.2 {lastChild} {
912    set doc [dom parse <root/>]
913    set result [[$doc lastChild] nodeName]
914    $doc delete
915    set result
916} {root}
917
918test domDoc-12.3 {lastChild} {
919    set doc [dom parse {<?beforeRoot this?><root/><?afterRoot that?>}]
920    set result [[$doc lastChild] nodeName]
921    $doc delete
922    set result
923} {afterRoot}
924
925test domDoc-12.4 {lastChild} {
926    set doc [dom parse {<root/>}]
927    set newNode [$doc createElement newNode]
928    $doc appendChild $newNode
929    set result [[$doc lastChild] nodeName]
930    lappend result [[$doc lastChild] parentNode]
931    $doc delete
932    set result
933} {newNode {}}
934
935test domDoc-13.1 {appendChild} {
936    set doc [dom parse {<root/>}]
937    set newNode [$doc createElement newNode]
938    $doc appendChild $newNode
939    set newNode [$doc createComment "a comment"]
940    $doc appendChild $newNode
941    set newNode [$doc createProcessingInstruction this that]
942    $doc appendChild $newNode
943    set newNode [$doc createTextNode "text"]
944    $doc appendChild $newNode
945    set result [$doc asXML -indent none]
946    $doc delete
947    set result
948} {<root/><newNode/><!--a comment--><?this that?>text}
949
950test domDoc-13.2 {appendChild} {
951    set doc [dom createDocumentNode]
952    set newNode [$doc createElement newNode]
953    $doc appendChild $newNode
954    set result [[$doc documentElement] nodeName]
955    $doc delete
956    set result
957} {newNode}
958
959test domDoc-13.3 {appendChild} {
960    set doc [dom createDocumentNode]
961    set newNode [$doc createElement newNode]
962    $doc appendChild $newNode
963    set result [[$doc documentElement] parentNode]
964    $doc delete
965    set result
966} {}
967
968test domDoc-14.1 {removeChild} {
969    set doc [dom parse {<root/>}]
970    $doc removeChild [$doc firstChild]
971    set result [$doc documentElement]
972    $doc delete
973    set result
974} {}
975
976test domDoc-14.2 {removeChild} {
977    set doc [dom parse {<!---comment on top level--><root/>}]
978    $doc removeChild [$doc firstChild]
979    set result [$doc asXML -indent none]
980    $doc delete
981    set result
982} {<root/>}
983
984test domDoc-14.3 {removeChild} {
985    set doc [dom createDocumentNode]
986    set result [catch {$doc removeChild [$doc firstChild]}]
987    $doc delete
988    set result
989} {1}
990
991test domDoc-15.1 {hasChildNodes} {
992    set doc [dom createDocumentNode]
993    set result [$doc hasChildNodes]
994    set newNode [$doc createElement newNode]
995    $doc appendChild $newNode
996    lappend result [$doc hasChildNodes]
997    $doc delete
998    set result
999} {0 1}
1000
1001test domDoc-16.1 {childNodes} {
1002    set doc [dom parse {<?beforeRoot this?><root/><?afterRoot that?>}]
1003    set result {}
1004    foreach node [$doc childNodes] {
1005        lappend result [$node nodeName]
1006    }
1007    $doc delete
1008    set result
1009} {beforeRoot root afterRoot}
1010
1011test domDoc-17.1 {ownerDocument} {
1012    set doc [dom parse <root/>]
1013    set result [expr {$doc == [$doc ownerDocument]}]
1014    $doc delete
1015    set result
1016} {1}
1017
1018test domDoc-18.1 {appendFromList} {
1019    set doc [dom createDocumentNode]
1020    $doc appendFromList {elem {} {}}
1021    set node [$doc documentElement]
1022    set result [list [$node nodeName] [$node parentNode]]
1023    $doc delete
1024    set result
1025} {elem {}}
1026
1027test domDoc-19.1 {appendXML} {
1028    set doc [dom createDocumentNode]
1029    $doc appendXML <test>foo<child><childchild>text</childchild></child></test>
1030    set result [$doc asXML -indent none]
1031    $doc delete
1032    set result
1033} {<test>foo<child><childchild>text</childchild></child></test>}
1034
1035test domDoc-19.2 {appendXML} {
1036    set doc [dom createDocumentNode]
1037    $doc appendXML <test>foo<child><childchild>text</childchild></child></test>
1038    set result [[$doc documentElement] nodeName]
1039    lappend result [[$doc documentElement] parentNode]
1040    lappend result [expr {$doc == [[$doc documentElement] ownerDocument]}]
1041    $doc delete
1042    set result
1043} {test {} 1}
1044
1045test domDoc-19.3 {appendXML} {
1046    set doc [dom createDocument foo]
1047    $doc appendXML <test>foo<child><childchild>text</childchild></child></test>
1048    set result [[$doc documentElement] nodeName]
1049    set result [$doc asXML -indent none]
1050    $doc delete
1051    set result
1052} {<foo/><test>foo<child><childchild>text</childchild></child></test>}
1053
1054
1055test domDoc-20.1 {selectNodes} {
1056    set doc [dom parse {<root><child id="1"/><child id="2"/></root>}]
1057    set result [[$doc selectNodes {root/child[2]}] getAttribute id]
1058    $doc delete
1059    set result
1060} {2}
1061
1062test domDoc-20.2 {selectNodes} {
1063    set doc [dom parse {<root><child id="1"/><child id="2"/></root>}]
1064    set result [[$doc selectNodes {/root/child[2]}] getAttribute id]
1065    $doc delete
1066    set result
1067} {2}
1068
1069test domDoc-20.3 {selectNodes} {
1070    set doc [dom parse {<!-- Comment --><root/><?piAfterRoot value?>}]
1071    set result [list]
1072    foreach node [$doc selectNodes *] {
1073        lappend result [$node nodeName]
1074    }
1075    set result
1076} {root}
1077
1078test domDoc-20.4 {selectNodes} {
1079    set doc [dom parse {<!-- Comment --><root/><?piAfterRoot value?>}]
1080    set result [list]
1081    foreach node [$doc selectNodes node()] {
1082        lappend result [$node nodeType]
1083    }
1084    set result
1085} {COMMENT_NODE ELEMENT_NODE PROCESSING_INSTRUCTION_NODE}
1086
1087test domDoc-20.5 {selectNodes with -namespaces option} {
1088    set doc [dom createDocumentNS "http://tdom.org" tdom:doc]
1089    set node [$doc selectNodes \
1090                  -namespaces {tdom http://tdom.org} \
1091                  tdom:doc]
1092    set result [$node nodeName]
1093    set node [$doc selectNodes \
1094                  -namespaces {myPrefix http://tdom.org} \
1095                  myPrefix:doc]
1096    lappend result [$node nodeName]
1097    lappend result [$doc selectNodes -namespaces {} doc typeVar]
1098    lappend result $typeVar
1099    $doc delete
1100    set result
1101} [list tdom:doc tdom:doc "" empty]
1102
1103test domDoc-20.6 {selectNodes with -namespaces option} {
1104    set doc [dom createDocumentNS "http://tdom.org" tdom:doc]
1105    set node [$doc selectNodes \
1106                  -namespaces {foo bar} \
1107                  -namespaces {a b c d} \
1108                  -namespaces {tdom http://tdom.org} \
1109                  tdom:doc]
1110    set result [$node nodeName]
1111    set node [$doc selectNodes \
1112                  -namespaces {myPrefix http://tdom.org} \
1113                  myPrefix:doc]
1114    lappend result [$node nodeName]
1115    lappend result [$doc selectNodes -namespaces {} doc typeVar]
1116    lappend result $typeVar
1117    $doc delete
1118    set result
1119} [list tdom:doc tdom:doc "" empty]
1120
1121test domDoc-20.7 {selectNodes with -namespaces option} {
1122    set doc [dom createDocumentNS "http://tdom.org" tdom:doc]
1123    catch {set node [$doc selectNodes \
1124                         -namespaces {foo bar} \
1125                         -namespaces {a b c d} \
1126                         -namespaces {wrong_not_pair} \
1127                         tdom:doc]} errMsg
1128    $doc delete
1129    set errMsg
1130} {The "-namespaces" option requires a 'prefix namespace' pairs list as argument}
1131
1132test domDoc-21.1 {baseURI} {
1133    set doc [dom createDocumentNode]
1134    set result [$doc baseURI]
1135    $doc delete
1136    set result
1137} {}
1138
1139test domDoc-21.2 {baseURI} {
1140    set doc [dom parse -baseurl file://foo <root/>]
1141    set result [$doc baseURI]
1142    $doc baseURI http://that.this
1143    lappend result [$doc baseURI]
1144    $doc delete
1145    set result
1146} {file://foo http://that.this}
1147
1148namespace eval nodeCmds {
1149    dom createNodeCmd elementNode e1
1150    dom createNodeCmd elementNode e2
1151    dom createNodeCmd commentNode c
1152    dom createNodeCmd textNode    t
1153    dom createNodeCmd cdataNode   cdata
1154    dom createNodeCmd piNode      pi
1155    dom createNodeCmd parserNode  parser
1156}
1157test domDoc-22.1 {appendFromScript} {
1158    set doc [dom createDocumentNode]
1159    $doc appendFromScript nodeCmds::e1
1160    set result [$doc asXML -indent none]
1161    lappend result [[$doc documentElement] nodeName]
1162    $doc delete
1163    set result
1164} {<e1/> e1}
1165
1166test domDoc-22.2 {appendFromScript} {
1167    set doc [dom parse <root/>]
1168    $doc appendFromScript {
1169        nodeCmds::e1
1170        nodeCmds::e2
1171    }
1172    # namespace eval nodeCmds {
1173    #     $doc appendFromScript {
1174    #         e1
1175    #         e2
1176    #     }
1177    # }
1178    set result [$doc asXML -indent none]
1179    foreach node [$doc selectNodes *] {
1180        lappend result [$node parentNode]
1181        lappend result [expr {$doc == [$node ownerDocument]}]
1182    }
1183    $doc delete
1184    set result
1185} {<root/><e1/><e2/> {} 1 {} 1 {} 1}
1186
1187test domDoc-22.3 {appendFromScript} {
1188    set doc [dom createDocumentNode]
1189    set nrOfNodeCmdsBefore [info commands domNode*]
1190    $doc appendFromScript {
1191            nodeCmds::e1
1192    }
1193    $doc delete
1194    set nrOfNodeCmdsAfter [info commands domNode*]
1195    expr {$nrOfNodeCmdsBefore == $nrOfNodeCmdsAfter}
1196} {1}
1197
1198test domDoc-23.1 {getElementsByTagNameNS} {
1199    dom createNodeCmd elementNode child
1200
1201    set doc [dom createDocument root]
1202    $doc documentElement root
1203    $root appendFromScript {
1204        for {set x 0} {$x < 250} {incr x} {
1205            child [list xmlns ns$x] {}
1206        }
1207    }
1208    set xml [$doc asXML]
1209    $doc delete
1210    set doc [dom parse $xml]
1211    set result 1
1212    for {set x 0} {$x < 250} {incr x} {
1213        set nodes [$doc getElementsByTagNameNS ns$x *]
1214        if {[llength $nodes] != 1} {
1215            set result 0
1216        }
1217    }
1218    $doc delete
1219    set result
1220} {1}
1221
1222test domDoc-24.1 {cdataSectionElements} {
1223    set doc [dom parse {<root>Some Text</root>}]
1224    set result [catch {$doc cdataSectionElements} errMsg]
1225    lappend result $errMsg
1226    $doc delete
1227    set result
1228} {1 {wrong # args: should be "<domDoc> cdataSectionElements ?URI:?localname ?boolean?"}}
1229
1230test domDoc-24.2 {cdataSectionElements} {
1231    set doc [dom parse {<root>Some Text</root>}]
1232    set result [catch {$doc cdataSectionElements foo bar grill} errMsg]
1233    lappend result $errMsg
1234    $doc delete
1235    set result
1236} {1 {wrong # args: should be "<domDoc> cdataSectionElements ?URI:?localname ?boolean?"}}
1237
1238test domDoc-24.3 {cdataSectionElements} {
1239    set doc [dom parse {<root>Some Text</root>}]
1240    set result [catch {$doc cdataSectionElements root foo} errMsg]
1241    lappend result $errMsg
1242    $doc delete
1243    set result
1244} {1 {expected boolean value but got "foo"}}
1245
1246test domDoc-24.4 {cdataSectionElements} {
1247    set doc [dom parse {<root>Some Text</root>}]
1248    set result [$doc cdataSectionElements root]
1249    $doc delete
1250    set result
1251} {0}
1252
1253test domDoc-24.5 {cdataSectionElements} {
1254    set doc [dom parse {<root>Some Text</root>}]
1255    set result [$doc cdataSectionElements root 0]
1256    lappend result [$doc cdataSectionElements root 1]
1257    lappend result [$doc cdataSectionElements root 0]
1258    $doc delete
1259    set result
1260} {0 1 0}
1261
1262test domDoc-24.6 {cdataSectionElements} {
1263    set doc [dom parse {<root>Some Text</root>}]
1264    set result [$doc cdataSectionElements root 1]
1265    lappend result [$doc asXML -indent none]
1266    $doc delete
1267    set result
1268} {1 {<root><![CDATA[Some Text]]></root>}}
1269
1270test domDoc-24.7 {cdataSectionElements} {
1271    set doc [dom parse {<root>&lt;foo></root>}]
1272    foreach element {foo root bar grill} {
1273        $doc cdataSectionElements $element 1
1274    }
1275    set result [$doc asXML -indent none]
1276    $doc delete
1277    set result
1278} {<root><![CDATA[<foo>]]></root>}
1279
1280test domDoc-24.8 {cdataSectionElements} {
1281    set doc [dom parse {<root>text ]</root>}]
1282    $doc cdataSectionElements root 1
1283    set result [$doc asXML -indent none]
1284    $doc delete
1285    set result
1286} {<root><![CDATA[text ]]]></root>}
1287
1288test domDoc-24.9 {cdataSectionElements} {
1289    set doc [dom parse {<root>text ]]</root>}]
1290    $doc cdataSectionElements root 1
1291    set result [$doc asXML -indent none]
1292    $doc delete
1293    set result
1294} {<root><![CDATA[text ]]]]></root>}
1295
1296test domDoc-24.10 {cdataSectionElements} {
1297    set doc [dom parse {<root>text ]]&gt;</root>}]
1298    $doc cdataSectionElements root 1
1299    set result [$doc asXML -indent none]
1300    $doc delete
1301    set result
1302} {<root><![CDATA[text ]]]]><![CDATA[>]]></root>}
1303
1304test domDoc-24.11 {cdataSectionElements} {
1305    set doc [dom parse {<root>text ]]&gt; text]]&gt;text</root>}]
1306    $doc cdataSectionElements root 1
1307    set result [$doc asXML -indent none]
1308    $doc delete
1309    set result
1310} {<root><![CDATA[text ]]]]><![CDATA[> text]]]]><![CDATA[>text]]></root>}
1311
1312test domDoc-24.12 {cdataSectionElements} {
1313    set doc [dom parse {<root xmlns="http://foo.bar">text</root>}]
1314    $doc cdataSectionElements http://foo.bar:root 1
1315    set result [$doc asXML -indent none]
1316    $doc delete
1317    set result
1318} {<root xmlns="http://foo.bar"><![CDATA[text]]></root>}
1319
1320test domDoc-24.13 {cdataSectionElements} {
1321    set doc [dom parse {<root>text</root>}]
1322    set result [$doc cdataSectionElements ""]
1323    $doc delete
1324    set result
1325} {0}
1326
1327test domDoc-24.14 {cdataSectionElements} {
1328    set doc [dom parse {<root>text</root>}]
1329    set result [$doc cdataSectionElements *]
1330    $doc delete
1331    set result
1332} {}
1333
1334test domDoc-24.15 {cdataSectionElements} {
1335    set doc [dom parse {<root>text</root>}]
1336    foreach elem {foo bar grill root http://www.foo.org:baz} {
1337        $doc cdataSectionElements $elem 1
1338    }
1339    foreach elem {foo grill} {
1340        $doc cdataSectionElements $elem 0
1341    }
1342    set result [lsort [$doc cdataSectionElements *]]
1343    $doc delete
1344    set result
1345} {bar http://www.foo.org:baz root}
1346
1347test domDoc-24.16 {cdataSectionElements} {
1348    set doc [dom parse {<doc><child>some text</child></doc>}]
1349    $doc documentElement root
1350    set node [$root firstChild]
1351    $doc cdataSectionElements child 1
1352    set result [$node asXML -indent none]
1353    $doc delete
1354    set result
1355} {<child><![CDATA[some text]]></child>}
1356
1357test domDoc-24.17 {cdataSectionElements} {
1358    set doc [dom parse {<doc><child>some text <b>more text</b> text again</child></doc>}]
1359    $doc cdataSectionElements child 1
1360    set result [$doc asXML -indent none]
1361    $doc delete
1362    set result
1363} {<doc><child><![CDATA[some text ]]><b>more text</b><![CDATA[ text again]]></child></doc>}
1364
1365
1366test domDoc-25.1 {selectNodesNamespaces} {
1367    set doc [dom createDocument foo]
1368    set result [$doc selectNodesNamespaces]
1369    $doc delete
1370    set result
1371} {}
1372
1373test domDoc-25.2 {selectNodesNamespaces} {
1374    set doc [dom createDocument foo]
1375    set result [list [$doc selectNodesNamespaces] \
1376                    [$doc selectNodesNamespaces {}] \
1377                    [$doc selectNodesNamespaces]]
1378    $doc delete
1379    set result
1380} {{} {} {}}
1381
1382test domDoc-25.3 {selectNodesNamespaces} {
1383    set doc [dom createDocument foo]
1384    set result [list [$doc selectNodesNamespaces] \
1385                    [$doc selectNodesNamespaces {prefix http://foo.org/uri}] \
1386                    [$doc selectNodesNamespaces] \
1387                    [$doc selectNodesNamespaces {}]]
1388    $doc delete
1389    set result
1390} {{} {prefix http://foo.org/uri} {prefix http://foo.org/uri} {}}
1391
1392test domDoc-25.4 {selectNodesNamespaces} {
1393    set doc [dom createDocument foo]
1394    set result [catch {$doc selectNodesNamespaces wrong} errMsg]
1395    lappend result $errMsg
1396    $doc delete
1397    set result
1398} {1 {The optional argument to the selectNodesNamespaces method must be a 'prefix namespace' pairs list}}
1399
1400test domDoc-25.5 {selectNodesNamespaces} {
1401    set doc [dom parse {<root xmlns="rootdefaultNS">
1402        <elem1 xmlns="elem1NS"><elem11/></elem1>
1403        <elem2 xmlns="elem2NS"/>
1404        </root>}]
1405    $doc selectNodesNamespaces {default1 rootdefaultNS}
1406    set node [$doc selectNodes default1:root]
1407    set result [list [$node prefix] [$node localName]]
1408    $doc delete
1409    set result
1410} {{} root}
1411
1412test domDoc-25.6 {selectNodesNamespaces} {
1413    set doc [dom parse {<root xmlns="rootdefaultNS">
1414        <elem1 xmlns="elem1NS"><elem11/></elem1>
1415        <elem2 xmlns="elem2NS"/>
1416        </root>}]
1417    $doc selectNodesNamespaces {default2 elem1NS default1 rootdefaultNS}
1418    set node [$doc selectNodes default1:root/default2:elem1]
1419    set result [list [$node prefix] [$node localName]]
1420    set node [$doc selectNodes default1:root/default2:elem1/default2:elem11]
1421    lappend result [$node nodeName] [$node namespaceURI]
1422    $doc delete
1423    set result
1424} {{} elem1 elem11 elem1NS}
1425
1426test domDoc-25.7 {selectNodesNamespaces} {
1427    set doc [dom parse {<root xmlns="rootdefaultNS">
1428        <elem1 xmlns="elem1NS"><elem11 xmlns=""/></elem1>
1429        <elem2 xmlns="elem2NS"/>
1430        </root>}]
1431    $doc selectNodesNamespaces {default2 elem1NS default1 rootdefaultNS}
1432    set node [$doc selectNodes default1:root/default2:elem1]
1433    set result [list [$node prefix] [$node localName]]
1434    set node [$doc selectNodes default1:root/default2:elem1/elem11]
1435    lappend result [$node nodeName] [$node namespaceURI]
1436    $doc delete
1437    set result
1438} {{} elem1 elem11 {}}
1439
1440test domDoc-25.7.1 {selectNodesNamespaces} {
1441    set doc [dom parse {<root xmlns="rootdefaultNS">
1442        <elem1 xmlns="elem1NS"/>
1443        <elem2 xmlns="elem2NS"/>
1444        </root>}]
1445    $doc documentElement root
1446    $root firstChild elem1
1447    $doc createElement elem11 elem11
1448    $elem1 appendChild $elem11
1449    $doc selectNodesNamespaces {default2 elem1NS default1 rootdefaultNS}
1450    set node [$doc selectNodes default1:root/default2:elem1]
1451    set result [list [$node prefix] [$node localName]]
1452    set node [$doc selectNodes default1:root/default2:elem1/elem11]
1453    lappend result [$node nodeName] [$node namespaceURI]
1454    $doc delete
1455    set result
1456} {{} elem1 elem11 {}}
1457
1458test domDoc-25.8 {selectNodesNamespaces} {
1459    set doc [dom parse {<root xmlns="rootdefaultNS">
1460        <elem1 xmlns="elem1NS"><elem11 xmlns=""/></elem1>
1461        <elem2 xmlns="elem2NS"/>
1462        </root>}]
1463    $doc selectNodesNamespaces {default2 elem1NS default1 rootdefaultNS}
1464    set result [catch {set node [$doc selectNodes \
1465                                     -namespaces {
1466                                         dflt1 elem1NS
1467                                         dflt2 rootdefaultNS
1468                                     } \
1469                                     default1:root/dflt1:elem1/elem11]} errMsg]
1470    lappend result $errMsg
1471    $doc delete
1472    set result
1473} {1 {Prefix doesn't resolve}}
1474
1475test domDoc-25.9 {selectNodesNamespaces} {
1476    set doc [dom parse {<root xmlns="rootdefaultNS">
1477        <elem1 xmlns="elem1NS"><elem11 xmlns=""/></elem1>
1478        <elem2 xmlns="elem2NS"/>
1479        </root>}]
1480    $doc selectNodesNamespaces {default2 elem1NS default1 rootdefaultNS}
1481    set node [$doc selectNodes default1:root/default2:elem1]
1482    set result [list [$node prefix] [$node localName]]
1483    set node [$doc selectNodes \
1484                  -namespaces {dflt1 elem1NS dflt2 rootdefaultNS} \
1485                  dflt2:root/dflt1:elem1/elem11]
1486    lappend result [$node nodeName] [$node namespaceURI]
1487    $doc delete
1488    set result
1489} {{} elem1 elem11 {}}
1490
1491
1492test domDoc-26.1 {Fragment list} {
1493    set doc [dom parse {<!---comment on top level-->
1494        <root>text1<child>text2</child>text3</root>}]
1495    $doc removeChild [$doc firstChild]
1496    $doc documentElement root
1497    for {set i 1} {$i < 4} {incr i} {
1498        set removedNode$i [$root removeChild [$root firstChild]]
1499    }
1500    $removedNode2 delete
1501    $root appendChild $removedNode3
1502    $root appendChild $removedNode1
1503    set result [$doc asXML -indent none]
1504    $doc delete
1505    set result
1506} {<root>text3text1</root>}
1507
1508test domDoc-27.1 {deleteXPathCache} {
1509    set doc [dom createDocument doc]
1510    set result [list]
1511    lappend result [$doc deleteXPathCache foo/bar]
1512    $doc selectNodes -cache 1 2+2
1513    lappend result [$doc deleteXPathCache foo/bar]
1514    lappend result [$doc deleteXPathCache 2+2]
1515    lappend result [$doc deleteXPathCache]
1516    $doc selectNodes -cache 1 2+2
1517    $doc delete
1518    set result
1519} {{} {} {} {}}
1520
1521test domDoc-28.1 {createElementNS} {
1522    set doc [dom createDocument doc]
1523    set newElem [$doc createElementNS uri ns:e]
1524    $doc documentElement root
1525    $root appendChild $newElem
1526    set result [$doc asXML -indent none]
1527    $doc delete
1528    set result
1529} {<doc><ns:e xmlns:ns="uri"/></doc>}
1530
1531test domDoc-28.2 {createElementNS} {
1532    set doc [dom createDocument doc]
1533    set newElem [$doc createElementNS uri ns:e]
1534    $newElem setAttributeNS uri ns:att value
1535    $doc documentElement root
1536    $root appendChild $newElem
1537    set result [$doc selectNodes -namespaces {ns uri} string(/doc/ns:e/@ns:att)]
1538    $doc delete
1539    set result
1540} {value}
1541
1542test domDoc-28.3 {createElementNS} {
1543    set doc [dom createDocument doc]
1544    catch {$doc createElementNS "" e} errMsg
1545    $doc delete
1546    set errMsg
1547} {Missing URI in Namespace declaration}
1548
1549
1550# cleanup
1551::tcltest::cleanupTests
1552return
1553