nokogiri 1.6.0 → 1.13.2

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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -19
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +23 -4
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +952 -132
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +231 -96
  18. data/ext/nokogiri/nokogiri.h +188 -129
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +269 -177
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -58
  93. data/lib/nokogiri/css/parser.rb +407 -357
  94. data/lib/nokogiri/css/parser.y +265 -246
  95. data/lib/nokogiri/css/parser_extras.rb +52 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +8 -7
  99. data/lib/nokogiri/css/xpath_visitor.rb +266 -80
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/html4/document.rb +331 -0
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +221 -0
  123. data/lib/nokogiri/version.rb +3 -105
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +96 -54
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -41
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +270 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +278 -362
  177. data/.autotest +0 -26
  178. data/.gemtest +0 -0
  179. data/.travis.yml +0 -27
  180. data/CHANGELOG.ja.rdoc +0 -819
  181. data/CHANGELOG.rdoc +0 -819
  182. data/C_CODING_STYLE.rdoc +0 -33
  183. data/Manifest.txt +0 -315
  184. data/README.ja.rdoc +0 -106
  185. data/README.rdoc +0 -175
  186. data/ROADMAP.md +0 -90
  187. data/Rakefile +0 -246
  188. data/STANDARD_RESPONSES.md +0 -47
  189. data/Y_U_NO_GEMSPEC.md +0 -155
  190. data/build_all +0 -105
  191. data/ext/nokogiri/html_document.c +0 -170
  192. data/ext/nokogiri/html_document.h +0 -10
  193. data/ext/nokogiri/html_element_description.c +0 -279
  194. data/ext/nokogiri/html_element_description.h +0 -10
  195. data/ext/nokogiri/html_entity_lookup.c +0 -32
  196. data/ext/nokogiri/html_entity_lookup.h +0 -8
  197. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  198. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  199. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  200. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  201. data/ext/nokogiri/xml_attr.h +0 -9
  202. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  203. data/ext/nokogiri/xml_cdata.h +0 -9
  204. data/ext/nokogiri/xml_comment.h +0 -9
  205. data/ext/nokogiri/xml_document.h +0 -23
  206. data/ext/nokogiri/xml_document_fragment.h +0 -10
  207. data/ext/nokogiri/xml_dtd.h +0 -10
  208. data/ext/nokogiri/xml_element_content.h +0 -10
  209. data/ext/nokogiri/xml_element_decl.h +0 -9
  210. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  211. data/ext/nokogiri/xml_entity_decl.h +0 -10
  212. data/ext/nokogiri/xml_entity_reference.h +0 -9
  213. data/ext/nokogiri/xml_io.c +0 -56
  214. data/ext/nokogiri/xml_io.h +0 -11
  215. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  216. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  217. data/ext/nokogiri/xml_namespace.h +0 -13
  218. data/ext/nokogiri/xml_node.h +0 -13
  219. data/ext/nokogiri/xml_node_set.h +0 -14
  220. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  221. data/ext/nokogiri/xml_reader.h +0 -10
  222. data/ext/nokogiri/xml_relax_ng.h +0 -9
  223. data/ext/nokogiri/xml_sax_parser.h +0 -39
  224. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  225. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  226. data/ext/nokogiri/xml_schema.h +0 -9
  227. data/ext/nokogiri/xml_syntax_error.h +0 -13
  228. data/ext/nokogiri/xml_text.h +0 -9
  229. data/ext/nokogiri/xml_xpath_context.h +0 -10
  230. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  231. data/lib/nokogiri/html/document.rb +0 -254
  232. data/lib/nokogiri/html/document_fragment.rb +0 -41
  233. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  234. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  235. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  236. data/ports/archives/libxml2-2.8.0.tar.gz +0 -0
  237. data/ports/archives/libxslt-1.1.26.tar.gz +0 -0
  238. data/tasks/cross_compile.rb +0 -132
  239. data/tasks/nokogiri.org.rb +0 -24
  240. data/tasks/test.rb +0 -95
  241. data/test/css/test_nthiness.rb +0 -159
  242. data/test/css/test_parser.rb +0 -341
  243. data/test/css/test_tokenizer.rb +0 -198
  244. data/test/css/test_xpath_visitor.rb +0 -91
  245. data/test/decorators/test_slop.rb +0 -16
  246. data/test/files/2ch.html +0 -108
  247. data/test/files/address_book.rlx +0 -12
  248. data/test/files/address_book.xml +0 -10
  249. data/test/files/bar/bar.xsd +0 -4
  250. data/test/files/bogus.xml +0 -0
  251. data/test/files/dont_hurt_em_why.xml +0 -422
  252. data/test/files/encoding.html +0 -82
  253. data/test/files/encoding.xhtml +0 -84
  254. data/test/files/exslt.xml +0 -8
  255. data/test/files/exslt.xslt +0 -35
  256. data/test/files/foo/foo.xsd +0 -4
  257. data/test/files/metacharset.html +0 -10
  258. data/test/files/noencoding.html +0 -47
  259. data/test/files/po.xml +0 -32
  260. data/test/files/po.xsd +0 -66
  261. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  262. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  263. data/test/files/saml/xenc_schema.xsd +0 -146
  264. data/test/files/saml/xmldsig_schema.xsd +0 -318
  265. data/test/files/shift_jis.html +0 -10
  266. data/test/files/shift_jis.xml +0 -5
  267. data/test/files/snuggles.xml +0 -3
  268. data/test/files/staff.dtd +0 -10
  269. data/test/files/staff.xml +0 -59
  270. data/test/files/staff.xslt +0 -32
  271. data/test/files/test_document_url/bar.xml +0 -2
  272. data/test/files/test_document_url/document.dtd +0 -4
  273. data/test/files/test_document_url/document.xml +0 -6
  274. data/test/files/tlm.html +0 -850
  275. data/test/files/to_be_xincluded.xml +0 -2
  276. data/test/files/valid_bar.xml +0 -2
  277. data/test/files/xinclude.xml +0 -4
  278. data/test/helper.rb +0 -154
  279. data/test/html/sax/test_parser.rb +0 -141
  280. data/test/html/sax/test_parser_context.rb +0 -46
  281. data/test/html/test_builder.rb +0 -164
  282. data/test/html/test_document.rb +0 -552
  283. data/test/html/test_document_encoding.rb +0 -138
  284. data/test/html/test_document_fragment.rb +0 -261
  285. data/test/html/test_element_description.rb +0 -105
  286. data/test/html/test_named_characters.rb +0 -14
  287. data/test/html/test_node.rb +0 -196
  288. data/test/html/test_node_encoding.rb +0 -27
  289. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  290. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  291. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  292. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  293. data/test/test_convert_xpath.rb +0 -135
  294. data/test/test_css_cache.rb +0 -45
  295. data/test/test_encoding_handler.rb +0 -46
  296. data/test/test_memory_leak.rb +0 -156
  297. data/test/test_nokogiri.rb +0 -132
  298. data/test/test_reader.rb +0 -555
  299. data/test/test_soap4r_sax.rb +0 -52
  300. data/test/test_xslt_transforms.rb +0 -254
  301. data/test/xml/node/test_save_options.rb +0 -28
  302. data/test/xml/node/test_subclass.rb +0 -44
  303. data/test/xml/sax/test_parser.rb +0 -366
  304. data/test/xml/sax/test_parser_context.rb +0 -106
  305. data/test/xml/sax/test_push_parser.rb +0 -157
  306. data/test/xml/test_attr.rb +0 -64
  307. data/test/xml/test_attribute_decl.rb +0 -86
  308. data/test/xml/test_builder.rb +0 -306
  309. data/test/xml/test_c14n.rb +0 -151
  310. data/test/xml/test_cdata.rb +0 -48
  311. data/test/xml/test_comment.rb +0 -29
  312. data/test/xml/test_document.rb +0 -828
  313. data/test/xml/test_document_encoding.rb +0 -28
  314. data/test/xml/test_document_fragment.rb +0 -223
  315. data/test/xml/test_dtd.rb +0 -103
  316. data/test/xml/test_dtd_encoding.rb +0 -33
  317. data/test/xml/test_element_content.rb +0 -56
  318. data/test/xml/test_element_decl.rb +0 -73
  319. data/test/xml/test_entity_decl.rb +0 -122
  320. data/test/xml/test_entity_reference.rb +0 -245
  321. data/test/xml/test_namespace.rb +0 -95
  322. data/test/xml/test_node.rb +0 -1137
  323. data/test/xml/test_node_attributes.rb +0 -96
  324. data/test/xml/test_node_encoding.rb +0 -107
  325. data/test/xml/test_node_inheritance.rb +0 -32
  326. data/test/xml/test_node_reparenting.rb +0 -374
  327. data/test/xml/test_node_set.rb +0 -755
  328. data/test/xml/test_parse_options.rb +0 -64
  329. data/test/xml/test_processing_instruction.rb +0 -30
  330. data/test/xml/test_reader_encoding.rb +0 -142
  331. data/test/xml/test_relax_ng.rb +0 -60
  332. data/test/xml/test_schema.rb +0 -103
  333. data/test/xml/test_syntax_error.rb +0 -12
  334. data/test/xml/test_text.rb +0 -45
  335. data/test/xml/test_unparented_node.rb +0 -422
  336. data/test/xml/test_xinclude.rb +0 -83
  337. data/test/xml/test_xpath.rb +0 -295
  338. data/test/xslt/test_custom_functions.rb +0 -133
  339. data/test/xslt/test_exception_handling.rb +0 -37
  340. data/test_all +0 -81
