nokogiri 1.3.0-x86-mswin32

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 (256) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +233 -0
  3. data/CHANGELOG.rdoc +222 -0
  4. data/Manifest.txt +247 -0
  5. data/README.ja.rdoc +103 -0
  6. data/README.rdoc +117 -0
  7. data/Rakefile +205 -0
  8. data/bin/nokogiri +47 -0
  9. data/ext/nokogiri/extconf.rb +89 -0
  10. data/ext/nokogiri/html_document.c +183 -0
  11. data/ext/nokogiri/html_document.h +10 -0
  12. data/ext/nokogiri/html_element_description.c +272 -0
  13. data/ext/nokogiri/html_element_description.h +10 -0
  14. data/ext/nokogiri/html_entity_lookup.c +30 -0
  15. data/ext/nokogiri/html_entity_lookup.h +8 -0
  16. data/ext/nokogiri/html_sax_parser.c +57 -0
  17. data/ext/nokogiri/html_sax_parser.h +11 -0
  18. data/ext/nokogiri/iconv.dll +0 -0
  19. data/ext/nokogiri/libexslt.dll +0 -0
  20. data/ext/nokogiri/libxml2.dll +0 -0
  21. data/ext/nokogiri/libxslt.dll +0 -0
  22. data/ext/nokogiri/nokogiri.c +81 -0
  23. data/ext/nokogiri/nokogiri.h +149 -0
  24. data/ext/nokogiri/xml_attr.c +92 -0
  25. data/ext/nokogiri/xml_attr.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +53 -0
  27. data/ext/nokogiri/xml_cdata.h +9 -0
  28. data/ext/nokogiri/xml_comment.c +51 -0
  29. data/ext/nokogiri/xml_comment.h +9 -0
  30. data/ext/nokogiri/xml_document.c +308 -0
  31. data/ext/nokogiri/xml_document.h +21 -0
  32. data/ext/nokogiri/xml_document_fragment.c +48 -0
  33. data/ext/nokogiri/xml_document_fragment.h +10 -0
  34. data/ext/nokogiri/xml_dtd.c +102 -0
  35. data/ext/nokogiri/xml_dtd.h +8 -0
  36. data/ext/nokogiri/xml_entity_reference.c +50 -0
  37. data/ext/nokogiri/xml_entity_reference.h +9 -0
  38. data/ext/nokogiri/xml_io.c +24 -0
  39. data/ext/nokogiri/xml_io.h +10 -0
  40. data/ext/nokogiri/xml_namespace.c +69 -0
  41. data/ext/nokogiri/xml_namespace.h +12 -0
  42. data/ext/nokogiri/xml_node.c +928 -0
  43. data/ext/nokogiri/xml_node.h +14 -0
  44. data/ext/nokogiri/xml_node_set.c +386 -0
  45. data/ext/nokogiri/xml_node_set.h +9 -0
  46. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  47. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  48. data/ext/nokogiri/xml_reader.c +572 -0
  49. data/ext/nokogiri/xml_reader.h +10 -0
  50. data/ext/nokogiri/xml_relax_ng.c +106 -0
  51. data/ext/nokogiri/xml_relax_ng.h +9 -0
  52. data/ext/nokogiri/xml_sax_parser.c +336 -0
  53. data/ext/nokogiri/xml_sax_parser.h +10 -0
  54. data/ext/nokogiri/xml_sax_push_parser.c +86 -0
  55. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  56. data/ext/nokogiri/xml_schema.c +107 -0
  57. data/ext/nokogiri/xml_schema.h +9 -0
  58. data/ext/nokogiri/xml_syntax_error.c +203 -0
  59. data/ext/nokogiri/xml_syntax_error.h +12 -0
  60. data/ext/nokogiri/xml_text.c +47 -0
  61. data/ext/nokogiri/xml_text.h +9 -0
  62. data/ext/nokogiri/xml_xpath.c +53 -0
  63. data/ext/nokogiri/xml_xpath.h +11 -0
  64. data/ext/nokogiri/xml_xpath_context.c +252 -0
  65. data/ext/nokogiri/xml_xpath_context.h +9 -0
  66. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  67. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  68. data/ext/nokogiri/zlib1.dll +0 -0
  69. data/lib/action-nokogiri.rb +36 -0
  70. data/lib/nokogiri.rb +110 -0
  71. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  72. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  73. data/lib/nokogiri/css.rb +25 -0
  74. data/lib/nokogiri/css/generated_parser.rb +748 -0
  75. data/lib/nokogiri/css/generated_tokenizer.rb +144 -0
  76. data/lib/nokogiri/css/node.rb +107 -0
  77. data/lib/nokogiri/css/parser.rb +82 -0
  78. data/lib/nokogiri/css/parser.y +227 -0
  79. data/lib/nokogiri/css/syntax_error.rb +7 -0
  80. data/lib/nokogiri/css/tokenizer.rb +11 -0
  81. data/lib/nokogiri/css/tokenizer.rex +54 -0
  82. data/lib/nokogiri/css/xpath_visitor.rb +172 -0
  83. data/lib/nokogiri/decorators.rb +2 -0
  84. data/lib/nokogiri/decorators/hpricot.rb +3 -0
  85. data/lib/nokogiri/decorators/hpricot/node.rb +56 -0
  86. data/lib/nokogiri/decorators/hpricot/node_set.rb +54 -0
  87. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +30 -0
  88. data/lib/nokogiri/decorators/slop.rb +33 -0
  89. data/lib/nokogiri/ffi/html/document.rb +37 -0
  90. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  91. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  92. data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
  93. data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
  94. data/lib/nokogiri/ffi/libxml.rb +314 -0
  95. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  96. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  97. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  98. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  99. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  100. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  102. data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
  103. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  104. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  105. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  106. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  107. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  108. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  109. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
  110. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  111. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  112. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  113. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  114. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  115. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  117. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  118. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  119. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  120. data/lib/nokogiri/ffi/xml/document.rb +107 -0
  121. data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
  122. data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
  123. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  124. data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
  125. data/lib/nokogiri/ffi/xml/node.rb +380 -0
  126. data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
  127. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  128. data/lib/nokogiri/ffi/xml/reader.rb +217 -0
  129. data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
  130. data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
  131. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
  132. data/lib/nokogiri/ffi/xml/schema.rb +55 -0
  133. data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
  134. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  135. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  136. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  137. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  138. data/lib/nokogiri/hpricot.rb +62 -0
  139. data/lib/nokogiri/html.rb +34 -0
  140. data/lib/nokogiri/html/builder.rb +35 -0
  141. data/lib/nokogiri/html/document.rb +71 -0
  142. data/lib/nokogiri/html/document_fragment.rb +15 -0
  143. data/lib/nokogiri/html/element_description.rb +23 -0
  144. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  145. data/lib/nokogiri/html/sax/parser.rb +47 -0
  146. data/lib/nokogiri/nokogiri.rb +1 -0
  147. data/lib/nokogiri/syntax_error.rb +4 -0
  148. data/lib/nokogiri/version.rb +29 -0
  149. data/lib/nokogiri/version_warning.rb +11 -0
  150. data/lib/nokogiri/xml.rb +62 -0
  151. data/lib/nokogiri/xml/attr.rb +9 -0
  152. data/lib/nokogiri/xml/builder.rb +254 -0
  153. data/lib/nokogiri/xml/cdata.rb +11 -0
  154. data/lib/nokogiri/xml/document.rb +100 -0
  155. data/lib/nokogiri/xml/document_fragment.rb +49 -0
  156. data/lib/nokogiri/xml/dtd.rb +11 -0
  157. data/lib/nokogiri/xml/entity_declaration.rb +11 -0
  158. data/lib/nokogiri/xml/fragment_handler.rb +55 -0
  159. data/lib/nokogiri/xml/namespace.rb +7 -0
  160. data/lib/nokogiri/xml/node.rb +745 -0
  161. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  162. data/lib/nokogiri/xml/node_set.rb +238 -0
  163. data/lib/nokogiri/xml/notation.rb +6 -0
  164. data/lib/nokogiri/xml/parse_options.rb +80 -0
  165. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  166. data/lib/nokogiri/xml/reader.rb +66 -0
  167. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  168. data/lib/nokogiri/xml/sax.rb +3 -0
  169. data/lib/nokogiri/xml/sax/document.rb +143 -0
  170. data/lib/nokogiri/xml/sax/parser.rb +101 -0
  171. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  172. data/lib/nokogiri/xml/schema.rb +65 -0
  173. data/lib/nokogiri/xml/syntax_error.rb +34 -0
  174. data/lib/nokogiri/xml/xpath.rb +10 -0
  175. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  176. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  177. data/lib/nokogiri/xslt.rb +48 -0
  178. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  179. data/lib/xsd/xmlparser/nokogiri.rb +64 -0
  180. data/tasks/test.rb +161 -0
  181. data/test/css/test_nthiness.rb +160 -0
  182. data/test/css/test_parser.rb +277 -0
  183. data/test/css/test_tokenizer.rb +176 -0
  184. data/test/css/test_xpath_visitor.rb +76 -0
  185. data/test/ffi/test_document.rb +35 -0
  186. data/test/files/address_book.rlx +12 -0
  187. data/test/files/address_book.xml +10 -0
  188. data/test/files/dont_hurt_em_why.xml +422 -0
  189. data/test/files/exslt.xml +8 -0
  190. data/test/files/exslt.xslt +35 -0
  191. data/test/files/po.xml +32 -0
  192. data/test/files/po.xsd +66 -0
  193. data/test/files/staff.xml +59 -0
  194. data/test/files/staff.xslt +32 -0
  195. data/test/files/tlm.html +850 -0
  196. data/test/helper.rb +123 -0
  197. data/test/hpricot/files/basic.xhtml +17 -0
  198. data/test/hpricot/files/boingboing.html +2266 -0
  199. data/test/hpricot/files/cy0.html +3653 -0
  200. data/test/hpricot/files/immob.html +400 -0
  201. data/test/hpricot/files/pace_application.html +1320 -0
  202. data/test/hpricot/files/tenderlove.html +16 -0
  203. data/test/hpricot/files/uswebgen.html +220 -0
  204. data/test/hpricot/files/utf8.html +1054 -0
  205. data/test/hpricot/files/week9.html +1723 -0
  206. data/test/hpricot/files/why.xml +19 -0
  207. data/test/hpricot/load_files.rb +11 -0
  208. data/test/hpricot/test_alter.rb +68 -0
  209. data/test/hpricot/test_builder.rb +20 -0
  210. data/test/hpricot/test_parser.rb +426 -0
  211. data/test/hpricot/test_paths.rb +15 -0
  212. data/test/hpricot/test_preserved.rb +77 -0
  213. data/test/hpricot/test_xml.rb +30 -0
  214. data/test/html/sax/test_parser.rb +52 -0
  215. data/test/html/test_builder.rb +156 -0
  216. data/test/html/test_document.rb +361 -0
  217. data/test/html/test_document_encoding.rb +46 -0
  218. data/test/html/test_document_fragment.rb +97 -0
  219. data/test/html/test_element_description.rb +95 -0
  220. data/test/html/test_named_characters.rb +14 -0
  221. data/test/html/test_node.rb +165 -0
  222. data/test/test_convert_xpath.rb +186 -0
  223. data/test/test_css_cache.rb +56 -0
  224. data/test/test_gc.rb +15 -0
  225. data/test/test_memory_leak.rb +77 -0
  226. data/test/test_nokogiri.rb +127 -0
  227. data/test/test_reader.rb +316 -0
  228. data/test/test_xslt_transforms.rb +131 -0
  229. data/test/xml/node/test_save_options.rb +20 -0
  230. data/test/xml/node/test_subclass.rb +44 -0
  231. data/test/xml/sax/test_parser.rb +169 -0
  232. data/test/xml/sax/test_push_parser.rb +92 -0
  233. data/test/xml/test_attr.rb +38 -0
  234. data/test/xml/test_builder.rb +73 -0
  235. data/test/xml/test_cdata.rb +38 -0
  236. data/test/xml/test_comment.rb +23 -0
  237. data/test/xml/test_document.rb +397 -0
  238. data/test/xml/test_document_encoding.rb +26 -0
  239. data/test/xml/test_document_fragment.rb +76 -0
  240. data/test/xml/test_dtd.rb +42 -0
  241. data/test/xml/test_dtd_encoding.rb +31 -0
  242. data/test/xml/test_entity_reference.rb +21 -0
  243. data/test/xml/test_namespace.rb +43 -0
  244. data/test/xml/test_node.rb +808 -0
  245. data/test/xml/test_node_attributes.rb +34 -0
  246. data/test/xml/test_node_encoding.rb +84 -0
  247. data/test/xml/test_node_set.rb +368 -0
  248. data/test/xml/test_parse_options.rb +52 -0
  249. data/test/xml/test_processing_instruction.rb +30 -0
  250. data/test/xml/test_reader_encoding.rb +126 -0
  251. data/test/xml/test_relax_ng.rb +60 -0
  252. data/test/xml/test_schema.rb +65 -0
  253. data/test/xml/test_text.rb +18 -0
  254. data/test/xml/test_unparented_node.rb +381 -0
  255. data/test/xml/test_xpath.rb +106 -0
  256. metadata +409 -0
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNodeAttributes < Nokogiri::TestCase
6
+ def test_attribute_with_ns
7
+ doc = Nokogiri::XML <<-eoxml
8
+ <root xmlns:tlm='http://tenderlovemaking.com/'>
9
+ <node tlm:foo='bar' foo='baz' />
10
+ </root>
11
+ eoxml
12
+
13
+ node = doc.at('node')
14
+
15
+ assert_equal 'bar',
16
+ node.attribute_with_ns('foo', 'http://tenderlovemaking.com/').value
17
+ end
18
+
19
+ def test_namespace_key?
20
+ doc = Nokogiri::XML <<-eoxml
21
+ <root xmlns:tlm='http://tenderlovemaking.com/'>
22
+ <node tlm:foo='bar' foo='baz' />
23
+ </root>
24
+ eoxml
25
+
26
+ node = doc.at('node')
27
+
28
+ assert node.namespaced_key?('foo', 'http://tenderlovemaking.com/')
29
+ assert node.namespaced_key?('foo', nil)
30
+ assert !node.namespaced_key?('foo', 'foo')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,84 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
2
+
3
+ module Nokogiri
4
+ module XML
5
+ if RUBY_VERSION =~ /^1\.9/
6
+ class TestNodeEncoding < Nokogiri::TestCase
7
+ def setup
8
+ super
9
+ @html = Nokogiri::HTML(File.read(HTML_FILE), HTML_FILE)
10
+ end
11
+
12
+ def test_get_attribute
13
+ node = @html.css('a').first
14
+ assert_equal @html.encoding, node['href'].encoding.name
15
+ end
16
+
17
+ def test_encode_special_chars
18
+ foo = @html.css('a').first.encode_special_chars('foo')
19
+ assert_equal @html.encoding, foo.encoding.name
20
+ end
21
+
22
+ def test_content
23
+ node = @html.css('a').first
24
+ assert_equal @html.encoding, node.content.encoding.name
25
+ end
26
+
27
+ def test_name
28
+ node = @html.css('a').first
29
+ assert_equal @html.encoding, node.name.encoding.name
30
+ end
31
+
32
+ def test_path
33
+ node = @html.css('a').first
34
+ assert_equal @html.encoding, node.path.encoding.name
35
+ end
36
+
37
+ def test_namespace
38
+ xml = <<-eoxml
39
+ <root>
40
+ <car xmlns:part="http://general-motors.com/">
41
+ <part:tire>Michelin Model XGV</part:tire>
42
+ </car>
43
+ <bicycle xmlns:part="http://schwinn.com/">
44
+ <part:tire>I'm a bicycle tire!</part:tire>
45
+ </bicycle>
46
+ </root>
47
+ eoxml
48
+ doc = Nokogiri::XML(xml, nil, 'UTF-8')
49
+ assert_equal 'UTF-8', doc.encoding
50
+ n = doc.xpath('//part:tire', { 'part' => 'http://schwinn.com/' }).first
51
+ assert n
52
+ assert_equal doc.encoding, n.namespace.href.encoding.name
53
+ assert_equal doc.encoding, n.namespace.prefix.encoding.name
54
+ end
55
+
56
+ def test_namespace_as_hash
57
+ xml = <<-eoxml
58
+ <root>
59
+ <car xmlns:part="http://general-motors.com/">
60
+ <part:tire>Michelin Model XGV</part:tire>
61
+ </car>
62
+ <bicycle xmlns:part="http://schwinn.com/">
63
+ <part:tire>I'm a bicycle tire!</part:tire>
64
+ </bicycle>
65
+ </root>
66
+ eoxml
67
+ doc = Nokogiri::XML(xml, nil, 'UTF-8')
68
+ assert_equal 'UTF-8', doc.encoding
69
+ assert n = doc.xpath('//car').first
70
+
71
+ n.namespace_definitions.each do |nd|
72
+ assert_equal doc.encoding, nd.href.encoding.name
73
+ assert_equal doc.encoding, nd.prefix.encoding.name
74
+ end
75
+
76
+ n.namespaces.each do |k,v|
77
+ assert_equal doc.encoding, k.encoding.name
78
+ assert_equal doc.encoding, v.encoding.name
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,368 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNodeSet < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
9
+ end
10
+
11
+ def test_double_equal
12
+ assert node_set_one = @xml.xpath('//employee')
13
+ assert node_set_two = @xml.xpath('//employee')
14
+
15
+ assert_not_equal node_set_one.object_id, node_set_two.object_id
16
+
17
+ assert_equal node_set_one, node_set_two
18
+ end
19
+
20
+ def test_node_set_not_equal_to_string
21
+ node_set_one = @xml.xpath('//employee')
22
+ assert_not_equal node_set_one, "asdfadsf"
23
+ end
24
+
25
+ def test_out_of_order_not_equal
26
+ one = @xml.xpath('//employee')
27
+ two = @xml.xpath('//employee')
28
+ two.push two.shift
29
+ assert_not_equal one, two
30
+ end
31
+
32
+ def test_shorter_is_not_equal
33
+ node_set_one = @xml.xpath('//employee')
34
+ node_set_two = @xml.xpath('//employee')
35
+ node_set_two.delete(node_set_two.first)
36
+
37
+ assert_not_equal node_set_one, node_set_two
38
+ end
39
+
40
+ def test_pop
41
+ set = @xml.xpath('//employee')
42
+ last = set.last
43
+ assert_equal last, set.pop
44
+ end
45
+
46
+ def test_shift
47
+ set = @xml.xpath('//employee')
48
+ first = set.first
49
+ assert_equal first, set.shift
50
+ end
51
+
52
+ def test_shift_empty
53
+ set = Nokogiri::XML::NodeSet.new(@xml)
54
+ assert_nil set.shift
55
+ end
56
+
57
+ def test_pop_empty
58
+ set = Nokogiri::XML::NodeSet.new(@xml)
59
+ assert_nil set.pop
60
+ end
61
+
62
+ def test_first_takes_arguments
63
+ assert node_set = @xml.xpath('//employee')
64
+ assert_equal 2, node_set.first(2).length
65
+ end
66
+
67
+ def test_dup
68
+ assert node_set = @xml.xpath('//employee')
69
+ dup = node_set.dup
70
+ assert_equal node_set.length, dup.length
71
+ node_set.zip(dup).each do |a,b|
72
+ assert_equal a, b
73
+ end
74
+ end
75
+
76
+ def test_xmlns_is_automatically_registered
77
+ doc = Nokogiri::XML(<<-eoxml)
78
+ <root xmlns="http://tenderlovemaking.com/">
79
+ <foo>
80
+ <bar/>
81
+ </foo>
82
+ </root>
83
+ eoxml
84
+ set = doc.css('foo')
85
+ assert_equal 1, set.css('xmlns|bar').length
86
+ assert_equal 0, set.css('|bar').length
87
+ assert_equal 1, set.xpath('//xmlns:bar').length
88
+ assert_equal 1, set.search('xmlns|bar').length
89
+ assert_equal 1, set.search('//xmlns:bar').length
90
+ assert set.at('//xmlns:bar')
91
+ assert set.at('xmlns|bar')
92
+ assert set.at('bar')
93
+ end
94
+
95
+ def test_children_has_document
96
+ set = @xml.root.children
97
+ assert_instance_of(NodeSet, set)
98
+ assert_equal @xml, set.document
99
+ end
100
+
101
+ def test_length_size
102
+ assert node_set = @xml.search('//employee')
103
+ assert_equal node_set.length, node_set.size
104
+ end
105
+
106
+ def test_to_xml
107
+ assert node_set = @xml.search('//employee')
108
+ assert node_set.to_xml
109
+ end
110
+
111
+ def test_inner_html
112
+ doc = Nokogiri::HTML(<<-eohtml)
113
+ <html>
114
+ <body>
115
+ <div>
116
+ <a>one</a>
117
+ </div>
118
+ <div>
119
+ <a>two</a>
120
+ </div>
121
+ </body>
122
+ </html>
123
+ eohtml
124
+ assert html = doc.css('div').inner_html
125
+ assert_match '<a>', html
126
+ end
127
+
128
+ def test_at
129
+ assert node_set = @xml.search('//employee')
130
+ assert_equal node_set.first, node_set.at(0)
131
+ end
132
+
133
+ def test_percent
134
+ assert node_set = @xml.search('//employee')
135
+ assert_equal node_set.first, node_set % 0
136
+ end
137
+
138
+ def test_to_ary
139
+ assert node_set = @xml.search('//employee')
140
+ foo = []
141
+ foo += node_set
142
+ assert_equal node_set.length, foo.length
143
+ end
144
+
145
+ def test_push
146
+ node = Nokogiri::XML::Node.new('foo', @xml)
147
+ node.content = 'bar'
148
+
149
+ assert node_set = @xml.search('//employee')
150
+ node_set.push(node)
151
+
152
+ assert node_set.include?(node)
153
+ end
154
+
155
+ def test_delete_with_invalid_argument
156
+ employees = @xml.search("//employee")
157
+ positions = @xml.search("//position")
158
+
159
+ assert_raises(ArgumentError) { employees.delete(positions) }
160
+ end
161
+
162
+ def test_delete_when_present
163
+ employees = @xml.search("//employee")
164
+ wally = employees.first
165
+ assert employees.include?(wally) # testing setup
166
+ length = employees.length
167
+
168
+ result = employees.delete(wally)
169
+ assert_equal result, wally
170
+ assert ! employees.include?(wally)
171
+ assert length-1, employees.length
172
+ end
173
+
174
+ def test_delete_when_not_present
175
+ employees = @xml.search("//employee")
176
+ phb = @xml.search("//position").first
177
+ assert ! employees.include?(phb) # testing setup
178
+ length = employees.length
179
+
180
+ result = employees.delete(phb)
181
+ assert_nil result
182
+ assert length, employees.length
183
+ end
184
+
185
+ def test_unlink
186
+ xml = Nokogiri::XML.parse(<<-eoxml)
187
+ <root>
188
+ <a class='foo bar'>Bar</a>
189
+ <a class='bar foo'>Bar</a>
190
+ <a class='bar'>Bar</a>
191
+ <a>Hello world</a>
192
+ <a class='baz bar foo'>Bar</a>
193
+ <a class='bazbarfoo'>Awesome</a>
194
+ <a class='bazbar'>Awesome</a>
195
+ </root>
196
+ eoxml
197
+ set = xml.xpath('//a')
198
+ set.unlink
199
+ set.each do |node|
200
+ assert !node.parent
201
+ #assert !node.document
202
+ assert !node.previous_sibling
203
+ assert !node.next_sibling
204
+ end
205
+ assert_no_match(/Hello world/, xml.to_s)
206
+ end
207
+
208
+ def test_nodeset_search_takes_namespace
209
+ @xml = Nokogiri::XML.parse(<<-eoxml)
210
+ <root>
211
+ <car xmlns:part="http://general-motors.com/">
212
+ <part:tire>Michelin Model XGV</part:tire>
213
+ </car>
214
+ <bicycle xmlns:part="http://schwinn.com/">
215
+ <part:tire>I'm a bicycle tire!</part:tire>
216
+ </bicycle>
217
+ </root>
218
+ eoxml
219
+ set = @xml/'root'
220
+ assert_equal 1, set.length
221
+ bike_tire = set.search('//bike:tire', 'bike' => "http://schwinn.com/")
222
+ assert_equal 1, bike_tire.length
223
+ end
224
+
225
+ def test_new_nodeset
226
+ node_set = Nokogiri::XML::NodeSet.new(@xml)
227
+ assert_equal(0, node_set.length)
228
+ node = Nokogiri::XML::Node.new('form', @xml)
229
+ node_set << node
230
+ assert_equal(1, node_set.length)
231
+ assert_equal(node, node_set.last)
232
+ end
233
+
234
+ def test_search_on_nodeset
235
+ assert node_set = @xml.search('//employee')
236
+ assert sub_set = node_set.search('.//name')
237
+ assert_equal(node_set.length, sub_set.length)
238
+ end
239
+
240
+ def test_negative_index_works
241
+ assert node_set = @xml.search('//employee')
242
+ assert_equal node_set.last, node_set[-1]
243
+ end
244
+
245
+ def test_large_negative_index_returns_nil
246
+ assert node_set = @xml.search('//employee')
247
+ assert_nil(node_set[-1 * (node_set.length + 1)])
248
+ end
249
+
250
+ def test_node_set_fetches_private_data
251
+ assert node_set = @xml.search('//employee')
252
+
253
+ set = node_set
254
+ assert_equal(set[0], set[0])
255
+ end
256
+
257
+ def test_node_set_returns_0
258
+ assert node_set = @xml.search('//asdkfjhasdlkfjhaldskfh')
259
+ assert_equal(0, node_set.length)
260
+ end
261
+
262
+ def test_wrap
263
+ employees = (@xml/"//employee").wrap("<wrapper/>")
264
+ assert_equal 'wrapper', employees[0].parent.name
265
+ assert_equal 'employee', @xml.search("//wrapper").first.children[0].name
266
+ end
267
+
268
+ def test_plus_operator
269
+ names = @xml.search("name")
270
+ positions = @xml.search("position")
271
+
272
+ names_len = names.length
273
+ positions_len = positions.length
274
+
275
+ assert_raises(ArgumentError) { result = names + positions.first }
276
+
277
+ result = names + positions
278
+ assert_equal names_len, names.length
279
+ assert_equal positions_len, positions.length
280
+ assert_equal names.length + positions.length, result.length
281
+
282
+ names += positions
283
+ assert_equal result.length, names.length
284
+ end
285
+
286
+ def test_minus_operator
287
+ employees = @xml.search("//employee")
288
+ females = @xml.search("//employee[gender[text()='Female']]")
289
+
290
+ employees_len = employees.length
291
+ females_len = females.length
292
+
293
+ assert_raises(ArgumentError) { result = employees - females.first }
294
+
295
+ result = employees - females
296
+ assert_equal employees_len, employees.length
297
+ assert_equal females_len, females.length
298
+ assert_equal employees.length - females.length, result.length
299
+
300
+ employees -= females
301
+ assert_equal result.length, employees.length
302
+ end
303
+
304
+ def test_array_index
305
+ employees = @xml.search("//employee")
306
+ other = @xml.search("//position").first
307
+
308
+ assert_equal 3, employees.index(employees[3])
309
+ assert_nil employees.index(other)
310
+ end
311
+
312
+ def test_array_slice_with_start_and_end
313
+ employees = @xml.search("//employee")
314
+ assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
315
+ end
316
+
317
+ def test_array_index_bracket_equivalence
318
+ employees = @xml.search("//employee")
319
+ assert_equal [employees[1], employees[2], employees[3]], employees[1,3].to_a
320
+ assert_equal [employees[1], employees[2], employees[3]], employees.slice(1,3).to_a
321
+ end
322
+
323
+ def test_array_slice_with_negative_start
324
+ employees = @xml.search("//employee")
325
+ assert_equal [employees[2]], employees[-3,1].to_a
326
+ assert_equal [employees[2], employees[3]], employees[-3,2].to_a
327
+ end
328
+
329
+ def test_array_slice_with_invalid_args
330
+ employees = @xml.search("//employee")
331
+ assert_nil employees[99, 1] # large start
332
+ assert_nil employees[1, -1] # negative len
333
+ assert_equal [], employees[1, 0].to_a # zero len
334
+ end
335
+
336
+ def test_array_slice_with_range
337
+ employees = @xml.search("//employee")
338
+ assert_equal [employees[1], employees[2], employees[3]], employees[1..3].to_a
339
+ assert_equal [employees[0], employees[1], employees[2], employees[3]], employees[0..3].to_a
340
+ end
341
+
342
+ def test_intersection_with_no_overlap
343
+ employees = @xml.search("//employee")
344
+ positions = @xml.search("//position")
345
+
346
+ assert_equal [], (employees & positions).to_a
347
+ end
348
+
349
+ def test_intersection
350
+ employees = @xml.search("//employee")
351
+ first_set = employees[0..2]
352
+ second_set = employees[2..4]
353
+
354
+ assert_equal [employees[2]], (first_set & second_set).to_a
355
+ end
356
+
357
+ def test_include?
358
+ employees = @xml.search("//employee")
359
+ yes = employees.first
360
+ no = @xml.search("//position").first
361
+
362
+ assert employees.include?(yes)
363
+ assert ! employees.include?(no)
364
+ end
365
+
366
+ end
367
+ end
368
+ end