testunitxml 0.1.4 → 0.1.5

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.
Files changed (41) hide show
  1. data/CHANGES +4 -0
  2. data/README +1 -1
  3. data/docs/html/classes/REXML/DocType.src/M000005.html +7 -2
  4. data/docs/html/classes/REXML/DocType.src/M000006.html +7 -2
  5. data/docs/html/classes/REXML/DocType.src/M000007.html +1 -1
  6. data/docs/html/classes/REXML/DocType.src/M000008.html +1 -1
  7. data/docs/html/classes/Test.html +4 -0
  8. data/docs/html/classes/Test/Unit.html +4 -0
  9. data/docs/html/classes/Test/Unit/XML.html +26 -1
  10. data/docs/html/classes/Test/Unit/XML.src/M000009.html +1 -1
  11. data/docs/html/classes/Test/Unit/XML.src/M000010.html +23 -0
  12. data/docs/html/classes/Test/Unit/XML/Conditionals.html +173 -0
  13. data/docs/html/classes/Test/Unit/XML/Conditionals.src/M000011.html +19 -0
  14. data/docs/html/classes/Test/Unit/XML/Conditionals.src/M000012.html +42 -0
  15. data/docs/html/classes/Test/Unit/XML/NodeIterator.html +20 -20
  16. data/docs/html/classes/Test/Unit/XML/NodeIterator.src/M000013.html +13 -6
  17. data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000011.html → M000014.html} +0 -0
  18. data/docs/html/classes/Test/Unit/XML/NodeIterator.src/{M000012.html → M000015.html} +0 -0
  19. data/docs/html/classes/Test/Unit/XML/NodeIterator.src/M000016.html +20 -0
  20. data/docs/html/classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html +5 -5
  21. data/docs/html/classes/Test/Unit/XML/NodeIterator/NullNodeFilter.src/{M000014.html → M000017.html} +0 -0
  22. data/docs/html/classes/Test/Unit/XML/XmlEqualFilter.html +5 -5
  23. data/docs/html/classes/Test/Unit/XML/XmlEqualFilter.src/{M000015.html → M000018.html} +0 -0
  24. data/docs/html/created.rid +1 -1
  25. data/docs/html/files/CHANGES.html +10 -1
  26. data/docs/html/files/README.html +2 -2
  27. data/docs/html/files/lib/test/unit/xml/conditionals_rb.html +101 -0
  28. data/docs/html/files/lib/test/unit/xml/doctype_mixin_rb.html +8 -1
  29. data/docs/html/files/lib/test/unit/xml/xml_assertions_rb.html +2 -1
  30. data/docs/html/fr_class_index.html +1 -0
  31. data/docs/html/fr_file_index.html +1 -0
  32. data/docs/html/fr_method_index.html +11 -8
  33. data/lib/test/unit/xml/conditionals.rb +141 -0
  34. data/lib/test/unit/xml/doctype_mixin.rb +24 -2
  35. data/lib/test/unit/xml/xml_assertions.rb +22 -114
  36. data/test/tc_attributes_mixin.rb +37 -0
  37. data/test/tc_doctype_mixin.rb +71 -0
  38. data/test/tc_notationdecl_mixin.rb +39 -21
  39. data/test/tc_testunitxml.rb +21 -0
  40. metadata +16 -7
  41. data/docs/html/classes/Test/Unit/XML/NodeIterator.src/M000010.html +0 -27
@@ -5,16 +5,23 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>next (Test::Unit::XML::NodeIterator)</title>
8
+ <title>find_next_node (Test::Unit::XML::NodeIterator)</title>
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
10
  <link rel="stylesheet" href="../../../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/test/unit/xml/nodeiterator.rb, line 40</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">next</span>
