nokogiri-backupify 1.5.0.beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. data/.autotest +26 -0
  2. data/CHANGELOG.ja.rdoc +509 -0
  3. data/CHANGELOG.rdoc +490 -0
  4. data/Manifest.txt +274 -0
  5. data/README.ja.rdoc +106 -0
  6. data/README.rdoc +150 -0
  7. data/Rakefile +217 -0
  8. data/bin/nokogiri +54 -0
  9. data/deps.rip +5 -0
  10. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  11. data/ext/java/nokogiri/HtmlDocument.java +146 -0
  12. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  13. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  14. data/ext/java/nokogiri/HtmlSaxParserContext.java +256 -0
  15. data/ext/java/nokogiri/NokogiriService.java +466 -0
  16. data/ext/java/nokogiri/XmlAttr.java +183 -0
  17. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  18. data/ext/java/nokogiri/XmlCdata.java +89 -0
  19. data/ext/java/nokogiri/XmlComment.java +84 -0
  20. data/ext/java/nokogiri/XmlDocument.java +514 -0
  21. data/ext/java/nokogiri/XmlDocumentFragment.java +216 -0
  22. data/ext/java/nokogiri/XmlDtd.java +464 -0
  23. data/ext/java/nokogiri/XmlElement.java +221 -0
  24. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  25. data/ext/java/nokogiri/XmlElementDecl.java +147 -0
  26. data/ext/java/nokogiri/XmlEntityDecl.java +161 -0
  27. data/ext/java/nokogiri/XmlEntityReference.java +75 -0
  28. data/ext/java/nokogiri/XmlNamespace.java +127 -0
  29. data/ext/java/nokogiri/XmlNode.java +1392 -0
  30. data/ext/java/nokogiri/XmlNodeSet.java +284 -0
  31. data/ext/java/nokogiri/XmlProcessingInstruction.java +103 -0
  32. data/ext/java/nokogiri/XmlReader.java +409 -0
  33. data/ext/java/nokogiri/XmlRelaxng.java +199 -0
  34. data/ext/java/nokogiri/XmlSaxParserContext.java +353 -0
  35. data/ext/java/nokogiri/XmlSaxPushParser.java +182 -0
  36. data/ext/java/nokogiri/XmlSchema.java +175 -0
  37. data/ext/java/nokogiri/XmlSyntaxError.java +114 -0
  38. data/ext/java/nokogiri/XmlText.java +135 -0
  39. data/ext/java/nokogiri/XmlXpathContext.java +175 -0
  40. data/ext/java/nokogiri/XsltStylesheet.java +181 -0
  41. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +205 -0
  42. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  43. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +80 -0
  44. data/ext/java/nokogiri/internals/NokogiriHandler.java +326 -0
  45. data/ext/java/nokogiri/internals/NokogiriHelpers.java +583 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +170 -0
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +118 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +73 -0
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  50. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +78 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +120 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +56 -0
  53. data/ext/java/nokogiri/internals/ParserContext.java +278 -0
  54. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  55. data/ext/java/nokogiri/internals/ReaderNode.java +473 -0
  56. data/ext/java/nokogiri/internals/SaveContext.java +282 -0
  57. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +68 -0
  58. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  59. data/ext/java/nokogiri/internals/XmlDomParser.java +77 -0
  60. data/ext/java/nokogiri/internals/XmlDomParserContext.java +233 -0
  61. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  62. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  63. data/ext/nokogiri/depend +358 -0
  64. data/ext/nokogiri/extconf.rb +124 -0
  65. data/ext/nokogiri/html_document.c +154 -0
  66. data/ext/nokogiri/html_document.h +10 -0
  67. data/ext/nokogiri/html_element_description.c +276 -0
  68. data/ext/nokogiri/html_element_description.h +10 -0
  69. data/ext/nokogiri/html_entity_lookup.c +32 -0
  70. data/ext/nokogiri/html_entity_lookup.h +8 -0
  71. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  72. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  73. data/ext/nokogiri/nokogiri.c +92 -0
  74. data/ext/nokogiri/nokogiri.h +160 -0
  75. data/ext/nokogiri/xml_attr.c +94 -0
  76. data/ext/nokogiri/xml_attr.h +9 -0
  77. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  78. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  79. data/ext/nokogiri/xml_cdata.c +56 -0
  80. data/ext/nokogiri/xml_cdata.h +9 -0
  81. data/ext/nokogiri/xml_comment.c +54 -0
  82. data/ext/nokogiri/xml_comment.h +9 -0
  83. data/ext/nokogiri/xml_document.c +478 -0
  84. data/ext/nokogiri/xml_document.h +23 -0
  85. data/ext/nokogiri/xml_document_fragment.c +48 -0
  86. data/ext/nokogiri/xml_document_fragment.h +10 -0
  87. data/ext/nokogiri/xml_dtd.c +202 -0
  88. data/ext/nokogiri/xml_dtd.h +10 -0
  89. data/ext/nokogiri/xml_element_content.c +123 -0
  90. data/ext/nokogiri/xml_element_content.h +10 -0
  91. data/ext/nokogiri/xml_element_decl.c +69 -0
  92. data/ext/nokogiri/xml_element_decl.h +9 -0
  93. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  94. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  95. data/ext/nokogiri/xml_entity_decl.c +110 -0
  96. data/ext/nokogiri/xml_entity_decl.h +10 -0
  97. data/ext/nokogiri/xml_entity_reference.c +52 -0
  98. data/ext/nokogiri/xml_entity_reference.h +9 -0
  99. data/ext/nokogiri/xml_io.c +31 -0
  100. data/ext/nokogiri/xml_io.h +11 -0
  101. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  102. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  103. data/ext/nokogiri/xml_namespace.c +84 -0
  104. data/ext/nokogiri/xml_namespace.h +13 -0
  105. data/ext/nokogiri/xml_node.c +1384 -0
  106. data/ext/nokogiri/xml_node.h +13 -0
  107. data/ext/nokogiri/xml_node_set.c +418 -0
  108. data/ext/nokogiri/xml_node_set.h +9 -0
  109. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  110. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  111. data/ext/nokogiri/xml_reader.c +684 -0
  112. data/ext/nokogiri/xml_reader.h +10 -0
  113. data/ext/nokogiri/xml_relax_ng.c +161 -0
  114. data/ext/nokogiri/xml_relax_ng.h +9 -0
  115. data/ext/nokogiri/xml_sax_parser.c +288 -0
  116. data/ext/nokogiri/xml_sax_parser.h +39 -0
  117. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  118. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  119. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  120. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  121. data/ext/nokogiri/xml_schema.c +205 -0
  122. data/ext/nokogiri/xml_schema.h +9 -0
  123. data/ext/nokogiri/xml_syntax_error.c +58 -0
  124. data/ext/nokogiri/xml_syntax_error.h +13 -0
  125. data/ext/nokogiri/xml_text.c +50 -0
  126. data/ext/nokogiri/xml_text.h +9 -0
  127. data/ext/nokogiri/xml_xpath_context.c +309 -0
  128. data/ext/nokogiri/xml_xpath_context.h +9 -0
  129. data/ext/nokogiri/xslt_stylesheet.c +258 -0
  130. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  131. data/lib/isorelax.jar +0 -0
  132. data/lib/jing.jar +0 -0
  133. data/lib/nekodtd.jar +0 -0
  134. data/lib/nekohtml.jar +0 -0
  135. data/lib/nokogiri.rb +143 -0
  136. data/lib/nokogiri/css.rb +23 -0
  137. data/lib/nokogiri/css/node.rb +99 -0
  138. data/lib/nokogiri/css/parser.rb +677 -0
  139. data/lib/nokogiri/css/parser.y +237 -0
  140. data/lib/nokogiri/css/parser_extras.rb +91 -0
  141. data/lib/nokogiri/css/syntax_error.rb +7 -0
  142. data/lib/nokogiri/css/tokenizer.rb +152 -0
  143. data/lib/nokogiri/css/tokenizer.rex +55 -0
  144. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  145. data/lib/nokogiri/decorators/slop.rb +35 -0
  146. data/lib/nokogiri/html.rb +36 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +221 -0
  149. data/lib/nokogiri/html/document_fragment.rb +41 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  152. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  153. data/lib/nokogiri/html/sax/parser.rb +52 -0
  154. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  155. data/lib/nokogiri/syntax_error.rb +4 -0
  156. data/lib/nokogiri/version.rb +35 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +418 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +218 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +84 -0
  165. data/lib/nokogiri/xml/dtd.rb +22 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  169. data/lib/nokogiri/xml/namespace.rb +13 -0
  170. data/lib/nokogiri/xml/node.rb +907 -0
  171. data/lib/nokogiri/xml/node/save_options.rb +45 -0
  172. data/lib/nokogiri/xml/node_set.rb +350 -0
  173. data/lib/nokogiri/xml/notation.rb +6 -0
  174. data/lib/nokogiri/xml/parse_options.rb +85 -0
  175. data/lib/nokogiri/xml/pp.rb +2 -0
  176. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  177. data/lib/nokogiri/xml/pp/node.rb +56 -0
  178. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  179. data/lib/nokogiri/xml/reader.rb +112 -0
  180. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  181. data/lib/nokogiri/xml/sax.rb +4 -0
  182. data/lib/nokogiri/xml/sax/document.rb +164 -0
  183. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  184. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  185. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  186. data/lib/nokogiri/xml/schema.rb +57 -0
  187. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  188. data/lib/nokogiri/xml/text.rb +9 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +52 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xercesImpl.jar +0 -0
  195. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  196. data/tasks/cross_compile.rb +177 -0
  197. data/tasks/test.rb +94 -0
  198. data/test/css/test_nthiness.rb +159 -0
  199. data/test/css/test_parser.rb +303 -0
  200. data/test/css/test_tokenizer.rb +198 -0
  201. data/test/css/test_xpath_visitor.rb +85 -0
  202. data/test/decorators/test_slop.rb +16 -0
  203. data/test/files/2ch.html +108 -0
  204. data/test/files/address_book.rlx +12 -0
  205. data/test/files/address_book.xml +10 -0
  206. data/test/files/bar/bar.xsd +4 -0
  207. data/test/files/dont_hurt_em_why.xml +422 -0
  208. data/test/files/exslt.xml +8 -0
  209. data/test/files/exslt.xslt +35 -0
  210. data/test/files/foo/foo.xsd +4 -0
  211. data/test/files/po.xml +32 -0
  212. data/test/files/po.xsd +66 -0
  213. data/test/files/shift_jis.html +10 -0
  214. data/test/files/shift_jis.xml +5 -0
  215. data/test/files/snuggles.xml +3 -0
  216. data/test/files/staff.dtd +10 -0
  217. data/test/files/staff.xml +59 -0
  218. data/test/files/staff.xslt +32 -0
  219. data/test/files/tlm.html +850 -0
  220. data/test/files/valid_bar.xml +2 -0
  221. data/test/helper.rb +171 -0
  222. data/test/html/sax/test_parser.rb +136 -0
  223. data/test/html/sax/test_parser_context.rb +48 -0
  224. data/test/html/test_builder.rb +164 -0
  225. data/test/html/test_document.rb +457 -0
  226. data/test/html/test_document_encoding.rb +123 -0
  227. data/test/html/test_document_fragment.rb +255 -0
  228. data/test/html/test_element_description.rb +100 -0
  229. data/test/html/test_named_characters.rb +14 -0
  230. data/test/html/test_node.rb +190 -0
  231. data/test/html/test_node_encoding.rb +27 -0
  232. data/test/test_convert_xpath.rb +135 -0
  233. data/test/test_css_cache.rb +45 -0
  234. data/test/test_encoding_handler.rb +46 -0
  235. data/test/test_memory_leak.rb +52 -0
  236. data/test/test_nokogiri.rb +132 -0
  237. data/test/test_reader.rb +403 -0
  238. data/test/test_soap4r_sax.rb +52 -0
  239. data/test/test_xslt_transforms.rb +189 -0
  240. data/test/xml/node/test_save_options.rb +20 -0
  241. data/test/xml/node/test_subclass.rb +44 -0
  242. data/test/xml/sax/test_parser.rb +338 -0
  243. data/test/xml/sax/test_parser_context.rb +113 -0
  244. data/test/xml/sax/test_push_parser.rb +156 -0
  245. data/test/xml/test_attr.rb +65 -0
  246. data/test/xml/test_attribute_decl.rb +86 -0
  247. data/test/xml/test_builder.rb +210 -0
  248. data/test/xml/test_cdata.rb +50 -0
  249. data/test/xml/test_comment.rb +29 -0
  250. data/test/xml/test_document.rb +675 -0
  251. data/test/xml/test_document_encoding.rb +26 -0
  252. data/test/xml/test_document_fragment.rb +192 -0
  253. data/test/xml/test_dtd.rb +107 -0
  254. data/test/xml/test_dtd_encoding.rb +33 -0
  255. data/test/xml/test_element_content.rb +56 -0
  256. data/test/xml/test_element_decl.rb +73 -0
  257. data/test/xml/test_entity_decl.rb +122 -0
  258. data/test/xml/test_entity_reference.rb +21 -0
  259. data/test/xml/test_namespace.rb +70 -0
  260. data/test/xml/test_node.rb +899 -0
  261. data/test/xml/test_node_attributes.rb +34 -0
  262. data/test/xml/test_node_encoding.rb +107 -0
  263. data/test/xml/test_node_reparenting.rb +321 -0
  264. data/test/xml/test_node_set.rb +708 -0
  265. data/test/xml/test_parse_options.rb +52 -0
  266. data/test/xml/test_processing_instruction.rb +30 -0
  267. data/test/xml/test_reader_encoding.rb +126 -0
  268. data/test/xml/test_relax_ng.rb +60 -0
  269. data/test/xml/test_schema.rb +89 -0
  270. data/test/xml/test_syntax_error.rb +12 -0
  271. data/test/xml/test_text.rb +47 -0
  272. data/test/xml/test_unparented_node.rb +381 -0
  273. data/test/xml/test_xpath.rb +237 -0
  274. data/test/xslt/test_custom_functions.rb +94 -0
  275. metadata +525 -0
