nokogiri-maglev- 1.5.0.1

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 (225) hide show
  1. data/.autotest +26 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +544 -0
  4. data/CHANGELOG.rdoc +532 -0
  5. data/Manifest.txt +283 -0
  6. data/README.ja.rdoc +106 -0
  7. data/README.rdoc +174 -0
  8. data/Rakefile +171 -0
  9. data/bin/nokogiri +53 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +124 -0
  12. data/ext/nokogiri/html_document.c +154 -0
  13. data/ext/nokogiri/html_document.h +10 -0
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +32 -0
  17. data/ext/nokogiri/html_entity_lookup.h +8 -0
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/nokogiri.c +115 -0
  21. data/ext/nokogiri/nokogiri.h +160 -0
  22. data/ext/nokogiri/st.c +576 -0
  23. data/ext/nokogiri/xml_attr.c +94 -0
  24. data/ext/nokogiri/xml_attr.h +9 -0
  25. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  26. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  27. data/ext/nokogiri/xml_cdata.c +56 -0
  28. data/ext/nokogiri/xml_cdata.h +9 -0
  29. data/ext/nokogiri/xml_comment.c +54 -0
  30. data/ext/nokogiri/xml_comment.h +9 -0
  31. data/ext/nokogiri/xml_document.c +478 -0
  32. data/ext/nokogiri/xml_document.h +23 -0
  33. data/ext/nokogiri/xml_document_fragment.c +48 -0
  34. data/ext/nokogiri/xml_document_fragment.h +10 -0
  35. data/ext/nokogiri/xml_dtd.c +202 -0
  36. data/ext/nokogiri/xml_dtd.h +10 -0
  37. data/ext/nokogiri/xml_element_content.c +123 -0
  38. data/ext/nokogiri/xml_element_content.h +10 -0
  39. data/ext/nokogiri/xml_element_decl.c +69 -0
  40. data/ext/nokogiri/xml_element_decl.h +9 -0
  41. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  42. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  43. data/ext/nokogiri/xml_entity_decl.c +110 -0
  44. data/ext/nokogiri/xml_entity_decl.h +10 -0
  45. data/ext/nokogiri/xml_entity_reference.c +52 -0
  46. data/ext/nokogiri/xml_entity_reference.h +9 -0
  47. data/ext/nokogiri/xml_io.c +56 -0
  48. data/ext/nokogiri/xml_io.h +11 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  50. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  51. data/ext/nokogiri/xml_namespace.c +84 -0
  52. data/ext/nokogiri/xml_namespace.h +13 -0
  53. data/ext/nokogiri/xml_node.c +1397 -0
  54. data/ext/nokogiri/xml_node.h +13 -0
  55. data/ext/nokogiri/xml_node_set.c +418 -0
  56. data/ext/nokogiri/xml_node_set.h +9 -0
  57. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  58. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  59. data/ext/nokogiri/xml_reader.c +684 -0
  60. data/ext/nokogiri/xml_reader.h +10 -0
  61. data/ext/nokogiri/xml_relax_ng.c +162 -0
  62. data/ext/nokogiri/xml_relax_ng.h +9 -0
  63. data/ext/nokogiri/xml_sax_parser.c +293 -0
  64. data/ext/nokogiri/xml_sax_parser.h +39 -0
  65. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  66. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  67. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  68. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  69. data/ext/nokogiri/xml_schema.c +205 -0
  70. data/ext/nokogiri/xml_schema.h +9 -0
  71. data/ext/nokogiri/xml_syntax_error.c +58 -0
  72. data/ext/nokogiri/xml_syntax_error.h +13 -0
  73. data/ext/nokogiri/xml_text.c +50 -0
  74. data/ext/nokogiri/xml_text.h +9 -0
  75. data/ext/nokogiri/xml_xpath_context.c +315 -0
  76. data/ext/nokogiri/xml_xpath_context.h +9 -0
  77. data/ext/nokogiri/xslt_stylesheet.c +265 -0
  78. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  79. data/lib/nokogiri.rb +127 -0
  80. data/lib/nokogiri/css.rb +27 -0
  81. data/lib/nokogiri/css/node.rb +99 -0
  82. data/lib/nokogiri/css/parser.rb +677 -0
  83. data/lib/nokogiri/css/parser.y +237 -0
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/syntax_error.rb +7 -0
  86. data/lib/nokogiri/css/tokenizer.rb +152 -0
  87. data/lib/nokogiri/css/tokenizer.rex +55 -0
  88. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  89. data/lib/nokogiri/decorators/slop.rb +35 -0
  90. data/lib/nokogiri/html.rb +36 -0
  91. data/lib/nokogiri/html/builder.rb +35 -0
  92. data/lib/nokogiri/html/document.rb +213 -0
  93. data/lib/nokogiri/html/document_fragment.rb +41 -0
  94. data/lib/nokogiri/html/element_description.rb +23 -0
  95. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  96. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  97. data/lib/nokogiri/html/sax/parser.rb +52 -0
  98. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  99. data/lib/nokogiri/syntax_error.rb +4 -0
  100. data/lib/nokogiri/version.rb +88 -0
  101. data/lib/nokogiri/xml.rb +67 -0
  102. data/lib/nokogiri/xml/attr.rb +14 -0
  103. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  104. data/lib/nokogiri/xml/builder.rb +426 -0
  105. data/lib/nokogiri/xml/cdata.rb +11 -0
  106. data/lib/nokogiri/xml/character_data.rb +7 -0
  107. data/lib/nokogiri/xml/document.rb +234 -0
  108. data/lib/nokogiri/xml/document_fragment.rb +98 -0
  109. data/lib/nokogiri/xml/dtd.rb +22 -0
  110. data/lib/nokogiri/xml/element_content.rb +36 -0
  111. data/lib/nokogiri/xml/element_decl.rb +13 -0
  112. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  113. data/lib/nokogiri/xml/namespace.rb +13 -0
  114. data/lib/nokogiri/xml/node.rb +915 -0
  115. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  116. data/lib/nokogiri/xml/node_set.rb +357 -0
  117. data/lib/nokogiri/xml/notation.rb +6 -0
  118. data/lib/nokogiri/xml/parse_options.rb +93 -0
  119. data/lib/nokogiri/xml/pp.rb +2 -0
  120. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  121. data/lib/nokogiri/xml/pp/node.rb +56 -0
  122. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  123. data/lib/nokogiri/xml/reader.rb +112 -0
  124. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  125. data/lib/nokogiri/xml/sax.rb +4 -0
  126. data/lib/nokogiri/xml/sax/document.rb +164 -0
  127. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  128. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  129. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  130. data/lib/nokogiri/xml/schema.rb +63 -0
  131. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  132. data/lib/nokogiri/xml/text.rb +9 -0
  133. data/lib/nokogiri/xml/xpath.rb +10 -0
  134. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  135. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  136. data/lib/nokogiri/xslt.rb +52 -0
  137. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  138. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  139. data/nokogiri_help_responses.md +40 -0
  140. data/tasks/cross_compile.rb +152 -0
  141. data/tasks/nokogiri.org.rb +18 -0
  142. data/tasks/test.rb +94 -0
  143. data/test/css/test_nthiness.rb +159 -0
  144. data/test/css/test_parser.rb +303 -0
  145. data/test/css/test_tokenizer.rb +198 -0
  146. data/test/css/test_xpath_visitor.rb +85 -0
  147. data/test/decorators/test_slop.rb +16 -0
  148. data/test/files/2ch.html +108 -0
  149. data/test/files/address_book.rlx +12 -0
  150. data/test/files/address_book.xml +10 -0
  151. data/test/files/bar/bar.xsd +4 -0
  152. data/test/files/dont_hurt_em_why.xml +422 -0
  153. data/test/files/encoding.html +82 -0
  154. data/test/files/encoding.xhtml +84 -0
  155. data/test/files/exslt.xml +8 -0
  156. data/test/files/exslt.xslt +35 -0
  157. data/test/files/foo/foo.xsd +4 -0
  158. data/test/files/metacharset.html +10 -0
  159. data/test/files/noencoding.html +47 -0
  160. data/test/files/po.xml +32 -0
  161. data/test/files/po.xsd +66 -0
  162. data/test/files/shift_jis.html +10 -0
  163. data/test/files/shift_jis.xml +5 -0
  164. data/test/files/snuggles.xml +3 -0
  165. data/test/files/staff.dtd +10 -0
  166. data/test/files/staff.xml +59 -0
  167. data/test/files/staff.xslt +32 -0
  168. data/test/files/tlm.html +850 -0
  169. data/test/files/valid_bar.xml +2 -0
  170. data/test/helper.rb +173 -0
  171. data/test/html/sax/test_parser.rb +139 -0
  172. data/test/html/sax/test_parser_context.rb +48 -0
  173. data/test/html/test_builder.rb +165 -0
  174. data/test/html/test_document.rb +472 -0
  175. data/test/html/test_document_encoding.rb +138 -0
  176. data/test/html/test_document_fragment.rb +255 -0
  177. data/test/html/test_element_description.rb +101 -0
  178. data/test/html/test_named_characters.rb +14 -0
  179. data/test/html/test_node.rb +193 -0
  180. data/test/html/test_node_encoding.rb +27 -0
  181. data/test/test_convert_xpath.rb +135 -0
  182. data/test/test_css_cache.rb +45 -0
  183. data/test/test_encoding_handler.rb +46 -0
  184. data/test/test_memory_leak.rb +72 -0
  185. data/test/test_nokogiri.rb +133 -0
  186. data/test/test_reader.rb +425 -0
  187. data/test/test_soap4r_sax.rb +52 -0
  188. data/test/test_xslt_transforms.rb +193 -0
  189. data/test/xml/node/test_save_options.rb +28 -0
  190. data/test/xml/node/test_subclass.rb +44 -0
  191. data/test/xml/sax/test_parser.rb +338 -0
  192. data/test/xml/sax/test_parser_context.rb +113 -0
  193. data/test/xml/sax/test_push_parser.rb +156 -0
  194. data/test/xml/test_attr.rb +65 -0
  195. data/test/xml/test_attribute_decl.rb +86 -0
  196. data/test/xml/test_builder.rb +227 -0
  197. data/test/xml/test_cdata.rb +50 -0
  198. data/test/xml/test_comment.rb +29 -0
  199. data/test/xml/test_document.rb +697 -0
  200. data/test/xml/test_document_encoding.rb +26 -0
  201. data/test/xml/test_document_fragment.rb +192 -0
  202. data/test/xml/test_dtd.rb +107 -0
  203. data/test/xml/test_dtd_encoding.rb +33 -0
  204. data/test/xml/test_element_content.rb +56 -0
  205. data/test/xml/test_element_decl.rb +73 -0
  206. data/test/xml/test_entity_decl.rb +122 -0
  207. data/test/xml/test_entity_reference.rb +21 -0
  208. data/test/xml/test_namespace.rb +70 -0
  209. data/test/xml/test_node.rb +917 -0
  210. data/test/xml/test_node_attributes.rb +34 -0
  211. data/test/xml/test_node_encoding.rb +107 -0
  212. data/test/xml/test_node_reparenting.rb +334 -0
  213. data/test/xml/test_node_set.rb +742 -0
  214. data/test/xml/test_parse_options.rb +52 -0
  215. data/test/xml/test_processing_instruction.rb +30 -0
  216. data/test/xml/test_reader_encoding.rb +126 -0
  217. data/test/xml/test_relax_ng.rb +60 -0
  218. data/test/xml/test_schema.rb +94 -0
  219. data/test/xml/test_syntax_error.rb +12 -0
  220. data/test/xml/test_text.rb +47 -0
  221. data/test/xml/test_unparented_node.rb +381 -0
  222. data/test/xml/test_xpath.rb +237 -0
  223. data/test/xslt/test_custom_functions.rb +94 -0
  224. data/test/xslt/test_exception_handling.rb +37 -0
  225. metadata +548 -0
