testunitxml 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +15 -0
- data/MIT-LICENSE +21 -0
- data/README +119 -0
- data/docs/html/classes/REXML/Attributes.html +6 -6
- data/docs/html/classes/REXML/Attributes.src/{M000001.html → M000004.html} +0 -0
- data/docs/html/classes/REXML/DocType.html +207 -0
- data/docs/html/classes/REXML/DocType.src/M000005.html +18 -0
- data/docs/html/classes/REXML/DocType.src/M000006.html +18 -0
- data/docs/html/classes/REXML/DocType.src/M000007.html +18 -0
- data/docs/html/classes/REXML/DocType.src/M000008.html +20 -0
- data/docs/html/classes/REXML/NotationDecl.html +188 -0
- data/docs/html/classes/REXML/NotationDecl.src/M000001.html +18 -0
- data/docs/html/classes/REXML/NotationDecl.src/M000002.html +18 -0
- data/docs/html/classes/REXML/NotationDecl.src/M000003.html +19 -0
- data/docs/html/classes/REXML.html +10 -0
- data/docs/html/classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html +5 -5
- data/docs/html/classes/Test/Unit/XML/NodeIterator/NullNodeFilter.src/{M000007.html → M000014.html} +0 -0
- data/docs/html/classes/Test/Unit/XML/NodeIterator.html +20 -20
- data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000003.html → M000010.html} +0 -0
- data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000004.html → M000011.html} +0 -0
- data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000005.html → M000012.html} +0 -0
- data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000006.html → M000013.html} +0 -0
- data/docs/html/classes/Test/Unit/XML/XmlEqualFilter.html +5 -5
- data/docs/html/classes/Test/Unit/XML/XmlEqualFilter.src/{M000008.html → M000015.html} +4 -0
- data/docs/html/classes/Test/Unit/XML.html +49 -11
- data/docs/html/classes/Test/Unit/XML.src/{M000002.html → M000009.html} +1 -1
- data/docs/html/created.rid +1 -1
- data/docs/html/files/CHANGES.html +127 -0
- data/docs/html/files/README.html +64 -25
- data/docs/html/files/lib/test/unit/xml/doctype_mixin_rb.html +101 -0
- data/docs/html/files/lib/test/unit/xml/notationdecl_mixin_rb.html +101 -0
- data/docs/html/files/lib/test/unit/xml/xml_assertions_rb.html +3 -1
- data/docs/html/files/lib/test/unit/xml/xmlequalfilter_rb.html +1 -1
- data/docs/html/fr_class_index.html +2 -0
- data/docs/html/fr_file_index.html +3 -0
- data/docs/html/fr_method_index.html +15 -8
- data/lib/test/unit/xml/doctype_mixin.rb +32 -0
- data/lib/test/unit/xml/notationdecl_mixin.rb +54 -0
- data/lib/test/unit/xml/xml_assertions.rb +75 -7
- data/lib/test/unit/xml/xmlequalfilter.rb +10 -6
- data/setup.rb +1585 -0
- data/test/tc_notationdecl_mixin.rb +50 -0
- data/test/tc_testunitxml.rb +172 -1
- data/test/ts_testunitxml.rb +12 -0
- metadata +33 -11
@@ -0,0 +1,101 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>File: doctype_mixin.rb</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../../../../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="fileHeader">
|
50
|
+
<h1>doctype_mixin.rb</h1>
|
51
|
+
<table class="header-table">
|
52
|
+
<tr class="top-aligned-row">
|
53
|
+
<td><strong>Path:</strong></td>
|
54
|
+
<td>lib/test/unit/xml/doctype_mixin.rb
|
55
|
+
</td>
|
56
|
+
</tr>
|
57
|
+
<tr class="top-aligned-row">
|
58
|
+
<td><strong>Last Update:</strong></td>
|
59
|
+
<td>Mon Jan 23 14:15:13 CET 2006</td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
</div>
|
63
|
+
<!-- banner header -->
|
64
|
+
|
65
|
+
<div id="bodyContent">
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
<div id="contextContent">
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
</div>
|
74
|
+
|
75
|
+
|
76
|
+
</div>
|
77
|
+
|
78
|
+
|
79
|
+
<!-- if includes -->
|
80
|
+
|
81
|
+
<div id="section">
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
<!-- if method_list -->
|
91
|
+
|
92
|
+
|
93
|
+
</div>
|
94
|
+
|
95
|
+
|
96
|
+
<div id="validator-badges">
|
97
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
98
|
+
</div>
|
99
|
+
|
100
|
+
</body>
|
101
|
+
</html>
|
@@ -0,0 +1,101 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>File: notationdecl_mixin.rb</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href="../../../../.././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="fileHeader">
|
50
|
+
<h1>notationdecl_mixin.rb</h1>
|
51
|
+
<table class="header-table">
|
52
|
+
<tr class="top-aligned-row">
|
53
|
+
<td><strong>Path:</strong></td>
|
54
|
+
<td>lib/test/unit/xml/notationdecl_mixin.rb
|
55
|
+
</td>
|
56
|
+
</tr>
|
57
|
+
<tr class="top-aligned-row">
|
58
|
+
<td><strong>Last Update:</strong></td>
|
59
|
+
<td>Mon Jan 23 14:20:13 CET 2006</td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
</div>
|
63
|
+
<!-- banner header -->
|
64
|
+
|
65
|
+
<div id="bodyContent">
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
<div id="contextContent">
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
</div>
|
74
|
+
|
75
|
+
|
76
|
+
</div>
|
77
|
+
|
78
|
+
|
79
|
+
<!-- if includes -->
|
80
|
+
|
81
|
+
<div id="section">
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
<!-- if method_list -->
|
91
|
+
|
92
|
+
|
93
|
+
</div>
|
94
|
+
|
95
|
+
|
96
|
+
<div id="validator-badges">
|
97
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
98
|
+
</div>
|
99
|
+
|
100
|
+
</body>
|
101
|
+
</html>
|
@@ -56,7 +56,7 @@
|
|
56
56
|
</tr>
|
57
57
|
<tr class="top-aligned-row">
|
58
58
|
<td><strong>Last Update:</strong></td>
|
59
|
-
<td>Mon Jan
|
59
|
+
<td>Mon Jan 23 14:28:19 CET 2006</td>
|
60
60
|
</tr>
|
61
61
|
</table>
|
62
62
|
</div>
|
@@ -75,6 +75,8 @@
|
|
75
75
|
<div class="name-list">
|
76
76
|
rexml/document
|
77
77
|
test/unit/xml/attributes_mixin
|
78
|
+
test/unit/xml/doctype_mixin
|
79
|
+
test/unit/xml/notationdecl_mixin
|
78
80
|
test/unit
|
79
81
|
test/unit/xml/xmlequalfilter
|
80
82
|
test/unit/xml/nodeiterator
|
@@ -22,6 +22,8 @@
|
|
22
22
|
<div id="index-entries">
|
23
23
|
<a href="classes/REXML.html">REXML</a><br />
|
24
24
|
<a href="classes/REXML/Attributes.html">REXML::Attributes</a><br />
|
25
|
+
<a href="classes/REXML/DocType.html">REXML::DocType</a><br />
|
26
|
+
<a href="classes/REXML/NotationDecl.html">REXML::NotationDecl</a><br />
|
25
27
|
<a href="classes/Test.html">Test</a><br />
|
26
28
|
<a href="classes/Test/Unit.html">Test::Unit</a><br />
|
27
29
|
<a href="classes/Test/Unit/TestCase.html">Test::Unit::TestCase</a><br />
|
@@ -20,11 +20,14 @@
|
|
20
20
|
<div id="index">
|
21
21
|
<h1 class="section-bar">Files</h1>
|
22
22
|
<div id="index-entries">
|
23
|
+
<a href="files/CHANGES.html">CHANGES</a><br />
|
23
24
|
<a href="files/MIT-LICENSE.html">MIT-LICENSE</a><br />
|
24
25
|
<a href="files/README.html">README</a><br />
|
25
26
|
<a href="files/lib/test/unit/xml_rb.html">lib/test/unit/xml.rb</a><br />
|
26
27
|
<a href="files/lib/test/unit/xml/attributes_mixin_rb.html">lib/test/unit/xml/attributes_mixin.rb</a><br />
|
28
|
+
<a href="files/lib/test/unit/xml/doctype_mixin_rb.html">lib/test/unit/xml/doctype_mixin.rb</a><br />
|
27
29
|
<a href="files/lib/test/unit/xml/nodeiterator_rb.html">lib/test/unit/xml/nodeiterator.rb</a><br />
|
30
|
+
<a href="files/lib/test/unit/xml/notationdecl_mixin_rb.html">lib/test/unit/xml/notationdecl_mixin.rb</a><br />
|
28
31
|
<a href="files/lib/test/unit/xml/xml_assertions_rb.html">lib/test/unit/xml/xml_assertions.rb</a><br />
|
29
32
|
<a href="files/lib/test/unit/xml/xmlequalfilter_rb.html">lib/test/unit/xml/xmlequalfilter.rb</a><br />
|
30
33
|
</div>
|
@@ -20,14 +20,21 @@
|
|
20
20
|
<div id="index">
|
21
21
|
<h1 class="section-bar">Methods</h1>
|
22
22
|
<div id="index-entries">
|
23
|
-
<a href="classes/Test/Unit/XML/XmlEqualFilter.html#
|
24
|
-
<a href="classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html#
|
25
|
-
<a href="classes/Test/Unit/XML.html#
|
26
|
-
<a href="classes/Test/Unit/XML/NodeIterator.html#
|
27
|
-
<a href="classes/REXML/Attributes.html#
|
28
|
-
<a href="classes/Test/Unit/XML/NodeIterator.html#
|
29
|
-
<a href="classes/
|
30
|
-
<a href="classes/Test/Unit/XML/NodeIterator.html#
|
23
|
+
<a href="classes/Test/Unit/XML/XmlEqualFilter.html#M000015">accept (Test::Unit::XML::XmlEqualFilter)</a><br />
|
24
|
+
<a href="classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html#M000014">accept (Test::Unit::XML::NodeIterator::NullNodeFilter)</a><br />
|
25
|
+
<a href="classes/Test/Unit/XML.html#M000009">assert_xml_equal (Test::Unit::XML)</a><br />
|
26
|
+
<a href="classes/Test/Unit/XML/NodeIterator.html#M000010">find_next_node (Test::Unit::XML::NodeIterator)</a><br />
|
27
|
+
<a href="classes/REXML/Attributes.html#M000004">get_attribute_ns (REXML::Attributes)</a><br />
|
28
|
+
<a href="classes/Test/Unit/XML/NodeIterator.html#M000012">has_next (Test::Unit::XML::NodeIterator)</a><br />
|
29
|
+
<a href="classes/REXML/NotationDecl.html#M000001">name (REXML::NotationDecl)</a><br />
|
30
|
+
<a href="classes/Test/Unit/XML/NodeIterator.html#M000011">new (Test::Unit::XML::NodeIterator)</a><br />
|
31
|
+
<a href="classes/Test/Unit/XML/NodeIterator.html#M000013">next (Test::Unit::XML::NodeIterator)</a><br />
|
32
|
+
<a href="classes/REXML/DocType.html#M000008">notation (REXML::DocType)</a><br />
|
33
|
+
<a href="classes/REXML/DocType.html#M000007">notations (REXML::DocType)</a><br />
|
34
|
+
<a href="classes/REXML/DocType.html#M000005">public (REXML::DocType)</a><br />
|
35
|
+
<a href="classes/REXML/NotationDecl.html#M000003">public (REXML::NotationDecl)</a><br />
|
36
|
+
<a href="classes/REXML/DocType.html#M000006">system (REXML::DocType)</a><br />
|
37
|
+
<a href="classes/REXML/NotationDecl.html#M000002">system (REXML::NotationDecl)</a><br />
|
31
38
|
</div>
|
32
39
|
</div>
|
33
40
|
</body>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module REXML
|
2
|
+
|
3
|
+
# The REXML::DocType mix-in adds methods that are useful for
|
4
|
+
# Doctype declarations, but not present in the standard
|
5
|
+
# REXML::DocType class
|
6
|
+
class DocType
|
7
|
+
|
8
|
+
# This method retrieves the public identifier identifying the document's DTD.
|
9
|
+
def public
|
10
|
+
@long_name
|
11
|
+
end
|
12
|
+
|
13
|
+
# This method retrieves the system identifier identifying the document's DTD
|
14
|
+
def system
|
15
|
+
@uri
|
16
|
+
end
|
17
|
+
|
18
|
+
# This method returns a list of notations that have been declared in the
|
19
|
+
# _internal_ DTD subset. Notations in the external DTD subset are not listed.
|
20
|
+
def notations
|
21
|
+
children().select {|node| node.kind_of?(REXML::NotationDecl)}
|
22
|
+
end
|
23
|
+
|
24
|
+
# Retrieves a named notation. Only notations declared in the internal
|
25
|
+
# DTD subset can be retrieved.
|
26
|
+
def notation(name)
|
27
|
+
notations.find { |notation_decl|
|
28
|
+
notation_decl.name == name
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module REXML
|
2
|
+
|
3
|
+
# The REXML::NotationDecl mix-in adds methods that are useful for
|
4
|
+
# notation declarations, but not present in the standard
|
5
|
+
# REXML::NotationDecl class
|
6
|
+
class NotationDecl
|
7
|
+
|
8
|
+
# This method retrieves the name of the notation.
|
9
|
+
def name
|
10
|
+
@name
|
11
|
+
end
|
12
|
+
|
13
|
+
# This method retrieves the system identifier specified in the notation
|
14
|
+
# declaration. If there is no system identifier defined, the method returns
|
15
|
+
# +nil+
|
16
|
+
def system
|
17
|
+
parse_rest(@rest)[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
# This method retrieves the public identifier specified in the notation
|
21
|
+
# declaration. If there is no public identifier defined, the method returns
|
22
|
+
# +nil+
|
23
|
+
def public
|
24
|
+
return nil unless @middle == "PUBLIC"
|
25
|
+
parse_rest(@rest)[0]
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def parse_rest(rest)
|
31
|
+
case rest
|
32
|
+
when /^"([^"]+)"\s+"([^"]+)"$/
|
33
|
+
return [$1,$2]
|
34
|
+
when /^'([^']+)'\s+'([^']+)'$/
|
35
|
+
return [$1,$2]
|
36
|
+
when /^"([^"]+)"\s+'([^']+)'$/
|
37
|
+
return [$1,$2]
|
38
|
+
when /^'([^']+)'\s+"([^"]+)"$/
|
39
|
+
return [$1,$2]
|
40
|
+
when /^"([^"]+)"$/
|
41
|
+
return [nil, $1] if @middle == 'SYSTEM'
|
42
|
+
return [$1, nil] if @middle == 'PUBLIC'
|
43
|
+
raise "Unknown notation keyword: #{@middle}"
|
44
|
+
when /^'([^']+)'$/
|
45
|
+
return [nil, $1] if @middle == 'SYSTEM'
|
46
|
+
return [$1, nil] if @middle == 'PUBLIC'
|
47
|
+
raise "Unknown notation keyword: #{@middle}"
|
48
|
+
else
|
49
|
+
raise "Could not parse \@rest variable in REXML::NotationDecl: |#{@rest}|"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'rexml/document'
|
4
4
|
require 'test/unit/xml/attributes_mixin' # Must be required after rexml/document
|
5
|
+
require 'test/unit/xml/doctype_mixin' # Must be required after rexml/document
|
6
|
+
require 'test/unit/xml/notationdecl_mixin' # Must be required after rexml/document
|
5
7
|
require 'test/unit'
|
6
8
|
require 'test/unit/xml/xmlequalfilter'
|
7
9
|
require 'test/unit/xml/nodeiterator'
|
@@ -15,7 +17,6 @@ module Test
|
|
15
17
|
module XML
|
16
18
|
|
17
19
|
# This method checks whether two well-formed XML documents are equal.
|
18
|
-
# Doctype declarations are ignored for the purposes of comparison.
|
19
20
|
# Two XML documents are considered equal if:
|
20
21
|
# * They contain the same type of nodes, in the same order,
|
21
22
|
# except for text nodes that are empty, or contain only
|
@@ -27,11 +28,37 @@ module Test
|
|
27
28
|
# XML declarations are equal if they have the same version,
|
28
29
|
# encoding, and stand-alone pseudo-attributes.
|
29
30
|
# Doctype::
|
30
|
-
#
|
31
|
+
# Doctypes are equal if they fulfill all of the following conditions:
|
32
|
+
# * They have the same public identifier, or neither has a public identifier
|
33
|
+
# * If one of the doctypes has a system identifier that is a URN,
|
34
|
+
# the other doctype must have a system identifier that is the same URN.
|
35
|
+
# System identifiers that are URLs are ignored for comparison purposes.
|
36
|
+
# The reason is that the same DTD is very often stored in many different
|
37
|
+
# locations (for example different directories on different computers).
|
38
|
+
# Therefore the physical location of the DTD does not say anything useful
|
39
|
+
# about whether two documents are equal.
|
40
|
+
# * An entity declaration present in one of the doctype declarations
|
41
|
+
# must also be present in the other.
|
42
|
+
# * A notation declaration present in one of the doctype declarations
|
43
|
+
# must also be present in the other.
|
44
|
+
# Internal General Entity Declaration::
|
45
|
+
# Internal General entity declarations are equal if they have the same name,
|
46
|
+
# and the same value.
|
47
|
+
# External General Entity Declaration::
|
48
|
+
# External general entity declarations are equal if they have the same name,
|
49
|
+
# and if the identifiers are of the same type (PUBLIC or SYSTEM) and have
|
50
|
+
# the same value. Note that if the identifiers are URLs, a comparison may
|
51
|
+
# fail even though both URLS point to the same resource, for example if one
|
52
|
+
# URL is relative and the other is absolute.
|
53
|
+
# Notation Declaration::
|
54
|
+
# Notation declarations are equal if they have the same name,
|
55
|
+
# and if the identifiers are of the same type (PUBLIC or SYSTEM) and have
|
56
|
+
# the same value.
|
31
57
|
# Elements::
|
32
58
|
# Elements are considered equal if they have the same generic
|
33
|
-
# identifier (tag name)
|
34
|
-
# namespace _prefixes_ may be different
|
59
|
+
# identifier (tag name), belong to the same namespace, and have the same
|
60
|
+
# attributes. Note that the namespace _prefixes_ of two elements may be different
|
61
|
+
# as long as they belong to the same namespace.
|
35
62
|
# Attributes::
|
36
63
|
# Attributes are equal if they belong to the same namespace,
|
37
64
|
# have the same name, and the same value.
|
@@ -118,8 +145,7 @@ EOT
|
|
118
145
|
# TODO: Implement Document comparison
|
119
146
|
true
|
120
147
|
when REXML::DocType
|
121
|
-
|
122
|
-
true
|
148
|
+
compare_doctypes(expected_node, actual_node)
|
123
149
|
when REXML::Element :
|
124
150
|
compare_elements(expected_node, actual_node)
|
125
151
|
when REXML::CData
|
@@ -132,12 +158,30 @@ EOT
|
|
132
158
|
compare_pi(expected_node, actual_node)
|
133
159
|
when REXML::XMLDecl
|
134
160
|
compare_xml_declaration(expected_node, actual_node)
|
161
|
+
#when REXML::Entity
|
162
|
+
# compare_xml_entities(expected_node, actual_node)
|
135
163
|
else
|
136
164
|
puts "Unknown node type #{actual_node.class}"
|
137
165
|
false
|
138
166
|
end
|
139
167
|
end
|
140
168
|
|
169
|
+
def compare_doctypes(expected_node, actual_node)
|
170
|
+
return compare_system_id(expected_node.system, actual_node.system) &&
|
171
|
+
expected_node.public == actual_node.public &&
|
172
|
+
compare_xml_internal_dtd_subset(expected_node, actual_node)
|
173
|
+
end
|
174
|
+
|
175
|
+
def compare_system_id(expected_id, actual_id)
|
176
|
+
is_expected_urn = expected_id =~ /^urn:/i
|
177
|
+
is_actual_urn = actual_id =~ /^urn:/i
|
178
|
+
if is_expected_urn || is_actual_urn
|
179
|
+
expected_id == actual_id
|
180
|
+
else
|
181
|
+
true
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
141
185
|
def compare_elements(expected_node, actual_node)
|
142
186
|
return expected_node.name == actual_node.name &&
|
143
187
|
expected_node.namespace() == actual_node.namespace() &&
|
@@ -181,7 +225,31 @@ EOT
|
|
181
225
|
return expected_decl == actual_decl
|
182
226
|
end
|
183
227
|
|
184
|
-
|
228
|
+
def compare_xml_internal_dtd_subset(expected_node, actual_node)
|
229
|
+
expected_subset = expected_node.children()
|
230
|
+
actual_subset = actual_node.children()
|
231
|
+
return false unless expected_subset.length == actual_subset.length
|
232
|
+
expected_subset.inject(true) { |memo, expected_decl|
|
233
|
+
case expected_decl
|
234
|
+
when REXML::Entity
|
235
|
+
memo &&
|
236
|
+
expected_decl.value == actual_node.entities[expected_decl.name].value &&
|
237
|
+
expected_decl.ndata == actual_node.entities[expected_decl.name].ndata
|
238
|
+
when REXML::NotationDecl
|
239
|
+
actual_notation_decl = actual_node.notation(expected_decl.name)
|
240
|
+
memo &&
|
241
|
+
actual_notation_decl != nil &&
|
242
|
+
expected_decl.name == actual_notation_decl.name &&
|
243
|
+
expected_decl.public == actual_notation_decl.public &&
|
244
|
+
expected_decl.system == actual_notation_decl.system
|
245
|
+
when REXML::Comment
|
246
|
+
true
|
247
|
+
else
|
248
|
+
raise "Unexpected node type in internal DTD subset of expected document: " + expected_decl.inspect
|
249
|
+
end
|
250
|
+
}
|
251
|
+
end
|
252
|
+
end
|
185
253
|
end
|
186
254
|
end
|
187
255
|
|
@@ -1,16 +1,20 @@
|
|
1
1
|
#! /usr/bin/ruby
|
2
2
|
|
3
|
-
module Test
|
4
|
-
module Unit
|
3
|
+
module Test
|
4
|
+
module Unit
|
5
5
|
module XML
|
6
6
|
|
7
7
|
# This filter class accepts any node except text nodes
|
8
|
-
# that contain non-significant whitespace
|
8
|
+
# that contain non-significant whitespace
|
9
9
|
class XmlEqualFilter
|
10
10
|
def accept(node)
|
11
11
|
case
|
12
12
|
when node.kind_of?(REXML::Text)
|
13
13
|
is_significant?(node.value)
|
14
|
+
when node.kind_of?(REXML::Entity)
|
15
|
+
false
|
16
|
+
when node.kind_of?(REXML::NotationDecl)
|
17
|
+
false
|
14
18
|
else
|
15
19
|
true
|
16
20
|
end
|
@@ -21,7 +25,7 @@ module Test
|
|
21
25
|
def is_significant?(string)
|
22
26
|
string =~ /^\s*$/ ? false : true
|
23
27
|
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
27
31
|
end
|