rubyjedi-nokogiri_java 1.4.0.20100513161003-java

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 (285) hide show
  1. data/.autotest +26 -0
  2. data/CHANGELOG.ja.rdoc +330 -0
  3. data/CHANGELOG.rdoc +341 -0
  4. data/Manifest.txt +277 -0
  5. data/README.ja.rdoc +105 -0
  6. data/README.rdoc +125 -0
  7. data/Rakefile +307 -0
  8. data/bin/nokogiri +49 -0
  9. data/deps.rip +5 -0
  10. data/ext/nokogiri/extconf.rb +149 -0
  11. data/ext/nokogiri/html_document.c +145 -0
  12. data/ext/nokogiri/html_document.h +10 -0
  13. data/ext/nokogiri/html_element_description.c +272 -0
  14. data/ext/nokogiri/html_element_description.h +10 -0
  15. data/ext/nokogiri/html_entity_lookup.c +32 -0
  16. data/ext/nokogiri/html_entity_lookup.h +8 -0
  17. data/ext/nokogiri/html_sax_parser_context.c +92 -0
  18. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  19. data/ext/nokogiri/nokogiri.c +96 -0
  20. data/ext/nokogiri/nokogiri.h +148 -0
  21. data/ext/nokogiri/xml_attr.c +92 -0
  22. data/ext/nokogiri/xml_attr.h +9 -0
  23. data/ext/nokogiri/xml_attribute_decl.c +67 -0
  24. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  25. data/ext/nokogiri/xml_cdata.c +54 -0
  26. data/ext/nokogiri/xml_cdata.h +9 -0
  27. data/ext/nokogiri/xml_comment.c +52 -0
  28. data/ext/nokogiri/xml_comment.h +9 -0
  29. data/ext/nokogiri/xml_document.c +386 -0
  30. data/ext/nokogiri/xml_document.h +24 -0
  31. data/ext/nokogiri/xml_document_fragment.c +46 -0
  32. data/ext/nokogiri/xml_document_fragment.h +10 -0
  33. data/ext/nokogiri/xml_dtd.c +192 -0
  34. data/ext/nokogiri/xml_dtd.h +10 -0
  35. data/ext/nokogiri/xml_element_content.c +123 -0
  36. data/ext/nokogiri/xml_element_content.h +10 -0
  37. data/ext/nokogiri/xml_element_decl.c +69 -0
  38. data/ext/nokogiri/xml_element_decl.h +9 -0
  39. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  40. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  41. data/ext/nokogiri/xml_entity_decl.c +97 -0
  42. data/ext/nokogiri/xml_entity_decl.h +10 -0
  43. data/ext/nokogiri/xml_entity_reference.c +50 -0
  44. data/ext/nokogiri/xml_entity_reference.h +9 -0
  45. data/ext/nokogiri/xml_io.c +31 -0
  46. data/ext/nokogiri/xml_io.h +11 -0
  47. data/ext/nokogiri/xml_namespace.c +82 -0
  48. data/ext/nokogiri/xml_namespace.h +13 -0
  49. data/ext/nokogiri/xml_node.c +1080 -0
  50. data/ext/nokogiri/xml_node.h +13 -0
  51. data/ext/nokogiri/xml_node_set.c +405 -0
  52. data/ext/nokogiri/xml_node_set.h +9 -0
  53. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  54. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  55. data/ext/nokogiri/xml_reader.c +593 -0
  56. data/ext/nokogiri/xml_reader.h +10 -0
  57. data/ext/nokogiri/xml_relax_ng.c +159 -0
  58. data/ext/nokogiri/xml_relax_ng.h +9 -0
  59. data/ext/nokogiri/xml_sax_parser.c +283 -0
  60. data/ext/nokogiri/xml_sax_parser.h +43 -0
  61. data/ext/nokogiri/xml_sax_parser_context.c +157 -0
  62. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  63. data/ext/nokogiri/xml_sax_push_parser.c +114 -0
  64. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  65. data/ext/nokogiri/xml_schema.c +156 -0
  66. data/ext/nokogiri/xml_schema.h +9 -0
  67. data/ext/nokogiri/xml_syntax_error.c +52 -0
  68. data/ext/nokogiri/xml_syntax_error.h +13 -0
  69. data/ext/nokogiri/xml_text.c +48 -0
  70. data/ext/nokogiri/xml_text.h +9 -0
  71. data/ext/nokogiri/xml_xpath.c +53 -0
  72. data/ext/nokogiri/xml_xpath.h +11 -0
  73. data/ext/nokogiri/xml_xpath_context.c +239 -0
  74. data/ext/nokogiri/xml_xpath_context.h +9 -0
  75. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  76. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  77. data/lib/isorelax.jar +0 -0
  78. data/lib/jing.jar +0 -0
  79. data/lib/nekodtd.jar +0 -0
  80. data/lib/nekohtml.jar +0 -0
  81. data/lib/nokogiri.rb +123 -0
  82. data/lib/nokogiri/css.rb +25 -0
  83. data/lib/nokogiri/css/generated_parser.rb +659 -0
  84. data/lib/nokogiri/css/generated_tokenizer.rb +145 -0
  85. data/lib/nokogiri/css/node.rb +99 -0
  86. data/lib/nokogiri/css/parser.rb +82 -0
  87. data/lib/nokogiri/css/parser.y +230 -0
  88. data/lib/nokogiri/css/syntax_error.rb +7 -0
  89. data/lib/nokogiri/css/tokenizer.rb +7 -0
  90. data/lib/nokogiri/css/tokenizer.rex +55 -0
  91. data/lib/nokogiri/css/xpath_visitor.rb +164 -0
  92. data/lib/nokogiri/decorators/slop.rb +33 -0
  93. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  94. data/lib/nokogiri/ffi/html/document.rb +28 -0
  95. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  96. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  97. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  98. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  99. data/lib/nokogiri/ffi/libxml.rb +372 -0
  100. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  101. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  102. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  103. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  105. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  106. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  107. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  108. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  109. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  110. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  111. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  112. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  113. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  114. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  115. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  116. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  117. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  118. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +19 -0
  119. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  120. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  121. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  122. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  123. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  124. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  126. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  127. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  128. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  129. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  130. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  131. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  132. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  133. data/lib/nokogiri/ffi/xml/document.rb +135 -0
  134. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  135. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  136. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  137. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  138. data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
  139. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  140. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  141. data/lib/nokogiri/ffi/xml/node.rb +465 -0
  142. data/lib/nokogiri/ffi/xml/node_set.rb +146 -0
  143. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  144. data/lib/nokogiri/ffi/xml/reader.rb +227 -0
  145. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser.rb +135 -0
  147. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
  148. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +55 -0
  149. data/lib/nokogiri/ffi/xml/schema.rb +92 -0
  150. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  151. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  152. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  153. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  154. data/lib/nokogiri/ffi/xslt/stylesheet.rb +50 -0
  155. data/lib/nokogiri/html.rb +36 -0
  156. data/lib/nokogiri/html/builder.rb +35 -0
  157. data/lib/nokogiri/html/document.rb +88 -0
  158. data/lib/nokogiri/html/document_fragment.rb +15 -0
  159. data/lib/nokogiri/html/element_description.rb +23 -0
  160. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  161. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  162. data/lib/nokogiri/html/sax/parser.rb +48 -0
  163. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  164. data/lib/nokogiri/nokogiri.jar +0 -0
  165. data/lib/nokogiri/syntax_error.rb +4 -0
  166. data/lib/nokogiri/version.rb +33 -0
  167. data/lib/nokogiri/version_warning.rb +11 -0
  168. data/lib/nokogiri/xml.rb +67 -0
  169. data/lib/nokogiri/xml/attr.rb +14 -0
  170. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  171. data/lib/nokogiri/xml/builder.rb +405 -0
  172. data/lib/nokogiri/xml/cdata.rb +11 -0
  173. data/lib/nokogiri/xml/character_data.rb +7 -0
  174. data/lib/nokogiri/xml/document.rb +163 -0
  175. data/lib/nokogiri/xml/document_fragment.rb +73 -0
  176. data/lib/nokogiri/xml/dtd.rb +11 -0
  177. data/lib/nokogiri/xml/element_content.rb +36 -0
  178. data/lib/nokogiri/xml/element_decl.rb +13 -0
  179. data/lib/nokogiri/xml/entity_decl.rb +15 -0
  180. data/lib/nokogiri/xml/fragment_handler.rb +73 -0
  181. data/lib/nokogiri/xml/namespace.rb +13 -0
  182. data/lib/nokogiri/xml/node.rb +730 -0
  183. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  184. data/lib/nokogiri/xml/node_set.rb +318 -0
  185. data/lib/nokogiri/xml/notation.rb +6 -0
  186. data/lib/nokogiri/xml/parse_options.rb +85 -0
  187. data/lib/nokogiri/xml/pp.rb +2 -0
  188. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  189. data/lib/nokogiri/xml/pp/node.rb +56 -0
  190. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  191. data/lib/nokogiri/xml/reader.rb +74 -0
  192. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  193. data/lib/nokogiri/xml/sax.rb +4 -0
  194. data/lib/nokogiri/xml/sax/document.rb +160 -0
  195. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  196. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  197. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  198. data/lib/nokogiri/xml/schema.rb +61 -0
  199. data/lib/nokogiri/xml/syntax_error.rb +43 -0
  200. data/lib/nokogiri/xml/xpath.rb +10 -0
  201. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  202. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  203. data/lib/nokogiri/xslt.rb +48 -0
  204. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  205. data/lib/xercesImpl.jar +0 -0
  206. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  207. data/tasks/test.rb +100 -0
  208. data/test/css/test_nthiness.rb +159 -0
  209. data/test/css/test_parser.rb +282 -0
  210. data/test/css/test_tokenizer.rb +190 -0
  211. data/test/css/test_xpath_visitor.rb +76 -0
  212. data/test/ffi/test_document.rb +35 -0
  213. data/test/files/2ch.html +108 -0
  214. data/test/files/address_book.rlx +12 -0
  215. data/test/files/address_book.xml +10 -0
  216. data/test/files/bar/bar.xsd +4 -0
  217. data/test/files/dont_hurt_em_why.xml +422 -0
  218. data/test/files/exslt.xml +8 -0
  219. data/test/files/exslt.xslt +35 -0
  220. data/test/files/foo/foo.xsd +4 -0
  221. data/test/files/po.xml +32 -0
  222. data/test/files/po.xsd +66 -0
  223. data/test/files/shift_jis.html +10 -0
  224. data/test/files/shift_jis.xml +5 -0
  225. data/test/files/snuggles.xml +3 -0
  226. data/test/files/staff.dtd +10 -0
  227. data/test/files/staff.xml +59 -0
  228. data/test/files/staff.xslt +32 -0
  229. data/test/files/tlm.html +850 -0
  230. data/test/files/valid_bar.xml +2 -0
  231. data/test/helper.rb +137 -0
  232. data/test/html/sax/test_parser.rb +83 -0
  233. data/test/html/sax/test_parser_context.rb +48 -0
  234. data/test/html/test_builder.rb +164 -0
  235. data/test/html/test_document.rb +385 -0
  236. data/test/html/test_document_encoding.rb +77 -0
  237. data/test/html/test_document_fragment.rb +157 -0
  238. data/test/html/test_element_description.rb +98 -0
  239. data/test/html/test_named_characters.rb +14 -0
  240. data/test/html/test_node.rb +242 -0
  241. data/test/html/test_node_encoding.rb +27 -0
  242. data/test/test_convert_xpath.rb +135 -0
  243. data/test/test_css_cache.rb +45 -0
  244. data/test/test_encoding_handler.rb +46 -0
  245. data/test/test_jruby.rb +40 -0
  246. data/test/test_memory_leak.rb +87 -0
  247. data/test/test_nokogiri.rb +140 -0
  248. data/test/test_reader.rb +358 -0
  249. data/test/test_soap4r_sax.rb +52 -0
  250. data/test/test_xslt_transforms.rb +150 -0
  251. data/test/xml/node/test_save_options.rb +20 -0
  252. data/test/xml/node/test_subclass.rb +44 -0
  253. data/test/xml/sax/test_parser.rb +314 -0
  254. data/test/xml/sax/test_parser_context.rb +63 -0
  255. data/test/xml/sax/test_push_parser.rb +135 -0
  256. data/test/xml/test_attr.rb +38 -0
  257. data/test/xml/test_attribute_decl.rb +90 -0
  258. data/test/xml/test_builder.rb +167 -0
  259. data/test/xml/test_cdata.rb +38 -0
  260. data/test/xml/test_comment.rb +29 -0
  261. data/test/xml/test_document.rb +638 -0
  262. data/test/xml/test_document_encoding.rb +26 -0
  263. data/test/xml/test_document_fragment.rb +149 -0
  264. data/test/xml/test_dtd.rb +92 -0
  265. data/test/xml/test_dtd_encoding.rb +33 -0
  266. data/test/xml/test_element_content.rb +56 -0
  267. data/test/xml/test_element_decl.rb +73 -0
  268. data/test/xml/test_entity_decl.rb +83 -0
  269. data/test/xml/test_entity_reference.rb +21 -0
  270. data/test/xml/test_namespace.rb +70 -0
  271. data/test/xml/test_node.rb +740 -0
  272. data/test/xml/test_node_attributes.rb +34 -0
  273. data/test/xml/test_node_encoding.rb +107 -0
  274. data/test/xml/test_node_reparenting.rb +279 -0
  275. data/test/xml/test_node_set.rb +577 -0
  276. data/test/xml/test_parse_options.rb +52 -0
  277. data/test/xml/test_processing_instruction.rb +30 -0
  278. data/test/xml/test_reader_encoding.rb +126 -0
  279. data/test/xml/test_relax_ng.rb +60 -0
  280. data/test/xml/test_schema.rb +89 -0
  281. data/test/xml/test_syntax_error.rb +12 -0
  282. data/test/xml/test_text.rb +30 -0
  283. data/test/xml/test_unparented_node.rb +381 -0
  284. data/test/xml/test_xpath.rb +169 -0
  285. metadata +477 -0