@@ -0,0 +1,742 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNodeSet < Nokogiri::TestCase
6
+ class TestNodeSetNamespaces < Nokogiri::TestCase
7
+ def setup
8
+ super
9
+ @xml = Nokogiri.XML('<foo xmlns:n0="http://example.com" />')
10
+ @list = @xml.xpath('//namespace::*')
11
+ end
12
+
13
+ def test_include?
14
+ assert @list.include?(@list.first), 'list should have item'
15
+ end
16
+
17
+ def test_push
18
+ @list.push @list.first
19
+ end
20
+
21
+ def test_delete
22
+ @list.push @list.first
23
+ @list.delete @list.first
24
+ end
25
+ end
26
+
27
+ def setup
28
+ super
29
+ @xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
30
+ @list = @xml.css('employee')
31
+ end
32
+
33
+ def test_break_works
34
+ assert_equal 7, @xml.root.elements.each { |x| break 7 }
35
+ end
36
+
37
+ def test_filter
38
+ list = @xml.css('address').filter('*[domestic="Yes"]')
39
+ assert_equal(%w{ Yes } * 4, list.map { |n| n['domestic'] })
40
+ end
41
+
42
+ def test_remove_attr
43
+ @list.each { |x| x['class'] = 'blah' }
44
+ assert_equal @list, @list.remove_attr('class')
45
+ @list.each { |x| assert_nil x['class'] }
46
+ end
47
+
48
+ def test_add_class
49
+ assert_equal @list, @list.add_class('bar')
50
+ @list.each { |x| assert_equal 'bar', x['class'] }
51
+
52
+ @list.add_class('bar')
53
+ @list.each { |x| assert_equal 'bar', x['class'] }
54
+
55
+ @list.add_class('baz')
56
+ @list.each { |x| assert_equal 'bar baz', x['class'] }
57
+ end
58
+
59
+ def test_remove_class_with_no_class
60
+ assert_equal @list, @list.remove_class('bar')
61
+ @list.each { |e| assert_nil e['class'] }
62
+
63
+ @list.each { |e| e['class'] = '' }
64
+ assert_equal @list, @list.remove_class('bar')
65
+ @list.each { |e| assert_nil e['class'] }
66
+ end
67
+
68
+ def test_remove_class_single
69
+ @list.each { |e| e['class'] = 'foo bar' }
70
+
71
+ assert_equal @list, @list.remove_class('bar')
72
+ @list.each { |e| assert_equal 'foo', e['class'] }
73
+ end
74
+
75
+ def test_remove_class_completely
76
+ @list.each { |e| e['class'] = 'foo' }
77
+
78
+ assert_equal @list, @list.remove_class
79
+ @list.each { |e| assert_nil e['class'] }
80
+ end
81
+
82
+ def test_attribute_set
83
+ @list.each { |e| assert_nil e['foo'] }
84
+
85
+ [ ['attribute', 'bar'], ['attr', 'biz'], ['set', 'baz'] ].each do |t|
86
+ @list.send(t.first.to_sym, 'foo', t.last)
87
+ @list.each { |e| assert_equal t.last, e['foo'] }
88
+ end
89
+ end
90
+
91
+ def test_attribute_set_with_block
92
+ @list.each { |e| assert_nil e['foo'] }
93
+
94
+ [ ['attribute', 'bar'], ['attr', 'biz'], ['set', 'baz'] ].each do |t|
95
+ @list.send(t.first.to_sym, 'foo') { |x| t.last }
96
+ @list.each { |e| assert_equal t.last, e['foo'] }
97
+ end
98
+ end
99
+
100
+ def test_attribute_set_with_hash
101
+ @list.each { |e| assert_nil e['foo'] }
102
+
103
+ [ ['attribute', 'bar'], ['attr', 'biz'], ['set', 'baz'] ].each do |t|
104
+ @list.send(t.first.to_sym, 'foo' => t.last)
105
+ @list.each { |e| assert_equal t.last, e['foo'] }
106
+ end
107
+ end
108
+
109
+ def test_attribute_no_args
110
+ @list.first['foo'] = 'bar'
111
+ assert_equal @list.first.attribute('foo'), @list.attribute('foo')
112
+ end
113
+
114
+ def test_search_empty_node_set
115
+ set = Nokogiri::XML::NodeSet.new(Nokogiri::XML::Document.new)
116
+ assert_equal 0, set.css('foo').length
117
+ assert_equal 0, set.xpath('.//foo').length
118
+ assert_equal 0, set.search('foo').length
119
+ end
120
+
121
+ def test_xpath_with_custom_object
122
+ set = @xml.xpath('//staff')
123
+ custom_employees = set.xpath('//*[awesome(.)]', Class.new {
124
+ def awesome ns
125
+ ns.select { |n| n.name == 'employee' }
126
+ end
127
+ }.new)
128
+
129
+ assert_equal @xml.xpath('//employee'), custom_employees
130
+ end
131
+
132
+ def test_css_with_custom_object
133
+ set = @xml.xpath('//staff')
134
+ custom_employees = set.css('*:awesome', Class.new {
135
+ def awesome ns
136
+ ns.select { |n| n.name == 'employee' }
137
+ end
138
+ }.new)
139
+
140
+ assert_equal @xml.xpath('//employee'), custom_employees
141
+ end
142
+
143
+ def test_search_with_custom_object
144
+ set = @xml.xpath('//staff')
145
+ custom_employees = set.search('//*[awesome(.)]', Class.new {
146
+ def awesome ns
147
+ ns.select { |n| n.name == 'employee' }
148
+ end
149
+ }.new)
150
+
151
+ assert_equal @xml.xpath('//employee'), custom_employees
152
+ end
153
+
154
+ def test_css_searches_match_self
155
+ html = Nokogiri::HTML("<html><body><div class='a'></div></body></html>")
156
+ set = html.xpath("/html/body/div")
157
+ assert_equal set.first, set.css(".a").first
158
+ end
159
+
160
+ def test_search_with_css_matches_self
161
+ html = Nokogiri::HTML("<html><body><div class='a'></div></body></html>")
162
+ set = html.xpath("/html/body/div")
163
+ assert_equal set.first, set.search(".a").first
164
+ end
165
+
166
+ def test_css_search_with_namespace
167
+ fragment = Nokogiri::XML.fragment(<<-eoxml)
168
+ <html xmlns="http://www.w3.org/1999/xhtml">
169
+ <head></head>
170
+ <body></body>
171
+ </html>
172
+ eoxml
173
+ assert_nothing_raised{ fragment.children.search( 'body', { 'xmlns' => 'http://www.w3.org/1999/xhtml' }) }
174
+ end
175
+
176
+ def test_double_equal
177
+ assert node_set_one = @xml.xpath('//employee')
178
+ assert node_set_two = @xml.xpath('//employee')
179
+
180
+ assert_not_equal node_set_one.object_id, node_set_two.object_id
181
+
182
+ assert_equal node_set_one, node_set_two
183
+ end
184
+
185
+ def test_node_set_not_equal_to_string
186
+ node_set_one = @xml.xpath('//employee')
187
+ assert_not_equal node_set_one, "asdfadsf"
188
+ end
189
+
190
+ def test_out_of_order_not_equal
191
+ one = @xml.xpath('//employee')
192
+ two = @xml.xpath('//employee')
193
+ two.push two.shift
194
+ assert_not_equal one, two
195
+ end
196
+
197
+ def test_shorter_is_not_equal
198
+ node_set_one = @xml.xpath('//employee')
199
+ node_set_two = @xml.xpath('//employee')
200
+ node_set_two.delete(node_set_two.first)
201
+
202
+ assert_not_equal node_set_one, node_set_two
203
+ end
204
+
205
+ def test_pop
206
+ set = @xml.xpath('//employee')
207
+ last = set.last
208
+ assert_equal last, set.pop
209
+ end
210
+
211
+ def test_shift
212
+ set = @xml.xpath('//employee')
213
+ first = set.first
214
+ assert_equal first, set.shift
215
+ end
216
+
217
+ def test_shift_empty
218
+ set = Nokogiri::XML::NodeSet.new(@xml)
219
+ assert_nil set.shift
220
+ end
221
+
222
+ def test_pop_empty
223
+ set = Nokogiri::XML::NodeSet.new(@xml)
224
+ assert_nil set.pop
225
+ end
226
+
227
+ def test_first_takes_arguments
228
+ assert node_set = @xml.xpath('//employee')
229
+ assert_equal 2, node_set.first(2).length
230
+ end
231
+
232
+ def test_dup
233
+ assert node_set = @xml.xpath('//employee')
234
+ dup = node_set.dup
235
+ assert_equal node_set.length, dup.length
236
+ node_set.zip(dup).each do |a,b|
237
+ assert_equal a, b
238
+ end
239
+ end
240
+
241
+ def test_dup_on_empty_set
242
+ empty_set = Nokogiri::XML::NodeSet.new @xml, []
243
+ assert_equal 0, empty_set.dup.length # this shouldn't raise null pointer exception
244
+ end
245
+
246
+ def test_xmlns_is_automatically_registered
247
+ doc = Nokogiri::XML(<<-eoxml)
248
+ <root xmlns="http://tenderlovemaking.com/">
249
+ <foo>
250
+ <bar/>
251
+ </foo>
252
+ </root>
253
+ eoxml
254
+ set = doc.css('foo')
255
+ assert_equal 1, set.css('xmlns|bar').length
256
+ assert_equal 0, set.css('|bar').length
257
+ assert_equal 1, set.xpath('//xmlns:bar').length
258
+ assert_equal 1, set.search('xmlns|bar').length
259
+ assert_equal 1, set.search('//xmlns:bar').length
260
+ assert set.at('//xmlns:bar')
261
+ assert set.at('xmlns|bar')
262
+ assert set.at('bar')
263
+ end
264
+
265
+ def test_children_has_document
266
+ set = @xml.root.children
267
+ assert_instance_of(NodeSet, set)
268
+ assert_equal @xml, set.document
269
+ end
270
+
271
+ def test_length_size
272
+ assert node_set = @xml.search('//employee')
273
+ assert_equal node_set.length, node_set.size
274
+ end
275
+
276
+ def test_to_xml
277
+ assert node_set = @xml.search('//employee')
278
+ assert node_set.to_xml
279
+ end
280
+
281
+ def test_inner_html
282
+ doc = Nokogiri::HTML(<<-eohtml)
283
+ <html>
284
+ <body>
285
+ <div>
286
+ <a>one</a>
287
+ </div>
288
+ <div>
289
+ <a>two</a>
290
+ </div>
291
+ </body>
292
+ </html>
293
+ eohtml
294
+ assert html = doc.css('div').inner_html
295
+ assert_match '<a>', html
296
+ end
297
+
298
+ def test_gt_string_arg
299
+ assert node_set = @xml.search('//employee')
300
+ assert_equal node_set.xpath('./employeeId'), (node_set > 'employeeId')
301
+ end
302
+
303
+ def test_at
304
+ assert node_set = @xml.search('//employee')
305
+ assert_equal node_set.first, node_set.at(0)
306
+ end
307
+
308
+ def test_at_xpath
309
+ assert node_set = @xml.search('//employee')
310
+ assert_equal node_set.first.first_element_child, node_set.at_xpath('./employeeId')
311
+ end
312
+
313
+ def test_at_css
314
+ assert node_set = @xml.search('//employee')
315
+ assert_equal node_set.first.first_element_child, node_set.at_css('employeeId')
316
+ end
317
+
318
+ def test_percent
319
+ assert node_set = @xml.search('//employee')
320
+ assert_equal node_set.first, node_set % 0
321
+ end
322
+
323
+ def test_to_ary
324
+ assert node_set = @xml.search('//employee')
325
+ foo = []
326
+ foo += node_set
327
+ assert_equal node_set.length, foo.length
328
+ end
329
+
330
+ def test_push
331
+ node = Nokogiri::XML::Node.new('foo', @xml)
332
+ node.content = 'bar'
333
+
334
+ assert node_set = @xml.search('//employee')
335
+ node_set.push(node)
336
+
337
+ assert node_set.include?(node)
338
+ end
339
+
340
+ def test_delete_with_invalid_argument
341
+ employees = @xml.search("//employee")
342
+ positions = @xml.search("//position")
343
+
344
+ assert_raises(ArgumentError) { employees.delete(positions) }
345
+ end
346
+
347
+ def test_delete_when_present
348
+ employees = @xml.search("//employee")
349
+ wally = employees.first
350
+ assert employees.include?(wally) # testing setup
351
+ length = employees.length
352
+
353
+ result = employees.delete(wally)
354
+ assert_equal result, wally
355
+ assert ! employees.include?(wally)
356
+ assert length-1, employees.length
357
+ end
358
+
359
+ def test_delete_when_not_present
360
+ employees = @xml.search("//employee")
361
+ phb = @xml.search("//position").first
362
+ assert ! employees.include?(phb) # testing setup
363
+ length = employees.length
364
+
365
+ result = employees.delete(phb)
366
+ assert_nil result
367
+ assert length, employees.length
368
+ end
369
+
370
+ def test_delete_on_empty_set
371
+ empty_set = Nokogiri::XML::NodeSet.new @xml, []
372
+ employee = @xml.at_xpath("//employee")
373
+ assert_equal nil, empty_set.delete(employee)
374
+ end
375
+
376
+ def test_unlink
377
+ xml = Nokogiri::XML.parse(<<-eoxml)
378
+ <root>
379
+ <a class='foo bar'>Bar</a>
380
+ <a class='bar foo'>Bar</a>
381
+ <a class='bar'>Bar</a>
382
+ <a>Hello world</a>
383
+ <a class='baz bar foo'>Bar</a>
384
+ <a class='bazbarfoo'>Awesome</a>
385
+ <a class='bazbar'>Awesome</a>
386
+ </root>
387
+ eoxml
388
+ set = xml.xpath('//a')
389
+ set.unlink
390
+ set.each do |node|
391
+ assert !node.parent
392
+ #assert !node.document
393
+ assert !node.previous_sibling
394
+ assert !node.next_sibling
395
+ end
396
+ assert_no_match(/Hello world/, xml.to_s)
397
+ end
398
+
399
+ def test_nodeset_search_takes_namespace
400
+ @xml = Nokogiri::XML.parse(<<-eoxml)
401
+ <root>
402
+ <car xmlns:part="http://general-motors.com/">
403
+ <part:tire>Michelin Model XGV</part:tire>
404
+ </car>
405
+ <bicycle xmlns:part="http://schwinn.com/">
406
+ <part:tire>I'm a bicycle tire!</part:tire>
407
+ </bicycle>
408
+ </root>
409
+ eoxml
410
+ set = @xml/'root'
411
+ assert_equal 1, set.length
412
+ bike_tire = set.search('//bike:tire', 'bike' => "http://schwinn.com/")
413
+ assert_equal 1, bike_tire.length
414
+ end
415
+
416
+ def test_new_nodeset
417
+ node_set = Nokogiri::XML::NodeSet.new(@xml)
418
+ assert_equal(0, node_set.length)
419
+ node = Nokogiri::XML::Node.new('form', @xml)
420
+ node_set << node
421
+ assert_equal(1, node_set.length)
422
+ assert_equal(node, node_set.last)
423
+ end
424
+
425
+ def test_search_on_nodeset
426
+ assert node_set = @xml.search('//employee')
427
+ assert sub_set = node_set.search('.//name')
428
+ assert_equal(node_set.length, sub_set.length)
429
+ end
430
+
431
+ def test_negative_index_works
432
+ assert node_set = @xml.search('//employee')
433
+ assert_equal node_set.last, node_set[-1]
434
+ end
435
+
436
+ def test_large_negative_index_returns_nil
437
+ assert node_set = @xml.search('//employee')
438
+ assert_nil(node_set[-1 * (node_set.length + 1)])
439
+ end
440
+
441
+ def test_node_set_fetches_private_data
442
+ assert node_set = @xml.search('//employee')
443
+
444
+ set = node_set
445
+ assert_equal(set[0], set[0])
446
+ end
447
+
448
+ def test_node_set_returns_0
449
+ assert node_set = @xml.search('//asdkfjhasdlkfjhaldskfh')
450
+ assert_equal(0, node_set.length)
451
+ end
452
+
453
+ def test_wrap
454
+ employees = (@xml/"//employee").wrap("<wrapper/>")
455
+ assert_equal 'wrapper', employees[0].parent.name
456
+ assert_equal 'employee', @xml.search("//wrapper").first.children[0].name
457
+ end
458
+
459
+ def test_wrap_a_fragment
460
+ frag = Nokogiri::XML::DocumentFragment.parse <<-EOXML
461
+ <employees>
462
+ <employee>hello</employee>
463
+ <employee>goodbye</employee>
464
+ </employees>
465
+ EOXML
466
+ employees = frag.xpath ".//employee"
467
+ employees.wrap("<wrapper/>")
468
+ assert_equal 'wrapper', employees[0].parent.name
469
+ assert_equal 'employee', frag.at(".//wrapper").children.first.name
470
+ end
471
+
472
+ def test_wrap_preserves_document_structure
473
+ assert_equal "employeeId",
474
+ @xml.at_xpath("//employee").children.detect{|j| ! j.text? }.name
475
+ @xml.xpath("//employeeId[text()='EMP0001']").wrap("<wrapper/>")
476
+ assert_equal "wrapper",
477
+ @xml.at_xpath("//employee").children.detect{|j| ! j.text? }.name
478
+ end
479
+
480
+ def test_plus_operator
481
+ names = @xml.search("name")
482
+ positions = @xml.search("position")
483
+
484
+ names_len = names.length
485
+ positions_len = positions.length
486
+
487
+ assert_raises(ArgumentError) { names + positions.first }
488
+
489
+ result = names + positions
490
+ assert_equal names_len, names.length
491
+ assert_equal positions_len, positions.length
492
+ assert_equal names.length + positions.length, result.length
493
+
494
+ names += positions
495
+ assert_equal result.length, names.length
496
+ end
497
+
498
+ def test_union
499
+ names = @xml.search("name")
500
+
501
+ assert_equal(names.length, (names | @xml.search("name")).length)
502
+ end
503
+
504
+ def test_minus_operator
505
+ employees = @xml.search("//employee")
506
+ females = @xml.search("//employee[gender[text()='Female']]")
507
+
508
+ employees_len = employees.length
509
+ females_len = females.length
510
+
511
+ assert_raises(ArgumentError) { employees - females.first }
512
+
513
+ result = employees - females
514
+ assert_equal employees_len, employees.length
515
+ assert_equal females_len, females.length
516
+ assert_equal employees.length - females.length, result.length
517
+
518
+ employees -= females
519
+ assert_equal result.length, employees.length
520
+ end
521
+
522
+ def test_array_index
523
+ employees = @xml.search("//employee")
524
+ other = @xml.search("//position").first
525
+
526
+ assert_equal 3, employees.index(employees[3])
527
+ assert_nil employees.index(other)
528
+ end
529
+
530
+ def test_slice_too_far
531
+ employees = @xml.search("//employee")
532
+ assert_equal employees.length, employees[0, employees.length + 1].length
533
+ assert_equal employees.length, employees[0, employees.length].length
534
+ end
535
+
536
+ def test_slice_on_empty_node_set
537
+ empty_set = Nokogiri::XML::NodeSet.new @xml, []
538
+ assert_equal nil, empty_set[99]
539
+ assert_equal nil, empty_set[99..101]
540
+ assert_equal nil, empty_set[99,2]
541
+ end
542
+
543
+ def test_slice_waaaaaay_off_the_end
544
+ xml = Nokogiri::XML::Builder.new {
545
+ root { 100.times { div } }
546
+ }.doc
547
+ nodes = xml.css "div"
548
+ assert_equal 1, nodes.slice(99, 100_000).length
549
+ assert_equal 0, nodes.slice(100, 100_000).length
550
+ end
551
+
552
+ def test_array_slice_with_start_and_end
553
+ employees = @xml.search("//employee")
554
+ assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
555
+ end
556
+
557
+ def test_array_index_bracket_equivalence
558
+ employees = @xml.search("//employee")
559
+ assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
560
+ assert_equal [employees[1], employees[2], employees[3]], employees.slice(1,3).to_a
561
+ end
562
+
563
+ def test_array_slice_with_negative_start
564
+ employees = @xml.search("//employee")
565
+ assert_equal [employees[2]], employees[-3,1].to_a
566
+ assert_equal [employees[2], employees[3]], employees[-3,2].to_a
567
+ end
568
+
569
+ def test_array_slice_with_invalid_args
570
+ employees = @xml.search("//employee")
571
+ assert_nil employees[99, 1] # large start
572
+ assert_nil employees[1, -1] # negative len
573
+ assert_equal [], employees[1, 0].to_a # zero len
574
+ end
575
+
576
+ def test_array_slice_with_range
577
+ employees = @xml.search("//employee")
578
+ assert_equal [employees[1], employees[2], employees[3]], employees[1..3].to_a
579
+ assert_equal [employees[0], employees[1], employees[2], employees[3]], employees[0..3].to_a
580
+ end
581
+
582
+ def test_intersection_with_no_overlap
583
+ employees = @xml.search("//employee")
584
+ positions = @xml.search("//position")
585
+
586
+ assert_equal [], (employees & positions).to_a
587
+ end
588
+
589
+ def test_intersection
590
+ employees = @xml.search("//employee")
591
+ first_set = employees[0..2]
592
+ second_set = employees[2..4]
593
+
594
+ assert_equal [employees[2]], (first_set & second_set).to_a
595
+ end
596
+
597
+ def test_intersection_on_empty_set
598
+ empty_set = Nokogiri::XML::NodeSet.new @xml
599
+ employees = @xml.search("//employee")
600
+ assert_equal 0, (empty_set & employees).length
601
+ end
602
+
603
+ def test_include?
604
+ employees = @xml.search("//employee")
605
+ yes = employees.first
606
+ no = @xml.search("//position").first
607
+
608
+ assert employees.include?(yes)
609
+ assert ! employees.include?(no)
610
+ end
611
+
612
+ def test_include_on_empty_node_set
613
+ empty_set = Nokogiri::XML::NodeSet.new @xml, []
614
+ employee = @xml.at_xpath("//employee")
615
+ assert ! empty_set.include?(employee)
616
+ end
617
+
618
+ def test_children
619
+ employees = @xml.search("//employee")
620
+ count = 0
621
+ employees.each do |employee|
622
+ count += employee.children.length
623
+ end
624
+ set = employees.children
625
+ assert_equal count, set.length
626
+ end
627
+
628
+ def test_inspect
629
+ employees = @xml.search("//employee")
630
+ inspected = employees.inspect
631
+
632
+ assert_equal "[#{employees.map { |x| x.inspect }.join(', ')}]",
633
+ inspected
634
+ end
635
+
636
+ def test_should_not_splode_when_accessing_namespace_declarations_in_a_node_set
637
+ xml = Nokogiri::XML "<foo></foo>"
638
+ node_set = xml.xpath("//namespace::*")
639
+ assert_equal 1, node_set.size
640
+ node = node_set.first
641
+ node.to_s # segfaults in 1.4.0 and earlier
642
+
643
+ # if we haven't segfaulted, let's make sure we handled it correctly
644
+ assert_instance_of Nokogiri::XML::Namespace, node
645
+ end
646
+
647
+ def test_should_not_splode_when_arrayifying_node_set_containing_namespace_declarations
648
+ xml = Nokogiri::XML "<foo></foo>"
649
+ node_set = xml.xpath("//namespace::*")
650
+ assert_equal 1, node_set.size
651
+
652
+ node_array = node_set.to_a
653
+ node = node_array.first
654
+ node.to_s # segfaults in 1.4.0 and earlier
655
+
656
+ # if we haven't segfaulted, let's make sure we handled it correctly
657
+ assert_instance_of Nokogiri::XML::Namespace, node
658
+ end
659
+
660
+ def test_should_not_splode_when_unlinking_node_set_containing_namespace_declarations
661
+ xml = Nokogiri::XML "<foo></foo>"
662
+ node_set = xml.xpath("//namespace::*")
663
+ assert_equal 1, node_set.size
664
+
665
+ node_set.unlink
666
+ end
667
+
668
+ def test_reverse
669
+ xml = Nokogiri::XML "<root><a />b<c />d<e /></root>"
670
+ children = xml.root.children
671
+ assert_instance_of Nokogiri::XML::NodeSet, children
672
+
673
+ reversed = children.reverse
674
+ assert_equal reversed[0], children[4]
675
+ assert_equal reversed[1], children[3]
676
+ assert_equal reversed[2], children[2]
677
+ assert_equal reversed[3], children[1]
678
+ assert_equal reversed[4], children[0]
679
+
680
+ assert_equal children, children.reverse.reverse
681
+ end
682
+
683
+ def test_node_set_dup_result_has_document_and_is_decorated
684
+ x = Module.new do
685
+ def awesome! ; end
686
+ end
687
+ util_decorate(@xml, x)
688
+ node_set = @xml.css("address")
689
+ new_set = node_set.dup
690
+ assert_equal node_set.document, new_set.document
691
+ assert new_set.respond_to?(:awesome!)
692
+ end
693
+
694
+ def test_node_set_union_result_has_document_and_is_decorated
695
+ x = Module.new do
696
+ def awesome! ; end
697
+ end
698
+ util_decorate(@xml, x)
699
+ node_set1 = @xml.css("address")
700
+ node_set2 = @xml.css("address")
701
+ new_set = node_set1 | node_set2
702
+ assert_equal node_set1.document, new_set.document
703
+ assert new_set.respond_to?(:awesome!)
704
+ end
705
+
706
+ def test_node_set_intersection_result_has_document_and_is_decorated
707
+ x = Module.new do
708
+ def awesome! ; end
709
+ end
710
+ util_decorate(@xml, x)
711
+ node_set1 = @xml.css("address")
712
+ node_set2 = @xml.css("address")
713
+ new_set = node_set1 & node_set2
714
+ assert_equal node_set1.document, new_set.document
715
+ assert new_set.respond_to?(:awesome!)
716
+ end
717
+
718
+ def test_node_set_difference_result_has_document_and_is_decorated
719
+ x = Module.new do
720
+ def awesome! ; end
721
+ end
722
+ util_decorate(@xml, x)
723
+ node_set1 = @xml.css("address")
724
+ node_set2 = @xml.css("address")
725
+ new_set = node_set1 - node_set2
726
+ assert_equal node_set1.document, new_set.document
727
+ assert new_set.respond_to?(:awesome!)
728
+ end
729
+
730
+ def test_node_set_slice_result_has_document_and_is_decorated
731
+ x = Module.new do
732
+ def awesome! ; end
733
+ end
734
+ util_decorate(@xml, x)
735
+ node_set = @xml.css("address")
736
+ new_set = node_set[0..-1]
737
+ assert_equal node_set.document, new_set.document
738
+ assert new_set.respond_to?(:awesome!)
739
+ end
740
+ end
741
+ end
742
+ end