nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60

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 (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -1,8 +1,17 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
5
5
  class TestAttr < Nokogiri::TestCase
6
+ def test_new
7
+ assert_nothing_raised do
8
+ 100.times {
9
+ doc = Nokogiri::XML::Document.new
10
+ Nokogiri::XML::Attr.new(doc, 'foo')
11
+ }
12
+ end
13
+ end
14
+
6
15
  def test_content=
7
16
  xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
8
17
  address = xml.xpath('//address')[3]
@@ -26,6 +35,31 @@ module Nokogiri
26
35
  address.attribute_nodes.first.unlink
27
36
  assert_nil address['domestic']
28
37
  end
38
+
39
+ def test_parsing_attribute_namespace
40
+ doc = Nokogiri::XML <<-EOXML
41
+ <root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
42
+ <div f:myattr='foo'></div>
43
+ </root>
44
+ EOXML
45
+
46
+ node = doc.at_css "div"
47
+ attr = node.attributes["myattr"]
48
+ assert_equal "http://flavorjon.es/", attr.namespace.href
49
+ end
50
+
51
+ def test_setting_attribute_namespace
52
+ doc = Nokogiri::XML <<-EOXML
53
+ <root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
54
+ <div f:myattr='foo'></div>
55
+ </root>
56
+ EOXML
57
+
58
+ node = doc.at_css "div"
59
+ attr = node.attributes["myattr"]
60
+ attr.add_namespace("fizzle", "http://fizzle.com/")
61
+ assert_equal "http://fizzle.com/", attr.namespace.href
62
+ end
29
63
  end
30
64
  end
31
65
  end
@@ -0,0 +1,82 @@
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 >
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
+ assert_equal 1, @attr_decl.attribute_type
68
+ end
69
+
70
+ def test_default
71
+ assert_equal '0', @attr_decl.default
72
+ assert_nil @attrs[1].default
73
+ end
74
+
75
+ def test_enumeration
76
+ assert_equal [], @attr_decl.enumeration
77
+ assert_equal ['check', 'cash'], @attrs[2].enumeration
78
+ end
79
+ end
80
+ end
81
+ end
82
+
@@ -1,8 +1,187 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
5
5
  class TestBuilder < Nokogiri::TestCase
6
+ def test_builder_namespace
7
+ doc = Nokogiri::XML::Builder.new { |xml|
8
+ xml.a("xmlns:a" => "x") do
9
+ xml.b("xmlns:a" => "x", "xmlns:b" => "y")
10
+ end
11
+ }.doc
12
+
13
+ b = doc.at('b')
14
+ assert b
15
+ assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y"}, b.namespaces)
16
+ assert_equal({"xmlns:b"=>"y"}, namespaces_defined_on(b))
17
+ end
18
+
19
+ def test_builder_namespace_part_deux
20
+ doc = Nokogiri::XML::Builder.new { |xml|
21
+ xml.a("xmlns:b" => "y") do
22
+ xml.b("xmlns:a" => "x", "xmlns:b" => "y", "xmlns:c" => "z")
23
+ end
24
+ }.doc
25
+
26
+ b = doc.at('b')
27
+ assert b
28
+ assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y", "xmlns:c"=>"z"}, b.namespaces)
29
+ assert_equal({"xmlns:a"=>"x", "xmlns:c"=>"z"}, namespaces_defined_on(b))
30
+ end
31
+
32
+ def test_builder_with_unlink
33
+ assert_nothing_raised do
34
+ Nokogiri::XML::Builder.new do |xml|
35
+ xml.foo do
36
+ xml.bar { xml.parent.unlink }
37
+ xml.bar2
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ def test_with_root
44
+ doc = Nokogiri::XML(File.read(XML_FILE))
45
+ Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
46
+ xml.foo
47
+ end
48
+ assert_equal 1, doc.xpath('//employee/foo').length
49
+ end
50
+
51
+ def test_root_namespace_default_decl
52
+ b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
53
+ doc = b.doc
54
+ assert_equal 'one:two', doc.root.namespace.href
55
+ assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
56
+ end
57
+
58
+ def test_root_namespace_multi_decl
59
+ b = Nokogiri::XML::Builder.new { |xml|
60
+ xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
61
+ xml.hello
62
+ end
63
+ }
64
+ doc = b.doc
65
+ assert_equal 'one:two', doc.root.namespace.href
66
+ assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
67
+
68
+ assert_equal 'one:two', doc.at('hello').namespace.href
69
+ end
70
+
71
+ def test_non_root_namespace
72
+ b = Nokogiri::XML::Builder.new { |xml|
73
+ xml.root { xml.hello(:xmlns => 'one') }
74
+ }
75
+ assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
76
+ end
77
+
78
+ def test_specify_namespace
79
+ b = Nokogiri::XML::Builder.new { |xml|
80
+ xml.root('xmlns:foo' => 'bar') do
81
+ xml[:foo].bar
82
+ xml['foo'].baz
83
+ end
84
+ }
85
+ doc = b.doc
86
+ assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
87
+ assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
88
+ end
89
+
90
+ def test_specify_namespace_nested
91
+ b = Nokogiri::XML::Builder.new { |xml|
92
+ xml.root('xmlns:foo' => 'bar') do
93
+ xml.yay do
94
+ xml[:foo].bar
95
+
96
+ xml.yikes do
97
+ xml['foo'].baz
98
+ end
99
+ end
100
+ end
101
+ }
102
+ doc = b.doc
103
+ assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
104
+ assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
105
+ end
106
+
107
+ def test_specified_namespace_undeclared
108
+ Nokogiri::XML::Builder.new { |xml|
109
+ xml.root do
110
+ assert_raises(ArgumentError) do
111
+ xml[:foo]
112
+ end
113
+ end
114
+ }
115
+ end
116
+
117
+ def test_set_encoding
118
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
119
+ xml.root do
120
+ xml.bar 'blah'
121
+ end
122
+ end
123
+ assert_match 'UTF-8', builder.to_xml
124
+ end
125
+
126
+ def test_bang_and_underscore_is_escaped
127
+ builder = Nokogiri::XML::Builder.new do |xml|
128
+ xml.root do
129
+ xml.p_('adsfadsf')
130
+ xml.p!('adsfadsf')
131
+ end
132
+ end
133
+ assert_equal 2, builder.doc.xpath('//p').length
134
+ end
135
+
136
+ def test_square_brackets_set_attributes
137
+ builder = Nokogiri::XML::Builder.new do |xml|
138
+ xml.root do
139
+ foo = xml.foo
140
+ foo['id'] = 'hello'
141
+ assert_equal 'hello', foo['id']
142
+ end
143
+ end
144
+ assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
145
+ end
146
+
147
+ def test_nested_local_variable
148
+ @ivar = 'hello'
149
+ local_var = 'hello world'
150
+ builder = Nokogiri::XML::Builder.new do |xml|
151
+ xml.root do
152
+ xml.foo local_var
153
+ xml.bar @ivar
154
+ xml.baz {
155
+ xml.text @ivar
156
+ }
157
+ end
158
+ end
159
+
160
+ assert_equal 'hello world', builder.doc.at('//root/foo').content
161
+ assert_equal 'hello', builder.doc.at('//root/bar').content
162
+ assert_equal 'hello', builder.doc.at('baz').content
163
+ end
164
+
165
+ def test_raw_append
166
+ builder = Nokogiri::XML::Builder.new do |xml|
167
+ xml.root do
168
+ xml << 'hello'
169
+ end
170
+ end
171
+
172
+ assert_equal 'hello', builder.doc.at('/root').content
173
+ end
174
+
175
+ def test_raw_append_with_instance_eval
176
+ builder = Nokogiri::XML::Builder.new do
177
+ root do
178
+ self << 'hello'
179
+ end
180
+ end
181
+
182
+ assert_equal 'hello', builder.doc.at('/root').content
183
+ end
184
+
6
185
  def test_cdata
7
186
  builder = Nokogiri::XML::Builder.new do
8
187
  root {
@@ -20,6 +199,12 @@ module Nokogiri
20
199
  }
21
200
  assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
22
201
  end
202
+
203
+ private
204
+
205
+ def namespaces_defined_on(node)
206
+ Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
207
+ end
23
208
  end
24
209
  end
25
210
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
@@ -14,6 +14,37 @@ module Nokogiri
14
14
  assert cdata.cdata?
15
15
  assert_equal '#cdata-section', cdata.name
16
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
+ assert_nothing_raised do
33
+ 100.times { CDATA.new(@xml, "asdfasdf") }
34
+ end
35
+ end
36
+
37
+ def test_content=
38
+ node = CDATA.new(@xml, 'foo')
39
+ assert_equal('foo', node.content)
40
+
41
+ node.content = '& <foo> &amp;'
42
+ assert_equal('& <foo> &amp;', node.content)
43
+ assert_equal('<![CDATA[& <foo> &amp;]]>', node.to_xml)
44
+
45
+ node.content = 'foo ]]> bar'
46
+ assert_equal('foo ]]> bar', node.content)
47
+ end
17
48
  end
18
49
  end
19
50
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
@@ -12,6 +12,18 @@ module Nokogiri
12
12
  comment = Nokogiri::XML::Comment.new(@xml, 'hello world')
13
13
  assert_equal('<!--hello world-->', comment.to_s)
14
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
15
27
  end
16
28
  end
17
29
  end
@@ -1,15 +1,327 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  require 'uri'
4
4
 
5
5
  module Nokogiri
6
6
  module XML
7
7
  class TestDocument < Nokogiri::TestCase
8
+ URI = if URI.const_defined?(:DEFAULT_PARSER)
9
+ ::URI::DEFAULT_PARSER
10
+ else
11
+ ::URI
12
+ end
13
+
8
14
  def setup
9
15
  super
10
16
  @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
11
17
  end
12
18
 
19
+ def test_root_set_to_nil
20
+ @xml.root = nil
21
+ assert_equal nil, @xml.root
22
+ end
23
+
24
+ def test_collect_namespaces
25
+ doc = Nokogiri::XML(<<-eoxml)
26
+ <xml>
27
+ <foo xmlns='hello'>
28
+ <bar xmlns:foo='world' />
29
+ </foo>
30
+ </xml>
31
+ eoxml
32
+ assert_equal({"xmlns"=>"hello", "xmlns:foo"=>"world"},
33
+ doc.collect_namespaces)
34
+ end
35
+
36
+ def test_subclass_initialize_modify # testing a segv
37
+ Class.new(Nokogiri::XML::Document) {
38
+ def initialize
39
+ super
40
+ body_node = Nokogiri::XML::Node.new "body", self
41
+ body_node.content = "stuff"
42
+ self.root = body_node
43
+ end
44
+ }.new
45
+ end
46
+
47
+ def test_create_text_node
48
+ txt = @xml.create_text_node 'foo'
49
+ assert_instance_of Nokogiri::XML::Text, txt
50
+ assert_equal 'foo', txt.text
51
+ assert_equal @xml, txt.document
52
+ end
53
+
54
+ def test_create_element
55
+ elm = @xml.create_element('foo')
56
+ assert_instance_of Nokogiri::XML::Element, elm
57
+ assert_equal 'foo', elm.name
58
+ assert_equal @xml, elm.document
59
+ end
60
+
61
+ def test_create_element_with_attributes
62
+ elm = @xml.create_element('foo',:a => "1")
63
+ assert_instance_of Nokogiri::XML::Element, elm
64
+ assert_instance_of Nokogiri::XML::Attr, elm.attributes["a"]
65
+ assert_equal "1", elm["a"]
66
+ end
67
+
68
+ def test_create_element_with_namespace
69
+ elm = @xml.create_element('foo',:'xmlns:foo' => 'http://tenderlovemaking.com')
70
+ assert_equal 'http://tenderlovemaking.com', elm.namespaces['xmlns:foo']
71
+ end
72
+
73
+ def test_create_element_with_content
74
+ elm = @xml.create_element('foo',"needs more xml/violence")
75
+ assert_equal "needs more xml/violence", elm.content
76
+ end
77
+
78
+ def test_create_cdata
79
+ cdata = @xml.create_cdata("abc")
80
+ assert_instance_of Nokogiri::XML::CDATA, cdata
81
+ assert_equal "abc", cdata.content
82
+ end
83
+
84
+ def test_pp
85
+ out = StringIO.new('')
86
+ assert_nothing_raised do
87
+ ::PP.pp @xml, out
88
+ end
89
+ end
90
+
91
+ def test_create_internal_subset_on_existing_subset
92
+ assert_not_nil @xml.internal_subset
93
+ assert_raises(RuntimeError) do
94
+ @xml.create_internal_subset('staff', nil, 'staff.dtd')
95
+ end
96
+ end
97
+
98
+ def test_create_internal_subset
99
+ xml = Nokogiri::XML('<root />')
100
+ assert_nil xml.internal_subset
101
+
102
+ xml.create_internal_subset('name', nil, 'staff.dtd')
103
+ ss = xml.internal_subset
104
+ assert_equal 'name', ss.name
105
+ assert_nil ss.external_id
106
+ assert_equal 'staff.dtd', ss.system_id
107
+ end
108
+
109
+ def test_external_subset
110
+ assert_nil @xml.external_subset
111
+ Dir.chdir(ASSETS_DIR) do
112
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) { |cfg|
113
+ cfg.dtdload
114
+ }
115
+ end
116
+ assert @xml.external_subset
117
+ end
118
+
119
+ def test_create_external_subset_fails_with_existing_subset
120
+ assert_nil @xml.external_subset
121
+ Dir.chdir(ASSETS_DIR) do
122
+ @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) { |cfg|
123
+ cfg.dtdload
124
+ }
125
+ end
126
+ assert @xml.external_subset
127
+
128
+ assert_raises(RuntimeError) do
129
+ @xml.create_external_subset('staff', nil, 'staff.dtd')
130
+ end
131
+ end
132
+
133
+ def test_create_external_subset
134
+ dtd = @xml.create_external_subset('staff', nil, 'staff.dtd')
135
+ assert_nil dtd.external_id
136
+ assert_equal 'staff.dtd', dtd.system_id
137
+ assert_equal 'staff', dtd.name
138
+ assert_equal dtd, @xml.external_subset
139
+ end
140
+
141
+ def test_version
142
+ assert_equal '1.0', @xml.version
143
+ end
144
+
145
+ def test_add_namespace
146
+ assert_raise NoMethodError do
147
+ @xml.add_namespace('foo', 'bar')
148
+ end
149
+ end
150
+
151
+ def test_attributes
152
+ assert_raise NoMethodError do
153
+ @xml.attributes
154
+ end
155
+ end
156
+
157
+ def test_namespace
158
+ assert_raise NoMethodError do
159
+ @xml.namespace
160
+ end
161
+ end
162
+
163
+ def test_namespace_definitions
164
+ assert_raise NoMethodError do
165
+ @xml.namespace_definitions
166
+ end
167
+ end
168
+
169
+ def test_line
170
+ assert_raise NoMethodError do
171
+ @xml.line
172
+ end
173
+ end
174
+
175
+ def test_empty_node_converted_to_html_is_not_self_closing
176
+ doc = Nokogiri::XML('<a></a>')
177
+ assert_equal "<a></a>", doc.inner_html
178
+ end
179
+
180
+ def test_fragment
181
+ fragment = @xml.fragment
182
+ assert_equal 0, fragment.children.length
183
+ end
184
+
185
+ def test_add_child_fragment_with_single_node
186
+ doc = Nokogiri::XML::Document.new
187
+ fragment = doc.fragment('<hello />')
188
+ doc.add_child fragment
189
+ assert_equal '/hello', doc.at('//hello').path
190
+ assert_equal 'hello', doc.root.name
191
+ end
192
+
193
+ def test_add_child_fragment_with_multiple_nodes
194
+ doc = Nokogiri::XML::Document.new
195
+ fragment = doc.fragment('<hello /><goodbye />')
196
+ assert_raises(RuntimeError) do
197
+ doc.add_child fragment
198
+ end
199
+ end
200
+
201
+ def test_add_child_with_multiple_roots
202
+ assert_raises(RuntimeError) do
203
+ @xml << Node.new('foo', @xml)
204
+ end
205
+ end
206
+
207
+ def test_move_root_to_document_with_no_root
208
+ sender = Nokogiri::XML('<root>foo</root>')
209
+ newdoc = Nokogiri::XML::Document.new
210
+ newdoc.root = sender.root
211
+ end
212
+
213
+ def test_move_root_with_existing_root_gets_gcd
214
+ doc = Nokogiri::XML('<root>test</root>')
215
+ doc2 = Nokogiri::XML("<root>#{'x' * 5000000}</root>")
216
+ doc2.root = doc.root
217
+ end
218
+
219
+ def test_validate
220
+ assert_equal 44, @xml.validate.length
221
+ end
222
+
223
+ def test_validate_no_internal_subset
224
+ doc = Nokogiri::XML('<test/>')
225
+ assert_nil doc.validate
226
+ end
227
+
228
+ def test_clone
229
+ assert @xml.clone
230
+ end
231
+
232
+ def test_document_should_not_have_default_ns
233
+ doc = Nokogiri::XML::Document.new
234
+
235
+ assert_raises NoMethodError do
236
+ doc.default_namespace = 'http://innernet.com/'
237
+ end
238
+
239
+ assert_raises NoMethodError do
240
+ doc.add_namespace_definition('foo', 'bar')
241
+ end
242
+ end
243
+
244
+ def test_parse_handles_nil_gracefully
245
+ assert_nothing_raised do
246
+ @doc = Nokogiri::XML::Document.parse(nil)
247
+ end
248
+ assert_instance_of Nokogiri::XML::Document, @doc
249
+ end
250
+
251
+ def test_parse_takes_block
252
+ options = nil
253
+ Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) do |cfg|
254
+ options = cfg
255
+ end
256
+ assert options
257
+ end
258
+
259
+ def test_parse_yields_parse_options
260
+ options = nil
261
+ Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) do |cfg|
262
+ options = cfg
263
+ options.nonet.nowarning.dtdattr
264
+ end
265
+ assert options.nonet?
266
+ assert options.nowarning?
267
+ assert options.dtdattr?
268
+ end
269
+
270
+ def test_XML_takes_block
271
+ options = nil
272
+ Nokogiri::XML(File.read(XML_FILE), XML_FILE) do |cfg|
273
+ options = cfg
274
+ options.nonet.nowarning.dtdattr
275
+ end
276
+ assert options.nonet?
277
+ assert options.nowarning?
278
+ assert options.dtdattr?
279
+ end
280
+
281
+ def test_subclass
282
+ klass = Class.new(Nokogiri::XML::Document)
283
+ doc = klass.new
284
+ assert_instance_of klass, doc
285
+ end
286
+
287
+ def test_subclass_initialize
288
+ klass = Class.new(Nokogiri::XML::Document) do
289
+ attr_accessor :initialized_with
290
+
291
+ def initialize(*args)
292
+ @initialized_with = args
293
+ end
294
+ end
295
+ doc = klass.new("1.0", 1)
296
+ assert_equal ["1.0", 1], doc.initialized_with
297
+ end
298
+
299
+ def test_subclass_dup
300
+ klass = Class.new(Nokogiri::XML::Document)
301
+ doc = klass.new.dup
302
+ assert_instance_of klass, doc
303
+ end
304
+
305
+ def test_subclass_parse
306
+ klass = Class.new(Nokogiri::XML::Document)
307
+ doc = klass.parse(File.read(XML_FILE))
308
+ assert_equal @xml.to_s, doc.to_s
309
+ assert_instance_of klass, doc
310
+ end
311
+
312
+ def test_document_parse_method
313
+ xml = Nokogiri::XML::Document.parse(File.read(XML_FILE))
314
+ assert_equal @xml.to_s, xml.to_s
315
+ end
316
+
317
+ def test_encoding=
318
+ @xml.encoding = 'UTF-8'
319
+ assert_match 'UTF-8', @xml.to_xml
320
+
321
+ @xml.encoding = 'EUC-JP'
322
+ assert_match 'EUC-JP', @xml.to_xml
323
+ end
324
+
13
325
  def test_namespace_should_not_exist