15
- <span class="ruby-identifier">node</span> = <span class="ruby-ivar">@next_node</span>
16
- <span class="ruby-ivar">@next_node</span> = <span class="ruby-constant">NodeIterator</span>.<span class="ruby-identifier">find_next_node</span>(<span class="ruby-identifier">node</span>, <span class="ruby-ivar">@node_filter</span>)
17
- <span class="ruby-identifier">node</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/test/unit/xml/nodeiterator.rb, line 17</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">NodeIterator</span>.<span class="ruby-identifier">find_next_node</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">node_filter</span> = <span class="ruby-constant">NullNodeFilter</span>.<span class="ruby-identifier">new</span>)
15
+ <span class="ruby-identifier">next_node</span> = <span class="ruby-keyword kw">nil</span>
16
+ <span class="ruby-keyword kw">if</span> <span class="ruby-constant">NodeIterator</span>.<span class="ruby-identifier">has_children?</span>(<span class="ruby-identifier">node</span>) <span class="ruby-keyword kw">then</span>
17
+ <span class="ruby-identifier">next_node</span> = <span class="ruby-identifier">node</span>[<span class="ruby-value">0</span>] <span class="ruby-comment cmt"># The index should be 1 according to the REXML docs
18
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">next_sibling_node</span>
19
+ <span class="ruby-identifier">next_node</span> = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">next_sibling_node</span>
20
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-constant">NodeIterator</span>.<span class="ruby-identifier">has_parent_with_sibling?</span>(<span class="ruby-identifier">node</span>)
21
+ <span class="ruby-identifier">next_node</span> = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">next_sibling_node</span>
22
+ <span class="ruby-keyword kw">end</span>
23
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">next_node</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node_filter</span>.<span class="ruby-identifier">accept</span>(<span class="ruby-identifier">next_node</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">next_node</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
24
+ <span class="ruby-identifier">find_next_node</span>(<span class="ruby-identifier">next_node</span>, <span class="ruby-identifier">node_filter</span>)
18
25
  <span class="ruby-keyword kw">end</span></pre>
19
26
  </body>
20
27
  </html>
@@ -0,0 +1,20 @@
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>
7
+ <head>
8
+ <title>next (Test::Unit::XML::NodeIterator)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../../../../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/test/unit/xml/nodeiterator.rb, line 40</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">next</span>
15
+ <span class="ruby-identifier">node</span> = <span class="ruby-ivar">@next_node</span>
16
+ <span class="ruby-ivar">@next_node</span> = <span class="ruby-constant">NodeIterator</span>.<span class="ruby-identifier">find_next_node</span>(<span class="ruby-identifier">node</span>, <span class="ruby-ivar">@node_filter</span>)
17
+ <span class="ruby-identifier">node</span>
18
+ <span class="ruby-keyword kw">end</span></pre>
19
+ </body>
20
+ </html>
@@ -86,7 +86,7 @@
86
86
  <h3 class="section-bar">Methods</h3>
87
87
 
88
88
  <div class="name-list">
89
- <a href="#M000014">accept</a>&nbsp;&nbsp;
89
+ <a href="#M000017">accept</a>&nbsp;&nbsp;
90
90
  </div>
91
91
  </div>
92
92
 
@@ -108,12 +108,12 @@
108
108
  <div id="methods">
109
109
  <h3 class="section-bar">Public Instance methods</h3>
110
110
 
111
- <div id="method-M000014" class="method-detail">
112
- <a name="M000014"></a>
111
+ <div id="method-M000017" class="method-detail">
112
+ <a name="M000017"></a>
113
113
 
114
114
  <div class="method-heading">
115
- <a href="NullNodeFilter.src/M000014.html" target="Code" class="method-signature"
116
- onclick="popupCode('NullNodeFilter.src/M000014.html');return false;">
115
+ <a href="NullNodeFilter.src/M000017.html" target="Code" class="method-signature"
116
+ onclick="popupCode('NullNodeFilter.src/M000017.html');return false;">
117
117
  <span class="method-name">accept</span><span class="method-args">(node)</span>
118
118
  </a>
119
119
  </div>
@@ -93,7 +93,7 @@ non-significant whitespace
93
93
  <h3 class="section-bar">Methods</h3>
94
94
 
95
95
  <div class="name-list">
96
- <a href="#M000015">accept</a>&nbsp;&nbsp;
96
+ <a href="#M000018">accept</a>&nbsp;&nbsp;
97
97
  </div>
98
98
  </div>
99
99
 
@@ -115,12 +115,12 @@ non-significant whitespace
115
115
  <div id="methods">
116
116
  <h3 class="section-bar">Public Instance methods</h3>
117
117
 
