nokogiri 1.6.2.rc1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

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