nokogiri 1.5.10 → 1.13.0

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 (334) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +73 -0
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +956 -100
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +232 -87
  18. data/ext/nokogiri/nokogiri.h +188 -129
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +162 -168
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -58
  93. data/lib/nokogiri/css/parser.rb +327 -288
  94. data/lib/nokogiri/css/parser.y +67 -45
  95. data/lib/nokogiri/css/parser_extras.rb +52 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +263 -75
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/html4/document.rb +331 -0
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +221 -0
  123. data/lib/nokogiri/version.rb +3 -90
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +96 -54
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -41
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +259 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +18 -16
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  171. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  172. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  173. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  175. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  176. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  177. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  178. metadata +382 -460
  179. data/.autotest +0 -26
  180. data/.gemtest +0 -0
  181. data/CHANGELOG.ja.rdoc +0 -785
  182. data/CHANGELOG.rdoc +0 -783
  183. data/C_CODING_STYLE.rdoc +0 -33
  184. data/Manifest.txt +0 -303
  185. data/README.ja.rdoc +0 -106
  186. data/README.rdoc +0 -175
  187. data/ROADMAP.md +0 -90
  188. data/Rakefile +0 -228
  189. data/STANDARD_RESPONSES.md +0 -47
  190. data/Y_U_NO_GEMSPEC.md +0 -155
  191. data/build_all +0 -105
  192. data/ext/nokogiri/html_document.c +0 -170
  193. data/ext/nokogiri/html_document.h +0 -10
  194. data/ext/nokogiri/html_element_description.c +0 -279
  195. data/ext/nokogiri/html_element_description.h +0 -10
  196. data/ext/nokogiri/html_entity_lookup.c +0 -32
  197. data/ext/nokogiri/html_entity_lookup.h +0 -8
  198. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  199. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  200. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  201. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  202. data/ext/nokogiri/xml_attr.h +0 -9
  203. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  204. data/ext/nokogiri/xml_cdata.h +0 -9
  205. data/ext/nokogiri/xml_comment.h +0 -9
  206. data/ext/nokogiri/xml_document.h +0 -23
  207. data/ext/nokogiri/xml_document_fragment.h +0 -10
  208. data/ext/nokogiri/xml_dtd.h +0 -10
  209. data/ext/nokogiri/xml_element_content.h +0 -10
  210. data/ext/nokogiri/xml_element_decl.h +0 -9
  211. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  212. data/ext/nokogiri/xml_entity_decl.h +0 -10
  213. data/ext/nokogiri/xml_entity_reference.h +0 -9
  214. data/ext/nokogiri/xml_io.c +0 -56
  215. data/ext/nokogiri/xml_io.h +0 -11
  216. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  217. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  218. data/ext/nokogiri/xml_namespace.h +0 -13
  219. data/ext/nokogiri/xml_node.h +0 -13
  220. data/ext/nokogiri/xml_node_set.h +0 -14
  221. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  222. data/ext/nokogiri/xml_reader.h +0 -10
  223. data/ext/nokogiri/xml_relax_ng.h +0 -9
  224. data/ext/nokogiri/xml_sax_parser.h +0 -39
  225. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  226. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  227. data/ext/nokogiri/xml_schema.h +0 -9
  228. data/ext/nokogiri/xml_syntax_error.h +0 -13
  229. data/ext/nokogiri/xml_text.h +0 -9
  230. data/ext/nokogiri/xml_xpath_context.h +0 -10
  231. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  232. data/lib/nokogiri/html/document.rb +0 -254
  233. data/lib/nokogiri/html/document_fragment.rb +0 -41
  234. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  235. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  236. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  237. data/tasks/cross_compile.rb +0 -150
  238. data/tasks/nokogiri.org.rb +0 -24
  239. data/tasks/test.rb +0 -95
  240. data/test/css/test_nthiness.rb +0 -159
  241. data/test/css/test_parser.rb +0 -341
  242. data/test/css/test_tokenizer.rb +0 -198
  243. data/test/css/test_xpath_visitor.rb +0 -91
  244. data/test/decorators/test_slop.rb +0 -16
  245. data/test/files/2ch.html +0 -108
  246. data/test/files/address_book.rlx +0 -12
  247. data/test/files/address_book.xml +0 -10
  248. data/test/files/bar/bar.xsd +0 -4
  249. data/test/files/dont_hurt_em_why.xml +0 -422
  250. data/test/files/encoding.html +0 -82
  251. data/test/files/encoding.xhtml +0 -84
  252. data/test/files/exslt.xml +0 -8
  253. data/test/files/exslt.xslt +0 -35
  254. data/test/files/foo/foo.xsd +0 -4
  255. data/test/files/metacharset.html +0 -10
  256. data/test/files/noencoding.html +0 -47
  257. data/test/files/po.xml +0 -32
  258. data/test/files/po.xsd +0 -66
  259. data/test/files/shift_jis.html +0 -10
  260. data/test/files/shift_jis.xml +0 -5
  261. data/test/files/snuggles.xml +0 -3
  262. data/test/files/staff.dtd +0 -10
  263. data/test/files/staff.xml +0 -59
  264. data/test/files/staff.xslt +0 -32
  265. data/test/files/test_document_url/bar.xml +0 -2
  266. data/test/files/test_document_url/document.dtd +0 -4
  267. data/test/files/test_document_url/document.xml +0 -6
  268. data/test/files/tlm.html +0 -850
  269. data/test/files/to_be_xincluded.xml +0 -2
  270. data/test/files/valid_bar.xml +0 -2
  271. data/test/files/xinclude.xml +0 -4
  272. data/test/helper.rb +0 -154
  273. data/test/html/sax/test_parser.rb +0 -141
  274. data/test/html/sax/test_parser_context.rb +0 -46
  275. data/test/html/test_builder.rb +0 -164
  276. data/test/html/test_document.rb +0 -552
  277. data/test/html/test_document_encoding.rb +0 -138
  278. data/test/html/test_document_fragment.rb +0 -261
  279. data/test/html/test_element_description.rb +0 -105
  280. data/test/html/test_named_characters.rb +0 -14
  281. data/test/html/test_node.rb +0 -196
  282. data/test/html/test_node_encoding.rb +0 -27
  283. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  284. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  285. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  286. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  287. data/test/test_convert_xpath.rb +0 -135
  288. data/test/test_css_cache.rb +0 -45
  289. data/test/test_encoding_handler.rb +0 -46
  290. data/test/test_memory_leak.rb +0 -156
  291. data/test/test_nokogiri.rb +0 -132
  292. data/test/test_reader.rb +0 -555
  293. data/test/test_soap4r_sax.rb +0 -52
  294. data/test/test_xslt_transforms.rb +0 -254
  295. data/test/xml/node/test_save_options.rb +0 -28
  296. data/test/xml/node/test_subclass.rb +0 -44
  297. data/test/xml/sax/test_parser.rb +0 -366
  298. data/test/xml/sax/test_parser_context.rb +0 -106
  299. data/test/xml/sax/test_push_parser.rb +0 -157
  300. data/test/xml/test_attr.rb +0 -64
  301. data/test/xml/test_attribute_decl.rb +0 -86
  302. data/test/xml/test_builder.rb +0 -306
  303. data/test/xml/test_c14n.rb +0 -151
  304. data/test/xml/test_cdata.rb +0 -48
  305. data/test/xml/test_comment.rb +0 -29
  306. data/test/xml/test_document.rb +0 -828
  307. data/test/xml/test_document_encoding.rb +0 -28
  308. data/test/xml/test_document_fragment.rb +0 -223
  309. data/test/xml/test_dtd.rb +0 -103
  310. data/test/xml/test_dtd_encoding.rb +0 -33
  311. data/test/xml/test_element_content.rb +0 -56
  312. data/test/xml/test_element_decl.rb +0 -73
  313. data/test/xml/test_entity_decl.rb +0 -122
  314. data/test/xml/test_entity_reference.rb +0 -245
  315. data/test/xml/test_namespace.rb +0 -95
  316. data/test/xml/test_node.rb +0 -1137
  317. data/test/xml/test_node_attributes.rb +0 -96
  318. data/test/xml/test_node_encoding.rb +0 -107
  319. data/test/xml/test_node_inheritance.rb +0 -32
  320. data/test/xml/test_node_reparenting.rb +0 -374
  321. data/test/xml/test_node_set.rb +0 -755
  322. data/test/xml/test_parse_options.rb +0 -64
  323. data/test/xml/test_processing_instruction.rb +0 -30
  324. data/test/xml/test_reader_encoding.rb +0 -142
  325. data/test/xml/test_relax_ng.rb +0 -60
  326. data/test/xml/test_schema.rb +0 -103
  327. data/test/xml/test_syntax_error.rb +0 -12
  328. data/test/xml/test_text.rb +0 -45
  329. data/test/xml/test_unparented_node.rb +0 -422
  330. data/test/xml/test_xinclude.rb +0 -83
  331. data/test/xml/test_xpath.rb +0 -295
  332. data/test/xslt/test_custom_functions.rb +0 -133
  333. data/test/xslt/test_exception_handling.rb +0 -37
  334. data/test_all +0 -81
