nokogiri 1.0.0 → 1.6.8.1

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 (309) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.cross_rubies +9 -0
  4. data/.editorconfig +17 -0
  5. data/.gemtest +0 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGELOG.rdoc +1160 -0
  8. data/CONTRIBUTING.md +42 -0
  9. data/C_CODING_STYLE.rdoc +33 -0
  10. data/Gemfile +22 -0
  11. data/LICENSE.txt +31 -0
  12. data/Manifest.txt +284 -40
  13. data/README.md +166 -0
  14. data/ROADMAP.md +111 -0
  15. data/Rakefile +310 -199
  16. data/STANDARD_RESPONSES.md +47 -0
  17. data/Y_U_NO_GEMSPEC.md +155 -0
  18. data/appveyor.yml +22 -0
  19. data/bin/nokogiri +118 -0
  20. data/build_all +45 -0
  21. data/dependencies.yml +29 -0
  22. data/ext/nokogiri/depend +358 -0
  23. data/ext/nokogiri/extconf.rb +664 -34
  24. data/ext/nokogiri/html_document.c +120 -33
  25. data/ext/nokogiri/html_document.h +1 -1
  26. data/ext/nokogiri/html_element_description.c +279 -0
  27. data/ext/nokogiri/html_element_description.h +10 -0
  28. data/ext/nokogiri/html_entity_lookup.c +32 -0
  29. data/ext/nokogiri/html_entity_lookup.h +8 -0
  30. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  31. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  32. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  33. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  34. data/ext/nokogiri/nokogiri.c +145 -0
  35. data/ext/nokogiri/nokogiri.h +131 -0
  36. data/ext/nokogiri/xml_attr.c +94 -0
  37. data/ext/nokogiri/xml_attr.h +9 -0
  38. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  39. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  40. data/ext/nokogiri/xml_cdata.c +23 -19
  41. data/ext/nokogiri/xml_cdata.h +1 -1
  42. data/ext/nokogiri/xml_comment.c +69 -0
  43. data/ext/nokogiri/xml_comment.h +9 -0
  44. data/ext/nokogiri/xml_document.c +501 -54
  45. data/ext/nokogiri/xml_document.h +14 -1
  46. data/ext/nokogiri/xml_document_fragment.c +48 -0
  47. data/ext/nokogiri/xml_document_fragment.h +10 -0
  48. data/ext/nokogiri/xml_dtd.c +109 -24
  49. data/ext/nokogiri/xml_dtd.h +3 -1
  50. data/ext/nokogiri/xml_element_content.c +123 -0
  51. data/ext/nokogiri/xml_element_content.h +10 -0
  52. data/ext/nokogiri/xml_element_decl.c +69 -0
  53. data/ext/nokogiri/xml_element_decl.h +9 -0
  54. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  55. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  56. data/ext/nokogiri/xml_entity_decl.c +110 -0
  57. data/ext/nokogiri/xml_entity_decl.h +10 -0
  58. data/ext/nokogiri/xml_entity_reference.c +52 -0
  59. data/ext/nokogiri/xml_entity_reference.h +9 -0
  60. data/ext/nokogiri/xml_io.c +60 -0
  61. data/ext/nokogiri/xml_io.h +11 -0
  62. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  63. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  64. data/ext/nokogiri/xml_namespace.c +117 -0
  65. data/ext/nokogiri/xml_namespace.h +13 -0
  66. data/ext/nokogiri/xml_node.c +1285 -315
  67. data/ext/nokogiri/xml_node.h +4 -6
  68. data/ext/nokogiri/xml_node_set.c +415 -54
  69. data/ext/nokogiri/xml_node_set.h +6 -2
  70. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  71. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  72. data/ext/nokogiri/xml_reader.c +316 -77
  73. data/ext/nokogiri/xml_reader.h +1 -1
  74. data/ext/nokogiri/xml_relax_ng.c +161 -0
  75. data/ext/nokogiri/xml_relax_ng.h +9 -0
  76. data/ext/nokogiri/xml_sax_parser.c +215 -80
  77. data/ext/nokogiri/xml_sax_parser.h +30 -1
  78. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  79. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  80. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  81. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  82. data/ext/nokogiri/xml_schema.c +205 -0
  83. data/ext/nokogiri/xml_schema.h +9 -0
  84. data/ext/nokogiri/xml_syntax_error.c +45 -175
  85. data/ext/nokogiri/xml_syntax_error.h +4 -2
  86. data/ext/nokogiri/xml_text.c +37 -14
  87. data/ext/nokogiri/xml_text.h +1 -1
  88. data/ext/nokogiri/xml_xpath_context.c +230 -13
  89. data/ext/nokogiri/xml_xpath_context.h +2 -1
  90. data/ext/nokogiri/xslt_stylesheet.c +196 -34
  91. data/ext/nokogiri/xslt_stylesheet.h +6 -1
  92. data/lib/nokogiri/css/node.rb +18 -61
  93. data/lib/nokogiri/css/parser.rb +725 -17
  94. data/lib/nokogiri/css/parser.y +126 -63
  95. data/lib/nokogiri/css/parser_extras.rb +91 -0
  96. data/lib/nokogiri/css/syntax_error.rb +7 -0
  97. data/lib/nokogiri/css/tokenizer.rb +148 -5
  98. data/lib/nokogiri/css/tokenizer.rex +31 -39
  99. data/lib/nokogiri/css/xpath_visitor.rb +109 -51
  100. data/lib/nokogiri/css.rb +24 -3
  101. data/lib/nokogiri/decorators/slop.rb +42 -0
  102. data/lib/nokogiri/html/builder.rb +27 -1
  103. data/lib/nokogiri/html/document.rb +329 -3
  104. data/lib/nokogiri/html/document_fragment.rb +39 -0
  105. data/lib/nokogiri/html/element_description.rb +23 -0
  106. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  107. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  108. data/lib/nokogiri/html/sax/parser.rb +35 -4
  109. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  110. data/lib/nokogiri/html/sax/push_parser.rb +36 -0
  111. data/lib/nokogiri/html.rb +18 -76
  112. data/lib/nokogiri/syntax_error.rb +4 -0
  113. data/lib/nokogiri/version.rb +106 -1
  114. data/lib/nokogiri/xml/attr.rb +14 -0
  115. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  116. data/lib/nokogiri/xml/builder.rb +395 -31
  117. data/lib/nokogiri/xml/cdata.rb +4 -2
  118. data/lib/nokogiri/xml/character_data.rb +7 -0
  119. data/lib/nokogiri/xml/document.rb +267 -12
  120. data/lib/nokogiri/xml/document_fragment.rb +149 -0
  121. data/lib/nokogiri/xml/dtd.rb +27 -1
  122. data/lib/nokogiri/xml/element_content.rb +36 -0
  123. data/lib/nokogiri/xml/element_decl.rb +13 -0
  124. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  125. data/lib/nokogiri/xml/namespace.rb +13 -0
  126. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  127. data/lib/nokogiri/xml/node.rb +748 -109
  128. data/lib/nokogiri/xml/node_set.rb +200 -72
  129. data/lib/nokogiri/xml/parse_options.rb +120 -0
  130. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  131. data/lib/nokogiri/xml/pp/node.rb +56 -0
  132. data/lib/nokogiri/xml/pp.rb +2 -0
  133. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  134. data/lib/nokogiri/xml/reader.rb +102 -4
  135. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  136. data/lib/nokogiri/xml/sax/document.rb +114 -2
  137. data/lib/nokogiri/xml/sax/parser.rb +97 -7
  138. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  139. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  140. data/lib/nokogiri/xml/sax.rb +2 -7
  141. data/lib/nokogiri/xml/schema.rb +63 -0
  142. data/lib/nokogiri/xml/searchable.rb +221 -0
  143. data/lib/nokogiri/xml/syntax_error.rb +27 -1
  144. data/lib/nokogiri/xml/text.rb +4 -1
  145. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  146. data/lib/nokogiri/xml/xpath.rb +4 -0
  147. data/lib/nokogiri/xml/xpath_context.rb +3 -1
  148. data/lib/nokogiri/xml.rb +45 -38
  149. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  150. data/lib/nokogiri/xslt.rb +47 -2
  151. data/lib/nokogiri.rb +117 -24
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/patches/sort-patches-by-date +25 -0
  154. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  155. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  156. data/suppressions/README.txt +1 -0
  157. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  158. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  159. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  160. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  161. data/tasks/test.rb +100 -0
  162. data/test/css/test_nthiness.rb +73 -6
  163. data/test/css/test_parser.rb +184 -39
  164. data/test/css/test_tokenizer.rb +72 -19
  165. data/test/css/test_xpath_visitor.rb +44 -2
  166. data/test/decorators/test_slop.rb +20 -0
  167. data/test/files/2ch.html +108 -0
  168. data/test/files/GH_1042.html +18 -0
  169. data/test/files/address_book.rlx +12 -0
  170. data/test/files/address_book.xml +10 -0
  171. data/test/files/atom.xml +344 -0
  172. data/test/files/bar/bar.xsd +4 -0
  173. data/test/files/bogus.xml +0 -0
  174. data/test/files/dont_hurt_em_why.xml +422 -0
  175. data/test/files/encoding.html +82 -0
  176. data/test/files/encoding.xhtml +84 -0
  177. data/test/files/exslt.xml +8 -0
  178. data/test/files/exslt.xslt +35 -0
  179. data/test/files/foo/foo.xsd +4 -0
  180. data/test/files/metacharset.html +10 -0
  181. data/test/files/namespace_pressure_test.xml +1684 -0
  182. data/test/files/noencoding.html +47 -0
  183. data/test/files/po.xml +32 -0
  184. data/test/files/po.xsd +66 -0
  185. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  186. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  187. data/test/files/saml/xenc_schema.xsd +146 -0
  188. data/test/files/saml/xmldsig_schema.xsd +318 -0
  189. data/test/files/shift_jis.html +10 -0
  190. data/test/files/shift_jis.xml +5 -0
  191. data/test/files/shift_jis_no_charset.html +9 -0
  192. data/test/files/slow-xpath.xml +25509 -0
  193. data/test/files/snuggles.xml +3 -0
  194. data/test/files/staff.dtd +10 -0
  195. data/test/files/test_document_url/bar.xml +2 -0
  196. data/test/files/test_document_url/document.dtd +4 -0
  197. data/test/files/test_document_url/document.xml +6 -0
  198. data/test/files/tlm.html +2 -1
  199. data/test/files/to_be_xincluded.xml +2 -0
  200. data/test/files/valid_bar.xml +2 -0
  201. data/test/files/xinclude.xml +4 -0
  202. data/test/helper.rb +124 -13
  203. data/test/html/sax/test_parser.rb +118 -4
  204. data/test/html/sax/test_parser_context.rb +46 -0
  205. data/test/html/sax/test_push_parser.rb +87 -0
  206. data/test/html/test_builder.rb +94 -8
  207. data/test/html/test_document.rb +626 -11
  208. data/test/html/test_document_encoding.rb +145 -0
  209. data/test/html/test_document_fragment.rb +301 -0
  210. data/test/html/test_element_description.rb +105 -0
  211. data/test/html/test_named_characters.rb +14 -0
  212. data/test/html/test_node.rb +212 -0
  213. data/test/html/test_node_encoding.rb +85 -0
  214. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  215. data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
  216. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  217. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  218. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  219. data/test/namespaces/test_namespaces_in_parsed_doc.rb +80 -0
  220. data/test/namespaces/test_namespaces_preservation.rb +31 -0
  221. data/test/test_convert_xpath.rb +2 -47
  222. data/test/test_css_cache.rb +45 -0
  223. data/test/test_encoding_handler.rb +48 -0
  224. data/test/test_memory_leak.rb +156 -0
  225. data/test/test_nokogiri.rb +103 -1
  226. data/test/test_soap4r_sax.rb +52 -0
  227. data/test/test_xslt_transforms.rb +293 -8
  228. data/test/xml/node/test_save_options.rb +28 -0
  229. data/test/xml/node/test_subclass.rb +44 -0
  230. data/test/xml/sax/test_parser.rb +309 -8
  231. data/test/xml/sax/test_parser_context.rb +115 -0
  232. data/test/xml/sax/test_push_parser.rb +157 -0
  233. data/test/xml/test_attr.rb +67 -0
  234. data/test/xml/test_attribute_decl.rb +86 -0
  235. data/test/xml/test_builder.rb +327 -2
  236. data/test/xml/test_c14n.rb +180 -0
  237. data/test/xml/test_cdata.rb +32 -2
  238. data/test/xml/test_comment.rb +40 -0
  239. data/test/xml/test_document.rb +846 -35
  240. data/test/xml/test_document_encoding.rb +31 -0
  241. data/test/xml/test_document_fragment.rb +271 -0
  242. data/test/xml/test_dtd.rb +153 -9
  243. data/test/xml/test_dtd_encoding.rb +31 -0
  244. data/test/xml/test_element_content.rb +56 -0
  245. data/test/xml/test_element_decl.rb +73 -0
  246. data/test/xml/test_entity_decl.rb +122 -0
  247. data/test/xml/test_entity_reference.rb +251 -0
  248. data/test/xml/test_namespace.rb +96 -0
  249. data/test/xml/test_node.rb +1126 -105
  250. data/test/xml/test_node_attributes.rb +115 -0
  251. data/test/xml/test_node_encoding.rb +69 -0
  252. data/test/xml/test_node_inheritance.rb +32 -0
  253. data/test/xml/test_node_reparenting.rb +549 -0
  254. data/test/xml/test_node_set.rb +668 -9
  255. data/test/xml/test_parse_options.rb +64 -0
  256. data/test/xml/test_processing_instruction.rb +30 -0
  257. data/test/xml/test_reader.rb +589 -0
  258. data/test/xml/test_reader_encoding.rb +134 -0
  259. data/test/xml/test_relax_ng.rb +60 -0
  260. data/test/xml/test_schema.rb +142 -0
  261. data/test/xml/test_syntax_error.rb +30 -0
  262. data/test/xml/test_text.rb +49 -2
  263. data/test/xml/test_unparented_node.rb +440 -0
  264. data/test/xml/test_xinclude.rb +83 -0
  265. data/test/xml/test_xpath.rb +445 -0
  266. data/test/xslt/test_custom_functions.rb +133 -0
  267. data/test/xslt/test_exception_handling.rb +37 -0
  268. data/test_all +107 -0
  269. metadata +459 -115
  270. data/History.txt +0 -6
  271. data/README.ja.txt +0 -86
  272. data/README.txt +0 -87
  273. data/ext/nokogiri/html_sax_parser.c +0 -32
  274. data/ext/nokogiri/html_sax_parser.h +0 -11
  275. data/ext/nokogiri/native.c +0 -40
  276. data/ext/nokogiri/native.h +0 -51
  277. data/ext/nokogiri/xml_xpath.c +0 -46
  278. data/ext/nokogiri/xml_xpath.h +0 -11
  279. data/lib/nokogiri/css/generated_parser.rb +0 -653
  280. data/lib/nokogiri/css/generated_tokenizer.rb +0 -159
  281. data/lib/nokogiri/decorators/hpricot/node.rb +0 -58
  282. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -14
  283. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -17
  284. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  285. data/lib/nokogiri/decorators.rb +0 -1
  286. data/lib/nokogiri/hpricot.rb +0 -47
  287. data/lib/nokogiri/xml/after_handler.rb +0 -18
  288. data/lib/nokogiri/xml/before_handler.rb +0 -32
  289. data/lib/nokogiri/xml/element.rb +0 -6
  290. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  291. data/nokogiri.gemspec +0 -34
  292. data/test/hpricot/files/basic.xhtml +0 -17
  293. data/test/hpricot/files/boingboing.html +0 -2266
  294. data/test/hpricot/files/cy0.html +0 -3653
  295. data/test/hpricot/files/immob.html +0 -400
  296. data/test/hpricot/files/pace_application.html +0 -1320
  297. data/test/hpricot/files/tenderlove.html +0 -16
  298. data/test/hpricot/files/uswebgen.html +0 -220
  299. data/test/hpricot/files/utf8.html +0 -1054
  300. data/test/hpricot/files/week9.html +0 -1723
  301. data/test/hpricot/files/why.xml +0 -19
  302. data/test/hpricot/load_files.rb +0 -7
  303. data/test/hpricot/test_alter.rb +0 -67
  304. data/test/hpricot/test_builder.rb +0 -27
  305. data/test/hpricot/test_parser.rb +0 -423
  306. data/test/hpricot/test_paths.rb +0 -15
  307. data/test/hpricot/test_preserved.rb +0 -78
  308. data/test/hpricot/test_xml.rb +0 -30
  309. data/test/test_reader.rb +0 -222