14
326
  assert_raises(NoMethodError) {
15
327
  @xml.namespace
@@ -17,13 +329,22 @@ module Nokogiri
17
329
  end
18
330
 
19
331
  def test_non_existant_function
20
- assert_raises(RuntimeError) {
332
+ # WTF. I don't know why this is different between MRI and ffi.
333
+ # They should be the same... Either way, raising an exception
334
+ # is the correct thing to do.
335
+ exception = RuntimeError
336
+
337
+ if Nokogiri::VERSION_INFO['libxml']['platform'] == 'jruby'
338
+ exception = Nokogiri::XML::XPath::SyntaxError
339
+ end
340
+
341
+ assert_raises(exception) {
21
342
  @xml.xpath('//name[foo()]')
22
343
  }
23
344
  end
24
345
 
25
346
  def test_ancestors
26
- assert_equal [], @xml.ancestors
347
+ assert_equal 0, @xml.ancestors.length
27
348
  end
28
349
 
29
350
  def test_root_node_parent_is_document
@@ -68,6 +389,22 @@ module Nokogiri
68
389
  assert_equal 1, doc.search('//xmlns:foo').search('./xmlns:bar').length
69
390
  end
70
391
 
392
+ def test_to_xml_with_indent
393
+ doc = Nokogiri::XML('<root><foo><bar/></foo></root>')
394
+ doc = Nokogiri::XML(doc.to_xml(:indent => 5))
395
+
396
+ assert_indent 5, doc
397
+ end
398
+
399
+ def test_write_xml_to_with_indent
400
+ io = StringIO.new
401
+ doc = Nokogiri::XML('<root><foo><bar/></foo></root>')
402
+ doc.write_xml_to io, :indent => 5
403
+ io.rewind
404
+ doc = Nokogiri::XML(io.read)
405
+ assert_indent 5, doc
406
+ end
407
+
71
408
  # wtf... osx's libxml sucks.
72
409
  unless Nokogiri::LIBXML_VERSION =~ /^2\.6\./
73
410
  def test_encoding
@@ -91,6 +428,18 @@ module Nokogiri
91
428
  assert_raises(Nokogiri::XML::SyntaxError) {
92
429
  Nokogiri::XML('<foo><bar></foo>', nil, nil, 0)
93
430
  }
431
+
432
+ assert_raises(Nokogiri::XML::SyntaxError) {
433
+ Nokogiri::XML('<foo><bar></foo>') { |cfg|
434
+ cfg.strict
435
+ }
436
+ }
437
+
438
+ assert_raises(Nokogiri::XML::SyntaxError) {
439
+ Nokogiri::XML(StringIO.new('<foo><bar></foo>')) { |cfg|
440
+ cfg.strict
441
+ }
442
+ }
94
443
  end
95
444
 
96
445
  def test_XML_function
@@ -143,11 +492,6 @@ module Nokogiri
143
492
  }
144
493
  end
145
494
 
146
- def test_new_document_collect_namespaces
147
- doc = Nokogiri::XML::Document.new
148
- assert_equal({}, doc.collect_namespaces)
149
- end
150
-
151
495
  def test_find_with_namespace
152
496
  doc = Nokogiri::XML.parse(<<-eoxml)
153
497
  <x xmlns:tenderlove='http://tenderlovemaking.com/'>
@@ -157,21 +501,21 @@ module Nokogiri
157
501
 
158
502
  ctx = Nokogiri::XML::XPathContext.new(doc)
159
503
  ctx.register_ns 'tenderlove', 'http://tenderlovemaking.com/'
160
- set = ctx.evaluate('//tenderlove:foo').node_set
504
+ set = ctx.evaluate('//tenderlove:foo')
161
505
  assert_equal 1, set.length
162
506
  assert_equal 'foo', set.first.name
163
507
 
164
508
  # It looks like only the URI is important:
165
509
  ctx = Nokogiri::XML::XPathContext.new(doc)
166
510
  ctx.register_ns 'america', 'http://tenderlovemaking.com/'
167
- set = ctx.evaluate('//america:foo').node_set
511
+ set = ctx.evaluate('//america:foo')
168
512
  assert_equal 1, set.length
169
513
  assert_equal 'foo', set.first.name
170
514
 
171
515
  # Its so important that a missing slash will cause it to return nothing
172
516
  ctx = Nokogiri::XML::XPathContext.new(doc)
173
517
  ctx.register_ns 'america', 'http://tenderlovemaking.com'
174
- set = ctx.evaluate('//america:foo').node_set
518
+ set = ctx.evaluate('//america:foo')
175
519
  assert_equal 0, set.length
176
520
  end
177
521
 
@@ -230,6 +574,65 @@ module Nokogiri
230
574
  assert dup.xml?, 'duplicate should be xml'
231
575
  end
232
576
 
577
+ def test_new
578
+ doc = nil
579
+ assert_nothing_raised {
580
+ doc = Nokogiri::XML::Document.new
581
+ }
582
+ assert doc
583
+ assert doc.xml?
584
+ assert_nil doc.root
585
+ end
586
+
587
+ def test_set_root
588
+ doc = nil
589
+ assert_nothing_raised {
590
+ doc = Nokogiri::XML::Document.new
591
+ }
592
+ assert doc
593
+ assert doc.xml?
594
+ assert_nil doc.root
595
+ node = Nokogiri::XML::Node.new("b", doc) { |n|
596
+ n.content = 'hello world'
597
+ }
598
+ assert_equal('hello world', node.content)
599
+ doc.root = node
600
+ assert_equal(node, doc.root)
601
+ end
602
+
603
+ def test_remove_namespaces
604
+ doc = Nokogiri::XML <<-EOX
605
+ <root xmlns:a="http://a.flavorjon.es/" xmlns:b="http://b.flavorjon.es/">
606
+ <a:foo>hello from a</a:foo>
607
+ <b:foo>hello from b</b:foo>
608
+ <container xmlns:c="http://c.flavorjon.es/">
609
+ <c:foo c:attr='attr-value'>hello from c</c:foo>
610
+ </container>
611
+ </root>
612
+ EOX
613
+
614
+ namespaces = doc.root.namespaces
615
+
616
+ # assert on setup
617
+ assert_equal 2, doc.root.namespaces.length
618
+ assert_equal 3, doc.at_xpath("//container").namespaces.length
619
+ assert_equal 0, doc.xpath("//foo").length
620
+ assert_equal 1, doc.xpath("//a:foo").length
621
+ assert_equal 1, doc.xpath("//a:foo").length
622
+ assert_equal 1, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
623
+ assert_match %r{foo c:attr}, doc.to_xml
624
+
625
+ doc.remove_namespaces!
626
+
627
+ assert_equal 0, doc.root.namespaces.length
628
+ assert_equal 0, doc.at_xpath("//container").namespaces.length
629
+ assert_equal 3, doc.xpath("//foo").length
630
+ assert_equal 0, doc.xpath("//a:foo", namespaces).length
631
+ assert_equal 0, doc.xpath("//a:foo", namespaces).length
632
+ assert_equal 0, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
633
+ assert_match %r{foo attr}, doc.to_xml
634
+ end
635
+
233
636
  def test_subset_is_decorated
234
637
  x = Module.new do
235
638
  def awesome!
@@ -260,38 +663,7 @@ module Nokogiri
260
663
  assert node.respond_to?(:awesome!), node.class
261
664
  end
262
665
  assert @xml.root.respond_to?(:awesome!)
263
- end
264
-
265
- def test_new
266
- doc = nil
267
- assert_nothing_raised {
268
- doc = Nokogiri::XML::Document.new
269
- }
270
- assert doc
271
- assert doc.xml?
272
- assert_nil doc.root
273
- end
274
-
275
- def test_set_root
276
- doc = nil
277
- assert_nothing_raised {
278
- doc = Nokogiri::XML::Document.new
279
- }
280
- assert doc
281
- assert doc.xml?
282
- assert_nil doc.root
283
- node = Nokogiri::XML::Node.new("b", doc) { |n|
284
- n.content = 'hello world'
285
- }
286
- assert_equal('hello world', node.content)
287
- doc.root = node
288
- assert_equal(node, doc.root)
289
- end
290
-
291
- def util_decorate(document, x)
292
- document.decorators(XML::Node) << x
293
- document.decorators(XML::NodeSet) << x
294
- document.decorate!
666
+ assert @xml.children.respond_to?(:awesome!)
295
667
  end
296
668
  end
297
669
  end