@@ -0,0 +1,457 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module HTML
5
+ class TestDocument < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @html = Nokogiri::HTML.parse(File.read(HTML_FILE))
9
+ end
10
+
11
+ def test_exceptions_remove_newlines
12
+ errors = @html.errors
13
+ assert errors.length > 0, 'has errors'
14
+ errors.each do |error|
15
+ assert_equal(error.to_s.chomp, error.to_s)
16
+ end
17
+ end
18
+
19
+ def test_fragment
20
+ fragment = @html.fragment
21
+ assert_equal 0, fragment.children.length
22
+ end
23
+
24
+ def test_document_takes_config_block
25
+ options = nil
26
+ Nokogiri::HTML(File.read(HTML_FILE), HTML_FILE) do |cfg|
27
+ options = cfg
28
+ options.nonet.nowarning.dtdattr
29
+ end
30
+ assert options.nonet?
31
+ assert options.nowarning?
32
+ assert options.dtdattr?
33
+ end
34
+
35
+ def test_parse_takes_config_block
36
+ options = nil
37
+ Nokogiri::HTML.parse(File.read(HTML_FILE), HTML_FILE) do |cfg|
38
+ options = cfg
39
+ options.nonet.nowarning.dtdattr
40
+ end
41
+ assert options.nonet?
42
+ assert options.nowarning?
43
+ assert options.dtdattr?
44
+ end
45
+
46
+ def test_subclass
47
+ klass = Class.new(Nokogiri::HTML::Document)
48
+ doc = klass.new
49
+ assert_instance_of klass, doc
50
+ end
51
+
52
+ def test_subclass_initialize
53
+ klass = Class.new(Nokogiri::HTML::Document) do
54
+ attr_accessor :initialized_with
55
+
56
+ def initialize(*args)
57
+ @initialized_with = args
58
+ end
59
+ end
60
+ doc = klass.new("uri", "external_id", 1)
61
+ assert_equal ["uri", "external_id", 1], doc.initialized_with
62
+ end
63
+
64
+ def test_subclass_dup
65
+ klass = Class.new(Nokogiri::HTML::Document)
66
+ doc = klass.new.dup
67
+ assert_instance_of klass, doc
68
+ end
69
+
70
+ def test_subclass_parse
71
+ klass = Class.new(Nokogiri::HTML::Document)
72
+ doc = klass.parse(File.read(HTML_FILE))
73
+ assert_equal @html.to_s, doc.to_s
74
+ assert_instance_of klass, doc
75
+ end
76
+
77
+ def test_document_parse_method
78
+ html = Nokogiri::HTML::Document.parse(File.read(HTML_FILE))
79
+ assert_equal @html.to_s, html.to_s
80
+ end
81
+
82
+ ###
83
+ # Nokogiri::HTML returns an empty Document when given a blank string GH#11
84
+ def test_empty_string_returns_empty_doc
85
+ doc = Nokogiri::HTML('')
86
+ assert_instance_of Nokogiri::HTML::Document, doc
87
+ assert_nil doc.root
88
+ end
89
+
90
+ unless Nokogiri.uses_libxml? && %w[2 6] === LIBXML_VERSION.split('.')[0..1]
91
+ # FIXME: this is a hack around broken libxml versions
92
+ def test_to_xhtml_with_indent
93
+ doc = Nokogiri::HTML('<html><body><a>foo</a></body></html>')
94
+ doc = Nokogiri::HTML(doc.to_xhtml(:indent => 2))
95
+ assert_indent 2, doc
96
+ end
97
+
98
+ def test_write_to_xhtml_with_indent
99
+ io = StringIO.new
100
+ doc = Nokogiri::HTML('<html><body><a>foo</a></body></html>')
101
+ doc.write_xhtml_to io, :indent => 5
102
+ io.rewind
103
+ doc = Nokogiri::HTML(io.read)
104
+ assert_indent 5, doc
105
+ end
106
+ end
107
+
108
+ def test_swap_should_not_exist
109
+ assert_raises(NoMethodError) {
110
+ @html.swap
111
+ }
112
+ end
113
+
114
+ def test_namespace_should_not_exist
115
+ assert_raises(NoMethodError) {
116
+ @html.namespace
117
+ }
118
+ end
119
+
120
+ def test_meta_encoding
121
+ assert_equal 'UTF-8', @html.meta_encoding
122
+
123
+ html = Nokogiri::HTML(<<-eohtml)
124
+ <html>
125
+ <head>
126
+ <meta http-equiv="X-Content-Type" content="text/html; charset=Shift_JIS">
127
+ </head>
128
+ <body>
129
+ foo
130
+ </body>
131
+ </html>
132
+ eohtml
133
+ assert_nil html.meta_encoding
134
+ end
135
+
136
+ def test_meta_encoding=
137
+ @html.meta_encoding = 'EUC-JP'
138
+ assert_equal 'EUC-JP', @html.meta_encoding
139
+ end
140
+
141
+ def test_title
142
+ assert_equal 'Tender Lovemaking ', @html.title
143
+ doc = Nokogiri::HTML('<html><body>foo</body></html>')
144
+ assert_nil doc.title
145
+ end
146
+
147
+ def test_title=()
148
+ doc = Nokogiri::HTML(<<eohtml)
149
+ <html>
150
+ <head>
151
+ <title>old</title>
152
+ </head>
153
+ <body>
154
+ foo
155
+ </body>
156
+ </html>
157
+ eohtml
158
+ doc.title = 'new'
159
+ assert_equal 'new', doc.title
160
+
161
+ doc = Nokogiri::HTML(<<eohtml)
162
+ <html>
163
+ <head>
164
+ </head>
165
+ <body>
166
+ foo
167
+ </body>
168
+ </html>
169
+ eohtml
170
+ doc.title = 'new'
171
+ assert_equal 'new', doc.title
172
+
173
+ doc = Nokogiri::HTML(<<eohtml)
174
+ <html>
175
+ <body>
176
+ foo
177
+ </body>
178
+ </html>
179
+ eohtml
180
+ doc.title = 'new'
181
+ if Nokogiri.uses_libxml?
182
+ assert_nil doc.title
183
+ else
184
+ assert_equal 'new', doc.title
185
+ end
186
+ end
187
+
188
+ def test_meta_encoding_without_head
189
+ html = Nokogiri::HTML('<html><body>foo</body></html>')
190
+ assert_nil html.meta_encoding
191
+
192
+ html.meta_encoding = 'EUC-JP'
193
+ assert_nil html.meta_encoding
194
+ end
195
+
196
+ def test_root_node_parent_is_document
197
+ parent = @html.root.parent
198
+ assert_equal @html, parent
199
+ assert_instance_of Nokogiri::HTML::Document, parent
200
+ end
201
+
202
+ def test_parse_handles_nil_gracefully
203
+ assert_nothing_raised do
204
+ @doc = Nokogiri::HTML::Document.parse(nil)
205
+ end
206
+ assert_instance_of Nokogiri::HTML::Document, @doc
207
+ end
208
+
209
+ def test_parse_empty_document
210
+ doc = Nokogiri::HTML("\n")
211
+ assert_equal 0, doc.css('a').length
212
+ assert_equal 0, doc.xpath('//a').length
213
+ assert_equal 0, doc.search('//a').length
214
+ end
215
+
216
+ def test_HTML_function
217
+ html = Nokogiri::HTML(File.read(HTML_FILE))
218
+ assert html.html?
219
+ end
220
+
221
+ def test_parse_io
222
+ assert File.open(HTML_FILE, 'rb') { |f|
223
+ Document.read_io(f, nil, 'UTF-8',
224
+ XML::ParseOptions::NOERROR | XML::ParseOptions::NOWARNING
225
+ )
226
+ }
227
+ end
228
+
229
+ def test_to_xhtml
230
+ assert_match 'XHTML', @html.to_xhtml
231
+ assert_match 'XHTML', @html.to_xhtml(:encoding => 'UTF-8')
232
+ assert_match 'UTF-8', @html.to_xhtml(:encoding => 'UTF-8')
233
+ end
234
+
235
+ def test_no_xml_header
236
+ html = Nokogiri::HTML(<<-eohtml)
237
+ <html>
238
+ </html>
239
+ eohtml
240
+ assert html.to_html.length > 0, 'html length is too short'
241
+ assert_no_match(/^<\?xml/, html.to_html)
242
+ end
243
+
244
+ def test_document_has_error
245
+ html = Nokogiri::HTML(<<-eohtml)
246
+ <html>
247
+ <body>
248
+ <div awesome="asdf>
249
+ <p>inside div tag</p>
250
+ </div>
251
+ <p>outside div tag</p>
252
+ </body>
253
+ </html>
254
+ eohtml
255
+ assert html.errors.length > 0
256
+ end
257
+
258
+ def test_relative_css
259
+ html = Nokogiri::HTML(<<-eohtml)
260
+ <html>
261
+ <body>
262
+ <div>
263
+ <p>inside div tag</p>
264
+ </div>
265
+ <p>outside div tag</p>
266
+ </body>
267
+ </html>
268
+ eohtml
269
+ set = html.search('div').search('p')
270
+ assert_equal(1, set.length)
271
+ assert_equal('inside div tag', set.first.inner_text)
272
+ end
273
+
274
+ def test_multi_css
275
+ html = Nokogiri::HTML(<<-eohtml)
276
+ <html>
277
+ <body>
278
+ <div>
279
+ <p>p tag</p>
280
+ <a>a tag</a>
281
+ </div>
282
+ </body>
283
+ </html>
284
+ eohtml
285
+ set = html.css('p, a')
286
+ assert_equal(2, set.length)
287
+ assert_equal ['a tag', 'p tag'].sort, set.map { |x| x.content }.sort
288
+ end
289
+
290
+ def test_inner_text
291
+ html = Nokogiri::HTML(<<-eohtml)
292
+ <html>
293
+ <body>
294
+ <div>
295
+ <p>
296
+ Hello world!
297
+ </p>
298
+ </div>
299
+ </body>
300
+ </html>
301
+ eohtml
302
+ node = html.xpath('//div').first
303
+ assert_equal('Hello world!', node.inner_text.strip)
304
+ end
305
+
306
+ def test_find_by_xpath
307
+ found = @html.xpath('//div/a')
308
+ assert_equal 3, found.length
309
+ end
310
+
311
+ def test_find_by_css
312
+ found = @html.css('div > a')
313
+ assert_equal 3, found.length
314
+ end
315
+
316
+ def test_find_by_css_with_square_brackets
317
+ found = @html.css("div[@id='header'] > h1")
318
+ found = @html.css("div[@id='header'] h1") # this blows up on commit 6fa0f6d329d9dbf1cc21c0ac72f7e627bb4c05fc
319
+ assert_equal 1, found.length
320
+ end
321
+
322
+ def test_find_with_function
323
+ assert @html.css("div:awesome() h1", Class.new {
324
+ def awesome divs
325
+ [divs.first]
326
+ end
327
+ }.new)
328
+ end
329
+
330
+ def test_dup_shallow
331
+ found = @html.search('//div/a').first
332
+ dup = found.dup(0)
333
+ assert dup
334
+ assert_equal '', dup.content
335
+ end
336
+
337
+ def test_search_can_handle_xpath_and_css
338
+ found = @html.search('//div/a', 'div > p')
339
+ length = @html.xpath('//div/a').length +
340
+ @html.css('div > p').length
341
+ assert_equal length, found.length
342
+ end
343
+
344
+ def test_dup_document
345
+ assert dup = @html.dup
346
+ assert_not_equal dup, @html
347
+ assert @html.html?
348
+ assert_instance_of Nokogiri::HTML::Document, dup
349
+ assert dup.html?, 'duplicate should be html'
350
+ assert_equal @html.to_s, dup.to_s
351
+ end
352
+
353
+ def test_dup_document_shallow
354
+ assert dup = @html.dup(0)
355
+ assert_not_equal dup, @html
356
+ end
357
+
358
+ def test_dup
359
+ found = @html.search('//div/a').first
360
+ dup = found.dup
361
+ assert dup
362
+ assert_equal found.content, dup.content
363
+ assert_equal found.document, dup.document
364
+ end
365
+
366
+ def test_inner_html
367
+ html = Nokogiri::HTML(<<-eohtml)
368
+ <html>
369
+ <body>
370
+ <div>
371
+ <p>
372
+ Hello world!
373
+ </p>
374
+ </div>
375
+ </body>
376
+ </html>
377
+ eohtml
378
+ node = html.xpath('//div').first
379
+ assert_equal('<p>Helloworld!</p>', node.inner_html.gsub(/\s/, ''))
380
+ end
381
+
382
+ def test_round_trip
383
+ doc = Nokogiri::HTML(@html.inner_html)
384
+ assert_equal @html.root.to_html, doc.root.to_html
385
+ end
386
+
387
+ def test_fragment_contains_text_node
388
+ fragment = Nokogiri::HTML.fragment('fooo')
389
+ assert_equal 1, fragment.children.length
390
+ assert_equal 'fooo', fragment.inner_text
391
+ end
392
+
393
+ def test_fragment_includes_two_tags
394
+ assert_equal 2, Nokogiri::HTML.fragment("<br/><hr/>").children.length
395
+ end
396
+
397
+ def test_relative_css_finder
398
+ doc = Nokogiri::HTML(<<-eohtml)
399
+ <html>
400
+ <body>
401
+ <div class="red">
402
+ <p>
403
+ inside red
404
+ </p>
405
+ </div>
406
+ <div class="green">
407
+ <p>
408
+ inside green
409
+ </p>
410
+ </div>
411
+ </body>
412
+ </html>
413
+ eohtml
414
+ red_divs = doc.css('div.red')
415
+ assert_equal 1, red_divs.length
416
+ p_tags = red_divs.first.css('p')
417
+ assert_equal 1, p_tags.length
418
+ assert_equal 'inside red', p_tags.first.text.strip
419
+ end
420
+
421
+ def test_find_classes
422
+ doc = Nokogiri::HTML(<<-eohtml)
423
+ <html>
424
+ <body>
425
+ <p class="red">RED</p>
426
+ <p class="awesome red">RED</p>
427
+ <p class="notred">GREEN</p>
428
+ <p class="green notred">GREEN</p>
429
+ </body>
430
+ </html>
431
+ eohtml
432
+ list = doc.css('.red')
433
+ assert_equal 2, list.length
434
+ assert_equal %w{ RED RED }, list.map { |x| x.text }
435
+ end
436
+
437
+ def test_parse_can_take_io
438
+ html = nil
439
+ File.open(HTML_FILE, 'rb') { |f|
440
+ html = Nokogiri::HTML(f)
441
+ }
442
+ assert html.html?
443
+ end
444
+
445
+ def test_html?
446
+ assert !@html.xml?
447
+ assert @html.html?
448
+ end
449
+
450
+ def test_serialize
451
+ assert @html.serialize
452
+ assert @html.to_html
453
+ end
454
+ end
455
+ end
456
+ end
457
+