@@ -0,0 +1,38 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestAttr < Nokogiri::TestCase
6
+ def test_new
7
+ 100.times {
8
+ doc = Nokogiri::XML::Document.new
9
+ attribute = Nokogiri::XML::Attr.new(doc, 'foo')
10
+ }
11
+ end
12
+
13
+ def test_content=
14
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
15
+ address = xml.xpath('//address')[3]
16
+ street = address.attributes['street']
17
+ street.content = "Y&ent1;"
18
+ assert_equal "Y&ent1;", street.value
19
+ end
20
+
21
+ def test_value=
22
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
23
+ address = xml.xpath('//address')[3]
24
+ street = address.attributes['street']
25
+ street.value = "Y&ent1;"
26
+ assert_equal "Y&ent1;", street.value
27
+ end
28
+
29
+ def test_unlink
30
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
31
+ address = xml.xpath('/staff/employee/address').first
32
+ assert_equal 'Yes', address['domestic']
33
+ address.attribute_nodes.first.unlink
34
+ assert_nil address['domestic']
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,90 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestAttributeDecl < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML(<<-eoxml)
9
+ <?xml version="1.0"?><?TEST-STYLE PIDATA?>
10
+ <!DOCTYPE staff SYSTEM "staff.dtd" [
11
+ <!ATTLIST br width CDATA "0">
12
+ <!ATTLIST a width CDATA "0">
13
+ <!ATTLIST payment type (check|cash) "cash">
14
+ ]>
15
+ <root />
16
+ eoxml
17
+ @attrs = @xml.internal_subset.children
18
+ @attr_decl = @attrs.first
19
+ end
20
+
21
+ def test_inspect
22
+ assert_equal(
23
+ "#<#{@attr_decl.class.name}:#{sprintf("0x%x", @attr_decl.object_id)} #{@attr_decl.to_s.inspect}>",
24
+ @attr_decl.inspect
25
+ )
26
+ end
27
+
28
+ def test_type
29
+ assert_equal 16, @attr_decl.type
30
+ end
31
+
32
+ def test_class
33
+ assert_instance_of Nokogiri::XML::AttributeDecl, @attr_decl
34
+ end
35
+
36
+ def test_content
37
+ assert_raise NoMethodError do
38
+ @attr_decl.content
39
+ end
40
+ end
41
+
42
+ def test_attributes
43
+ assert_raise NoMethodError do
44
+ @attr_decl.attributes
45
+ end
46
+ end
47
+
48
+ def test_namespace
49
+ assert_raise NoMethodError do
50
+ @attr_decl.namespace
51
+ end
52
+ end
53
+
54
+ def test_namespace_definitions
55
+ assert_raise NoMethodError do
56
+ @attr_decl.namespace_definitions
57
+ end
58
+ end
59
+
60
+ def test_line
61
+ assert_raise NoMethodError do
62
+ @attr_decl.line
63
+ end
64
+ end
65
+
66
+ def test_attribute_type
67
+ if Nokogiri.uses_libxml?
68
+ assert_equal 1, @attr_decl.attribute_type
69
+ else
70
+ assert_equal 'CDATA', @attr_decl.attribute_type
71
+ end
72
+ end
73
+
74
+ def test_default
75
+ assert_equal '0', @attr_decl.default
76
+ if Nokogiri.uses_libxml?
77
+ assert_nil @attrs[1].default
78
+ else
79
+ assert_equal '0', @attrs[1].default
80
+ end
81
+ end
82
+
83
+ def test_enumeration
84
+ assert_equal [], @attr_decl.enumeration
85
+ assert_equal ['check', 'cash'], @attrs[2].enumeration
86
+ end
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,167 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestBuilder < Nokogiri::TestCase
6
+ def test_with_root
7
+ doc = Nokogiri::XML(File.read(XML_FILE))
8
+ Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
9
+ xml.foo
10
+ end
11
+ assert_equal 1, doc.xpath('//employee/foo').length
12
+ end
13
+
14
+ def test_root_namespace_default_decl
15
+ b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
16
+ doc = b.doc
17
+ assert_equal 'one:two', doc.root.namespace.href
18
+ assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
19
+ end
20
+
21
+ def test_root_namespace_multi_decl
22
+ b = Nokogiri::XML::Builder.new { |xml|
23
+ xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
24
+ xml.hello
25
+ end
26
+ }
27
+ doc = b.doc
28
+ assert_equal 'one:two', doc.root.namespace.href
29
+ assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
30
+
31
+ assert_equal 'one:two', doc.at('hello').namespace.href
32
+ end
33
+
34
+ def test_non_root_namespace
35
+ b = Nokogiri::XML::Builder.new { |xml|
36
+ xml.root { xml.hello(:xmlns => 'one') }
37
+ }
38
+ assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
39
+ end
40
+
41
+ def test_specify_namespace
42
+ b = Nokogiri::XML::Builder.new { |xml|
43
+ xml.root('xmlns:foo' => 'bar') do
44
+ xml[:foo].bar
45
+ xml['foo'].baz
46
+ end
47
+ }
48
+ doc = b.doc
49
+ assert_equal 'bar', b.doc.at('foo|bar', 'foo' => 'bar').namespace.href
50
+ assert_equal 'bar', b.doc.at('foo|baz', 'foo' => 'bar').namespace.href
51
+ end
52
+
53
+ def test_specify_namespace_nested
54
+ b = Nokogiri::XML::Builder.new { |xml|
55
+ xml.root('xmlns:foo' => 'bar') do
56
+ xml.yay do
57
+ xml[:foo].bar
58
+
59
+ xml.yikes do
60
+ xml['foo'].baz
61
+ end
62
+ end
63
+ end
64
+ }
65
+ doc = b.doc
66
+ assert_equal 'bar', b.doc.at('foo|bar', 'foo' => 'bar').namespace.href
67
+ assert_equal 'bar', b.doc.at('foo|baz', 'foo' => 'bar').namespace.href
68
+ end
69
+
70
+ def test_specified_namespace_undeclared
71
+ b = Nokogiri::XML::Builder.new { |xml|
72
+ xml.root do
73
+ assert_raises(ArgumentError) do
74
+ xml[:foo]
75
+ end
76
+ end
77
+ }
78
+ end
79
+
80
+ def test_set_encoding
81
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
82
+ xml.root do
83
+ xml.bar 'blah'
84
+ end
85
+ end
86
+ assert_match 'UTF-8', builder.to_xml
87
+ end
88
+
89
+ def test_bang_and_underscore_is_escaped
90
+ builder = Nokogiri::XML::Builder.new do |xml|
91
+ xml.root do
92
+ xml.p_('adsfadsf')
93
+ xml.p!('adsfadsf')
94
+ end
95
+ end
96
+ assert_equal 2, builder.doc.xpath('//p').length
97
+ end
98
+
99
+ def test_square_brackets_set_attributes
100
+ builder = Nokogiri::XML::Builder.new do |xml|
101
+ xml.root do
102
+ foo = xml.foo
103
+ foo['id'] = 'hello'
104
+ assert_equal 'hello', foo['id']
105
+ end
106
+ end
107
+ assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
108
+ end
109
+
110
+ def test_nested_local_variable
111
+ @ivar = 'hello'
112
+ local_var = 'hello world'
113
+ builder = Nokogiri::XML::Builder.new do |xml|
114
+ xml.root do
115
+ xml.foo local_var
116
+ xml.bar @ivar
117
+ xml.baz {
118
+ xml.text @ivar
119
+ }
120
+ end
121
+ end
122
+
123
+ assert_equal 'hello world', builder.doc.at('//root/foo').content
124
+ assert_equal 'hello', builder.doc.at('//root/bar').content
125
+ assert_equal 'hello', builder.doc.at('baz').content
126
+ end
127
+
128
+ def test_raw_append
129
+ builder = Nokogiri::XML::Builder.new do |xml|
130
+ xml.root do
131
+ xml << 'hello'
132
+ end
133
+ end
134
+
135
+ assert_equal 'hello', builder.doc.at('/root').content
136
+ end
137
+
138
+ def test_raw_append_with_instance_eval
139
+ builder = Nokogiri::XML::Builder.new do
140
+ root do
141
+ self << 'hello'
142
+ end
143
+ end
144
+
145
+ assert_equal 'hello', builder.doc.at('/root').content
146
+ end
147
+
148
+ def test_cdata
149
+ builder = Nokogiri::XML::Builder.new do
150
+ root {
151
+ cdata "hello world"
152
+ }
153
+ end
154
+ assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
155
+ end
156
+
157
+ def test_builder_no_block
158
+ string = "hello world"
159
+ builder = Nokogiri::XML::Builder.new
160
+ builder.root {
161
+ cdata string
162
+ }
163
+ assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,38 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestCDATA < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
9
+ end
10
+
11
+ def test_cdata_node
12
+ name = @xml.xpath('//employee[2]/name').first
13
+ assert cdata = name.children[1]
14
+ assert cdata.cdata?
15
+ assert_equal '#cdata-section', cdata.name
16
+ end
17
+
18
+ def test_new
19
+ node = CDATA.new(@xml, "foo")
20
+ assert_equal "foo", node.content
21
+
22
+ node = CDATA.new(@xml.root, "foo")
23
+ assert_equal "foo", node.content
24
+ end
25
+
26
+ def test_new_with_nil
27
+ node = CDATA.new(@xml, nil)
28
+ assert_equal nil, node.content
29
+ end
30
+
31
+ def test_lots_of_new_cdata
32
+ 100.times {
33
+ node = CDATA.new(@xml, "asdfasdf")
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestComment < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
9
+ end
10
+
11
+ def test_new
12
+ comment = Nokogiri::XML::Comment.new(@xml, 'hello world')
13
+ assert_equal('<!--hello world-->', comment.to_s)
14
+ end
15
+
16
+ def test_comment?
17
+ comment = Nokogiri::XML::Comment.new(@xml, 'hello world')
18
+ assert(comment.comment?)
19
+ assert(!@xml.root.comment?)
20
+ end
21
+
22
+ def test_many_comments
23
+ 100.times {
24
+ Nokogiri::XML::Comment.new(@xml, 'hello world')
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,638 @@
1
+ require "helper"
2
+
3
+ require 'uri'
4
+
5
+ module Nokogiri
6
+ module XML
7
+ class TestDocument < Nokogiri::TestCase
8
+ def setup
9
+ super
10
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
11
+ end
12
+
13
+ def test_collect_namespaces
14
+ doc = Nokogiri::XML(<<-eoxml)
15
+ <xml>
16
+ <foo xmlns='hello'>
17
+ <bar xmlns:foo='world' />
18
+ </foo>
19
+ </xml>
20
+ eoxml
21
+ assert_equal({"xmlns"=>"hello", "xmlns:foo"=>"world"},
22
+ doc.collect_namespaces)
23
+ end
24
+
25
+ def test_subclass_initialize_modify # testing a segv
26
+ Class.new(Nokogiri::XML::Document) {
27
+ def initialize
28
+ super
29
+ body_node = Nokogiri::XML::Node.new "body", self
30
+ body_node.content = "stuff"
31
+ self.root = body_node
32
+ end
33
+ }.new
34
+ end
35
+
36
+ def test_create_text_node
37
+ txt = @xml.create_text_node 'foo'
38
+ assert_instance_of Nokogiri::XML::Text, txt
39
+ assert_equal 'foo', txt.text
40
+ assert_equal @xml, txt.document
41
+ end
42
+
43
+ def test_create_element
44
+ elm = @xml.create_element('foo')
45
+ assert_instance_of Nokogiri::XML::Element, elm
46
+ assert_equal 'foo', elm.name
47
+ assert_equal @xml, elm.document
48
+ end
49
+
50
+ def test_pp
51
+ out = StringIO.new('')
52
+ assert_nothing_raised do
53
+ ::PP.pp @xml, out
54
+ end
55
+ end
56
+
57
+ def test_create_internal_subset_on_existing_subset
58
+ assert_not_nil @xml.internal_subset
59
+ assert_raises(RuntimeError) do
60
+ @xml.create_internal_subset('staff', nil, 'staff.dtd')
61
+ end
62
+ end
63
+
64
+ def test_create_internal_subset
65
+ xml = Nokogiri::XML('<root />')
66
+ assert_nil xml.internal_subset
67
+
68
+ xml.create_internal_subset('name', nil, 'staff.dtd')
69
+ ss = xml.internal_subset
70
+ assert_equal 'name', ss.name
71
+ assert_nil ss.external_id
72
+ assert_equal 'staff.dtd', ss.system_id
73
+ end
74
+
75
+ def test_external_subset
76
+ assert_nil @xml.external_subset
77
+ Dir.chdir(ASSETS_DIR) do
78
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) { |cfg|
79
+ cfg.dtdload
80
+ }
81
+ end
82
+ assert @xml.external_subset
83
+ end
84
+
85
+ def test_create_external_subset_fails_with_existing_subset
86
+ assert_nil @xml.external_subset
87
+ Dir.chdir(ASSETS_DIR) do
88
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) { |cfg|
89
+ cfg.dtdload
90
+ }
91
+ end
92
+ assert @xml.external_subset
93
+
94
+ assert_raises(RuntimeError) do
95
+ @xml.create_external_subset('staff', nil, 'staff.dtd')
96
+ end
97
+ end
98
+
99
+ def test_create_external_subset
100
+ dtd = @xml.create_external_subset('staff', nil, 'staff.dtd')
101
+ assert_nil dtd.external_id
102
+ assert_equal 'staff.dtd', dtd.system_id
103
+ assert_equal 'staff', dtd.name
104
+ assert_equal dtd, @xml.external_subset
105
+ end
106
+
107
+ def test_version
108
+ assert_equal '1.0', @xml.version
109
+ end
110
+
111
+ def test_add_namespace
112
+ assert_raise NoMethodError do
113
+ @xml.add_namespace('foo', 'bar')
114
+ end
115
+ end
116
+
117
+ def test_attributes
118
+ assert_raise NoMethodError do
119
+ @xml.attributes
120
+ end
121
+ end
122
+
123
+ def test_namespace
124
+ assert_raise NoMethodError do
125
+ @xml.namespace
126
+ end
127
+ end
128
+
129
+ def test_namespace_definitions
130
+ assert_raise NoMethodError do
131
+ @xml.namespace_definitions
132
+ end
133
+ end
134
+
135
+ def test_line
136
+ assert_raise NoMethodError do
137
+ @xml.line
138
+ end
139
+ end
140
+
141
+ def test_empty_node_converted_to_html_is_not_self_closing
142
+ doc = Nokogiri::XML('<a></a>')
143
+ assert_equal "<a></a>", doc.inner_html
144
+ end
145
+
146
+ def test_fragment
147
+ fragment = @xml.fragment
148
+ assert_equal 0, fragment.children.length
149
+ end
150
+
151
+ def test_add_child_fragment_with_single_node
152
+ doc = Nokogiri::XML::Document.new
153
+ fragment = doc.fragment('<hello />')
154
+ doc.add_child fragment
155
+ assert_equal '/hello', doc.at('//hello').path
156
+ assert_equal 'hello', doc.root.name
157
+ end
158
+
159
+ def test_add_child_fragment_with_multiple_nodes
160
+ doc = Nokogiri::XML::Document.new
161
+ fragment = doc.fragment('<hello /><goodbye />')
162
+ assert_raises(RuntimeError) do
163
+ doc.add_child fragment
164
+ end
165
+ end
166
+
167
+ def test_add_child_with_multiple_roots
168
+ assert_raises(RuntimeError) do
169
+ @xml << Node.new('foo', @xml)
170
+ end
171
+ end
172
+
173
+ def test_move_root_to_document_with_no_root
174
+ sender = Nokogiri::XML('<root>foo</root>')
175
+ newdoc = Nokogiri::XML::Document.new
176
+ newdoc.root = sender.root
177
+ end
178
+
179
+ def test_move_root_with_existing_root_gets_gcd
180
+ doc = Nokogiri::XML('<root>test</root>')
181
+ doc2 = Nokogiri::XML("<root>#{'x' * 5000000}</root>")
182
+ doc2.root = doc.root
183
+ end
184
+
185
+ def test_validate
186
+ if Nokogiri.uses_libxml?
187
+ assert_equal 44, @xml.validate.length
188
+ else
189
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) {|cfg| cfg.dtdvalid}
190
+ assert_equal 37, xml.validate.length
191
+ end
192
+ end
193
+
194
+ def test_validate_no_internal_subset
195
+ doc = Nokogiri::XML('<test/>')
196
+ assert_nil doc.validate
197
+ end
198
+
199
+ def test_clone
200
+ assert @xml.clone
201
+ end
202
+
203
+ def test_document_should_not_have_default_ns
204
+ doc = Nokogiri::XML::Document.new
205
+
206
+ assert_raises NoMethodError do
207
+ doc.default_namespace = 'http://innernet.com/'
208
+ end
209
+
210
+ assert_raises NoMethodError do
211
+ doc.add_namespace_definition('foo', 'bar')
212
+ end
213
+ end
214
+
215
+ def test_parse_handles_nil_gracefully
216
+ assert_nothing_raised do
217
+ @doc = Nokogiri::XML::Document.parse(nil)
218
+ end
219
+ assert_instance_of Nokogiri::XML::Document, @doc
220
+ end
221
+
222
+ def test_parse_takes_block
223
+ options = nil
224
+ Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) do |cfg|
225
+ options = cfg
226
+ end
227
+ assert options
228
+ end
229
+
230
+ def test_parse_yields_parse_options
231
+ options = nil
232
+ Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) do |cfg|
233
+ options = cfg
234
+ options.nonet.nowarning.dtdattr
235
+ end
236
+ assert options.nonet?
237
+ assert options.nowarning?
238
+ assert options.dtdattr?
239
+ end
240
+
241
+ def test_XML_takes_block
242
+ options = nil
243
+ Nokogiri::XML(File.read(XML_FILE), XML_FILE) do |cfg|
244
+ options = cfg
245
+ options.nonet.nowarning.dtdattr
246
+ end
247
+ assert options.nonet?
248
+ assert options.nowarning?
249
+ assert options.dtdattr?
250
+ end
251
+
252
+ def test_subclass
253
+ klass = Class.new(Nokogiri::XML::Document)
254
+ doc = klass.new
255
+ assert_instance_of klass, doc
256
+ end
257
+
258
+ def test_subclass_initialize
259
+ klass = Class.new(Nokogiri::XML::Document) do
260
+ attr_accessor :initialized_with
261
+
262
+ def initialize(*args)
263
+ @initialized_with = args
264
+ end
265
+ end
266
+ doc = klass.new("1.0", 1)
267
+ assert_equal ["1.0", 1], doc.initialized_with
268
+ end
269
+
270
+ def test_subclass_dup
271
+ klass = Class.new(Nokogiri::XML::Document)
272
+ doc = klass.new.dup
273
+ assert_instance_of klass, doc
274
+ end
275
+
276
+ def test_subclass_parse
277
+ klass = Class.new(Nokogiri::XML::Document)
278
+ doc = klass.parse(File.read(XML_FILE))
279
+ assert_equal @xml.to_s, doc.to_s
280
+ assert_instance_of klass, doc
281
+ end
282
+
283
+ def test_document_parse_method
284
+ xml = Nokogiri::XML::Document.parse(File.read(XML_FILE))
285
+ assert_equal @xml.to_s, xml.to_s
286
+ end
287
+
288
+ def test_encoding=
289
+ @xml.encoding = 'UTF-8'
290
+ assert_match 'UTF-8', @xml.to_xml
291
+
292
+ @xml.encoding = 'EUC-JP'
293
+ assert_match 'EUC-JP', @xml.to_xml
294
+ end
295
+
296
+ def test_namespace_should_not_exist
297
+ assert_raises(NoMethodError) {
298
+ @xml.namespace
299
+ }
300
+ end
301
+
302
+ def test_non_existant_function
303
+ # WTF. I don't know why this is different between MRI and ffi.
304
+ # They should be the same... Either way, raising an exception
305
+ # is the correct thing to do.
306
+ exception = RuntimeError
307
+
308
+ if !Nokogiri.uses_libxml? || (Nokogiri.uses_libxml? && Nokogiri::VERSION_INFO['libxml']['platform'] == 'jruby')
309
+ exception = Nokogiri::XML::XPath::SyntaxError
310
+ end
311
+
312
+ assert_raises(exception) {
313
+ @xml.xpath('//name[foo()]')
314
+ }
315
+ end
316
+
317
+ def test_ancestors
318
+ assert_equal 0, @xml.ancestors.length
319
+ end
320
+
321
+ def test_root_node_parent_is_document
322
+ parent = @xml.root.parent
323
+ assert_equal @xml, parent
324
+ assert_instance_of Nokogiri::XML::Document, parent
325
+ end
326
+
327
+ def test_xmlns_is_automatically_registered
328
+ doc = Nokogiri::XML(<<-eoxml)
329
+ <root xmlns="http://tenderlovemaking.com/">
330
+ <foo>
331
+ bar
332
+ </foo>
333
+ </root>
334
+ eoxml
335
+ assert_equal 1, doc.css('xmlns|foo').length
336
+ assert_equal 1, doc.css('foo').length
337
+ assert_equal 0, doc.css('|foo').length
338
+ assert_equal 1, doc.xpath('//xmlns:foo').length
339
+ assert_equal 1, doc.search('xmlns|foo').length
340
+ assert_equal 1, doc.search('//xmlns:foo').length
341
+ assert doc.at('xmlns|foo')
342
+ assert doc.at('//xmlns:foo')
343
+ assert doc.at('foo')
344
+ end
345
+
346
+ def test_xmlns_is_registered_for_nodesets
347
+ doc = Nokogiri::XML(<<-eoxml)
348
+ <root xmlns="http://tenderlovemaking.com/">
349
+ <foo>
350
+ <bar>
351
+ baz
352
+ </bar>
353
+ </foo>
354
+ </root>
355
+ eoxml
356
+ assert_equal 1, doc.css('xmlns|foo').css('xmlns|bar').length
357
+ assert_equal 1, doc.css('foo').css('bar').length
358
+ assert_equal 1, doc.xpath('//xmlns:foo').xpath('./xmlns:bar').length
359
+ assert_equal 1, doc.search('xmlns|foo').search('xmlns|bar').length
360
+ assert_equal 1, doc.search('//xmlns:foo').search('./xmlns:bar').length
361
+ end
362
+
363
+ def test_to_xml_with_indent
364
+ doc = Nokogiri::XML('<root><foo><bar/></foo></root>')
365
+ doc = Nokogiri::XML(doc.to_xml(:indent => 5))
366
+
367
+ assert_indent 5, doc
368
+ end
369
+
370
+ def test_write_xml_to_with_indent
371
+ io = StringIO.new
372
+ doc = Nokogiri::XML('<root><foo><bar/></foo></root>')
373
+ doc.write_xml_to io, :indent => 5
374
+ io.rewind
375
+ doc = Nokogiri::XML(io.read)
376
+ assert_indent 5, doc
377
+ end
378
+
379
+ # wtf... osx's libxml sucks.
380
+ unless !Nokogiri.uses_libxml? || Nokogiri::LIBXML_VERSION =~ /^2\.6\./
381
+ def test_encoding
382
+ xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE, 'UTF-8')
383
+ assert_equal 'UTF-8', xml.encoding
384
+ end
385
+ end
386
+
387
+ def test_document_has_errors
388
+ doc = Nokogiri::XML(<<-eoxml)
389
+ <foo><bar></foo>
390
+ eoxml
391
+ assert doc.errors.length > 0
392
+ doc.errors.each do |error|
393
+ assert_match error.message, error.inspect
394
+ assert_match error.message, error.to_s
395
+ end
396
+ end
397
+
398
+ def test_strict_document_throws_syntax_error
399
+ assert_raises(Nokogiri::XML::SyntaxError) {
400
+ Nokogiri::XML('<foo><bar></foo>', nil, nil, 0)
401
+ }
402
+
403
+ assert_raises(Nokogiri::XML::SyntaxError) {
404
+ Nokogiri::XML('<foo><bar></foo>') { |cfg|
405
+ cfg.strict
406
+ }
407
+ }
408
+
409
+ assert_raises(Nokogiri::XML::SyntaxError) {
410
+ Nokogiri::XML(StringIO.new('<foo><bar></foo>')) { |cfg|
411
+ cfg.strict
412
+ }
413
+ }
414
+ end
415
+
416
+ def test_XML_function
417
+ xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
418
+ assert xml.xml?
419
+ end
420
+
421
+ def test_url
422
+ assert @xml.url
423
+ assert_equal XML_FILE, URI.unescape(@xml.url).sub('file:///', '')
424
+ end
425
+
426
+ def test_document_parent
427
+ xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
428
+ assert_raises(NoMethodError) {
429
+ xml.parent
430
+ }
431
+ end
432
+
433
+ def test_document_name
434
+ xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
435
+ assert_equal 'document', xml.name
436
+ end
437
+
438
+ def test_parse_can_take_io
439
+ xml = nil
440
+ File.open(XML_FILE, 'rb') { |f|
441
+ xml = Nokogiri::XML(f)
442
+ }
443
+ assert xml.xml?
444
+ set = xml.search('//employee')
445
+ assert set.length > 0
446
+ end
447
+
448
+ def test_search_on_empty_documents
449
+ doc = Nokogiri::XML::Document.new
450
+ ns = doc.search('//foo')
451
+ assert_equal 0, ns.length
452
+
453
+ ns = doc.css('foo')
454
+ assert_equal 0, ns.length
455
+
456
+ ns = doc.xpath('//foo')
457
+ assert_equal 0, ns.length
458
+ end
459
+
460
+ def test_bad_xpath_raises_syntax_error
461
+ assert_raises(XML::XPath::SyntaxError) {
462
+ @xml.xpath('\\')
463
+ }
464
+ end
465
+
466
+ def test_find_with_namespace
467
+ doc = Nokogiri::XML.parse(<<-eoxml)
468
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
469
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
470
+ </x>
471
+ eoxml
472
+
473
+ ctx = Nokogiri::XML::XPathContext.new(doc)
474
+ ctx.register_ns 'tenderlove', 'http://tenderlovemaking.com/'
475
+ set = ctx.evaluate('//tenderlove:foo').node_set
476
+ assert_equal 1, set.length
477
+ assert_equal 'foo', set.first.name
478
+
479
+ # It looks like only the URI is important:
480
+ ctx = Nokogiri::XML::XPathContext.new(doc)
481
+ ctx.register_ns 'america', 'http://tenderlovemaking.com/'
482
+ set = ctx.evaluate('//america:foo').node_set
483
+ assert_equal 1, set.length
484
+ assert_equal 'foo', set.first.name
485
+
486
+ # Its so important that a missing slash will cause it to return nothing
487
+ ctx = Nokogiri::XML::XPathContext.new(doc)
488
+ ctx.register_ns 'america', 'http://tenderlovemaking.com'
489
+ set = ctx.evaluate('//america:foo').node_set
490
+ assert_equal 0, set.length
491
+ end
492
+
493
+ def test_xml?
494
+ assert @xml.xml?
495
+ end
496
+
497
+ def test_document
498
+ assert @xml.document
499
+ end
500
+
501
+ def test_singleton_methods
502
+ assert node_set = @xml.search('//name')
503
+ assert node_set.length > 0
504
+ node = node_set.first
505
+ def node.test
506
+ 'test'
507
+ end
508
+ assert node_set = @xml.search('//name')
509
+ assert_equal 'test', node_set.first.test
510
+ end
511
+
512
+ def test_multiple_search
513
+ assert node_set = @xml.search('//employee', '//name')
514
+ employees = @xml.search('//employee')
515
+ names = @xml.search('//name')
516
+ assert_equal(employees.length + names.length, node_set.length)
517
+ end
518
+
519
+ def test_node_set_index
520
+ assert node_set = @xml.search('//employee')
521
+
522
+ assert_equal(5, node_set.length)
523
+ assert node_set[4]
524
+ assert_nil node_set[5]
525
+ end
526
+
527
+ def test_search
528
+ assert node_set = @xml.search('//employee')
529
+
530
+ assert_equal(5, node_set.length)
531
+
532
+ node_set.each do |node|
533
+ assert_equal('employee', node.name)
534
+ end
535
+ end
536
+
537
+ def test_dump
538
+ assert @xml.serialize
539
+ assert @xml.to_xml
540
+ end
541
+
542
+ def test_dup
543
+ dup = @xml.dup
544
+ assert_instance_of Nokogiri::XML::Document, dup
545
+ assert dup.xml?, 'duplicate should be xml'
546
+ end
547
+
548
+ def test_subset_is_decorated
549
+ x = Module.new do
550
+ def awesome!
551
+ end
552
+ end
553
+ util_decorate(@xml, x)
554
+
555
+ assert @xml.respond_to?(:awesome!)
556
+ assert node_set = @xml.search('//staff')
557
+ assert node_set.respond_to?(:awesome!)
558
+ assert subset = node_set.search('.//employee')
559
+ assert subset.respond_to?(:awesome!)
560
+ assert sub_subset = node_set.search('.//name')
561
+ assert sub_subset.respond_to?(:awesome!)
562
+ end
563
+
564
+ def test_decorator_is_applied
565
+ x = Module.new do
566
+ def awesome!
567
+ end
568
+ end
569
+ util_decorate(@xml, x)
570
+
571
+ assert @xml.respond_to?(:awesome!)
572
+ assert node_set = @xml.search('//employee')
573
+ assert node_set.respond_to?(:awesome!)
574
+ node_set.each do |node|
575
+ assert node.respond_to?(:awesome!), node.class
576
+ end
577
+ assert @xml.root.respond_to?(:awesome!)
578
+ end
579
+
580
+ def test_new
581
+ doc = nil
582
+ assert_nothing_raised {
583
+ doc = Nokogiri::XML::Document.new
584
+ }
585
+ assert doc
586
+ assert doc.xml?
587
+ assert_nil doc.root
588
+ end
589
+
590
+ def test_set_root
591
+ doc = nil
592
+ assert_nothing_raised {
593
+ doc = Nokogiri::XML::Document.new
594
+ }
595
+ assert doc
596
+ assert doc.xml?
597
+ assert_nil doc.root
598
+ node = Nokogiri::XML::Node.new("b", doc) { |n|
599
+ n.content = 'hello world'
600
+ }
601
+ assert_equal('hello world', node.content)
602
+ doc.root = node
603
+ assert_equal(node, doc.root)
604
+ end
605
+
606
+ def test_remove_namespaces
607
+ doc = Nokogiri::XML <<-EOX
608
+ <root xmlns:a="http://a.flavorjon.es/" xmlns:b="http://b.flavorjon.es/">
609
+ <a:foo>hello from a</a:foo>
610
+ <b:foo>hello from b</b:foo>
611
+ <container xmlns:c="http://c.flavorjon.es/">
612
+ <c:foo>hello from c</c:foo>
613
+ </container>
614
+ </root>
615
+ EOX
616
+
617
+ # assert on setup
618
+ assert_equal 0, doc.xpath("//foo").length
619
+ assert_equal 1, doc.xpath("//a:foo").length
620
+ assert_equal 1, doc.xpath("//a:foo").length
621
+ assert_equal 1, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
622
+
623
+ doc.remove_namespaces!
624
+
625
+ assert_equal 3, doc.xpath("//foo").length
626
+ assert_equal 0, doc.xpath("//a:foo").length
627
+ assert_equal 0, doc.xpath("//a:foo").length
628
+ assert_equal 0, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
629
+ end
630
+
631
+ def util_decorate(document, x)
632
+ document.decorators(XML::Node) << x
633
+ document.decorators(XML::NodeSet) << x
634
+ document.decorate!
635
+ end
636
+ end
637
+ end
638
+ end