118
- <div id="method-M000015" class="method-detail">
119
- <a name="M000015"></a>
118
+ <div id="method-M000018" class="method-detail">
119
+ <a name="M000018"></a>
120
120
 
121
121
  <div class="method-heading">
122
- <a href="XmlEqualFilter.src/M000015.html" target="Code" class="method-signature"
123
- onclick="popupCode('XmlEqualFilter.src/M000015.html');return false;">
122
+ <a href="XmlEqualFilter.src/M000018.html" target="Code" class="method-signature"
123
+ onclick="popupCode('XmlEqualFilter.src/M000018.html');return false;">
124
124
  <span class="method-name">accept</span><span class="method-args">(node)</span>
125
125
  </a>
126
126
  </div>
@@ -1 +1 @@
1
- Mon Jan 23 15:05:33 CET 2006
1
+ Tue Apr 18 23:35:55 CEST 2006
@@ -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 23 14:04:26 CET 2006</td>
59
+ <td>Tue Apr 18 23:35:10 CEST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -70,6 +70,15 @@
70
70
 
71
71
  <div id="description">
72
72
  <h1>Changes</h1>
73
+ <h2>Version 0.1.5</h2>
74
+ <ul>
75
+ <li>Fixed a bug when comparing attributes containing entity references.
76
+
77
+ </li>
78
+ <li>Added an <tt>assert_xml_not_equal</tt> method.
79
+
80
+ </li>
81
+ </ul>
73
82
  <h2>Version 0.1.4</h2>
74
83
  <ul>
75
84
  <li>Added support for Doctype comparisons in <tt>assert_xml_equal</tt>
@@ -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 23 13:57:30 CET 2006</td>
59
+ <td>Wed Jan 25 08:59:19 CET 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -72,7 +72,7 @@
72
72
  <h1><a href="../classes/Test/Unit/XML.html">Test::Unit::XML</a></h1>
73
73
  <h2>An XML <a href="../classes/Test.html">Test</a> Framework</h2>
74
74
  <p>
75
- Version: 0.1.4
75
+ Version: 0.1.5
76
76
  </p>
77
77
  <p>
78
78
  Author: Henrik M�rtensson
@@ -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: conditionals.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>conditionals.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/conditionals.rb
55
+ </td>
56
+ </tr>
57
+ <tr class="top-aligned-row">
58
+ <td><strong>Last Update:</strong></td>
59
+ <td>Tue Apr 18 23:00:00 CEST 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 23 14:15:13 CET 2006</td>
59
+ <td>Sat Jan 28 11:54:26 CET 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -69,6 +69,13 @@
69
69
  <div id="contextContent">
70
70
 
71
71
 
72
+ <div id="requires-list">
73
+ <h3 class="section-bar">Required files</h3>
74
+
75
+ <div class="name-list">
76
+ test/unit/xml/notationdecl_mixin&nbsp;&nbsp;
77
+ </div>
78
+ </div>
72
79
 
73
80
  </div>
74
81
 
@@ -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 23 14:28:19 CET 2006</td>
59
+ <td>Tue Apr 18 23:15:02 CEST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -78,6 +78,7 @@
78
78
  test/unit/xml/doctype_mixin&nbsp;&nbsp;
79
79
  test/unit/xml/notationdecl_mixin&nbsp;&nbsp;
80
80
  test/unit&nbsp;&nbsp;
81
+ test/unit/xml/conditionals&nbsp;&nbsp;
81
82
  test/unit/xml/xmlequalfilter&nbsp;&nbsp;
82
83
  test/unit/xml/nodeiterator&nbsp;&nbsp;
83
84
  </div>
@@ -28,6 +28,7 @@
28
28
  <a href="classes/Test/Unit.html">Test::Unit</a><br />
29
29
  <a href="classes/Test/Unit/TestCase.html">Test::Unit::TestCase</a><br />
30
30
  <a href="classes/Test/Unit/XML.html">Test::Unit::XML</a><br />
31
+ <a href="classes/Test/Unit/XML/Conditionals.html">Test::Unit::XML::Conditionals</a><br />
31
32
  <a href="classes/Test/Unit/XML/NodeIterator.html">Test::Unit::XML::NodeIterator</a><br />
32
33
  <a href="classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html">Test::Unit::XML::NodeIterator::NullNodeFilter</a><br />