@@ -1,1137 +0,0 @@
1
- require "helper"
2
-
3
- require 'stringio'
4
-
5
- module Nokogiri
6
- module XML
7
- class TestNode < Nokogiri::TestCase
8
- def setup
9
- super
10
- @xml = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
11
- end
12
-
13
- def test_first_element_child
14
- node = @xml.root.first_element_child
15
- assert_equal 'employee', node.name
16
- assert node.element?, 'node is an element'
17
- end
18
-
19
- def test_element_children
20
- nodes = @xml.root.element_children
21
- assert_equal @xml.root.first_element_child, nodes.first
22
- assert nodes.all? { |node| node.element? }, 'all nodes are elements'
23
- end
24
-
25
- def test_last_element_child
26
- nodes = @xml.root.element_children
27
- assert_equal nodes.last, @xml.root.element_children.last
28
- end
29
-
30
- def test_bad_xpath
31
- bad_xpath = '//foo['
32
-
33
- begin
34
- @xml.xpath(bad_xpath)
35
- rescue Nokogiri::XML::XPath::SyntaxError => e
36
- assert_match(bad_xpath, e.to_s)
37
- end
38
- end
39
-
40
- def test_namespace_type_error
41
- assert_raises(TypeError) do
42
- @xml.root.namespace = Object.new
43
- end
44
- end
45
-
46
- def test_remove_namespace
47
- @xml = Nokogiri::XML('<r xmlns="v"><s /></r>')
48
- tag = @xml.at('s')
49
- assert tag.namespace
50
- tag.namespace = nil
51
- assert_nil tag.namespace
52
- end
53
-
54
- def test_parse_needs_doc
55
- list = @xml.root.parse('fooooooo <hello />')
56
- assert_equal 1, list.css('hello').length
57
- end
58
-
59
- def test_parse
60
- list = @xml.root.parse('fooooooo <hello />')
61
- assert_equal 2, list.length
62
- end
63
-
64
- def test_parse_with_block
65
- called = false
66
- list = @xml.root.parse('<hello />') { |cfg|
67
- called = true
68
- assert_instance_of Nokogiri::XML::ParseOptions, cfg
69
- }
70
- assert called, 'config block called'
71
- assert_equal 1, list.length
72
- end
73
-
74
- def test_parse_with_io
75
- list = @xml.root.parse(StringIO.new('<hello />'))
76
- assert_equal 1, list.length
77
- assert_equal 'hello', list.first.name
78
- end
79
-
80
- def test_parse_with_empty_string
81
- list = @xml.root.parse('')
82
- assert_equal 0, list.length
83
- end
84
-
85
- def test_parse_config_option
86
- node = @xml.root
87
- options = nil
88
- node.parse("<item></item>") do |config|
89
- options = config
90
- end
91
- assert_equal Nokogiri::XML::ParseOptions::DEFAULT_XML, options.to_i
92
- end
93
-
94
- # descriptive, not prescriptive.
95
- def test_parse_invalid_html_markup_results_in_empty_nodeset
96
- doc = Nokogiri::HTML("<html></html>")
97
- nodeset = doc.root.parse "<div><div>a</div><snippet>b</snippet></div>"
98
- assert_equal 1, doc.errors.length # "Tag snippet invalid"
99
- assert_equal 1, nodeset.length
100
- end
101
-
102
- def test_node_context_parsing_of_malformed_html_fragment_with_recover_is_corrected
103
- doc = HTML.parse "<html><body><div></div></body></html>"
104
- context_node = doc.at_css "div"
105
- nodeset = context_node.parse("<div </div>") do |options|
106
- options.recover
107
- end
108
- assert_equal "<div></div>", nodeset.to_s
109
- assert_equal 1, doc.errors.length
110
- assert_equal 1, nodeset.length
111
- end
112
-
113
- def test_node_context_parsing_of_malformed_html_fragment_without_recover_is_not_corrected
114
- doc = HTML.parse "<html><body><div></div></body></html>"
115
- context_node = doc.at_css "div"
116
- nodeset = context_node.parse("<div </div>") do |options|
117
- options.strict
118
- end
119
- assert_equal 1, doc.errors.length
120
- assert_equal 0, nodeset.length
121
- end
122
-
123
- def test_parse_error_list
124
- error_count = @xml.errors.length
125
- @xml.root.parse('<hello>')
126
- assert(error_count < @xml.errors.length, "errors should have increased")
127
- end
128
-
129
- def test_parse_error_on_fragment_with_empty_document
130
- doc = Document.new
131
- fragment = DocumentFragment.new(doc, '<foo><bar/></foo>')
132
- node = fragment%'bar'
133
- node.parse('<baz><</baz>')
134
- end
135
-
136
- def test_subclass_dup
137
- subclass = Class.new(Nokogiri::XML::Node)
138
- node = subclass.new('foo', @xml).dup
139
- assert_instance_of subclass, node
140
- end
141
-
142
- def test_gt_string_arg
143
- node = @xml.at('employee')
144
- nodes = (node > 'name')
145
- assert_equal 1, nodes.length
146
- assert_equal node, nodes.first.parent
147
- end
148
-
149
- def test_next_element_when_next_sibling_is_element_should_return_next_sibling
150
- doc = Nokogiri::XML "<root><foo /><quux /></root>"
151
- node = doc.at_css("foo")
152
- next_element = node.next_element
153
- assert next_element.element?
154
- assert_equal doc.at_css("quux"), next_element
155
- end
156
-
157
- def test_next_element_when_there_is_no_next_sibling_should_return_nil
158
- doc = Nokogiri::XML "<root><foo /><quux /></root>"
159
- assert_nil doc.at_css("quux").next_element
160
- end
161
-
162
- def test_next_element_when_next_sibling_is_not_an_element_should_return_closest_next_element_sibling
163
- doc = Nokogiri::XML "<root><foo />bar<quux /></root>"
164
- node = doc.at_css("foo")
165
- next_element = node.next_element
166
- assert next_element.element?
167
- assert_equal doc.at_css("quux"), next_element
168
- end
169
-
170
- def test_next_element_when_next_sibling_is_not_an_element_and_no_following_element_should_return_nil
171
- doc = Nokogiri::XML "<root><foo />bar</root>"
172
- node = doc.at_css("foo")
173
- next_element = node.next_element
174
- assert_nil next_element
175
- end
176
-
177
- def test_previous_element_when_previous_sibling_is_element_should_return_previous_sibling
178
- doc = Nokogiri::XML "<root><foo /><quux /></root>"
179
- node = doc.at_css("quux")
180
- previous_element = node.previous_element
181
- assert previous_element.element?
182
- assert_equal doc.at_css("foo"), previous_element
183
- end
184
-
185
- def test_previous_element_when_there_is_no_previous_sibling_should_return_nil
186
- doc = Nokogiri::XML "<root><foo /><quux /></root>"
187
- assert_nil doc.at_css("foo").previous_element
188
- end
189
-
190
- def test_previous_element_when_previous_sibling_is_not_an_element_should_return_closest_previous_element_sibling
191
- doc = Nokogiri::XML "<root><foo />bar<quux /></root>"
192
- node = doc.at_css("quux")
193
- previous_element = node.previous_element
194
- assert previous_element.element?
195
- assert_equal doc.at_css("foo"), previous_element
196
- end
197
-
198
- def test_previous_element_when_previous_sibling_is_not_an_element_and_no_following_element_should_return_nil
199
- doc = Nokogiri::XML "<root>foo<bar /></root>"
200
- node = doc.at_css("bar")
201
- previous_element = node.previous_element
202
- assert_nil previous_element
203
- end
204
-
205
- def test_element?
206
- assert @xml.root.element?, 'is an element'
207
- end
208
-
209
- def test_slash_search
210
- assert_equal 'EMP0001', (@xml/:staff/:employee/:employeeId).first.text
211
- end
212
-
213
- def test_append_with_document
214
- assert_raises(ArgumentError) do
215
- @xml.root << Nokogiri::XML::Document.new
216
- end
217
- end
218
-
219
- def test_append_with_attr
220
- r = Nokogiri.XML('<r a="1" />').root
221
- assert_raises(ArgumentError) do
222
- r << r.at_xpath('@a')
223
- end
224
- end
225
-
226
- def test_inspect_ns
227
- xml = Nokogiri::XML(<<-eoxml) { |c| c.noblanks }
228
- <root xmlns="http://tenderlovemaking.com/" xmlns:foo="bar">
229
- <awesome/>
230
- </root>
231
- eoxml
232
- ins = xml.inspect
233
-
234
- xml.traverse do |node|
235
- assert_match node.class.name, ins
236
- if node.respond_to? :attributes
237
- node.attributes.each do |k,v|
238
- assert_match k, ins
239
- assert_match v, ins
240
- end
241
- end
242
-
243
- if node.respond_to?(:namespace) && node.namespace
244
- assert_match node.namespace.class.name, ins
245
- assert_match node.namespace.href, ins
246
- end
247
- end
248
- end
249
-
250
- def test_namespace_definitions_when_some_exist
251
- xml = Nokogiri::XML <<-eoxml
252
- <root xmlns="http://tenderlovemaking.com/" xmlns:foo="bar">
253
- <awesome/>
254
- </root>
255
- eoxml
256
- namespace_definitions = xml.root.namespace_definitions
257
- assert_equal 2, namespace_definitions.length
258
- end
259
-
260
- def test_namespace_definitions_when_no_exist
261
- xml = Nokogiri::XML <<-eoxml
262
- <root xmlns="http://tenderlovemaking.com/" xmlns:foo="bar">
263
- <awesome/>
264
- </root>
265
- eoxml
266
- namespace_definitions = xml.at_xpath('//xmlns:awesome').namespace_definitions
267
- assert_equal 0, namespace_definitions.length
268
- end
269
-
270
- def test_namespace_goes_to_children
271
- fruits = Nokogiri::XML(<<-eoxml)
272
- <Fruit xmlns='www.fruits.org'>
273
- </Fruit>
274
- eoxml
275
- apple = Nokogiri::XML::Node.new('Apple', fruits)
276
- orange = Nokogiri::XML::Node.new('Orange', fruits)
277
- apple << orange
278
- fruits.root << apple
279
- assert fruits.at('//fruit:Orange',{'fruit'=>'www.fruits.org'})
280
- assert fruits.at('//fruit:Apple',{'fruit'=>'www.fruits.org'})
281
- end
282
-
283
- def test_description
284
- assert_nil @xml.at('employee').description
285
- end
286
-
287
- def test_spaceship
288
- nodes = @xml.xpath('//employee')
289
- assert_equal(-1, (nodes.first <=> nodes.last))
290
- list = [nodes.first, nodes.last].sort
291
- assert_equal nodes.first, list.first
292
- assert_equal nodes.last, list.last
293
- end
294
-
295
- def test_incorrect_spaceship
296
- nodes = @xml.xpath('//employee')
297
- assert_nil(nodes.first <=> 'asdf')
298
- end
299
-
300
- def test_document_compare
301
- nodes = @xml.xpath('//employee')
302
- assert_equal(-1, (nodes.first <=> @xml))
303
- end
304
-
305
- def test_different_document_compare
306
- nodes = @xml.xpath('//employee')
307
- doc = Nokogiri::XML('<a><b/></a>')
308
- b = doc.at('b')
309
- assert_nil(nodes.first <=> b)
310
- end
311
-
312
- def test_duplicate_node_removes_namespace
313
- fruits = Nokogiri::XML(<<-eoxml)
314
- <Fruit xmlns='www.fruits.org'>
315
- <Apple></Apple>
316
- </Fruit>
317
- eoxml
318
- apple = fruits.root.xpath('fruit:Apple', {'fruit'=>'www.fruits.org'})[0]
319
- new_apple = apple.dup
320
- fruits.root << new_apple
321
- assert_equal 2, fruits.xpath('//xmlns:Apple').length
322
- assert_equal 1, fruits.to_xml.scan('www.fruits.org').length
323
- end
324
-
325
- [:clone, :dup].each do |symbol|
326
- define_method "test_#{symbol}" do
327
- node = @xml.at('//employee')
328
- other = node.send(symbol)
329
- assert_equal "employee", other.name
330
- assert_nil other.parent
331
- end
332
- end
333
-
334
- def test_fragment_creates_elements
335
- apple = @xml.fragment('<Apple/>')
336
- apple.children.each do |child|
337
- assert_equal Nokogiri::XML::Node::ELEMENT_NODE, child.type
338
- assert_instance_of Nokogiri::XML::Element, child
339
- end
340
- end
341
-
342
- def test_node_added_to_root_should_get_namespace
343
- fruits = Nokogiri::XML(<<-eoxml)
344
- <Fruit xmlns='http://www.fruits.org'>
345
- </Fruit>
346
- eoxml
347
- apple = fruits.fragment('<Apple/>')
348
- fruits.root << apple
349
- assert_equal 1, fruits.xpath('//xmlns:Apple').length
350
- end
351
-
352
- def test_new_node_can_have_ancestors
353
- xml = Nokogiri::XML('<root>text</root>')
354
- item = Nokogiri::XML::Element.new('item', xml)
355
- assert_equal 0, item.ancestors.length
356
- end
357
-
358
- def test_children
359
- doc = Nokogiri::XML(<<-eoxml)
360
- <root>#{'<a/>' * 9 }</root>
361
- eoxml
362
- assert_equal 9, doc.root.children.length
363
- assert_equal 9, doc.root.children.to_a.length
364
-
365
- doc = Nokogiri::XML(<<-eoxml)
366
- <root>#{'<a/>' * 15 }</root>
367
- eoxml
368
- assert_equal 15, doc.root.children.length
369
- assert_equal 15, doc.root.children.to_a.length
370
- end
371
-
372
- def test_add_namespace
373
- node = @xml.at('address')
374
- node.add_namespace('foo', 'http://tenderlovemaking.com')
375
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
376
- end
377
-
378
- def test_add_namespace_twice
379
- node = @xml.at('address')
380
- ns = node.add_namespace('foo', 'http://tenderlovemaking.com')
381
- ns2 = node.add_namespace('foo', 'http://tenderlovemaking.com')
382
- assert_equal ns, ns2
383
- end
384
-
385
- def test_add_default_ns
386
- node = @xml.at('address')
387
- node.add_namespace(nil, 'http://tenderlovemaking.com')
388
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns']
389
- end
390
-
391
- def test_add_multiple_namespaces
392
- node = @xml.at('address')
393
-
394
- node.add_namespace(nil, 'http://tenderlovemaking.com')
395
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns']
396
-
397
- node.add_namespace('foo', 'http://tenderlovemaking.com')
398
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
399
- end
400
-
401
- def test_default_namespace=
402
- node = @xml.at('address')
403
- node.default_namespace = 'http://tenderlovemaking.com'
404
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns']
405
- end
406
-
407
- def test_namespace=
408
- node = @xml.at('address')
409
- assert_nil node.namespace
410
- definition = node.add_namespace_definition 'bar', 'http://tlm.com/'
411
-
412
- node.namespace = definition
413
-
414
- assert_equal definition, node.namespace
415
-
416
- assert_equal node, @xml.at('//foo:address', {
417
- 'foo' => 'http://tlm.com/'
418
- })
419
- end
420
-
421
- def test_add_namespace_with_nil_associates_node
422
- node = @xml.at('address')
423
- assert_nil node.namespace
424
- definition = node.add_namespace_definition nil, 'http://tlm.com/'
425
- assert_equal definition, node.namespace
426
- end
427
-
428
- def test_add_namespace_does_not_associate_node
429
- node = @xml.at('address')
430
- assert_nil node.namespace
431
- assert node.add_namespace_definition 'foo', 'http://tlm.com/'
432
- assert_nil node.namespace
433
- end
434
-
435
- def test_set_namespace_from_different_doc
436
- node = @xml.at('address')
437
- doc = Nokogiri::XML(File.read(XML_FILE), XML_FILE)
438
- decl = doc.root.add_namespace_definition 'foo', 'bar'
439
-
440
- assert_raises(ArgumentError) do
441
- node.namespace = decl
442
- end
443
- end
444
-
445
- def test_set_namespace_must_only_take_a_namespace
446
- node = @xml.at('address')
447
- assert_raises(TypeError) do
448
- node.namespace = node
449
- end
450
- end
451
-
452
- def test_at
453
- node = @xml.at('address')
454
- assert_equal node, @xml.xpath('//address').first
455
- end
456
-
457
- def test_at_self
458
- node = @xml.at('address')
459
- assert_equal node, node.at('.')
460
- end
461
-
462
- def test_at_xpath
463
- node = @xml.at_xpath('//address')
464
- nodes = @xml.xpath('//address')
465
- assert_equal 5, nodes.size
466
- assert_equal node, nodes.first
467
- end
468
-
469
- def test_at_css
470
- node = @xml.at_css('address')
471
- nodes = @xml.css('address')
472
- assert_equal 5, nodes.size
473
- assert_equal node, nodes.first
474
- end
475
-
476
- def test_percent
477
- node = @xml % ('address')
478
- assert_equal node, @xml.xpath('//address').first
479
- end
480
-
481
- def test_accept
482
- visitor = Class.new {
483
- attr_accessor :visited
484
- def accept target
485
- target.accept(self)
486
- end
487
-
488
- def visit node
489
- node.children.each { |c| c.accept(self) }
490
- @visited = true
491
- end
492
- }.new
493
- visitor.accept(@xml.root)
494
- assert visitor.visited
495
- end
496
-
497
- def test_write_to
498
- io = StringIO.new
499
- @xml.write_to io
500
- io.rewind
501
- assert_equal @xml.to_xml, io.read
502
- end
503
-
504
- def test_attribute_with_symbol
505
- assert_equal 'Yes', @xml.css('address').first[:domestic]
506
- end
507
-
508
- def test_non_existent_attribute_should_return_nil
509
- node = @xml.root.first_element_child
510
- assert_nil node.attribute('type')
511
- end
512
-
513
- def test_write_to_with_block
514
- called = false
515
- io = StringIO.new
516
- conf = nil
517
- @xml.write_to io do |config|
518
- called = true
519
- conf = config
520
- config.format.as_html.no_empty_tags
521
- end
522
- io.rewind
523
- assert called
524
- string = io.read
525
- assert_equal @xml.serialize(nil, conf.options), string
526
- assert_equal @xml.serialize(nil, conf), string
527
- end
528
-
529
- %w{ xml html xhtml }.each do |type|
530
- define_method(:"test_write_#{type}_to") do
531
- io = StringIO.new
532
- assert @xml.send(:"write_#{type}_to", io)
533
- io.rewind
534
- assert_match @xml.send(:"to_#{type}"), io.read
535
- end
536
- end
537
-
538
- def test_serialize_with_block
539
- called = false
540
- conf = nil
541
- string = @xml.serialize do |config|
542
- called = true
543
- conf = config
544
- config.format.as_html.no_empty_tags
545
- end
546
- assert called
547
- assert_equal @xml.serialize(nil, conf.options), string
548
- assert_equal @xml.serialize(nil, conf), string
549
- end
550
-
551
- def test_hold_refence_to_subnode
552
- doc = Nokogiri::XML(<<-eoxml)
553
- <root>
554
- <a>
555
- <b />
556
- </a>
557
- </root>
558
- eoxml
559
- assert node_a = doc.css('a').first
560
- assert node_b = node_a.css('b').first
561
- node_a.unlink
562
- assert_equal 'b', node_b.name
563
- end
564
-
565
- def test_values
566
- assert_equal %w{ Yes Yes }, @xml.xpath('//address')[1].values
567
- end
568
-
569
- def test_keys
570
- assert_equal %w{ domestic street }, @xml.xpath('//address')[1].keys
571
- end
572
-
573
- def test_each
574
- attributes = []
575
- @xml.xpath('//address')[1].each do |key, value|
576
- attributes << [key, value]
577
- end
578
- assert_equal [['domestic', 'Yes'], ['street', 'Yes']], attributes
579
- end
580
-
581
- def test_new
582
- assert node = Nokogiri::XML::Node.new('input', @xml)
583
- assert_equal 1, node.node_type
584
- assert_instance_of Nokogiri::XML::Element, node
585
- end
586
-
587
- def test_to_str
588
- name = @xml.xpath('//name').first
589
- assert_match(/Margaret/, '' + name)
590
- assert_equal('Margaret Martin', '' + name.children.first)
591
- end
592
-
593
- def test_ancestors
594
- address = @xml.xpath('//address').first
595
- assert_equal 3, address.ancestors.length
596
- assert_equal ['employee', 'staff', 'document'],
597
- address.ancestors.map { |x| x.name }
598
- end
599
-
600
- def test_read_only?
601
- assert entity_decl = @xml.internal_subset.children.find { |x|
602
- x.type == Node::ENTITY_DECL
603
- }
604
- assert entity_decl.read_only?
605
- end
606
-
607
- def test_remove_attribute
608
- address = @xml.xpath('/staff/employee/address').first
609
- assert_equal 'Yes', address['domestic']
610
- address.remove_attribute 'domestic'
611
- assert_nil address['domestic']
612
- end
613
-
614
- def test_attribute_setter_accepts_non_string
615
- address = @xml.xpath("/staff/employee/address").first
616
- assert_equal "Yes", address[:domestic]
617
- address[:domestic] = "Altered Yes"
618
- assert_equal "Altered Yes", address[:domestic]
619
- end
620
-
621
- def test_attribute_accessor_accepts_non_string
622
- address = @xml.xpath("/staff/employee/address").first
623
- assert_equal "Yes", address["domestic"]
624
- assert_equal "Yes", address[:domestic]
625
- end
626
-
627
- def test_empty_attribute_reading
628
- node = Nokogiri::XML '<foo empty="" whitespace=" "/>'
629
-
630
- assert_equal '', node.root['empty']
631
- assert_equal ' ', node.root['whitespace']
632
- end
633
-
634
- def test_delete
635
- address = @xml.xpath('/staff/employee/address').first
636
- assert_equal 'Yes', address['domestic']
637
- address.delete 'domestic'
638
- assert_nil address['domestic']
639
- end
640
-
641
- def test_set_content_with_symbol
642
- node = @xml.at('//name')
643
- node.content = :foo
644
- assert_equal 'foo', node.content
645
- end
646
-
647
- def test_set_native_content_is_unescaped
648
- comment = Nokogiri.XML('<r><!-- foo --></r>').at('//comment()')
649
-
650
- comment.native_content = " < " # content= will escape this string
651
- assert_equal "<!-- < -->", comment.to_xml
652
- end
653
-
654
- def test_find_by_css_class_with_nonstandard_whitespace
655
- doc = Nokogiri::HTML '
656
- <html>
657
- <body>
658
- <div class="a
659
- b"></div>
660
- </body>
661
- </html>
662
- '
663
- assert_not_nil doc.at_css(".b")
664
- end
665
-
666
- def test_find_by_css_with_tilde_eql
667
- xml = Nokogiri::XML.parse(<<-eoxml)
668
- <root>
669
- <a>Hello world</a>
670
- <a class='foo bar'>Bar</a>
671
- <a class='bar foo'>Bar</a>
672
- <a class='bar'>Bar</a>
673
- <a class='baz bar foo'>Bar</a>
674
- <a class='bazbarfoo'>Awesome</a>
675
- <a class='bazbar'>Awesome</a>
676
- </root>
677
- eoxml
678
- set = xml.css('a[@class~="bar"]')
679
- assert_equal 4, set.length
680
- assert_equal ['Bar'], set.map { |node| node.content }.uniq
681
- end
682
-
683
- def test_unlink
684
- xml = Nokogiri::XML.parse(<<-eoxml)
685
- <root>
686
- <a class='foo bar'>Bar</a>
687
- <a class='bar foo'>Bar</a>
688
- <a class='bar'>Bar</a>
689
- <a>Hello world</a>
690
- <a class='baz bar foo'>Bar</a>
691
- <a class='bazbarfoo'>Awesome</a>
692
- <a class='bazbar'>Awesome</a>
693
- </root>
694
- eoxml
695
- node = xml.xpath('//a')[3]
696
- assert_equal('Hello world', node.text)
697
- assert_match(/Hello world/, xml.to_s)
698
- assert node.parent
699
- assert node.document
700
- assert node.previous_sibling
701
- assert node.next_sibling
702
- node.unlink
703
- assert !node.parent
704
- #assert !node.document
705
- assert !node.previous_sibling
706
- assert !node.next_sibling
707
- assert_no_match(/Hello world/, xml.to_s)
708
- end
709
-
710
- def test_next_sibling
711
- assert node = @xml.root
712
- assert sibling = node.child.next_sibling
713
- assert_equal('employee', sibling.name)
714
- end
715
-
716
- def test_previous_sibling
717
- assert node = @xml.root
718
- assert sibling = node.child.next_sibling
719
- assert_equal('employee', sibling.name)
720
- assert_equal(sibling.previous_sibling, node.child)
721
- end
722
-
723
- def test_name=
724
- assert node = @xml.root
725
- node.name = 'awesome'
726
- assert_equal('awesome', node.name)
727
- end
728
-
729
- def test_child
730
- assert node = @xml.root
731
- assert child = node.child
732
- assert_equal('text', child.name)
733
- end
734
-
735
- def test_key?
736
- assert node = @xml.search('//address').first
737
- assert(!node.key?('asdfasdf'))
738
- end
739
-
740
- def test_set_property
741
- assert node = @xml.search('//address').first
742
- node['foo'] = 'bar'
743
- assert_equal('bar', node['foo'])
744
- end
745
-
746
- def test_set_property_non_string
747
- assert node = @xml.search('//address').first
748
- node['foo'] = 1
749
- assert_equal('1', node['foo'])
750
- node['foo'] = false
751
- assert_equal('false', node['foo'])
752
- end
753
-
754
- def test_attributes
755
- assert node = @xml.search('//address').first
756
- assert_nil(node['asdfasdfasdf'])
757
- assert_equal('Yes', node['domestic'])
758
-
759
- assert node = @xml.search('//address')[2]
760
- attr = node.attributes
761
- assert_equal 2, attr.size
762
- assert_equal 'Yes', attr['domestic'].value
763
- assert_equal 'Yes', attr['domestic'].to_s
764
- assert_equal 'No', attr['street'].value
765
- end
766
-
767
- def test_path
768
- assert set = @xml.search('//employee')
769
- assert node = set.first
770
- assert_equal('/staff/employee[1]', node.path)
771
- end
772
-
773
- def test_parent_xpath
774
- assert set = @xml.search('//employee')
775
- assert node = set.first
776
- assert parent_set = node.search('..')
777
- assert parent_node = parent_set.first
778
- assert_equal '/staff', parent_node.path
779
- assert_equal node.parent, parent_node
780
- end
781
-
782
- def test_search_self
783
- node = @xml.at('//employee')
784
- assert_equal node.search('.').to_a, [node]
785
- end
786
-
787
- def test_search_by_symbol
788
- assert set = @xml.search(:employee)
789
- assert 5, set.length
790
-
791
- assert node = @xml.at(:employee)
792
- assert node.text =~ /EMP0001/
793
- end
794
-
795
- def test_new_node
796
- node = Nokogiri::XML::Node.new('form', @xml)
797
- assert_equal('form', node.name)
798
- assert(node.document)
799
- end
800
-
801
- def test_encode_special_chars
802
- foo = @xml.css('employee').first.encode_special_chars('&')
803
- assert_equal '&amp;', foo
804
- end
805
-
806
- def test_content_equals
807
- node = Nokogiri::XML::Node.new('form', @xml)
808
- assert_equal('', node.content)
809
-
810
- node.content = 'hello world!'
811
- assert_equal('hello world!', node.content)
812
-
813
- node.content = '& <foo> &amp;'
814
- assert_equal('& <foo> &amp;', node.content)
815
- assert_equal('<form>&amp; &lt;foo&gt; &amp;amp;</form>', node.to_xml)
816
-
817
- node.content = "1234 <-> 1234"
818
- assert_equal "1234 <-> 1234", node.content
819
- assert_equal "<form>1234 &lt;-&gt; 1234</form>", node.to_xml
820
-
821
- node.content = '1234'
822
- node.add_child '<foo>5678</foo>'
823
- assert_equal '12345678', node.content
824
- end
825
-
826
- # issue #839
827
- def test_encoding_of_copied_nodes
828
- d1 = Nokogiri::XML('<r><a>&amp;</a></r>')
829
- d2 = Nokogiri::XML('<r></r>')
830
- ne = d1.root.xpath('//a').first.dup(1)
831
- ne.content += "& < & > \" &"
832
- d2.root << ne
833
- assert_match /<a>&amp;&amp; &lt; &amp; &gt; " &amp;<\/a>/, d2.to_s
834
- end
835
-
836
- def test_content_after_appending_text
837
- doc = Nokogiri::XML '<foo />'
838
- node = doc.children.first
839
- node.content = 'bar'
840
- node << 'baz'
841
- assert_equal 'barbaz', node.content
842
- end
843
-
844
- def test_content_depth_first
845
- node = Nokogiri::XML '<foo>first<baz>second</baz>third</foo>'
846
- assert_equal 'firstsecondthird', node.content
847
- end
848
-
849
- def test_set_content_should_unlink_existing_content
850
- node = @xml.at_css("employee")
851
- children = node.children
852
- node.content = "hello"
853
- children.each { |child| assert_nil child.parent }
854
- end
855
-
856
- def test_whitespace_nodes
857
- doc = Nokogiri::XML.parse("<root><b>Foo</b>\n<i>Bar</i> <p>Bazz</p></root>")
858
- children = doc.at('//root').children.collect{|j| j.to_s}
859
- assert_equal "\n", children[1]
860
- assert_equal " ", children[3]
861
- end
862
-
863
- def test_node_equality
864
- doc1 = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
865
- doc2 = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
866
-
867
- address1_1 = doc1.xpath('//address').first
868
- address1_2 = doc1.xpath('//address').first
869
-
870
- address2 = doc2.xpath('//address').first
871
-
872
- assert_not_equal address1_1, address2 # two references to very, very similar nodes
873
- assert_equal address1_1, address1_2 # two references to the exact same node
874
- end
875
-
876
- def test_namespace_search_with_xpath_and_hash
877
- xml = Nokogiri::XML.parse(<<-eoxml)
878
- <root>
879
- <car xmlns:part="http://general-motors.com/">
880
- <part:tire>Michelin Model XGV</part:tire>
881
- </car>
882
- <bicycle xmlns:part="http://schwinn.com/">
883
- <part:tire>I'm a bicycle tire!</part:tire>
884
- </bicycle>
885
- </root>
886
- eoxml
887
-
888
- tires = xml.xpath('//bike:tire', {'bike' => 'http://schwinn.com/'})
889
- assert_equal 1, tires.length
890
- end
891
-
892
- def test_namespace_search_with_xpath_and_hash_with_symbol_keys
893
- xml = Nokogiri::XML.parse(<<-eoxml)
894
- <root>
895
- <car xmlns:part="http://general-motors.com/">
896
- <part:tire>Michelin Model XGV</part:tire>
897
- </car>
898
- <bicycle xmlns:part="http://schwinn.com/">
899
- <part:tire>I'm a bicycle tire!</part:tire>
900
- </bicycle>
901
- </root>
902
- eoxml
903
-
904
- tires = xml.xpath('//bike:tire', :bike => 'http://schwinn.com/')
905
- assert_equal 1, tires.length
906
- end
907
-
908
- def test_namespace_search_with_css
909
- xml = Nokogiri::XML.parse(<<-eoxml)
910
- <root>
911
- <car xmlns:part="http://general-motors.com/">
912
- <part:tire>Michelin Model XGV</part:tire>
913
- </car>
914
- <bicycle xmlns:part="http://schwinn.com/">
915
- <part:tire>I'm a bicycle tire!</part:tire>
916
- </bicycle>
917
- </root>
918
- eoxml
919
-
920
- tires = xml.css('bike|tire', 'bike' => 'http://schwinn.com/' )
921
- assert_equal 1, tires.length
922
- end
923
-
924
- def test_namespaced_attribute_search_with_xpath
925
- # from #593
926
- xmlContent = <<-EOXML
927
- <?xml version="1.0"?>
928
- <ns1:el1 xmlns:ns1="http://blabla.com" >
929
- <ns1:el2 ns1:att="123">with namespace</ns1:el2 >
930
- <ns1:el2 att="noNameSpace">no namespace</ns1:el2 >
931
- </ns1:el1>
932
- EOXML
933
- xml_doc = Nokogiri::XML(xmlContent)
934
-
935
- no_ns = xml_doc.xpath("//*[@att]")
936
- assert_equal no_ns.length, 1
937
- assert_equal no_ns.first.content, "no namespace"
938
-
939
- with_ns = xml_doc.xpath("//*[@ns1:att]")
940
- assert_equal with_ns.length, 1
941
- assert_equal with_ns.first.content, "with namespace"
942
- end
943
-
944
- def test_namespaced_attribute_search_with_css
945
- # from #593
946
- xmlContent = <<-EOXML
947
- <?xml version="1.0"?>
948
- <ns1:el1 xmlns:ns1="http://blabla.com" >
949
- <ns1:el2 ns1:att="123">with namespace</ns1:el2 >
950
- <ns1:el2 att="noNameSpace">no namespace</ns1:el2 >
951
- </ns1:el1>
952
- EOXML
953
- xml_doc = Nokogiri::XML(xmlContent)
954
-
955
- no_ns = xml_doc.css('*[att]')
956
- assert_equal no_ns.length, 1
957
- assert_equal no_ns.first.content, "no namespace"
958
-
959
- with_ns = xml_doc.css('*[ns1|att]')
960
- assert_equal with_ns.length, 1
961
- assert_equal with_ns.first.content, "with namespace"
962
- end
963
-
964
- def test_namespaces_should_include_all_namespace_definitions
965
- xml = Nokogiri::XML.parse(<<-EOF)
966
- <x xmlns="http://quux.com/" xmlns:a="http://foo.com/" xmlns:b="http://bar.com/">
967
- <y xmlns:c="http://bazz.com/">
968
- <z>hello</z>
969
- <a xmlns:c="http://newc.com/" />
970
- </y>
971
- </x>
972
- EOF
973
-
974
- namespaces = xml.namespaces # Document#namespace
975
- assert_equal({"xmlns" => "http://quux.com/",
976
- "xmlns:a" => "http://foo.com/",
977
- "xmlns:b" => "http://bar.com/"}, namespaces)
978
-
979
- namespaces = xml.root.namespaces
980
- assert_equal({"xmlns" => "http://quux.com/",
981
- "xmlns:a" => "http://foo.com/",
982
- "xmlns:b" => "http://bar.com/"}, namespaces)
983
-
984
- namespaces = xml.at_xpath("//xmlns:y").namespaces
985
- assert_equal({"xmlns" => "http://quux.com/",
986
- "xmlns:a" => "http://foo.com/",
987
- "xmlns:b" => "http://bar.com/",
988
- "xmlns:c" => "http://bazz.com/"}, namespaces)
989
-
990
- namespaces = xml.at_xpath("//xmlns:z").namespaces
991
- assert_equal({"xmlns" => "http://quux.com/",
992
- "xmlns:a" => "http://foo.com/",
993
- "xmlns:b" => "http://bar.com/",
994
- "xmlns:c" => "http://bazz.com/"}, namespaces)
995
-
996
- namespaces = xml.at_xpath("//xmlns:a").namespaces
997
- assert_equal({"xmlns" => "http://quux.com/",
998
- "xmlns:a" => "http://foo.com/",
999
- "xmlns:b" => "http://bar.com/",
1000
- "xmlns:c" => "http://newc.com/"}, namespaces)
1001
- end
1002
-
1003
- def test_namespace
1004
- xml = Nokogiri::XML.parse(<<-EOF)
1005
- <x xmlns:a='http://foo.com/' xmlns:b='http://bar.com/'>
1006
- <y xmlns:c='http://bazz.com/'>
1007
- <a:div>hello a</a:div>
1008
- <b:div>hello b</b:div>
1009
- <c:div>hello c</c:div>
1010
- <div>hello moon</div>
1011
- </y>
1012
- </x>
1013
- EOF
1014
- set = xml.search("//y/*")
1015
- assert_equal "a", set[0].namespace.prefix
1016
- assert_equal "b", set[1].namespace.prefix
1017
- assert_equal "c", set[2].namespace.prefix
1018
- assert_equal nil, set[3].namespace
1019
- end
1020
-
1021
- if Nokogiri.uses_libxml?
1022
- def test_namespace_without_an_href_on_html_node
1023
- # because microsoft word's HTML formatting does this. ick.
1024
- xml = Nokogiri::HTML.parse <<-EOF
1025
- <div><o:p>foo</o:p></div>
1026
- EOF
1027
-
1028
- assert_not_nil(node = xml.at('p'))
1029
-
1030
- assert_equal 1, node.namespaces.keys.size
1031
- assert node.namespaces.has_key?('xmlns:o')
1032
- assert_equal nil, node.namespaces['xmlns:o']
1033
- end
1034
- end
1035
-
1036
- def test_line
1037
- xml = Nokogiri::XML(<<-eoxml)
1038
- <root>
1039
- <a>
1040
- Hello world
1041
- </a>
1042
- </root>
1043
- eoxml
1044
-
1045
- set = xml.search("//a")
1046
- node = set.first
1047
- assert_equal 2, node.line
1048
- end
1049
-
1050
- def test_xpath_results_have_document_and_are_decorated
1051
- x = Module.new do
1052
- def awesome! ; end
1053
- end
1054
- util_decorate(@xml, x)
1055
- node_set = @xml.xpath("//employee")
1056
- assert_equal @xml, node_set.document
1057
- assert node_set.respond_to?(:awesome!)
1058
- end
1059
-
1060
- def test_css_results_have_document_and_are_decorated
1061
- x = Module.new do
1062
- def awesome! ; end
1063
- end
1064
- util_decorate(@xml, x)
1065
- node_set = @xml.css("employee")
1066
- assert_equal @xml, node_set.document
1067
- assert node_set.respond_to?(:awesome!)
1068
- end
1069
-
1070
- def test_blank
1071
- doc = Nokogiri::XML('')
1072
- assert_equal false, doc.blank?
1073
- end
1074
-
1075
- def test_to_xml_allows_to_serialize_with_as_xml_save_option
1076
- xml = Nokogiri::XML("<root><ul><li>Hello world</li></ul></root>")
1077
- set = xml.search("//ul")
1078
- node = set.first
1079
-
1080
- assert_no_match("<ul>\n <li>", xml.to_xml(:save_with => XML::Node::SaveOptions::AS_XML))
1081
- assert_no_match("<ul>\n <li>", node.to_xml(:save_with => XML::Node::SaveOptions::AS_XML))
1082
- end
1083
-
1084
- # issue 647
1085
- def test_default_namespace_should_be_created
1086
- subject = Nokogiri::XML.parse('<foo xml:bar="http://bar.com"/>').root
1087
- ns = subject.attributes['bar'].namespace
1088
- assert_not_nil ns
1089
- assert_equal ns.class, Nokogiri::XML::Namespace
1090
- assert_equal 'xml', ns.prefix
1091
- assert_equal "http://www.w3.org/XML/1998/namespace", ns.href
1092
- end
1093
-
1094
- # issue 648
1095
- def test_namespace_without_prefix_should_be_set
1096
- node = Nokogiri::XML.parse('<foo xmlns="http://bar.com"/>').root
1097
- subject = Nokogiri::XML::Node.new 'foo', node.document
1098
- subject.namespace = node.namespace
1099
- ns = subject.namespace
1100
- assert_equal ns.class, Nokogiri::XML::Namespace
1101
- assert_nil ns.prefix
1102
- assert_equal ns.href, "http://bar.com"
1103
- end
1104
-
1105
- # issue 695
1106
- def test_namespace_in_rendered_xml
1107
- document = Nokogiri::XML::Document.new
1108
- subject = Nokogiri::XML::Node.new 'foo', document
1109
- ns = subject.add_namespace nil, 'bar'
1110
- subject.namespace = ns
1111
- assert_match(/xmlns="bar"/, subject.to_xml)
1112
- end
1113
-
1114
- # issue 771
1115
- def test_format_noblank
1116
- content = <<eoxml
1117
- <foo>
1118
- <bar>hello</bar>
1119
- </foo>
1120
- eoxml
1121
- subject = Nokogiri::XML(content) do |conf|
1122
- conf.default_xml.noblanks
1123
- end
1124
-
1125
- assert_match %r{<bar>hello</bar>}, subject.to_xml(:indent => 2)
1126
- end
1127
-
1128
- def test_text_node_colon
1129
- document = Nokogiri::XML::Document.new
1130
- root = Nokogiri::XML::Node.new 'foo', document
1131
- document.root = root
1132
- root << "<a>hello:with_colon</a>"
1133
- assert_match(/hello:with_colon/, document.to_xml)
1134
- end
1135
- end
1136
- end
1137
- end