@@ -0,0 +1,440 @@
1
+ require "helper"
2
+
3
+ require 'stringio'
4
+
5
+ module Nokogiri
6
+ module XML
7
+ class TestUnparentedNode < Nokogiri::TestCase
8
+ def setup
9
+ begin
10
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
11
+ @node = xml.at('staff')
12
+ @node.unlink
13
+ end
14
+ GC.start # try to GC the document
15
+ end
16
+
17
+ def test_node_still_has_document
18
+ assert @node.document
19
+ end
20
+
21
+ def test_add_namespace
22
+ node = @node.at('address')
23
+ node.unlink
24
+ node.add_namespace('foo', 'http://tenderlovemaking.com')
25
+ assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
26
+ end
27
+
28
+ def test_write_to
29
+ io = StringIO.new
30
+ @node.write_to io
31
+ io.rewind
32
+ assert_equal @node.to_xml, io.read
33
+ end
34
+
35
+ def test_attribute_with_symbol
36
+ assert_equal 'Yes', @node.css('address').first[:domestic]
37
+ end
38
+
39
+ def test_write_to_with_block
40
+ called = false
41
+ io = StringIO.new
42
+ conf = nil
43
+ @node.write_to io do |config|
44
+ called = true
45
+ conf = config
46
+ config.format.as_html.no_empty_tags
47
+ end
48
+ io.rewind
49
+ assert called
50
+ assert_equal @node.serialize(:save_with => conf.options), io.read
51
+ end
52
+
53
+ %w{ xml html xhtml }.each do |type|
54
+ define_method(:"test_write_#{type}_to") do
55
+ io = StringIO.new
56
+ assert @node.send(:"write_#{type}_to", io)
57
+ io.rewind
58
+ assert_match @node.send(:"to_#{type}"), io.read
59
+ end
60
+ end
61
+
62
+ def test_serialize_with_block
63
+ called = false
64
+ conf = nil
65
+ string = @node.serialize do |config|
66
+ called = true
67
+ conf = config
68
+ config.format.as_html.no_empty_tags
69
+ end
70
+ assert called
71
+ assert_equal @node.serialize(nil, conf.options), string
72
+ end
73
+
74
+ def test_values
75
+ assert_equal %w{ Yes Yes }, @node.xpath('.//address')[1].values
76
+ end
77
+
78
+ def test_keys
79
+ assert_equal %w{ domestic street }, @node.xpath('.//address')[1].keys
80
+ end
81
+
82
+ def test_each
83
+ attributes = []
84
+ @node.xpath('.//address')[1].each do |key, value|
85
+ attributes << [key, value]
86
+ end
87
+ assert_equal [['domestic', 'Yes'], ['street', 'Yes']], attributes
88
+ end
89
+
90
+ def test_new
91
+ assert node = Nokogiri::XML::Node.new('input', @node)
92
+ assert_equal 1, node.node_type
93
+ end
94
+
95
+ def test_to_str
96
+ assert name = @node.xpath('.//name').first
97
+ assert_match(/Margaret/, '' + name)
98
+ assert_equal('Margaret Martin', '' + name.children.first)
99
+ end
100
+
101
+ def test_ancestors
102
+ assert(address = @node.xpath('.//address').first)
103
+ assert_equal 2, address.ancestors.length
104
+ assert_equal ['employee', 'staff'],
105
+ address.ancestors.map { |x| x ? x.name : x }
106
+ end
107
+
108
+ def test_read_only?
109
+ assert entity_decl = @node.internal_subset.children.find { |x|
110
+ x.type == Node::ENTITY_DECL
111
+ }
112
+ assert entity_decl.read_only?
113
+ end
114
+
115
+ def test_remove_attribute
116
+ address = @node.xpath('./employee/address').first
117
+ assert_equal 'Yes', address['domestic']
118
+ address.remove_attribute 'domestic'
119
+ assert_nil address['domestic']
120
+ end
121
+
122
+ def test_delete
123
+ address = @node.xpath('./employee/address').first
124
+ assert_equal 'Yes', address['domestic']
125
+ address.delete 'domestic'
126
+ assert_nil address['domestic']
127
+ end
128
+
129
+ def test_add_child_in_same_document
130
+ child = @node.css('employee').first
131
+
132
+ assert child.children.last
133
+ assert new_child = child.children.first
134
+
135
+ last = child.children.last
136
+
137
+ child.add_child(new_child)
138
+ assert_equal new_child, child.children.last
139
+ assert_equal last, child.children.last
140
+ end
141
+
142
+ def test_add_child_from_other_document
143
+ d1 = Nokogiri::XML("<root><item>1</item><item>2</item></root>")
144
+ d2 = Nokogiri::XML("<root><item>3</item><item>4</item></root>")
145
+
146
+ d2.at('root').search('item').each do |i|
147
+ d1.at('root').add_child i
148
+ end
149
+
150
+ assert_equal 0, d2.search('item').size
151
+ assert_equal 4, d1.search('item').size
152
+ end
153
+
154
+ def test_add_child
155
+ xml = Nokogiri::XML(<<-eoxml)
156
+ <root>
157
+ <a>Hello world</a>
158
+ </root>
159
+ eoxml
160
+ text_node = Nokogiri::XML::Text.new('hello', xml)
161
+ assert_equal Nokogiri::XML::Node::TEXT_NODE, text_node.type
162
+ xml.root.add_child text_node
163
+ assert_match 'hello', xml.to_s
164
+ end
165
+
166
+ def test_chevron_works_as_add_child
167
+ xml = Nokogiri::XML(<<-eoxml)
168
+ <root>
169
+ <a>Hello world</a>
170
+ </root>
171
+ eoxml
172
+ text_node = Nokogiri::XML::Text.new('hello', xml)
173
+ xml.root << text_node
174
+ assert_match 'hello', xml.to_s
175
+ end
176
+
177
+ def test_add_previous_sibling
178
+ xml = Nokogiri::XML(<<-eoxml)
179
+ <root>
180
+ <a>Hello world</a>
181
+ </root>
182
+ eoxml
183
+ b_node = Nokogiri::XML::Node.new('a', xml)
184
+ assert_equal Nokogiri::XML::Node::ELEMENT_NODE, b_node.type
185
+ b_node.content = 'first'
186
+ a_node = xml.xpath('.//a').first
187
+ a_node.add_previous_sibling(b_node)
188
+ assert_equal('first', xml.xpath('.//a').first.text)
189
+ end
190
+
191
+ def test_add_previous_sibling_merge
192
+ xml = Nokogiri::XML(<<-eoxml)
193
+ <root>
194
+ <a>Hello world</a>
195
+ </root>
196
+ eoxml
197
+
198
+ assert a_tag = xml.css('a').first
199
+
200
+ left_space = a_tag.previous
201
+ right_space = a_tag.next
202
+ assert left_space.text?
203
+ assert right_space.text?
204
+
205
+ left_space.add_previous_sibling(right_space)
206
+ assert_equal left_space, right_space
207
+ end
208
+
209
+ def test_add_next_sibling_merge
210
+ xml = Nokogiri::XML(<<-eoxml)
211
+ <root>
212
+ <a>Hello world</a>
213
+ </root>
214
+ eoxml
215
+
216
+ assert a_tag = xml.css('a').first
217
+
218
+ left_space = a_tag.previous
219
+ right_space = a_tag.next
220
+ assert left_space.text?
221
+ assert right_space.text?
222
+
223
+ right_space.add_next_sibling(left_space)
224
+ assert_equal left_space, right_space
225
+ end
226
+
227
+ def test_add_next_sibling_to_root_raises_exception
228
+ xml = Nokogiri::XML(<<-eoxml)
229
+ <root />
230
+ eoxml
231
+
232
+ node = Nokogiri::XML::Node.new 'child', xml
233
+
234
+ assert_raise(ArgumentError) do
235
+ xml.root.add_next_sibling(node)
236
+ end
237
+ end
238
+
239
+ def test_add_previous_sibling_to_root_raises_exception
240
+ xml = Nokogiri::XML(<<-eoxml)
241
+ <root />
242
+ eoxml
243
+
244
+ node = Nokogiri::XML::Node.new 'child', xml
245
+
246
+ assert_raise(ArgumentError) do
247
+ xml.root.add_previous_sibling(node)
248
+ end
249
+ end
250
+
251
+ def test_add_pi_as_previous_and_next_sibling_to_root_is_ok
252
+ doc = Nokogiri::XML "<root>foo</root>"
253
+ pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
254
+ doc.root.add_previous_sibling pi
255
+ expected_doc = %Q{<?xml version="1.0"?>\n<?xml-stylesheet type="text/xsl" href="foo.xsl"?>\n<root>foo</root>}
256
+ assert_includes doc.to_xml, expected_doc
257
+
258
+ pi2 = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo2.xsl"})
259
+ pi.add_next_sibling pi2
260
+ expected_doc = %Q{<?xml version="1.0"?>\n<?xml-stylesheet type="text/xsl" href="foo.xsl"?>\n<?xml-stylesheet type="text/xsl" href="foo2.xsl"?>\n<root>foo</root>}
261
+ assert_includes doc.to_xml, expected_doc
262
+ end
263
+
264
+ def test_find_by_css_with_tilde_eql
265
+ xml = Nokogiri::XML.parse(<<-eoxml)
266
+ <root>
267
+ <a>Hello world</a>
268
+ <a class='foo bar'>Bar</a>
269
+ <a class='bar foo'>Bar</a>
270
+ <a class='bar'>Bar</a>
271
+ <a class='baz bar foo'>Bar</a>
272
+ <a class='bazbarfoo'>Awesome</a>
273
+ <a class='bazbar'>Awesome</a>
274
+ </root>
275
+ eoxml
276
+ set = xml.css('a[@class~="bar"]')
277
+ assert_equal 4, set.length
278
+ assert_equal ['Bar'], set.map { |node| node.content }.uniq
279
+ end
280
+
281
+ def test_unlink
282
+ xml = Nokogiri::XML.parse(<<-eoxml)
283
+ <root>
284
+ <a class='foo bar'>Bar</a>
285
+ <a class='bar foo'>Bar</a>
286
+ <a class='bar'>Bar</a>
287
+ <a>Hello world</a>
288
+ <a class='baz bar foo'>Bar</a>
289
+ <a class='bazbarfoo'>Awesome</a>
290
+ <a class='bazbar'>Awesome</a>
291
+ </root>
292
+ eoxml
293
+ node = xml.xpath('.//a')[3]
294
+ assert_equal('Hello world', node.text)
295
+ assert_match(/Hello world/, xml.to_s)
296
+ assert node.parent
297
+ assert node.document
298
+ assert node.previous_sibling
299
+ assert node.next_sibling
300
+ node.unlink
301
+ assert !node.parent
302
+ # assert !node.document
303
+ assert !node.previous_sibling
304
+ assert !node.next_sibling
305
+ assert_no_match(/Hello world/, xml.to_s)
306
+ end
307
+
308
+ def test_next_sibling
309
+ assert sibling = @node.child.next_sibling
310
+ assert_equal('employee', sibling.name)
311
+ end
312
+
313
+ def test_previous_sibling
314
+ assert sibling = @node.child.next_sibling
315
+ assert_equal('employee', sibling.name)
316
+ assert_equal(sibling.previous_sibling, @node.child)
317
+ end
318
+
319
+ def test_name=
320
+ @node.name = 'awesome'
321
+ assert_equal('awesome', @node.name)
322
+ end
323
+
324
+ def test_child
325
+ assert child = @node.child
326
+ assert_equal('text', child.name)
327
+ end
328
+
329
+ def test_key?
330
+ assert node = @node.search('.//address').first
331
+ assert(!node.key?('asdfasdf'))
332
+ end
333
+
334
+ def test_set_property
335
+ assert node = @node.search('.//address').first
336
+ node['foo'] = 'bar'
337
+ assert_equal('bar', node['foo'])
338
+ end
339
+
340
+ def test_attributes
341
+ assert node = @node.search('.//address').first
342
+ assert_nil(node['asdfasdfasdf'])
343
+ assert_equal('Yes', node['domestic'])
344
+
345
+ assert node = @node.search('.//address')[2]
346
+ attr = node.attributes
347
+ assert_equal 2, attr.size
348
+ assert_equal 'Yes', attr['domestic'].value
349
+ assert_equal 'Yes', attr['domestic'].to_s
350
+ assert_equal 'No', attr['street'].value
351
+ end
352
+
353
+ def test_path
354
+ assert set = @node.search('.//employee')
355
+ assert node = set.first
356
+ assert_equal('/staff/employee[1]', node.path)
357
+ end
358
+
359
+ def test_search_by_symbol
360
+ assert set = @node.search(:employee)
361
+ assert 5, set.length
362
+
363
+ assert node = @node.at(:employee)
364
+ assert node.text =~ /EMP0001/
365
+ end
366
+
367
+ def test_new_node
368
+ node = Nokogiri::XML::Node.new('form', @node.document)
369
+ assert_equal('form', node.name)
370
+ assert(node.document)
371
+ end
372
+
373
+ def test_encode_special_chars
374
+ foo = @node.css('employee').first.encode_special_chars('&')
375
+ assert_equal '&amp;', foo
376
+ end
377
+
378
+ def test_content
379
+ node = Nokogiri::XML::Node.new('form', @node)
380
+ assert_equal('', node.content)
381
+
382
+ node.content = 'hello world!'
383
+ assert_equal('hello world!', node.content)
384
+ end
385
+
386
+ def test_whitespace_nodes
387
+ doc = Nokogiri::XML.parse("<root><b>Foo</b>\n<i>Bar</i> <p>Bazz</p></root>")
388
+ children = doc.at('.//root').children.collect(&:to_s)
389
+ assert_equal "\n", children[1]
390
+ assert_equal " ", children[3]
391
+ end
392
+
393
+ def test_replace
394
+ set = @node.search('.//employee')
395
+ assert 5, set.length
396
+ assert 0, @node.search('.//form').length
397
+
398
+ first = set[0]
399
+ second = set[1]
400
+
401
+ node = Nokogiri::XML::Node.new('form', @node)
402
+ first.replace(node)
403
+
404
+ assert set = @node.search('.//employee')
405
+ assert_equal 4, set.length
406
+ assert 1, @node.search('.//form').length
407
+
408
+ assert_equal set[0].to_xml, second.to_xml
409
+ end
410
+
411
+ def test_replace_on_unparented_node
412
+ foo = Node.new('foo', @node.document)
413
+ if Nokogiri.jruby? # JRuby Nokogiri doesn't raise an exception
414
+ @node.replace(foo)
415
+ else
416
+ assert_raises(RuntimeError){ @node.replace(foo) }
417
+ end
418
+ end
419
+
420
+ def test_illegal_replace_of_node_with_doc
421
+ new_node = Nokogiri::XML.parse('<foo>bar</foo>')
422
+ old_node = @node.at('.//employee')
423
+ assert_raises(ArgumentError){ old_node.replace new_node }
424
+ end
425
+
426
+ def test_unlink_on_unlinked_node_1
427
+ node = Nokogiri::XML::Node.new 'div', Nokogiri::XML::Document.new
428
+ node.unlink # must_not_raise
429
+ assert_nil node.parent
430
+ end
431
+
432
+ def test_unlink_on_unlinked_node_2
433
+ node = Nokogiri::XML('<div>foo</div>').at_css("div")
434
+ node.unlink
435
+ node.unlink # must_not_raise
436
+ assert_nil node.parent
437
+ end
438
+ end
439
+ end
440
+ end
@@ -0,0 +1,83 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestXInclude < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML.parse(File.read(XML_XINCLUDE_FILE), XML_XINCLUDE_FILE)
9
+ @included = "this snippet is to be included from xinclude.xml"
10
+ end
11
+
12
+ def test_xinclude_on_document_parse
13
+ skip("Pure Java version XInlcude has a conflict with NekoDTD setting. This will be fixed later.") if Nokogiri.jruby?
14
+ # first test that xinclude works when requested
15
+ xml_doc = nil
16
+
17
+ File.open(XML_XINCLUDE_FILE) do |fp|
18
+ xml_doc = Nokogiri::XML(fp) do |conf|
19
+ conf.strict.dtdload.noent.nocdata.xinclude
20
+ end
21
+ end
22
+
23
+ assert_not_nil xml_doc
24
+ assert_not_nil included = xml_doc.at_xpath('//included')
25
+ assert_equal @included, included.content
26
+
27
+ # no xinclude should happen when not requested
28
+ xml_doc = nil
29
+
30
+ File.open(XML_XINCLUDE_FILE) do |fp|
31
+ xml_doc = Nokogiri::XML(fp) do |conf|
32
+ conf.strict.dtdload.noent.nocdata
33
+ end
34
+ end
35
+
36
+ assert_not_nil xml_doc
37
+ assert_nil xml_doc.at_xpath('//included')
38
+ end
39
+
40
+ def test_xinclude_on_document_node
41
+ skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
42
+ assert_nil @xml.at_xpath('//included')
43
+ @xml.do_xinclude
44
+ assert_not_nil included = @xml.at_xpath('//included')
45
+ assert_equal @included, included.content
46
+ end
47
+
48
+ def test_xinclude_on_element_subtree
49
+ skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
50
+ assert_nil @xml.at_xpath('//included')
51
+ @xml.root.do_xinclude
52
+ assert_not_nil included = @xml.at_xpath('//included')
53
+ assert_equal @included, included.content
54
+ end
55
+
56
+ def test_do_xinclude_accepts_block
57
+ non_default_options = Nokogiri::XML::ParseOptions::NOBLANKS | \
58
+ Nokogiri::XML::ParseOptions::XINCLUDE
59
+
60
+ @xml.do_xinclude(non_default_options) do |options|
61
+ assert_equal non_default_options, options.to_i
62
+ end
63
+ end
64
+
65
+ def test_include_nonexistent_throws_exception
66
+ skip("Pure Java version behaves differently") if Nokogiri.jruby?
67
+ # break inclusion deliberately
68
+ @xml.at_xpath('//xi:include')['href'] = "nonexistent.xml"
69
+
70
+ exception_raised = false
71
+ begin
72
+ @xml.do_xinclude { |opts| opts.nowarning }
73
+ rescue Exception => e
74
+ assert_equal Nokogiri::XML::SyntaxError, e.class
75
+ exception_raised = true
76
+ end
77
+
78
+ assert exception_raised
79
+ end
80
+
81
+ end
82
+ end
83
+ end