33
34
  <a href="classes/Test/Unit/XML/XmlEqualFilter.html">Test::Unit::XML::XmlEqualFilter</a><br />
@@ -25,6 +25,7 @@
25
25
  <a href="files/README.html">README</a><br />
26
26
  <a href="files/lib/test/unit/xml_rb.html">lib/test/unit/xml.rb</a><br />
27
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/conditionals_rb.html">lib/test/unit/xml/conditionals.rb</a><br />
28
29
  <a href="files/lib/test/unit/xml/doctype_mixin_rb.html">lib/test/unit/xml/doctype_mixin.rb</a><br />
29
30
  <a href="files/lib/test/unit/xml/nodeiterator_rb.html">lib/test/unit/xml/nodeiterator.rb</a><br />
30
31
  <a href="files/lib/test/unit/xml/notationdecl_mixin_rb.html">lib/test/unit/xml/notationdecl_mixin.rb</a><br />
@@ -20,21 +20,24 @@
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#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 />
23
+ <a href="classes/Test/Unit/XML/XmlEqualFilter.html#M000018">accept (Test::Unit::XML::XmlEqualFilter)</a><br />
24
+ <a href="classes/Test/Unit/XML/NodeIterator/NullNodeFilter.html#M000017">accept (Test::Unit::XML::NodeIterator::NullNodeFilter)</a><br />
25
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 />
26
+ <a href="classes/Test/Unit/XML.html#M000010">assert_xml_not_equal (Test::Unit::XML)</a><br />
27
+ <a href="classes/Test/Unit/XML/Conditionals.html#M000012">compare_xml_nodes (Test::Unit::XML::Conditionals)</a><br />
28
+ <a href="classes/Test/Unit/XML/Conditionals.html#M000011">create (Test::Unit::XML::Conditionals)</a><br />
29
+ <a href="classes/Test/Unit/XML/NodeIterator.html#M000013">find_next_node (Test::Unit::XML::NodeIterator)</a><br />
27
30
  <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 />
31
+ <a href="classes/Test/Unit/XML/NodeIterator.html#M000015">has_next (Test::Unit::XML::NodeIterator)</a><br />
29
32
  <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 />
33
+ <a href="classes/Test/Unit/XML/NodeIterator.html#M000014">new (Test::Unit::XML::NodeIterator)</a><br />
34
+ <a href="classes/Test/Unit/XML/NodeIterator.html#M000016">next (Test::Unit::XML::NodeIterator)</a><br />
32
35
  <a href="classes/REXML/DocType.html#M000008">notation (REXML::DocType)</a><br />
33
36
  <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
37
  <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 />
38
+ <a href="classes/REXML/DocType.html#M000005">public (REXML::DocType)</a><br />
37
39
  <a href="classes/REXML/NotationDecl.html#M000002">system (REXML::NotationDecl)</a><br />
40
+ <a href="classes/REXML/DocType.html#M000006">system (REXML::DocType)</a><br />
38
41
  </div>
39
42
  </div>
40
43
  </body>
