# Features covered: dom command # # This file contains a collection of tests for the dom command of # tDOM. # # dom-1.*: createDocument, createDocumentNS # dom-2.*: parse # dom-3.*: isName, isNCName, isCharData, isPIName, isComment, isCDATA # dom-4.*: parse -useForeignDTD # dom-5.*: external entities # dom-6.*: use in slave interpreter # dom-7.*: setNameCheck, setTextCheck # dom-8.*: createDocumentNode, documentNodes # dom-9.*: setObjectCommands # # Copyright (c) 2002, 2003, 2004 Rolf Ade. source [file join [file dir [info script]] loadtdom.tcl] test dom-1.1 {createDocument with root node name not a XML Name} { list [catch {dom createDocument "root node"} msg] $msg } "1 {invalid root element name}" test dom-1.2 {createDocument with root node name not a XML Name} { list [catch {dom createDocument "1root"} msg] $msg } "1 {invalid root element name}" test dom-1.3 {createDocument - root name us-ascii} { dom createDocument "root" doc set root [$doc documentElement] set result [$root nodeName] $doc delete set result } "root" test dom-1.4 {createDocument - root name with UTF-8 chars} { dom createDocument "\u00c4\u00d4\u00dc" doc set root [$doc documentElement] set result [$root nodeName] $doc delete set result } "\u00c4\u00d4\u00dc" test dom-1.5 {createDocument with FQ root name} { dom createDocument "foo:bar" doc set root [$doc documentElement] set result [$root nodeName] $doc delete set result } "foo:bar" test dom-1.6 {createDocument with wrong # of args} { list [catch {dom createDocument "root" "http:/foo:bar" doc} msg] $msg } "1 {wrong \# args: should be \"createDocument docElemName ?newObjVar?\"}" test dom-1.7 {createDocumentNS - check root name} { set doc [dom createDocumentNS "http://foo.bar" "root"] set root [$doc documentElement] set result [$root nodeName] $doc delete set result } "root" test dom-1.8 {createDocumentNS - check the NS of the created root} { dom createDocumentNS "http://foo.bar" "root" doc set root [$doc documentElement] set result [$root namespaceURI] $doc delete set result } "http://foo.bar" test dom-1.9 {createDocumentNS with root name not a NCName} { list [catch {dom createDocumentNS "http://foo.bar" "foo bar" doc} msg] $msg } "1 {invalid local name}" test dom-1.10 {createDocumentNS with root name not a NCName} { list [catch {dom createDocumentNS "http://foo.bar" "a:b:c" doc} msg] $msg } "1 {invalid local name}" test dom-1.11 {createDocumentNS with root name not a NCName} { list [catch {dom createDocumentNS "http://foo.bar" "a b:b" doc} msg] $msg } "1 {invalid prefix name}" test dom-1.12 {createDocumentNS with root name not a NCName} { list [catch {dom createDocumentNS "http://foo.bar" "a:a b" doc} msg] $msg } "1 {invalid local name}" test dom-1.13 {createDocumentNS - check root name} { set doc [dom createDocumentNS "http://foo.bar" foo:root] set root [$doc documentElement] set result [$root nodeName] $doc delete set result } "foo:root" test dom-1.14 {createDocument - rename the doc cmd} { set doc [dom createDocument root] if {[info commands fooCmd] == "fooCmd"} { rename fooCmd {} } rename $doc fooCmd set result [[fooCmd documentElement] nodeName] fooCmd delete set result } {root} test dom-1.15 {createDocument - rename the doc cmd} { if {[info commands fooCmd] == "fooCmd"} { rename fooCmd {} } set nrOfCommands [llength [info commands]] set doc [dom createDocument root] rename $doc fooCmd fooCmd delete expr {[llength [info commands]] == $nrOfCommands} } {1} test dom-2.1 {Don't quash white space at start or end of non white space content} { set doc [dom parse { some content }] set root [$doc documentElement] $root text } { some content } test dom-2.2 {parse doc with various re-declaration of a prefix} { set doc [dom parse { }] set root [$doc documentElement] set result [$root asXML] $doc delete set result } { } test dom-2.3 {parse doc with default NS declaration} { set doc [dom parse { }] set root [$doc documentElement] set result [$root asXML] $doc delete set result } { } test dom-2.4 {parse method: syntax check} { set doc [dom parse -keepEmpties { text }] set result [$doc asXML -indent none] $doc delete set result } { text } test dom-2.5 {parse method: syntax check} { set doc [dom parse -useForeignDTD 0 -keepEmpties { text }] set result [$doc asXML -indent none] $doc delete set result } { text } test dom-2.6 {parse method: syntax check} -setup { set xmlFile [makeFile { } dom.xml] } -body { set fd [open $xmlFile] set doc [dom parse -channel $fd -keepEmpties] close $fd set root [$doc documentElement] set result [$root asXML -indent none] $doc delete set result } -cleanup { removeFile dom.xml } -result { } test dom-2.7 {parse method: syntax check} -setup { set xmlFile [makeFile { } dom.xml] } -body { catch {unset -keepEmpties} set fd [open $xmlFile] set doc [dom parse -channel $fd -keepEmpties] close $fd $doc delete info exists -keepEmpties } -cleanup { removeFile dom.xml } -result 0 test dom-2.8 {parse method: bogus option} { set result [catch {set doc [dom parse -bogusOption foo ]} errMsg] lappend result $errMsg } {1 {bad option "-bogusOption": must be -keepEmpties, -simple, -html, -feedbackAfter, -channel, -baseurl, -externalentitycommand, -useForeignDTD, or -paramentityparsing}} test dom-2.9 {parse method: bogus option} -setup { set xmlFile [makeFile { } dom.xml] } -body { catch {unset -keepEmpties} set fd [open $xmlFile] set result [catch {set doc [dom parse -channel $fd -bogusOption]} errMsg] close $fd lappend result $errMsg } -cleanup { removeFile dom.xml } -result {1 {bad option "-bogusOption": must be -keepEmpties, -simple, -html, -feedbackAfter, -channel, -baseurl, -externalentitycommand, -useForeignDTD, or -paramentityparsing}} set dom_dtd " " proc extRefResolver {base systemId publicId} { global dom_dtd if {$publicId == "DOMCMDTEST"} { return [list string $base $dom_dtd] } else { return [::tDOM::extRefHandler $base $systemId $publicId] } } test dom-2.10 {parse method: -paramentityparsing default is 'always'} { set doc [dom parse -externalentitycommand extRefResolver { }] set root [$doc documentElement] set result [$root @lang] $doc delete set result } {en} test dom-2.11 {parse method: explicit -paramentityparsing always} { set doc [dom parse -externalentitycommand extRefResolver \ -paramentityparsing always { }] set root [$doc documentElement] set result [$root @lang] $doc delete set result } {en} test dom-2.12 {parse method: -paramentityparsing never} { set doc [dom parse -externalentitycommand extRefResolver \ -paramentityparsing never { }] set root [$doc documentElement] set result [catch {set result [$root @lang]} errMsg] $doc delete lappend result $errMsg set result } {1 {Attribute "lang" not found!}} test dom-2.13 {parse method: -paramentityparsing notstandalone} { set doc [dom parse -externalentitycommand extRefResolver \ -paramentityparsing notstandalone { }] set root [$doc documentElement] set result [$root @lang] $doc delete set result } {en} test dom-2.14 {parse method: -paramentityparsing notstandalone} { set doc [dom parse -externalentitycommand extRefResolver \ -paramentityparsing notstandalone \ { }] set root [$doc documentElement] set result [catch {set result [$root @lang]} errMsg] $doc delete lappend result $errMsg set result } {1 {Attribute "lang" not found!}} test dom-2.15 {parse method: -paramentityparsing notstandalone} { set doc [dom parse -externalentitycommand extRefResolver \ -paramentityparsing notstandalone \ { }] set root [$doc documentElement] set result [$root @lang] $doc delete set result } {en} test dom-2.16 {parse method: wrong value arg for -paramentityparsing} { set result [catch {set doc [dom parse -paramentityparsing wrong { }]} errMsg] lappend result $errMsg } {1 {bad value "wrong": must be always, never, or notstandalone}} # The following is syntactically wrong. It's used, to test the # error reporting in external DTDs set dom_dtd "" test dom-2.17 {parse method: test reporting of error in external subset} { set result [catch {set doc [dom parse \ -externalentitycommand extRefResolver { }]} errMsg] lappend result $errMsg } {1 {error "syntax error" in entity "dummysystemID" at line 1 character 20 ""}} test dom-2.18 {parse document with nodes before and after the documentElement} { set doc [dom parse { }] set result [$doc asXML -indent none] $doc delete set result } {} test dom-2.19 {parse document - rename docCmd} { set doc [dom parse {foo}] if {[info commands fooCmd] == "fooCmd"} { rename fooCmd {} } rename $doc fooCmd set result [fooCmd asXML -indent none] fooCmd delete set result } {foo} test dom-2.20 {parse - doc with internal subset parsed with -keepEmpties} { set doc [dom parse -keepEmpties { ]> }] $doc documentElement root set result "" foreach node [$root selectNodes /node()] { switch [$node nodeType] { TEXT_NODE { lappend result TEXT_NODE lappend result [string length [$node value]] } COMMENT_NODE { lappend result COMMENT_NODE lappend result [string length [$node value]] } PROCESSING_INSTRUCTION_NODE { lappend result PROCESSING_INSTRUCTION_NODE lappend result [$node target] lappend result [$node data] } ELEMENT_NODE { lappend result ELEMENT_NODE lappend result [$node nodeName] } default { lappend result [$node nodeType] } } } $doc delete set result } {ELEMENT_NODE root} test dom-2.21 {parse - empty CDATA section} { set doc [dom parse {}] set root [$doc documentElement] set result [$root hasChildNodes] $doc delete set result } {0} test dom-2.22 {parse - empty comment section} { set doc [dom parse {}] set root [$doc documentElement] set result [$root hasChildNodes] lappend result [[$root firstChild] nodeValue] $doc delete set result } {1 {}} test dom-2.23 {parse - pi without pivalue} { set doc [dom parse {}] set pi [[$doc documentElement] firstChild] set result [list [$pi nodeName] [$pi nodeValue] [$pi target] [$pi data]] $doc delete set result } {p {} p {}} proc 2.24 {args} { error "2.24 external entitiy resolver script error" } test dom-2.24 {parse - script error in -externalentitycommand} { set result [catch { dom parse -externalentitycommand 2.24 { }} errMsg] lappend result $errMsg } {1 {2.24 external entitiy resolver script error}} test dom-3.1 {isName} { dom isName ":foo" } {1} test dom-3.2 {isName} { dom isName "_foo" } {1} test dom-3.3 {isName} { dom isName "foo:bar:baz" } {1} test dom-3.4 {isName} { dom isName "-foo" } {0} test dom-3.5 {isName} { dom isName ".foo" } {0} test dom-3.6 {isName} { catch {dom isName} } {1} test dom-3.7 {isName} { catch {dom isName foo bar} } {1} # The following character classes are out of XML 1.0 Second Edition rec, # Appendix B (which is following the Unicode standard). set BaseChar { {0x0041 0x005A} {0x0061 0x007A} {0x00C0 0x00D6} {0x00D8 0x00F6} {0x00F8 0x00FF} {0x0100 0x0131} {0x0134 0x013E} {0x0141 0x0148} {0x014A 0x017E} {0x0180 0x01C3} {0x01CD 0x01F0} {0x01F4 0x01F5} {0x01FA 0x0217} {0x0250 0x02A8} {0x02BB 0x02C1} 0x0386 {0x0388 0x038A} 0x038C {0x038E 0x03A1} {0x03A3 0x03CE} {0x03D0 0x03D6} 0x03DA 0x03DC 0x03DE 0x03E0 {0x03E2 0x03F3} {0x0401 0x040C} {0x040E 0x044F} {0x0451 0x045C} {0x045E 0x0481} {0x0490 0x04C4} {0x04C7 0x04C8} {0x04CB 0x04CC} {0x04D0 0x04EB} {0x04EE 0x04F5} {0x04F8 0x04F9} {0x0531 0x0556} 0x0559 {0x0561 0x0586} {0x05D0 0x05EA} {0x05F0 0x05F2} {0x0621 0x063A} {0x0641 0x064A} {0x0671 0x06B7} {0x06BA 0x06BE} {0x06C0 0x06CE} {0x06D0 0x06D3} 0x06D5 {0x06E5 0x06E6} {0x0905 0x0939} 0x093D {0x0958 0x0961} {0x0985 0x098C} {0x098F 0x0990} {0x0993 0x09A8} {0x09AA 0x09B0} 0x09B2 {0x09B6 0x09B9} {0x09DC 0x09DD} {0x09DF 0x09E1} {0x09F0 0x09F1} {0x0A05 0x0A0A} {0x0A0F 0x0A10} {0x0A13 0x0A28} {0x0A2A 0x0A30} {0x0A32 0x0A33} {0x0A35 0x0A36} {0x0A38 0x0A39} {0x0A59 0x0A5C} 0x0A5E {0x0A72 0x0A74} {0x0A85 0x0A8B} 0x0A8D {0x0A8F 0x0A91} {0x0A93 0x0AA8} {0x0AAA 0x0AB0} {0x0AB2 0x0AB3} {0x0AB5 0x0AB9} 0x0ABD 0x0AE0 {0x0B05 0x0B0C} {0x0B0F 0x0B10} {0x0B13 0x0B28} {0x0B2A 0x0B30} {0x0B32 0x0B33} {0x0B36 0x0B39} 0x0B3D {0x0B5C 0x0B5D} {0x0B5F 0x0B61} {0x0B85 0x0B8A} {0x0B8E 0x0B90} {0x0B92 0x0B95} {0x0B99 0x0B9A} 0x0B9C {0x0B9E 0x0B9F} {0x0BA3 0x0BA4} {0x0BA8 0x0BAA} {0x0BAE 0x0BB5} {0x0BB7 0x0BB9} {0x0C05 0x0C0C} {0x0C0E 0x0C10} {0x0C12 0x0C28} {0x0C2A 0x0C33} {0x0C35 0x0C39} {0x0C60 0x0C61} {0x0C85 0x0C8C} {0x0C8E 0x0C90} {0x0C92 0x0CA8} {0x0CAA 0x0CB3} {0x0CB5 0x0CB9} 0x0CDE {0x0CE0 0x0CE1} {0x0D05 0x0D0C} {0x0D0E 0x0D10} {0x0D12 0x0D28} {0x0D2A 0x0D39} {0x0D60 0x0D61} {0x0E01 0x0E2E} 0x0E30 {0x0E32 0x0E33} {0x0E40 0x0E45} {0x0E81 0x0E82} 0x0E84 {0x0E87 0x0E88} 0x0E8A 0x0E8D {0x0E94 0x0E97} {0x0E99 0x0E9F} {0x0EA1 0x0EA3} 0x0EA5 0x0EA7 {0x0EAA 0x0EAB} {0x0EAD 0x0EAE} 0x0EB0 {0x0EB2 0x0EB3} 0x0EBD {0x0EC0 0x0EC4} {0x0F40 0x0F47} {0x0F49 0x0F69} {0x10A0 0x10C5} {0x10D0 0x10F6} 0x1100 {0x1102 0x1103} {0x1105 0x1107} 0x1109 {0x110B 0x110C} {0x110E 0x1112} 0x113C 0x113E 0x1140 0x114C 0x114E 0x1150 {0x1154 0x1155} 0x1159 {0x115F 0x1161} 0x1163 0x1165 0x1167 0x1169 {0x116D 0x116E} {0x1172 0x1173} 0x1175 0x119E 0x11A8 0x11AB {0x11AE 0x11AF} {0x11B7 0x11B8} 0x11BA {0x11BC 0x11C2} 0x11EB 0x11F0 0x11F9 {0x1E00 0x1E9B} {0x1EA0 0x1EF9} {0x1F00 0x1F15} {0x1F18 0x1F1D} {0x1F20 0x1F45} {0x1F48 0x1F4D} {0x1F50 0x1F57} 0x1F59 0x1F5B 0x1F5D {0x1F5F 0x1F7D} {0x1F80 0x1FB4} {0x1FB6 0x1FBC} 0x1FBE {0x1FC2 0x1FC4} {0x1FC6 0x1FCC} {0x1FD0 0x1FD3} {0x1FD6 0x1FDB} {0x1FE0 0x1FEC} {0x1FF2 0x1FF4} {0x1FF6 0x1FFC} 0x2126 {0x212A 0x212B} 0x212E {0x2180 0x2182} {0x3041 0x3094} {0x30A1 0x30FA} {0x3105 0x312C} {0xAC00 0xD7A3} } set Ideographic { {0x4E00 0x9FA5} 0x3007 {0x3021 0x3029} } set CombiningChar { {0x0300 0x0345} {0x0360 0x0361} {0x0483 0x0486} {0x0591 0x05A1} {0x05A3 0x05B9} {0x05BB 0x05BD} 0x05BF {0x05C1 0x05C2} 0x05C4 {0x064B 0x0652} 0x0670 {0x06D6 0x06DC} {0x06DD 0x06DF} {0x06E0 0x06E4} {0x06E7 0x06E8} {0x06EA 0x06ED} {0x0901 0x0903} 0x093C {0x093E 0x094C} 0x094D {0x0951 0x0954} {0x0962 0x0963} {0x0981 0x0983} 0x09BC 0x09BE 0x09BF {0x09C0 0x09C4} {0x09C7 0x09C8} {0x09CB 0x09CD} 0x09D7 {0x09E2 0x09E3} 0x0A02 0x0A3C 0x0A3E 0x0A3F {0x0A40 0x0A42} {0x0A47 0x0A48} {0x0A4B 0x0A4D} {0x0A70 0x0A71} {0x0A81 0x0A83} 0x0ABC {0x0ABE 0x0AC5} {0x0AC7 0x0AC9} {0x0ACB 0x0ACD} {0x0B01 0x0B03} 0x0B3C {0x0B3E 0x0B43} {0x0B47 0x0B48} {0x0B4B 0x0B4D} {0x0B56 0x0B57} {0x0B82 0x0B83} {0x0BBE 0x0BC2} {0x0BC6 0x0BC8} {0x0BCA 0x0BCD} 0x0BD7 {0x0C01 0x0C03} {0x0C3E 0x0C44} {0x0C46 0x0C48} {0x0C4A 0x0C4D} {0x0C55 0x0C56} {0x0C82 0x0C83} {0x0CBE 0x0CC4} {0x0CC6 0x0CC8} {0x0CCA 0x0CCD} {0x0CD5 0x0CD6} {0x0D02 0x0D03} {0x0D3E 0x0D43} {0x0D46 0x0D48} {0x0D4A 0x0D4D} 0x0D57 0x0E31 {0x0E34 0x0E3A} {0x0E47 0x0E4E} 0x0EB1 {0x0EB4 0x0EB9} {0x0EBB 0x0EBC} {0x0EC8 0x0ECD} {0x0F18 0x0F19} 0x0F35 0x0F37 0x0F39 0x0F3E 0x0F3F {0x0F71 0x0F84} {0x0F86 0x0F8B} {0x0F90 0x0F95} 0x0F97 {0x0F99 0x0FAD} {0x0FB1 0x0FB7} 0x0FB9 {0x20D0 0x20DC} 0x20E1 {0x302A 0x302F} 0x3099 0x309A } set Digit { {0x0030 0x0039} {0x0660 0x0669} {0x06F0 0x06F9} {0x0966 0x096F} {0x09E6 0x09EF} {0x0A66 0x0A6F} {0x0AE6 0x0AEF} {0x0B66 0x0B6F} {0x0BE7 0x0BEF} {0x0C66 0x0C6F} {0x0CE6 0x0CEF} {0x0D66 0x0D6F} {0x0E50 0x0E59} {0x0ED0 0x0ED9} {0x0F20 0x0F29} } set Extender { 0x00B7 0x02D0 0x02D1 0x0387 0x0640 0x0E46 0x0EC6 0x3005 {0x3031 0x3035} {0x309D 0x309E} {0x30FC 0x30FE} } proc sortCmd {a b} { if {[lindex $a 0] > [lindex $b 0]} { return 1 } else { return -1 } } # if {$tcl_version < 8.4} { # set nameStartChars [lsort -command sortCmd \ # [concat $BaseChar $Ideographic 0x005F 0x003A]] # } else { # set nameStartChars [lsort -integer -index 0 \ # [concat $BaseChar $Ideographic 0x005F 0x003A]] # } set nameStartChars [lsort -command sortCmd \ [concat $BaseChar $Ideographic 0x005F 0x003A]] # Append stop char needed by the test code to work properly. lappend nameStartChars 0x10000 test dom-3.8 {isName} {longRunning && need_i18n} { set ind 0 set nr 0 while {$nr < 65536} { set range [lindex $nameStartChars $ind] incr ind if {[llength $range] == 2} { foreach {min max} $range break } else { set min $range set max $range } while {$nr < $min} { if {[dom isName [subst \\u[format "%04x" $nr]]] != 0} { error "wrong 'isName' result for name start char #x[format "%04x" $nr] - should be illegal" } incr nr } if {$nr == 0x10000} {break} while {$nr <= $max} { if {[dom isName [subst \\u[format "%04x" $nr]]] != 1} { error "wrong 'isName' result for name start char #x[format "%04x" $nr] - should be legal" } incr nr } } set nr } {65536} set nameChars [lsort -command sortCmd \ [concat $BaseChar $Ideographic $Digit 0x002E 0x002D 0x005F 0x003A \ $CombiningChar $Extender]] # Append stop char needed by the test code to work properly. lappend nameChars 0x10000 test dom-3.9 {isName} {longRunning && need_i18n} { set ind 0 set nr 0 while {$nr < 65536} { set range [lindex $nameChars $ind] incr ind if {[llength $range] == 2} { foreach {min max} $range break } else { set min $range set max $range } while {$nr < $min} { if {[dom isName a[subst \\u[format "%04x" $nr]]] != 0} { error "wrong 'isName' result for name char #x[format "%04x" $nr] - should be illegal" } incr nr } if {$nr == 0x10000} {break} while {$nr <= $max} { if {[dom isName a[subst \\u[format "%04x" $nr]]] != 1} { error "wrong 'isName' result for name char #x[format "%04x" $nr] - should be legal" } incr nr } } set nr } {65536} test dom-3.10 {isNCName} { dom isNCName ":foo" } {0} test dom-3.11 {isNCName} { dom isNCName "_foo" } {1} test dom-3.12 {isNCName} { dom isNCName "foo:bar:baz" } {0} test dom-3.13 {isNCName} { dom isNCName "-foo" } {0} test dom-3.14 {isNCName} { dom isNCName ".foo" } {0} test dom-3.15 {isNCName} { catch {dom isNCName} } {1} test dom-3.16 {isNCName} { catch {dom isNCName foo bar} } {1} test dom-3.17 {isQName} { dom isQName ":foo" } {0} test dom-3.18 {isQName} { dom isQName "_foo" } {1} test dom-3.19 {isQName} { dom isQName "foo:bar:baz" } {0} test dom-3.20 {isQName} { dom isQName "-foo" } {0} test dom-3.21 {isQName} { dom isQName ".foo" } {0} test dom-3.22 {isQName} { dom isQName "foo:bar" } {1} test dom-3.23 {isQName} { catch {dom isQName} } {1} test dom-3.24 {isQName} { catch {dom isQName foo bar} } {1} test dom-3.25 {isQName} { dom isQName "foo bar" } {0} test dom-3.26 {isQName} { dom isQName "woozbiz:" } {0} set XMLChars { 0x9 0xA 0xD {0x20 0xD7FF} {0xE000 0xFFFD} {0x10000 0x10FFFF} } test dom-3.27 {isCharData} {longRunning && need_i18n} { set ind 0 set nr 1 while {$nr < 65536} { set range [lindex $XMLChars $ind] incr ind if {[llength $range] == 2} { foreach {min max} $range break } else { set min $range set max $range } while {$nr < $min} { if {[dom isCharData "a[subst \\u[format "%04x" $nr]]b"] != 0} { error "wrong 'isCharData' result for char #x[format "%04x" $nr] - should be illegal" } incr nr } if {$nr == 0x10000} {break} while {$nr <= $max} { if {[dom isCharData "a[subst \\u[format "%04x" $nr]]b"] != 1} { error "wrong 'isCharData' result for char #x[format "%04x" $nr] - should be legal" } incr nr } } set nr } {65536} test dom-3.28 {isPIName} { dom isPIName "target" } {1} test dom-3.29 {isPIName} { dom isPIName "foo:target" } {1} test dom-3.30 {isPIName} { dom isPIName "Xml" } {0} test dom-3.31 {isComment} { dom isComment "some comment" } {1} test dom-3.32 {isComment} { dom isComment "some invalid -- comment" } {0} test dom-3.33 {isComment} { dom isComment "some invalid comment-" } {0} test dom-3.34 {isCDATA} { dom isCDATA "some ]] CDATA " } {1} test dom-3.35 {isCDATA} { dom isCDATA "some ]]> CDATA " } {0} test dom-3.36 {isCDATA} { dom isCDATA "invalid: ]]>" } {0} test dom-3.37 {isCDATA} { dom isCDATA "valid: ]]> " } {0} test dom-3.38 {isCDATA} {need_i18n} { dom isCDATA "\ud7fa\ud7fb\ud7fc\ud7fd\ud7fe\ud7ff]]>" } {0} test dom-3.39 {isPIValue} { dom isPIValue "some processing instruction data" } {1} test dom-3.40 {isPIValue} { dom isPIValue "some invalid ?> processing instruction data" } {0} test dom-3.41 {isPIValue} { dom isPIValue "some invalid processing instruction data?>" } {0} test dom-4.1 {-useForeignDTD 0} { set doc [dom parse -useForeignDTD 0 {}] $doc delete } {} test dom-4.2 {-useForeignDTD 1 with document with internal subset} {need_uri} { set baseURI file://[file join [pwd] [file dir [info script]] dom.test] set ::tDOM::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tDOM::extRefHandler { ]> }] set root [$doc documentElement] set result [$root @fixed] $doc delete set result } {toThat} test dom-4.3 {-useForeignDTD 1 with document with internal subset} {need_uri} { set baseURI file://[file join [pwd] [file dir [info script]] dom.test] set ::tDOM::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tDOM::extRefHandler { ]> }] set root [$doc documentElement] set result [$root @fixed] lappend result [$root @fixed2] $doc delete set result } {toThis toThat} test dom-4.4 {-useForeignDTD 1 with document without document declaration} {need_uri} { set baseURI file://[file join [pwd] [file dir [info script]] dom.test] set ::tDOM::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tDOM::extRefHandler ] set root [$doc documentElement] set result [$root @fixed] $doc delete set result } {toThis} test dom-4.5 {-useForeignDTD 1 does not overwrite a given external subset} {need_uri} { set baseURI file://[file join [pwd] [file dir [info script]] dom.test] set ::tDOM::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tDOM::extRefHandler { }] set root [$doc documentElement] set result [$root @fixed] $doc delete set result } {toThat} test dom-4.6 {-useForeignDTD with nonboolean arg} {need_uri} { set result [catch {set doc [dom parse -useForeignDTD foo ]} errMsg] lappend result $errMsg } {1 {expected boolean value but got "foo"}} test dom-5.1 {document with external subset} {need_uri} { set baseURI file://[file join [pwd] [file dir [info script]] dom.test] set doc [dom parse \ -baseurl $baseURI \ -externalentitycommand ::tDOM::extRefHandler { }] set root [$doc documentElement] set result [$root @fixed] $doc delete set result } {toThat} test dom-6.1 {use in slave interpreter} { set slave [interp create] load {} tdom $slave interp eval $slave { dom parse foo doc $doc documentElement root } interp delete $slave } {} test dom-6.2 {use in slave interpreter} { set slave [interp create] load {} tdom $slave interp eval $slave { set doc [dom parse foo] set root [$doc documentElement] } interp delete $slave } {} test dom-7.1 {setNameCheck} { set result [dom setNameCheck] lappend result [dom setNameCheck 0] lappend result [dom setNameCheck] # set back to default lappend result [dom setNameCheck 1] set result } {1 0 0 1} set doc [dom createDocument root] # ensure, we've the default dom setNameCheck 1 test dom-7.2 {setNameCheck} { set result [catch {$doc createElement "invalid name"} errMsg] lappend result $errMsg } {1 {Invalid tag name 'invalid name'}} test dom-7.3 {setNameCheck} { catch {$doc createElement "valid:name"} } {0} test dom-7.4 {setNameCheck} { catch {$doc createElement "valid::name"} } {0} test dom-7.5 {setNameCheck} { dom setNameCheck 0 set result [catch {$doc createElement "invalid name"} errMsg] # set back to default dom setNameCheck 1 set result } {0} test dom-7.6 {setNameCheck} { set result [catch {$doc createElementNS "dummyns" "invalid name"} errMsg] lappend result $errMsg } {1 {Invalid full qualified tag name 'invalid name'}} test dom-7.7 {setNameCheck} { catch {$doc createElementNS "dummyns" "valid:name"} } {0} test dom-7.8 {setNameCheck} { set result [catch {$doc createElementNS "dummyns" "invalid::name"} errMsg] lappend result $errMsg } {1 {Invalid full qualified tag name 'invalid::name'}} test dom-7.9 {setNameCheck} { dom setNameCheck 0 set result [catch {$doc createElementNS "dummyns" "invalid name"} errMsg] # set back to default dom setNameCheck 1 set result } {0} test dom-7.10 {setTextCheck} { set result [catch {$doc createComment "valid comment"}] lappend result [catch {$doc createComment "invalid -- comment"}] dom setTextCheck 0 lappend result [catch {$doc createComment "invalid -- comment"}] dom setTextCheck 1 set result } {0 1 0} test dom-7.11 {setTextCheck} { set result [catch {$doc createCDATASection ""}] lappend result [catch {$doc createCDATASection "]]>]]>some text}] set root [$doc documentElement] set listRep [$root asList] $doc delete $docNode appendFromList $listRep set result [$docNode asXML -indent none] $docNode delete set result } {some text} test dom-9.1 {setObjectCommands} { dom setObjectCommands } {automatic} test dom-9.2 {setObjectCommands} { dom setObjectCommands automatic } {automatic} test dom-9.3 {setObjectCommands} { set result [catch {dom setObjectCommands foobar} errMsg] lappend result $errMsg } {1 {bad mode value "foobar": must be automatic, command, or token}} test dom-9.4 {setObjectCommands} { set nrOfCmds [llength [info commands]] dom setObjectCommands automatic set docNode [dom createDocumentNode] set result [expr {$nrOfCmds + 1 == [llength [info commands]]}] $docNode delete lappend result [expr {$nrOfCmds == [llength [info commands]]}] dom setObjectCommands token set docNode [dom createDocumentNode] lappend result [expr {$nrOfCmds == [llength [info commands]]}] lappend result [domDoc $docNode hasChildNodes] domDoc $docNode delete lappend result [expr {$nrOfCmds == [llength [info commands]]}] # switch back to default dom setObjectCommands automatic set result } {1 1 1 0 1} test dom-9.5 {setObjectCommands} { dom setObjectCommands token set nrOfCmds [llength [info commands]] set doc [dom parse ] set root [domDoc $doc documentElement] set result [expr {$nrOfCmds == [llength [info commands]]}] dom setObjectCommands command set docCmd [domNode $root ownerDocument] lappend result [expr {$nrOfCmds + 1 == [llength [info commands]]}] $docCmd delete set result } {1 1} # cleanup ::tcltest::cleanupTests return