@@ -1,341 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module CSS
5
- class TestParser < Nokogiri::TestCase
6
- def setup
7
- super
8
- @parser = Nokogiri::CSS::Parser.new
9
- @parser_with_ns = Nokogiri::CSS::Parser.new({
10
- "xmlns" => "http://default.example.com/",
11
- "hoge" => "http://hoge.example.com/",
12
- })
13
- end
14
-
15
- def test_extra_single_quote
16
- assert_raises(CSS::SyntaxError) { @parser.parse("'") }
17
- end
18
-
19
- def test_syntax_error_raised
20
- assert_raises(CSS::SyntaxError) { @parser.parse("a[x=]") }
21
- end
22
-
23
- def test_function_and_pseudo
24
- assert_xpath '//child::text()[position() = 99]', @parser.parse('text():nth-of-type(99)')
25
- end
26
-
27
- def test_find_by_type
28
- ast = @parser.parse("a:nth-child(2)").first
29
- matches = ast.find_by_type(
30
- [:CONDITIONAL_SELECTOR,
31
- [:ELEMENT_NAME],
32
- [:PSEUDO_CLASS,
33
- [:FUNCTION]
34
- ]
35
- ]
36
- )
37
- assert_equal(1, matches.length)
38
- assert_equal(ast, matches.first)
39
- end
40
-
41
- def test_to_type
42
- ast = @parser.parse("a:nth-child(2)").first
43
- assert_equal(
44
- [:CONDITIONAL_SELECTOR,
45
- [:ELEMENT_NAME],
46
- [:PSEUDO_CLASS,
47
- [:FUNCTION]
48
- ]
49
- ], ast.to_type
50
- )
51
- end
52
-
53
- def test_to_a
54
- asts = @parser.parse("a:nth-child(2)")
55
- assert_equal(
56
- [:CONDITIONAL_SELECTOR,
57
- [:ELEMENT_NAME, ["a"]],
58
- [:PSEUDO_CLASS,
59
- [:FUNCTION, ["nth-child("], ["2"]]
60
- ]
61
- ], asts.first.to_a
62
- )
63
- end
64
-
65
- def test_has
66
- assert_xpath "//a[b]", @parser.parse("a:has(b)")
67
- assert_xpath "//a[b/c]", @parser.parse("a:has(b > c)")
68
- end
69
-
70
- def test_dashmatch
71
- assert_xpath "//a[@class = 'bar' or starts-with(@class, concat('bar', '-'))]",
72
- @parser.parse("a[@class|='bar']")
73
- assert_xpath "//a[@class = 'bar' or starts-with(@class, concat('bar', '-'))]",
74
- @parser.parse("a[@class |= 'bar']")
75
- end
76
-
77
- def test_includes
78
- assert_xpath "//a[contains(concat(\" \", @class, \" \"),concat(\" \", 'bar', \" \"))]",
79
- @parser.parse("a[@class~='bar']")
80
- assert_xpath "//a[contains(concat(\" \", @class, \" \"),concat(\" \", 'bar', \" \"))]",
81
- @parser.parse("a[@class ~= 'bar']")
82
- end
83
-
84
- def test_function_with_arguments
85
- assert_xpath "//*[position() = 2 and self::a]",
86
- @parser.parse("a[2]")
87
- assert_xpath "//*[position() = 2 and self::a]",
88
- @parser.parse("a:nth-child(2)")
89
- end
90
-
91
- def test_carrot
92
- assert_xpath "//a[starts-with(@id, 'Boing')]",
93
- @parser.parse("a[id^='Boing']")
94
- assert_xpath "//a[starts-with(@id, 'Boing')]",
95
- @parser.parse("a[id ^= 'Boing']")
96
- end
97
-
98
- def test_suffix_match
99
- assert_xpath "//a[substring(@id, string-length(@id) - string-length('Boing') + 1, string-length('Boing')) = 'Boing']",
100
- @parser.parse("a[id$='Boing']")
101
- assert_xpath "//a[substring(@id, string-length(@id) - string-length('Boing') + 1, string-length('Boing')) = 'Boing']",
102
- @parser.parse("a[id $= 'Boing']")
103
- end
104
-
105
- def test_attributes_with_at
106
- ## This is non standard CSS
107
- assert_xpath "//a[@id = 'Boing']",
108
- @parser.parse("a[@id='Boing']")
109
- assert_xpath "//a[@id = 'Boing']",
110
- @parser.parse("a[@id = 'Boing']")
111
- end
112
-
113
- def test_attributes_with_at_and_stuff
114
- ## This is non standard CSS
115
- assert_xpath "//a[@id = 'Boing']//div",
116
- @parser.parse("a[@id='Boing'] div")
117
- end
118
-
119
- def test_not_equal
120
- ## This is non standard CSS
121
- assert_xpath "//a[child::text() != 'Boing']",
122
- @parser.parse("a[text()!='Boing']")
123
- assert_xpath "//a[child::text() != 'Boing']",
124
- @parser.parse("a[text() != 'Boing']")
125
- end
126
-
127
- def test_function
128
- ## This is non standard CSS
129
- assert_xpath "//a[child::text()]",
130
- @parser.parse("a[text()]")
131
-
132
- ## This is non standard CSS
133
- assert_xpath "//child::text()",
134
- @parser.parse("text()")
135
-
136
- ## This is non standard CSS
137
- assert_xpath "//a[contains(child::text(), 'Boing')]",
138
- @parser.parse("a[text()*='Boing']")
139
- assert_xpath "//a[contains(child::text(), 'Boing')]",
140
- @parser.parse("a[text() *= 'Boing']")
141
-
142
- ## This is non standard CSS
143
- assert_xpath "//script//comment()",
144
- @parser.parse("script comment()")
145
- end
146
-
147
- def test_nonstandard_nth_selectors
148
- ## These are non standard CSS
149
- assert_xpath '//a[position() = 1]', @parser.parse('a:first()')
150
- assert_xpath '//a[position() = 1]', @parser.parse('a:first') # no parens
151
- assert_xpath '//a[position() = 99]', @parser.parse('a:eq(99)')
152
- assert_xpath '//a[position() = 99]', @parser.parse('a:nth(99)')
153
- assert_xpath '//a[position() = last()]', @parser.parse('a:last()')
154
- assert_xpath '//a[position() = last()]', @parser.parse('a:last') # no parens
155
- assert_xpath '//a[node()]', @parser.parse('a:parent')
156
- end
157
-
158
- def test_standard_nth_selectors
159
- assert_xpath '//a[position() = 1]', @parser.parse('a:first-of-type()')
160
- assert_xpath '//a[position() = 1]', @parser.parse('a:first-of-type') # no parens
161
- assert_xpath '//a[position() = 99]', @parser.parse('a:nth-of-type(99)')
162
- assert_xpath '//a[position() = last()]', @parser.parse('a:last-of-type()')
163
- assert_xpath '//a[position() = last()]', @parser.parse('a:last-of-type') # no parens
164
- assert_xpath '//a[position() = last()]', @parser.parse('a:nth-last-of-type(1)')
165
- assert_xpath '//a[position() = last() - 98]', @parser.parse('a:nth-last-of-type(99)')
166
- end
167
-
168
- def test_nth_child_selectors
169
- assert_xpath '//*[position() = 1 and self::a]', @parser.parse('a:first-child')
170
- assert_xpath '//*[position() = 99 and self::a]', @parser.parse('a:nth-child(99)')
171
- assert_xpath '//*[position() = last() and self::a]', @parser.parse('a:last-child')
172
- assert_xpath '//*[position() = last() and self::a]', @parser.parse('a:nth-last-child(1)')
173
- assert_xpath '//*[position() = last() - 98 and self::a]', @parser.parse('a:nth-last-child(99)')
174
- end
175
-
176
- def test_miscellaneous_selectors
177
- assert_xpath '//*[last() = 1 and self::a]',
178
- @parser.parse('a:only-child')
179
- assert_xpath '//a[last() = 1]', @parser.parse('a:only-of-type')
180
- assert_xpath '//a[not(node())]', @parser.parse('a:empty')
181
- end
182
-
183
- def test_nth_a_n_plus_b
184
- assert_xpath '//a[(position() mod 2) = 0]', @parser.parse('a:nth-of-type(2n)')
185
- assert_xpath '//a[(position() >= 1) and (((position()-1) mod 2) = 0)]', @parser.parse('a:nth-of-type(2n+1)')
186
- assert_xpath '//a[(position() mod 2) = 0]', @parser.parse('a:nth-of-type(even)')
187
- assert_xpath '//a[(position() >= 1) and (((position()-1) mod 2) = 0)]', @parser.parse('a:nth-of-type(odd)')
188
- assert_xpath '//a[(position() >= 3) and (((position()-3) mod 4) = 0)]', @parser.parse('a:nth-of-type(4n+3)')
189
- assert_xpath '//a[(position() <= 3) and (((position()-3) mod 1) = 0)]', @parser.parse('a:nth-of-type(-1n+3)')
190
- assert_xpath '//a[(position() <= 3) and (((position()-3) mod 1) = 0)]', @parser.parse('a:nth-of-type(-n+3)')
191
- assert_xpath '//a[(position() >= 3) and (((position()-3) mod 1) = 0)]', @parser.parse('a:nth-of-type(1n+3)')
192
- assert_xpath '//a[(position() >= 3) and (((position()-3) mod 1) = 0)]', @parser.parse('a:nth-of-type(n+3)')
193
-
194
- assert_xpath '//a[((last()-position()+1) mod 2) = 0]', @parser.parse('a:nth-last-of-type(2n)')
195
- assert_xpath '//a[((last()-position()+1) >= 1) and ((((last()-position()+1)-1) mod 2) = 0)]', @parser.parse('a:nth-last-of-type(2n+1)')
196
- assert_xpath '//a[((last()-position()+1) mod 2) = 0]', @parser.parse('a:nth-last-of-type(even)')
197
- assert_xpath '//a[((last()-position()+1) >= 1) and ((((last()-position()+1)-1) mod 2) = 0)]', @parser.parse('a:nth-last-of-type(odd)')
198
- assert_xpath '//a[((last()-position()+1) >= 3) and ((((last()-position()+1)-3) mod 4) = 0)]', @parser.parse('a:nth-last-of-type(4n+3)')
199
- assert_xpath '//a[((last()-position()+1) <= 3) and ((((last()-position()+1)-3) mod 1) = 0)]', @parser.parse('a:nth-last-of-type(-1n+3)')
200
- assert_xpath '//a[((last()-position()+1) <= 3) and ((((last()-position()+1)-3) mod 1) = 0)]', @parser.parse('a:nth-last-of-type(-n+3)')
201
- assert_xpath '//a[((last()-position()+1) >= 3) and ((((last()-position()+1)-3) mod 1) = 0)]', @parser.parse('a:nth-last-of-type(1n+3)')
202
- assert_xpath '//a[((last()-position()+1) >= 3) and ((((last()-position()+1)-3) mod 1) = 0)]', @parser.parse('a:nth-last-of-type(n+3)')
203
- end
204
-
205
- def test_preceding_selector
206
- assert_xpath "//E/following-sibling::F",
207
- @parser.parse("E ~ F")
208
-
209
- assert_xpath "//E/following-sibling::F//G",
210
- @parser.parse("E ~ F G")
211
- end
212
-
213
- def test_direct_preceding_selector
214
- assert_xpath "//E/following-sibling::*[1]/self::F",
215
- @parser.parse("E + F")
216
-
217
- assert_xpath "//E/following-sibling::*[1]/self::F//G",
218
- @parser.parse("E + F G")
219
- end
220
-
221
- def test_child_selector
222
- assert_xpath("//a//b/i", @parser.parse('a b>i'))
223
- assert_xpath("//a//b/i", @parser.parse('a b > i'))
224
- assert_xpath("//a/b/i", @parser.parse('a > b > i'))
225
- end
226
-
227
- def test_prefixless_child_selector
228
- assert_xpath("./a", @parser.parse('>a'))
229
- assert_xpath("./a", @parser.parse('> a'))
230
- assert_xpath("./a//b/i", @parser.parse('>a b>i'))
231
- assert_xpath("./a/b/i", @parser.parse('> a > b > i'))
232
- end
233
-
234
- def test_prefixless_preceding_sibling_selector
235
- assert_xpath("./following-sibling::a", @parser.parse('~a'))
236
- assert_xpath("./following-sibling::a", @parser.parse('~ a'))
237
- assert_xpath("./following-sibling::a//b/following-sibling::i", @parser.parse('~a b~i'))
238
- assert_xpath("./following-sibling::a//b/following-sibling::i", @parser.parse('~ a b ~ i'))
239
- end
240
-
241
- def test_prefixless_direct_adjacent_selector
242
- assert_xpath("./following-sibling::*[1]/self::a", @parser.parse('+a'))
243
- assert_xpath("./following-sibling::*[1]/self::a", @parser.parse('+ a'))
244
- assert_xpath("./following-sibling::*[1]/self::a/following-sibling::*[1]/self::b", @parser.parse('+a+b'))
245
- assert_xpath("./following-sibling::*[1]/self::a/following-sibling::*[1]/self::b", @parser.parse('+ a + b'))
246
- end
247
-
248
- def test_attribute
249
- assert_xpath "//h1[@a = 'Tender Lovemaking']",
250
- @parser.parse("h1[a='Tender Lovemaking']")
251
- end
252
-
253
- def test_id
254
- assert_xpath "//*[@id = 'foo']", @parser.parse('#foo')
255
- end
256
-
257
- def test_pseudo_class_no_ident
258
- assert_xpath "//*[link(.)]", @parser.parse(':link')
259
- end
260
-
261
- def test_pseudo_class
262
- assert_xpath "//a[link(.)]", @parser.parse('a:link')
263
- assert_xpath "//a[visited(.)]", @parser.parse('a:visited')
264
- assert_xpath "//a[hover(.)]", @parser.parse('a:hover')
265
- assert_xpath "//a[active(.)]", @parser.parse('a:active')
266
- assert_xpath "//a[active(.) and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]",
267
- @parser.parse('a:active.foo')
268
- end
269
-
270
- def test_star
271
- assert_xpath "//*", @parser.parse('*')
272
- assert_xpath "//*[contains(concat(' ', normalize-space(@class), ' '), ' pastoral ')]",
273
- @parser.parse('*.pastoral')
274
- end
275
-
276
- def test_class
277
- assert_xpath "//*[contains(concat(' ', normalize-space(@class), ' '), ' a ') and contains(concat(' ', normalize-space(@class), ' '), ' b ')]",
278
- @parser.parse('.a.b')
279
- assert_xpath "//*[contains(concat(' ', normalize-space(@class), ' '), ' awesome ')]",
280
- @parser.parse('.awesome')
281
- assert_xpath "//foo[contains(concat(' ', normalize-space(@class), ' '), ' awesome ')]",
282
- @parser.parse('foo.awesome')
283
- assert_xpath "//foo//*[contains(concat(' ', normalize-space(@class), ' '), ' awesome ')]",
284
- @parser.parse('foo .awesome')
285
- end
286
-
287
- def test_not_so_simple_not
288
- assert_xpath "//*[@id = 'p' and not(contains(concat(' ', normalize-space(@class), ' '), ' a '))]",
289
- @parser.parse('#p:not(.a)')
290
- assert_xpath "//p[contains(concat(' ', normalize-space(@class), ' '), ' a ') and not(contains(concat(' ', normalize-space(@class), ' '), ' b '))]",
291
- @parser.parse('p.a:not(.b)')
292
- assert_xpath "//p[@a = 'foo' and not(contains(concat(' ', normalize-space(@class), ' '), ' b '))]",
293
- @parser.parse("p[a='foo']:not(.b)")
294
- end
295
-
296
- def test_ident
297
- assert_xpath '//x', @parser.parse('x')
298
- end
299
-
300
- def test_parse_space
301
- assert_xpath '//x//y', @parser.parse('x y')
302
- end
303
-
304
- def test_parse_descendant
305
- assert_xpath '//x/y', @parser.parse('x > y')
306
- end
307
-
308
- def test_parse_slash
309
- ## This is non standard CSS
310
- assert_xpath '//x/y', @parser.parse('x/y')
311
- end
312
-
313
- def test_parse_doubleslash
314
- ## This is non standard CSS
315
- assert_xpath '//x//y', @parser.parse('x//y')
316
- end
317
-
318
- def test_multi_path
319
- assert_xpath ['//x/y', '//y/z'], @parser.parse('x > y, y > z')
320
- assert_xpath ['//x/y', '//y/z'], @parser.parse('x > y,y > z')
321
- ###
322
- # TODO: should we make this work?
323
- # assert_xpath ['//x/y', '//y/z'], @parser.parse('x > y | y > z')
324
- end
325
-
326
- def test_attributes_with_namespace
327
- ## Default namespace is not applied to attributes.
328
- ## So this must be @class, not @xmlns:class.
329
- assert_xpath "//xmlns:a[@class = 'bar']", @parser_with_ns.parse("a[class='bar']")
330
- assert_xpath "//xmlns:a[@hoge:class = 'bar']", @parser_with_ns.parse("a[hoge|class='bar']")
331
- end
332
-
333
- def assert_xpath expecteds, asts
334
- expecteds = [expecteds].flatten
335
- expecteds.zip(asts).each do |expected, actual|
336
- assert_equal expected, actual.to_xpath
337
- end
338
- end
339
- end
340
- end
341
- end
@@ -1,198 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require "helper"
4
-
5
- module Nokogiri
6
- module CSS
7
- class Tokenizer
8
- alias :scan :scan_setup
9
- end
10
- end
11
- end
12
-
13
- module Nokogiri
14
- module CSS
15
- class TestTokenizer < Nokogiri::TestCase
16
- def setup
17
- super
18
- @scanner = Nokogiri::CSS::Tokenizer.new
19
- end
20
-
21
- def test_has
22
- @scanner.scan("a:has(b)")
23
- assert_tokens(
24
- [[:IDENT, "a"], [":", ":"], [:HAS, "has("], [:IDENT, "b"], [:RPAREN, ")"]],
25
- @scanner)
26
- end
27
-
28
- def test_unicode
29
- @scanner.scan("a日本語")
30
- assert_tokens([[:IDENT, 'a日本語']], @scanner)
31
- end
32
-
33
- def test_tokenize_bad_single_quote
34
- @scanner.scan("'")
35
- assert_tokens([["'", "'"]], @scanner)
36
- end
37
-
38
- def test_not_equal
39
- @scanner.scan("h1[a!='Tender Lovemaking']")
40
- assert_tokens([ [:IDENT, 'h1'],
41
- [:LSQUARE, '['],
42
- [:IDENT, 'a'],
43
- [:NOT_EQUAL, '!='],
44
- [:STRING, "'Tender Lovemaking'"],
45
- [:RSQUARE, ']'],
46
- ], @scanner)
47
- end
48
-
49
- def test_negation
50
- @scanner.scan("p:not(.a)")
51
- assert_tokens([ [:IDENT, 'p'],
52
- [:NOT, ':not('],
53
- ['.', '.'],
54
- [:IDENT, 'a'],
55
- [:RPAREN, ')'],
56
- ], @scanner)
57
- end
58
-
59
- def test_function
60
- @scanner.scan("script comment()")
61
- assert_tokens([ [:IDENT, 'script'],
62
- [:S, ' '],
63
- [:FUNCTION, 'comment('],
64
- [:RPAREN, ')'],
65
- ], @scanner)
66
- end
67
-
68
- def test_preceding_selector
69
- @scanner.scan("E ~ F")
70
- assert_tokens([ [:IDENT, 'E'],
71
- [:TILDE, ' ~ '],
72
- [:IDENT, 'F'],
73
- ], @scanner)
74
- end
75
-
76
- def test_scan_attribute_string
77
- @scanner.scan("h1[a='Tender Lovemaking']")
78
- assert_tokens([ [:IDENT, 'h1'],
79
- [:LSQUARE, '['],
80
- [:IDENT, 'a'],
81
- [:EQUAL, '='],
82
- [:STRING, "'Tender Lovemaking'"],
83
- [:RSQUARE, ']'],
84
- ], @scanner)
85
- @scanner.scan('h1[a="Tender Lovemaking"]')
86
- assert_tokens([ [:IDENT, 'h1'],
87
- [:LSQUARE, '['],
88
- [:IDENT, 'a'],
89
- [:EQUAL, '='],
90
- [:STRING, '"Tender Lovemaking"'],
91
- [:RSQUARE, ']'],
92
- ], @scanner)
93
- end
94
-
95
- def test_scan_id
96
- @scanner.scan('#foo')
97
- assert_tokens([ [:HASH, '#foo'] ], @scanner)
98
- end
99
-
100
- def test_scan_pseudo
101
- @scanner.scan('a:visited')
102
- assert_tokens([ [:IDENT, 'a'],
103
- [':', ':'],
104
- [:IDENT, 'visited']
105
- ], @scanner)
106
- end
107
-
108
- def test_scan_star
109
- @scanner.scan('*')
110
- assert_tokens([ ['*', '*'], ], @scanner)
111
- end
112
-
113
- def test_scan_class
114
- @scanner.scan('x.awesome')
115
- assert_tokens([ [:IDENT, 'x'],
116
- ['.', '.'],
117
- [:IDENT, 'awesome'],
118
- ], @scanner)
119
- end
120
-
121
- def test_scan_greater
122
- @scanner.scan('x > y')
123
- assert_tokens([ [:IDENT, 'x'],
124
- [:GREATER, ' > '],
125
- [:IDENT, 'y']
126
- ], @scanner)
127
- end
128
-
129
- def test_scan_slash
130
- @scanner.scan('x/y')
131
- assert_tokens([ [:IDENT, 'x'],
132
- [:SLASH, '/'],
133
- [:IDENT, 'y']
134
- ], @scanner)
135
- end
136
-
137
- def test_scan_doubleslash
138
- @scanner.scan('x//y')
139
- assert_tokens([ [:IDENT, 'x'],
140
- [:DOUBLESLASH, '//'],
141
- [:IDENT, 'y']
142
- ], @scanner)
143
- end
144
-
145
- def test_scan_function_selector
146
- @scanner.scan('x:eq(0)')
147
- assert_tokens([ [:IDENT, 'x'],
148
- [':', ':'],
149
- [:FUNCTION, 'eq('],
150
- [:NUMBER, "0"],
151
- [:RPAREN, ')'],
152
- ], @scanner)
153
- end
154
-
155
- def test_scan_an_plus_b
156
- @scanner.scan('x:nth-child(5n+3)')
157
- assert_tokens([ [:IDENT, 'x'],
158
- [':', ':'],
159
- [:FUNCTION, 'nth-child('],
160
- [:NUMBER, '5'],
161
- [:IDENT, 'n'],
162
- [:PLUS, '+'],
163
- [:NUMBER, '3'],
164
- [:RPAREN, ')'],
165
- ], @scanner)
166
-
167
- @scanner.scan('x:nth-child(-1n+3)')
168
- assert_tokens([ [:IDENT, 'x'],
169
- [':', ':'],
170
- [:FUNCTION, 'nth-child('],
171
- [:NUMBER, '-1'],
172
- [:IDENT, 'n'],
173
- [:PLUS, '+'],
174
- [:NUMBER, '3'],
175
- [:RPAREN, ')'],
176
- ], @scanner)
177
-
178
- @scanner.scan('x:nth-child(-n+3)')
179
- assert_tokens([ [:IDENT, 'x'],
180
- [':', ':'],
181
- [:FUNCTION, 'nth-child('],
182
- [:IDENT, '-n'],
183
- [:PLUS, '+'],
184
- [:NUMBER, '3'],
185
- [:RPAREN, ')'],
186
- ], @scanner)
187
- end
188
-
189
- def assert_tokens(tokens, scanner)
190
- toks = []
191
- while tok = @scanner.next_token
192
- toks << tok
193
- end
194
- assert_equal(tokens, toks)
195
- end
196
- end
197
- end
198
- end
@@ -1,91 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module CSS
5
- class TestXPathVisitor < Nokogiri::TestCase
6
- def setup
7
- super
8
- @parser = Nokogiri::CSS::Parser.new
9
- end
10
-
11
- def test_not_simple_selector
12
- assert_xpath('//ol/*[not(self::li)]', @parser.parse('ol > *:not(li)'))
13
- end
14
-
15
- def test_not_last_child
16
- assert_xpath('//ol/*[not(position() = last())]',
17
- @parser.parse('ol > *:not(:last-child)'))
18
- end
19
-
20
- def test_function_calls_allow_at_params
21
- assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
22
- assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
23
- assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
24
- end
25
-
26
- def test_namespace_conversion
27
- assert_xpath("//aaron:a", @parser.parse('aaron|a'))
28
- assert_xpath("//a", @parser.parse('|a'))
29
- end
30
-
31
- def test_namespaced_attribute_conversion
32
- assert_xpath("//a[@flavorjones:href]", @parser.parse('a[flavorjones|href]'))
33
- assert_xpath("//a[@href]", @parser.parse('a[|href]'))
34
- assert_xpath("//*[@flavorjones:href]", @parser.parse('*[flavorjones|href]'))
35
- end
36
-
37
- def test_unknown_psuedo_classes_get_pushed_down
38
- assert_xpath("//a[aaron(.)]", @parser.parse('a:aaron'))
39
- end
40
-
41
- def test_unknown_functions_get_dot_plus_args
42
- assert_xpath("//a[aaron(.)]", @parser.parse('a:aaron()'))
43
- assert_xpath("//a[aaron(., 12)]", @parser.parse('a:aaron(12)'))
44
- assert_xpath("//a[aaron(., 12, 1)]", @parser.parse('a:aaron(12, 1)'))
45
- end
46
-
47
- def test_class_selectors
48
- assert_xpath "//*[contains(concat(' ', normalize-space(@class), ' '), ' red ')]",
49
- @parser.parse(".red")
50
- end
51
-
52
- def test_pipe
53
- assert_xpath "//a[@id = 'Boing' or starts-with(@id, concat('Boing', '-'))]",
54
- @parser.parse("a[id|='Boing']")
55
- end
56
-
57
- def test_custom_functions
58
- visitor = Class.new(XPathVisitor) do
59
- attr_accessor :awesome
60
- def visit_function_aaron node
61
- @awesome = true
62
- 'aaron() = 1'
63
- end
64
- end.new
65
- ast = @parser.parse('a:aaron()').first
66
- assert_equal 'a[aaron() = 1]', visitor.accept(ast)
67
- assert visitor.awesome
68
- end
69
-
70
- def test_custom_psuedo_classes
71
- visitor = Class.new(XPathVisitor) do
72
- attr_accessor :awesome
73
- def visit_pseudo_class_aaron node
74
- @awesome = true
75
- 'aaron() = 1'
76
- end
77
- end.new
78
- ast = @parser.parse('a:aaron').first
79
- assert_equal 'a[aaron() = 1]', visitor.accept(ast)
80
- assert visitor.awesome
81
- end
82
-
83
- def assert_xpath expecteds, asts
84
- expecteds = [expecteds].flatten
85
- expecteds.zip(asts).each do |expected, actual|
86
- assert_equal expected, actual.to_xpath
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,16 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- class TestSlop < Nokogiri::TestCase
5
- def test_description_tag
6
- doc = Nokogiri.Slop(<<-eoxml)
7
- <item>
8
- <title>foo</title>
9
- <description>this is the foo thing</description>
10
- </item>
11
- eoxml
12
- assert doc.item.title
13
- assert doc.item._description, 'should have description'
14
- end
15
- end
16
- end