@@ -0,0 +1,141 @@
1
+
2
+ module Test
3
+ module Unit
4
+ module XML
5
+
6
+ # This singleton class compares all types of REXML nodes.
7
+ class Conditionals
8
+
9
+ private_class_method :new
10
+ @@conditionals = nil
11
+
12
+ # The +create+ method is used to create a singleton instance
13
+ # of the Conditionals class.
14
+ def Conditionals.create
15
+ @@conditionals = new unless @@conditionals
16
+ @@conditionals
17
+ end
18
+
19
+ # The method compares two REXML nodes representing an XML document,
20
+ # or part of a document. If the nodes are equal, the method returns
21
+ # +true+. If the nodes are not equal, the method returns +false+.
22
+ # If the nodes have child nodes, for example if the nodes are
23
+ # +Element+ nodes with content, they will _not_ be recursively compared.
24
+ def compare_xml_nodes(expected_node, actual_node)
25
+ return false unless actual_node.instance_of? expected_node.class
26
+ case actual_node
27
+ when REXML::Document
28
+ # TODO: Implement Document comparison
29
+ true
30
+ when REXML::DocType
31
+ compare_doctypes(expected_node, actual_node)
32
+ when REXML::Element :
33
+ compare_elements(expected_node, actual_node)
34
+ when REXML::CData
35
+ compare_texts(expected_node, actual_node)
36
+ when REXML::Text
37
+ compare_texts(expected_node, actual_node)
38
+ when REXML::Comment
39
+ compare_comments(expected_node, actual_node)
40
+ when REXML::Instruction
41
+ compare_pi(expected_node, actual_node)
42
+ when REXML::XMLDecl
43
+ compare_xml_declaration(expected_node, actual_node)
44
+ #when REXML::Entity
45
+ # compare_xml_entities(expected_node, actual_node)
46
+ else
47
+ puts "Unknown node type #{actual_node.class}"
48
+ false
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def compare_doctypes(expected_node, actual_node)
55
+ return compare_system_id(expected_node.system, actual_node.system) &&
56
+ expected_node.public == actual_node.public &&
57
+ compare_xml_internal_dtd_subset(expected_node, actual_node)
58
+ end
59
+
60
+ def compare_system_id(expected_id, actual_id)
61
+ is_expected_urn = expected_id =~ /^urn:/i
62
+ is_actual_urn = actual_id =~ /^urn:/i
63
+ if is_expected_urn || is_actual_urn
64
+ expected_id == actual_id
65
+ else
66
+ true
67
+ end
68
+ end
69
+
70
+ def compare_elements(expected_node, actual_node)
71
+ return expected_node.name == actual_node.name &&
72
+ expected_node.namespace() == actual_node.namespace() &&
73
+ compare_attributes(expected_node.attributes, actual_node.attributes)
74
+ end
75
+
76
+ def compare_attributes(expected_attributes, actual_attributes)
77
+ return false unless attribute_count(expected_attributes) == attribute_count(actual_attributes)
78
+ expected_attributes.each_attribute do |expected_attribute|
79
+ expected_prefix = expected_attribute.prefix()
80
+ unless expected_prefix == 'xmlns' then
81
+ expected_name = expected_attribute.name
82
+ expected_namespace = expected_attribute.namespace
83
+ actual_attribute = actual_attributes.get_attribute_ns(expected_namespace, expected_name)
84
+ return false unless actual_attribute
85
+ return false if expected_attribute.value() != actual_attribute.value()
86
+ end
87
+ end
88
+ true
89
+ end
90
+
91
+ def attribute_count(attributes)
92
+ # Do not count namespace declarations
93
+ attributes.size - attributes.prefixes.size
94
+ end
95
+
96
+ def compare_texts(expected_node, actual_node)
97
+ expected_node.value.eql?(actual_node.value)
98
+ end
99
+
100
+ def compare_comments(expected_node, actual_node)
101
+ expected_node == actual_node
102
+ end
103
+
104
+ def compare_pi(expected_pi, actual_pi)
105
+ return expected_pi.target == actual_pi.target &&
106
+ expected_pi.content == actual_pi.content
107
+ end
108
+
109
+ def compare_xml_declaration(expected_decl, actual_decl)
110
+ return expected_decl == actual_decl
111
+ end
112
+
113
+ def compare_xml_internal_dtd_subset(expected_node, actual_node)
114
+ expected_subset = expected_node.children()
115
+ actual_subset = actual_node.children()
116
+ return false unless expected_subset.length == actual_subset.length
117
+ expected_subset.inject(true) { |memo, expected_decl|
118
+ case expected_decl
119
+ when REXML::Entity
120
+ memo &&
121
+ expected_decl.value == actual_node.entities[expected_decl.name].value &&
122
+ expected_decl.ndata == actual_node.entities[expected_decl.name].ndata
123
+ when REXML::NotationDecl
124
+ actual_notation_decl = actual_node.notation(expected_decl.name)
125
+ memo &&
126
+ actual_notation_decl != nil &&
127
+ expected_decl.name == actual_notation_decl.name &&
128
+ expected_decl.public == actual_notation_decl.public &&
129
+ expected_decl.system == actual_notation_decl.system
130
+ when REXML::Comment
131
+ true
132
+ else
133
+ raise "Unexpected node type in internal DTD subset of expected document: " + expected_decl.inspect
134
+ end
135
+ }
136
+ end
137
+
138
+ end
139
+ end
140
+ end
141
+ end