actionpack 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -1,628 +0,0 @@
1
- #--
2
- # Copyright (c) 2006 Assaf Arkin (http://labnotes.org)
3
- # Under MIT and/or CC By license.
4
- #++
5
-
6
- require 'abstract_unit'
7
- require 'controller/fake_controllers'
8
-
9
- class SelectorTest < Test::Unit::TestCase
10
- #
11
- # Basic selector: element, id, class, attributes.
12
- #
13
-
14
- def test_element
15
- parse(%Q{<div id="1"></div><p></p><div id="2"></div>})
16
- # Match element by name.
17
- select("div")
18
- assert_equal 2, @matches.size
19
- assert_equal "1", @matches[0].attributes["id"]
20
- assert_equal "2", @matches[1].attributes["id"]
21
- # Not case sensitive.
22
- select("DIV")
23
- assert_equal 2, @matches.size
24
- assert_equal "1", @matches[0].attributes["id"]
25
- assert_equal "2", @matches[1].attributes["id"]
26
- # Universal match (all elements).
27
- select("*")
28
- assert_equal 3, @matches.size
29
- assert_equal "1", @matches[0].attributes["id"]
30
- assert_equal nil, @matches[1].attributes["id"]
31
- assert_equal "2", @matches[2].attributes["id"]
32
- end
33
-
34
-
35
- def test_identifier
36
- parse(%Q{<div id="1"></div><p></p><div id="2"></div>})
37
- # Match element by ID.
38
- select("div#1")
39
- assert_equal 1, @matches.size
40
- assert_equal "1", @matches[0].attributes["id"]
41
- # Match element by ID, substitute value.
42
- select("div#?", 2)
43
- assert_equal 1, @matches.size
44
- assert_equal "2", @matches[0].attributes["id"]
45
- # Element name does not match ID.
46
- select("p#?", 2)
47
- assert_equal 0, @matches.size
48
- # Use regular expression.
49
- select("#?", /\d/)
50
- assert_equal 2, @matches.size
51
- end
52
-
53
-
54
- def test_class_name
55
- parse(%Q{<div id="1" class=" foo "></div><p id="2" class=" foo bar "></p><div id="3" class="bar"></div>})
56
- # Match element with specified class.
57
- select("div.foo")
58
- assert_equal 1, @matches.size
59
- assert_equal "1", @matches[0].attributes["id"]
60
- # Match any element with specified class.
61
- select("*.foo")
62
- assert_equal 2, @matches.size
63
- assert_equal "1", @matches[0].attributes["id"]
64
- assert_equal "2", @matches[1].attributes["id"]
65
- # Match elements with other class.
66
- select("*.bar")
67
- assert_equal 2, @matches.size
68
- assert_equal "2", @matches[0].attributes["id"]
69
- assert_equal "3", @matches[1].attributes["id"]
70
- # Match only element with both class names.
71
- select("*.bar.foo")
72
- assert_equal 1, @matches.size
73
- assert_equal "2", @matches[0].attributes["id"]
74
- end
75
-
76
-
77
- def test_attribute
78
- parse(%Q{<div id="1"></div><p id="2" title="" bar="foo"></p><div id="3" title="foo"></div>})
79
- # Match element with attribute.
80
- select("div[title]")
81
- assert_equal 1, @matches.size
82
- assert_equal "3", @matches[0].attributes["id"]
83
- # Match any element with attribute.
84
- select("*[title]")
85
- assert_equal 2, @matches.size
86
- assert_equal "2", @matches[0].attributes["id"]
87
- assert_equal "3", @matches[1].attributes["id"]
88
- # Match element with attribute value.
89
- select("*[title=foo]")
90
- assert_equal 1, @matches.size
91
- assert_equal "3", @matches[0].attributes["id"]
92
- # Match element with attribute and attribute value.
93
- select("[bar=foo][title]")
94
- assert_equal 1, @matches.size
95
- assert_equal "2", @matches[0].attributes["id"]
96
- # Not case sensitive.
97
- select("[BAR=foo][TiTle]")
98
- assert_equal 1, @matches.size
99
- assert_equal "2", @matches[0].attributes["id"]
100
- end
101
-
102
-
103
- def test_attribute_quoted
104
- parse(%Q{<div id="1" title="foo"></div><div id="2" title="bar"></div><div id="3" title=" bar "></div>})
105
- # Match without quotes.
106
- select("[title = bar]")
107
- assert_equal 1, @matches.size
108
- assert_equal "2", @matches[0].attributes["id"]
109
- # Match with single quotes.
110
- select("[title = 'bar' ]")
111
- assert_equal 1, @matches.size
112
- assert_equal "2", @matches[0].attributes["id"]
113
- # Match with double quotes.
114
- select("[title = \"bar\" ]")
115
- assert_equal 1, @matches.size
116
- assert_equal "2", @matches[0].attributes["id"]
117
- # Match with spaces.
118
- select("[title = \" bar \" ]")
119
- assert_equal 1, @matches.size
120
- assert_equal "3", @matches[0].attributes["id"]
121
- end
122
-
123
-
124
- def test_attribute_equality
125
- parse(%Q{<div id="1" title="foo bar"></div><div id="2" title="barbaz"></div>})
126
- # Match (fail) complete value.
127
- select("[title=bar]")
128
- assert_equal 0, @matches.size
129
- # Match space-separate word.
130
- select("[title~=foo]")
131
- assert_equal 1, @matches.size
132
- assert_equal "1", @matches[0].attributes["id"]
133
- select("[title~=bar]")
134
- assert_equal 1, @matches.size
135
- assert_equal "1", @matches[0].attributes["id"]
136
- # Match beginning of value.
137
- select("[title^=ba]")
138
- assert_equal 1, @matches.size
139
- assert_equal "2", @matches[0].attributes["id"]
140
- # Match end of value.
141
- select("[title$=ar]")
142
- assert_equal 1, @matches.size
143
- assert_equal "1", @matches[0].attributes["id"]
144
- # Match text in value.
145
- select("[title*=bar]")
146
- assert_equal 2, @matches.size
147
- assert_equal "1", @matches[0].attributes["id"]
148
- assert_equal "2", @matches[1].attributes["id"]
149
- # Match first space separated word.
150
- select("[title|=foo]")
151
- assert_equal 1, @matches.size
152
- assert_equal "1", @matches[0].attributes["id"]
153
- select("[title|=bar]")
154
- assert_equal 0, @matches.size
155
- end
156
-
157
-
158
- #
159
- # Selector composition: groups, sibling, children
160
- #
161
-
162
-
163
- def test_selector_group
164
- parse(%Q{<h1 id="1"></h1><h2 id="2"></h2><h3 id="3"></h3>})
165
- # Simple group selector.
166
- select("h1,h3")
167
- assert_equal 2, @matches.size
168
- assert_equal "1", @matches[0].attributes["id"]
169
- assert_equal "3", @matches[1].attributes["id"]
170
- select("h1 , h3")
171
- assert_equal 2, @matches.size
172
- assert_equal "1", @matches[0].attributes["id"]
173
- assert_equal "3", @matches[1].attributes["id"]
174
- # Complex group selector.
175
- parse(%Q{<h1 id="1"><a href="foo"></a></h1><h2 id="2"><a href="bar"></a></h2><h3 id="2"><a href="baz"></a></h3>})
176
- select("h1 a, h3 a")
177
- assert_equal 2, @matches.size
178
- assert_equal "foo", @matches[0].attributes["href"]
179
- assert_equal "baz", @matches[1].attributes["href"]
180
- # And now for the three selector challenge.
181
- parse(%Q{<h1 id="1"><a href="foo"></a></h1><h2 id="2"><a href="bar"></a></h2><h3 id="2"><a href="baz"></a></h3>})
182
- select("h1 a, h2 a, h3 a")
183
- assert_equal 3, @matches.size
184
- assert_equal "foo", @matches[0].attributes["href"]
185
- assert_equal "bar", @matches[1].attributes["href"]
186
- assert_equal "baz", @matches[2].attributes["href"]
187
- end
188
-
189
-
190
- def test_sibling_selector
191
- parse(%Q{<h1 id="1"></h1><h2 id="2"></h2><h3 id="3"></h3>})
192
- # Test next sibling.
193
- select("h1+*")
194
- assert_equal 1, @matches.size
195
- assert_equal "2", @matches[0].attributes["id"]
196
- select("h1+h2")
197
- assert_equal 1, @matches.size
198
- assert_equal "2", @matches[0].attributes["id"]
199
- select("h1+h3")
200
- assert_equal 0, @matches.size
201
- select("*+h3")
202
- assert_equal 1, @matches.size
203
- assert_equal "3", @matches[0].attributes["id"]
204
- # Test any sibling.
205
- select("h1~*")
206
- assert_equal 2, @matches.size
207
- assert_equal "2", @matches[0].attributes["id"]
208
- assert_equal "3", @matches[1].attributes["id"]
209
- select("h2~*")
210
- assert_equal 1, @matches.size
211
- assert_equal "3", @matches[0].attributes["id"]
212
- end
213
-
214
-
215
- def test_children_selector
216
- parse(%Q{<div><p id="1"><span id="2"></span></p></div><div><p id="3"><span id="4" class="foo"></span></p></div>})
217
- # Test child selector.
218
- select("div>p")
219
- assert_equal 2, @matches.size
220
- assert_equal "1", @matches[0].attributes["id"]
221
- assert_equal "3", @matches[1].attributes["id"]
222
- select("div>span")
223
- assert_equal 0, @matches.size
224
- select("div>p#3")
225
- assert_equal 1, @matches.size
226
- assert_equal "3", @matches[0].attributes["id"]
227
- select("div>p>span")
228
- assert_equal 2, @matches.size
229
- assert_equal "2", @matches[0].attributes["id"]
230
- assert_equal "4", @matches[1].attributes["id"]
231
- # Test descendant selector.
232
- select("div p")
233
- assert_equal 2, @matches.size
234
- assert_equal "1", @matches[0].attributes["id"]
235
- assert_equal "3", @matches[1].attributes["id"]
236
- select("div span")
237
- assert_equal 2, @matches.size
238
- assert_equal "2", @matches[0].attributes["id"]
239
- assert_equal "4", @matches[1].attributes["id"]
240
- select("div *#3")
241
- assert_equal 1, @matches.size
242
- assert_equal "3", @matches[0].attributes["id"]
243
- select("div *#4")
244
- assert_equal 1, @matches.size
245
- assert_equal "4", @matches[0].attributes["id"]
246
- # This is here because it failed before when whitespaces
247
- # were not properly stripped.
248
- select("div .foo")
249
- assert_equal 1, @matches.size
250
- assert_equal "4", @matches[0].attributes["id"]
251
- end
252
-
253
-
254
- #
255
- # Pseudo selectors: root, nth-child, empty, content, etc
256
- #
257
-
258
-
259
- def test_root_selector
260
- parse(%Q{<div id="1"><div id="2"></div></div>})
261
- # Can only find element if it's root.
262
- select(":root")
263
- assert_equal 1, @matches.size
264
- assert_equal "1", @matches[0].attributes["id"]
265
- select("#1:root")
266
- assert_equal 1, @matches.size
267
- assert_equal "1", @matches[0].attributes["id"]
268
- select("#2:root")
269
- assert_equal 0, @matches.size
270
- # Opposite for nth-child.
271
- select("#1:nth-child(1)")
272
- assert_equal 0, @matches.size
273
- end
274
-
275
-
276
- def test_nth_child_odd_even
277
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
278
- # Test odd nth children.
279
- select("tr:nth-child(odd)")
280
- assert_equal 2, @matches.size
281
- assert_equal "1", @matches[0].attributes["id"]
282
- assert_equal "3", @matches[1].attributes["id"]
283
- # Test even nth children.
284
- select("tr:nth-child(even)")
285
- assert_equal 2, @matches.size
286
- assert_equal "2", @matches[0].attributes["id"]
287
- assert_equal "4", @matches[1].attributes["id"]
288
- end
289
-
290
-
291
- def test_nth_child_a_is_zero
292
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
293
- # Test the third child.
294
- select("tr:nth-child(0n+3)")
295
- assert_equal 1, @matches.size
296
- assert_equal "3", @matches[0].attributes["id"]
297
- # Same but an can be omitted when zero.
298
- select("tr:nth-child(3)")
299
- assert_equal 1, @matches.size
300
- assert_equal "3", @matches[0].attributes["id"]
301
- # Second element (but not every second element).
302
- select("tr:nth-child(0n+2)")
303
- assert_equal 1, @matches.size
304
- assert_equal "2", @matches[0].attributes["id"]
305
- # Before first and past last returns nothing.:
306
- assert_raise(ArgumentError) { select("tr:nth-child(-1)") }
307
- select("tr:nth-child(0)")
308
- assert_equal 0, @matches.size
309
- select("tr:nth-child(5)")
310
- assert_equal 0, @matches.size
311
- end
312
-
313
-
314
- def test_nth_child_a_is_one
315
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
316
- # a is group of one, pick every element in group.
317
- select("tr:nth-child(1n+0)")
318
- assert_equal 4, @matches.size
319
- # Same but a can be omitted when one.
320
- select("tr:nth-child(n+0)")
321
- assert_equal 4, @matches.size
322
- # Same but b can be omitted when zero.
323
- select("tr:nth-child(n)")
324
- assert_equal 4, @matches.size
325
- end
326
-
327
-
328
- def test_nth_child_b_is_zero
329
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
330
- # If b is zero, pick the n-th element (here each one).
331
- select("tr:nth-child(n+0)")
332
- assert_equal 4, @matches.size
333
- # If b is zero, pick the n-th element (here every second).
334
- select("tr:nth-child(2n+0)")
335
- assert_equal 2, @matches.size
336
- assert_equal "1", @matches[0].attributes["id"]
337
- assert_equal "3", @matches[1].attributes["id"]
338
- # If a and b are both zero, no element selected.
339
- select("tr:nth-child(0n+0)")
340
- assert_equal 0, @matches.size
341
- select("tr:nth-child(0)")
342
- assert_equal 0, @matches.size
343
- end
344
-
345
-
346
- def test_nth_child_a_is_negative
347
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
348
- # Since a is -1, picks the first three elements.
349
- select("tr:nth-child(-n+3)")
350
- assert_equal 3, @matches.size
351
- assert_equal "1", @matches[0].attributes["id"]
352
- assert_equal "2", @matches[1].attributes["id"]
353
- assert_equal "3", @matches[2].attributes["id"]
354
- # Since a is -2, picks the first in every second of first four elements.
355
- select("tr:nth-child(-2n+3)")
356
- assert_equal 2, @matches.size
357
- assert_equal "1", @matches[0].attributes["id"]
358
- assert_equal "3", @matches[1].attributes["id"]
359
- # Since a is -2, picks the first in every second of first three elements.
360
- select("tr:nth-child(-2n+2)")
361
- assert_equal 1, @matches.size
362
- assert_equal "1", @matches[0].attributes["id"]
363
- end
364
-
365
-
366
- def test_nth_child_b_is_negative
367
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
368
- # Select last of four.
369
- select("tr:nth-child(4n-1)")
370
- assert_equal 1, @matches.size
371
- assert_equal "4", @matches[0].attributes["id"]
372
- # Select first of four.
373
- select("tr:nth-child(4n-4)")
374
- assert_equal 1, @matches.size
375
- assert_equal "1", @matches[0].attributes["id"]
376
- # Select last of every second.
377
- select("tr:nth-child(2n-1)")
378
- assert_equal 2, @matches.size
379
- assert_equal "2", @matches[0].attributes["id"]
380
- assert_equal "4", @matches[1].attributes["id"]
381
- # Select nothing since an+b always < 0
382
- select("tr:nth-child(-1n-1)")
383
- assert_equal 0, @matches.size
384
- end
385
-
386
-
387
- def test_nth_child_substitution_values
388
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
389
- # Test with ?n?.
390
- select("tr:nth-child(?n?)", 2, 1)
391
- assert_equal 2, @matches.size
392
- assert_equal "1", @matches[0].attributes["id"]
393
- assert_equal "3", @matches[1].attributes["id"]
394
- select("tr:nth-child(?n?)", 2, 2)
395
- assert_equal 2, @matches.size
396
- assert_equal "2", @matches[0].attributes["id"]
397
- assert_equal "4", @matches[1].attributes["id"]
398
- select("tr:nth-child(?n?)", 4, 2)
399
- assert_equal 1, @matches.size
400
- assert_equal "2", @matches[0].attributes["id"]
401
- # Test with ? (b only).
402
- select("tr:nth-child(?)", 3)
403
- assert_equal 1, @matches.size
404
- assert_equal "3", @matches[0].attributes["id"]
405
- select("tr:nth-child(?)", 5)
406
- assert_equal 0, @matches.size
407
- end
408
-
409
-
410
- def test_nth_last_child
411
- parse(%Q{<table><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
412
- # Last two elements.
413
- select("tr:nth-last-child(-n+2)")
414
- assert_equal 2, @matches.size
415
- assert_equal "3", @matches[0].attributes["id"]
416
- assert_equal "4", @matches[1].attributes["id"]
417
- # All old elements counting from last one.
418
- select("tr:nth-last-child(odd)")
419
- assert_equal 2, @matches.size
420
- assert_equal "2", @matches[0].attributes["id"]
421
- assert_equal "4", @matches[1].attributes["id"]
422
- end
423
-
424
-
425
- def test_nth_of_type
426
- parse(%Q{<table><thead></thead><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
427
- # First two elements.
428
- select("tr:nth-of-type(-n+2)")
429
- assert_equal 2, @matches.size
430
- assert_equal "1", @matches[0].attributes["id"]
431
- assert_equal "2", @matches[1].attributes["id"]
432
- # All old elements counting from last one.
433
- select("tr:nth-last-of-type(odd)")
434
- assert_equal 2, @matches.size
435
- assert_equal "2", @matches[0].attributes["id"]
436
- assert_equal "4", @matches[1].attributes["id"]
437
- end
438
-
439
-
440
- def test_first_and_last
441
- parse(%Q{<table><thead></thead><tr id="1"></tr><tr id="2"></tr><tr id="3"></tr><tr id="4"></tr></table>})
442
- # First child.
443
- select("tr:first-child")
444
- assert_equal 0, @matches.size
445
- select(":first-child")
446
- assert_equal 1, @matches.size
447
- assert_equal "thead", @matches[0].name
448
- # First of type.
449
- select("tr:first-of-type")
450
- assert_equal 1, @matches.size
451
- assert_equal "1", @matches[0].attributes["id"]
452
- select("thead:first-of-type")
453
- assert_equal 1, @matches.size
454
- assert_equal "thead", @matches[0].name
455
- select("div:first-of-type")
456
- assert_equal 0, @matches.size
457
- # Last child.
458
- select("tr:last-child")
459
- assert_equal 1, @matches.size
460
- assert_equal "4", @matches[0].attributes["id"]
461
- # Last of type.
462
- select("tr:last-of-type")
463
- assert_equal 1, @matches.size
464
- assert_equal "4", @matches[0].attributes["id"]
465
- select("thead:last-of-type")
466
- assert_equal 1, @matches.size
467
- assert_equal "thead", @matches[0].name
468
- select("div:last-of-type")
469
- assert_equal 0, @matches.size
470
- end
471
-
472
-
473
- def test_first_and_last
474
- # Only child.
475
- parse(%Q{<table><tr></tr></table>})
476
- select("table:only-child")
477
- assert_equal 0, @matches.size
478
- select("tr:only-child")
479
- assert_equal 1, @matches.size
480
- assert_equal "tr", @matches[0].name
481
- parse(%Q{<table><tr></tr><tr></tr></table>})
482
- select("tr:only-child")
483
- assert_equal 0, @matches.size
484
- # Only of type.
485
- parse(%Q{<table><thead></thead><tr></tr><tr></tr></table>})
486
- select("thead:only-of-type")
487
- assert_equal 1, @matches.size
488
- assert_equal "thead", @matches[0].name
489
- select("td:only-of-type")
490
- assert_equal 0, @matches.size
491
- end
492
-
493
-
494
- def test_empty
495
- parse(%Q{<table><tr></tr></table>})
496
- select("table:empty")
497
- assert_equal 0, @matches.size
498
- select("tr:empty")
499
- assert_equal 1, @matches.size
500
- parse(%Q{<div> </div>})
501
- select("div:empty")
502
- assert_equal 1, @matches.size
503
- end
504
-
505
-
506
- def test_content
507
- parse(%Q{<div> </div>})
508
- select("div:content()")
509
- assert_equal 1, @matches.size
510
- parse(%Q{<div>something </div>})
511
- select("div:content()")
512
- assert_equal 0, @matches.size
513
- select("div:content(something)")
514
- assert_equal 1, @matches.size
515
- select("div:content( 'something' )")
516
- assert_equal 1, @matches.size
517
- select("div:content( \"something\" )")
518
- assert_equal 1, @matches.size
519
- select("div:content(?)", "something")
520
- assert_equal 1, @matches.size
521
- select("div:content(?)", /something/)
522
- assert_equal 1, @matches.size
523
- end
524
-
525
-
526
- #
527
- # Test negation.
528
- #
529
-
530
-
531
- def test_element_negation
532
- parse(%Q{<p></p><div></div>})
533
- select("*")
534
- assert_equal 2, @matches.size
535
- select("*:not(p)")
536
- assert_equal 1, @matches.size
537
- assert_equal "div", @matches[0].name
538
- select("*:not(div)")
539
- assert_equal 1, @matches.size
540
- assert_equal "p", @matches[0].name
541
- select("*:not(span)")
542
- assert_equal 2, @matches.size
543
- end
544
-
545
-
546
- def test_id_negation
547
- parse(%Q{<p id="1"></p><p id="2"></p>})
548
- select("p")
549
- assert_equal 2, @matches.size
550
- select(":not(#1)")
551
- assert_equal 1, @matches.size
552
- assert_equal "2", @matches[0].attributes["id"]
553
- select(":not(#2)")
554
- assert_equal 1, @matches.size
555
- assert_equal "1", @matches[0].attributes["id"]
556
- end
557
-
558
-
559
- def test_class_name_negation
560
- parse(%Q{<p class="foo"></p><p class="bar"></p>})
561
- select("p")
562
- assert_equal 2, @matches.size
563
- select(":not(.foo)")
564
- assert_equal 1, @matches.size
565
- assert_equal "bar", @matches[0].attributes["class"]
566
- select(":not(.bar)")
567
- assert_equal 1, @matches.size
568
- assert_equal "foo", @matches[0].attributes["class"]
569
- end
570
-
571
-
572
- def test_attribute_negation
573
- parse(%Q{<p title="foo"></p><p title="bar"></p>})
574
- select("p")
575
- assert_equal 2, @matches.size
576
- select(":not([title=foo])")
577
- assert_equal 1, @matches.size
578
- assert_equal "bar", @matches[0].attributes["title"]
579
- select(":not([title=bar])")
580
- assert_equal 1, @matches.size
581
- assert_equal "foo", @matches[0].attributes["title"]
582
- end
583
-
584
-
585
- def test_pseudo_class_negation
586
- parse(%Q{<div><p id="1"></p><p id="2"></p></div>})
587
- select("p")
588
- assert_equal 2, @matches.size
589
- select("p:not(:first-child)")
590
- assert_equal 1, @matches.size
591
- assert_equal "2", @matches[0].attributes["id"]
592
- select("p:not(:nth-child(2))")
593
- assert_equal 1, @matches.size
594
- assert_equal "1", @matches[0].attributes["id"]
595
- end
596
-
597
-
598
- def test_negation_details
599
- parse(%Q{<p id="1"></p><p id="2"></p><p id="3"></p>})
600
- assert_raise(ArgumentError) { select(":not(") }
601
- assert_raise(ArgumentError) { select(":not(:not())") }
602
- select("p:not(#1):not(#3)")
603
- assert_equal 1, @matches.size
604
- assert_equal "2", @matches[0].attributes["id"]
605
- end
606
-
607
-
608
- def test_select_from_element
609
- parse(%Q{<div><p id="1"></p><p id="2"></p></div>})
610
- select("div")
611
- @matches = @matches[0].select("p")
612
- assert_equal 2, @matches.size
613
- assert_equal "1", @matches[0].attributes["id"]
614
- assert_equal "2", @matches[1].attributes["id"]
615
- end
616
-
617
-
618
- protected
619
-
620
- def parse(html)
621
- @html = HTML::Document.new(html).root
622
- end
623
-
624
- def select(*selector)
625
- @matches = HTML.selector(*selector).select(@html)
626
- end
627
-
628
- end