cucumber 1.3.10 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -1
  4. data/.travis.yml +4 -3
  5. data/CONTRIBUTING.md +9 -0
  6. data/Gemfile +9 -2
  7. data/History.md +212 -22
  8. data/LICENSE +2 -2
  9. data/README.md +4 -4
  10. data/Rakefile +10 -1
  11. data/bin/cucumber +1 -5
  12. data/cucumber.gemspec +10 -13
  13. data/cucumber.yml +14 -24
  14. data/examples/{ramaze → i18n/el}/Rakefile +1 -1
  15. data/examples/i18n/el/features/addition.feature +17 -0
  16. data/examples/i18n/el/features/division.feature +10 -0
  17. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  18. data/examples/i18n/el/lib/calculator.rb +14 -0
  19. data/examples/i18n/fr/Rakefile +3 -1
  20. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +2 -2
  21. data/examples/i18n/ht/Rakefile +6 -0
  22. data/examples/i18n/ht/features/adisyon.feature +17 -0
  23. data/examples/i18n/ht/features/divizyon.feature +10 -0
  24. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  25. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  26. data/examples/i18n/zh-CN/features/{step_definitons → step_definitions}/calculator_steps.rb +4 -4
  27. data/examples/tcl/features/step_definitions/fib_steps.rb +1 -1
  28. data/{legacy_features → features/docs}/api/list_step_defs_as_json.feature +14 -14
  29. data/{legacy_features → features/docs}/api/run_cli_main_with_existing_runtime.feature +5 -10
  30. data/features/{backtraces.feature → docs/cli/backtraces.feature} +2 -2
  31. data/features/docs/cli/dry_run.feature +73 -0
  32. data/features/docs/cli/exclude_files.feature +18 -0
  33. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  34. data/features/docs/cli/randomize.feature +46 -0
  35. data/features/docs/cli/require.feature +27 -0
  36. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  37. data/features/docs/cli/run_specific_scenarios.feature +75 -0
  38. data/features/docs/cli/showing_differences.feature +43 -0
  39. data/features/docs/cli/specifying_multiple_formatters.feature +44 -0
  40. data/features/docs/cli/strict_mode.feature +64 -0
  41. data/features/{nested_steps.feature → docs/defining_steps/nested_steps.feature} +52 -6
  42. data/features/{nested_steps_i18n.feature → docs/defining_steps/nested_steps_i18n.feature} +0 -2
  43. data/features/{step_definitions.feature → docs/defining_steps/one_line_step_definitions.feature} +3 -3
  44. data/features/docs/defining_steps/printing_messages.feature +148 -0
  45. data/features/docs/defining_steps/skip_scenario.feature +62 -0
  46. data/features/docs/defining_steps/snippets.feature +56 -0
  47. data/{legacy_features → features/docs/defining_steps}/table_diffing.feature +21 -16
  48. data/features/{transforms.feature → docs/defining_steps/transforms.feature} +2 -2
  49. data/{legacy_features/exception_in_after_block.feature → features/docs/exception_in_after_hook.feature} +25 -26
  50. data/{legacy_features/exception_in_after_step_block.feature → features/docs/exception_in_after_step_hook.feature} +22 -24
  51. data/features/docs/exception_in_around_hook.feature +80 -0
  52. data/{legacy_features/exception_in_before_block.feature → features/docs/exception_in_before_hook.feature} +18 -20
  53. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  54. data/features/docs/extending_cucumber/custom_formatter.feature +94 -0
  55. data/features/docs/formatters/debug_formatter.feature +47 -0
  56. data/features/{formatter_step_file_colon_line.feature → docs/formatters/formatter_step_file_colon_line.feature} +2 -4
  57. data/features/{html_formatter.feature → docs/formatters/html_formatter.feature} +10 -14
  58. data/features/docs/formatters/json_formatter.feature +760 -0
  59. data/features/docs/formatters/junit_formatter.feature +316 -0
  60. data/features/docs/formatters/pretty_formatter.feature +73 -0
  61. data/features/{progress_formatter.feature → docs/formatters/progress_formatter.feature} +1 -1
  62. data/features/docs/formatters/rerun_formatter.feature +136 -0
  63. data/features/docs/formatters/usage_formatter.feature +102 -0
  64. data/features/docs/getting_started.feature +27 -0
  65. data/features/{background.feature → docs/gherkin/background.feature} +149 -91
  66. data/features/{doc_strings.feature → docs/gherkin/doc_strings.feature} +1 -0
  67. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  68. data/features/docs/gherkin/language_from_header.feature +32 -0
  69. data/features/docs/gherkin/outlines.feature +158 -0
  70. data/features/docs/gherkin/unicode_table.feature +32 -0
  71. data/features/docs/gherkin/using_descriptions.feature +88 -0
  72. data/features/docs/gherkin/using_star_notation.feature +37 -0
  73. data/{legacy_features → features/docs}/post_configuration_hook.feature +17 -18
  74. data/{legacy_features → features/docs}/profiles.feature +30 -36
  75. data/{legacy_features → features/docs}/rake_task.feature +30 -41
  76. data/features/{raketask.feature → docs/raketask.feature} +6 -13
  77. data/{legacy_features/wire_protocol_erb.feature → features/docs/wire_protocol/erb_configuration.feature} +7 -8
  78. data/features/docs/wire_protocol/handle_unexpected_response.feature +30 -0
  79. data/features/docs/wire_protocol/invoke_message.feature +216 -0
  80. data/features/docs/wire_protocol/readme.md +26 -0
  81. data/features/docs/wire_protocol/snippets_message.feature +51 -0
  82. data/features/docs/wire_protocol/step_matches_message.feature +81 -0
  83. data/{legacy_features/wire_protocol_table_diffing.feature → features/docs/wire_protocol/table_diffing.feature} +19 -12
  84. data/{legacy_features/wire_protocol_tags.feature → features/docs/wire_protocol/tags.feature} +7 -7
  85. data/{legacy_features/wire_protocol_timeouts.feature → features/docs/wire_protocol/timeouts.feature} +7 -6
  86. data/{legacy_features → features/docs}/work_in_progress.feature +52 -54
  87. data/features/docs/writing_support_code/after_hooks.feature +80 -0
  88. data/{legacy_features → features/docs/writing_support_code}/around_hooks.feature +56 -28
  89. data/features/docs/writing_support_code/before_hook.feature +65 -0
  90. data/features/docs/writing_support_code/hook_order.feature +61 -0
  91. data/features/{load_path.feature → docs/writing_support_code/load_path.feature} +3 -0
  92. data/features/docs/writing_support_code/state.feature +32 -0
  93. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  94. data/features/lib/step_definitions/aruba_steps.rb +22 -0
  95. data/features/lib/step_definitions/cucumber_steps.rb +50 -0
  96. data/features/{step_definitions → lib/step_definitions}/iso-8859-1_steps.rb +3 -15
  97. data/features/lib/step_definitions/json_steps.rb +7 -0
  98. data/features/lib/step_definitions/junit_steps.rb +13 -0
  99. data/features/lib/step_definitions/language_steps.rb +4 -5
  100. data/features/lib/step_definitions/profile_steps.rb +15 -0
  101. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  102. data/features/lib/step_definitions/wire_steps.rb +58 -0
  103. data/features/lib/support/env.rb +21 -0
  104. data/{legacy_features → features/lib}/support/fake_wire_server.rb +10 -7
  105. data/features/{support → lib/support}/feature_factory.rb +1 -1
  106. data/features/lib/support/normalise_output.rb +33 -0
  107. data/gem_tasks/cov.rake +5 -0
  108. data/gem_tasks/cucumber.rake +3 -8
  109. data/gem_tasks/rspec.rake +0 -2
  110. data/lib/cucumber/ast.rb +8 -25
  111. data/lib/cucumber/cli/configuration.rb +33 -37
  112. data/lib/cucumber/cli/main.rb +14 -27
  113. data/lib/cucumber/cli/options.rb +22 -60
  114. data/lib/cucumber/cli/profile_loader.rb +1 -1
  115. data/lib/cucumber/configuration.rb +4 -0
  116. data/lib/cucumber/constantize.rb +7 -6
  117. data/lib/cucumber/core_ext/instance_exec.rb +7 -38
  118. data/lib/cucumber/core_ext/proc.rb +1 -1
  119. data/lib/cucumber/encoding.rb +5 -0
  120. data/lib/cucumber/errors.rb +21 -10
  121. data/lib/cucumber/file_specs.rb +37 -0
  122. data/lib/cucumber/filters/activate_steps.rb +33 -0
  123. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  124. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  125. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  126. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  127. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  128. data/lib/cucumber/filters/prepare_world.rb +45 -0
  129. data/lib/cucumber/filters/quit.rb +28 -0
  130. data/lib/cucumber/filters/randomizer.rb +40 -0
  131. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  132. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  133. data/lib/cucumber/filters/tag_limits.rb +45 -0
  134. data/lib/cucumber/filters.rb +9 -0
  135. data/lib/cucumber/formatter/ansicolor.rb +0 -8
  136. data/lib/cucumber/formatter/console.rb +66 -36
  137. data/lib/cucumber/formatter/debug.rb +10 -8
  138. data/lib/cucumber/formatter/fanout.rb +27 -0
  139. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +122 -12
  140. data/lib/cucumber/formatter/html.rb +67 -18
  141. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  142. data/lib/cucumber/formatter/interceptor.rb +17 -3
  143. data/lib/cucumber/formatter/json.rb +1 -1
  144. data/lib/cucumber/formatter/junit.rb +105 -5
  145. data/lib/cucumber/formatter/legacy_api/adapter.rb +1060 -0
  146. data/lib/cucumber/formatter/legacy_api/ast.rb +376 -0
  147. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  148. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +30 -0
  149. data/lib/cucumber/formatter/pretty.rb +16 -8
  150. data/lib/cucumber/formatter/progress.rb +10 -0
  151. data/lib/cucumber/formatter/rerun.rb +14 -71
  152. data/lib/cucumber/formatter/unicode.rb +8 -21
  153. data/lib/cucumber/formatter/usage.rb +7 -1
  154. data/lib/cucumber/hooks.rb +97 -0
  155. data/lib/cucumber/language_support/language_methods.rb +0 -54
  156. data/lib/cucumber/{ast/table.rb → multiline_argument/data_table.rb} +77 -84
  157. data/lib/cucumber/multiline_argument/doc_string.rb +10 -0
  158. data/lib/cucumber/multiline_argument.rb +74 -0
  159. data/lib/cucumber/platform.rb +21 -20
  160. data/lib/cucumber/project_initializer.rb +43 -0
  161. data/lib/cucumber/rake/task.rb +3 -54
  162. data/lib/cucumber/rb_support/rb_hook.rb +2 -2
  163. data/lib/cucumber/rb_support/rb_language.rb +4 -34
  164. data/lib/cucumber/rb_support/rb_step_definition.rb +11 -2
  165. data/lib/cucumber/rb_support/rb_transform.rb +3 -1
  166. data/lib/cucumber/rb_support/rb_world.rb +13 -20
  167. data/lib/cucumber/rb_support/snippet.rb +61 -20
  168. data/lib/cucumber/rspec/doubles.rb +9 -6
  169. data/lib/cucumber/running_test_case.rb +115 -0
  170. data/lib/cucumber/runtime/after_hooks.rb +24 -0
  171. data/lib/cucumber/runtime/before_hooks.rb +23 -0
  172. data/lib/cucumber/runtime/for_programming_languages.rb +14 -10
  173. data/lib/cucumber/runtime/step_hooks.rb +22 -0
  174. data/lib/cucumber/runtime/support_code.rb +78 -21
  175. data/lib/cucumber/runtime/user_interface.rb +4 -0
  176. data/lib/cucumber/runtime.rb +153 -98
  177. data/lib/cucumber/step_match.rb +27 -3
  178. data/lib/cucumber/term/ansicolor.rb +1 -9
  179. data/lib/cucumber/wire_support/wire_language.rb +23 -9
  180. data/lib/cucumber/wire_support/wire_packet.rb +1 -1
  181. data/lib/cucumber/wire_support/wire_protocol/requests.rb +13 -5
  182. data/lib/cucumber/wire_support/wire_step_definition.rb +1 -8
  183. data/lib/cucumber.rb +8 -6
  184. data/spec/cucumber/cli/configuration_spec.rb +165 -134
  185. data/spec/cucumber/cli/main_spec.rb +36 -99
  186. data/spec/cucumber/cli/options_spec.rb +238 -272
  187. data/spec/cucumber/cli/profile_loader_spec.rb +18 -7
  188. data/spec/cucumber/configuration_spec.rb +3 -3
  189. data/spec/cucumber/constantize_spec.rb +2 -1
  190. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  191. data/spec/cucumber/core_ext/proc_spec.rb +32 -43
  192. data/spec/cucumber/file_specs_spec.rb +60 -0
  193. data/spec/cucumber/filters/activate_steps_spec.rb +57 -0
  194. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  195. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  196. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  197. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  198. data/spec/cucumber/formatter/ansicolor_spec.rb +11 -10
  199. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  200. data/spec/cucumber/formatter/duration_spec.rb +6 -6
  201. data/spec/cucumber/formatter/html_spec.rb +233 -39
  202. data/spec/cucumber/formatter/interceptor_spec.rb +38 -31
  203. data/spec/cucumber/formatter/junit_spec.rb +213 -151
  204. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2090 -0
  205. data/spec/cucumber/formatter/pretty_spec.rb +481 -49
  206. data/spec/cucumber/formatter/progress_spec.rb +63 -16
  207. data/spec/cucumber/formatter/rerun_spec.rb +107 -0
  208. data/spec/cucumber/formatter/spec_helper.rb +32 -17
  209. data/spec/cucumber/hooks_spec.rb +30 -0
  210. data/spec/cucumber/{ast/table_spec.rb → multiline_argument/data_table_spec.rb} +128 -208
  211. data/spec/cucumber/project_initializer_spec.rb +87 -0
  212. data/spec/cucumber/rake/forked_spec.rb +13 -22
  213. data/spec/cucumber/rb_support/rb_language_spec.rb +78 -69
  214. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +90 -44
  215. data/spec/cucumber/rb_support/rb_transform_spec.rb +24 -3
  216. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +6 -4
  217. data/spec/cucumber/rb_support/snippet_spec.rb +47 -38
  218. data/spec/cucumber/running_test_case_spec.rb +83 -0
  219. data/spec/cucumber/runtime/for_programming_languages_spec.rb +18 -13
  220. data/spec/cucumber/runtime/support_code_spec.rb +29 -29
  221. data/spec/cucumber/runtime_spec.rb +35 -34
  222. data/spec/cucumber/step_match_spec.rb +30 -20
  223. data/spec/cucumber/wire_support/configuration_spec.rb +8 -5
  224. data/spec/cucumber/wire_support/connection_spec.rb +12 -8
  225. data/spec/cucumber/wire_support/wire_exception_spec.rb +14 -8
  226. data/spec/cucumber/wire_support/wire_language_spec.rb +8 -9
  227. data/spec/cucumber/wire_support/wire_packet_spec.rb +17 -13
  228. data/spec/cucumber/world/pending_spec.rb +36 -36
  229. data/spec/simplecov_setup.rb +18 -0
  230. data/spec/spec_helper.rb +6 -13
  231. metadata +348 -350
  232. data/.gitattributes +0 -1
  233. data/.ruby-version +0 -1
  234. data/examples/python/README.textile +0 -8
  235. data/examples/python/Rakefile +0 -4
  236. data/examples/python/features/fibonacci.feature +0 -19
  237. data/examples/python/features/step_definitions/fib_steps.py +0 -11
  238. data/examples/python/lib/fib.py +0 -7
  239. data/examples/ramaze/README.textile +0 -7
  240. data/examples/ramaze/app.rb +0 -21
  241. data/examples/ramaze/features/add.feature +0 -11
  242. data/examples/ramaze/features/step_definitions/add_steps.rb +0 -15
  243. data/examples/ramaze/features/support/env.rb +0 -32
  244. data/examples/ramaze/layout/default.html.erb +0 -8
  245. data/examples/ramaze/view/index.html.erb +0 -5
  246. data/examples/ruby2python/README.textile +0 -8
  247. data/examples/ruby2python/Rakefile +0 -4
  248. data/examples/ruby2python/features/fibonacci.feature +0 -19
  249. data/examples/ruby2python/features/step_definitions/fib_steps.rb +0 -7
  250. data/examples/ruby2python/features/support/env.rb +0 -21
  251. data/examples/ruby2python/lib/fib.py +0 -7
  252. data/examples/v8/Rakefile +0 -6
  253. data/examples/v8/features/fibonacci.feature +0 -43
  254. data/examples/v8/features/step_definitions/fib_steps.js +0 -49
  255. data/examples/v8/features/support/env.js +0 -14
  256. data/examples/v8/lib/fibonacci.js +0 -19
  257. data/features/.cucumber/stepdefs.json +0 -627
  258. data/features/assertions.feature +0 -73
  259. data/features/autoformat_profile_output.feature +0 -23
  260. data/features/before_hook.feature +0 -43
  261. data/features/bootstrap.feature +0 -27
  262. data/features/custom_formatter.feature +0 -41
  263. data/features/drb_server_integration.feature +0 -63
  264. data/features/execute_with_tag_filter.feature +0 -63
  265. data/features/formatter_callbacks.feature +0 -189
  266. data/features/json_formatter.feature +0 -338
  267. data/features/parsing.feature +0 -18
  268. data/features/pretty_formatter.feature +0 -31
  269. data/features/rerun_formatter.feature +0 -35
  270. data/features/run_specific_scenarios.feature +0 -47
  271. data/features/stats_formatters.feature +0 -73
  272. data/features/step_definitions/cucumber-features/cucumber_ruby_mappings.rb +0 -197
  273. data/features/step_definitions/cucumber_steps.rb +0 -55
  274. data/features/step_definitions/drb_steps.rb +0 -3
  275. data/features/support/env.rb +0 -57
  276. data/features/tagged_hooks.feature +0 -59
  277. data/fixtures/json/features/background.feature +0 -7
  278. data/fixtures/json/features/embed.feature +0 -4
  279. data/fixtures/json/features/one_passing_one_failing.feature +0 -11
  280. data/fixtures/json/features/step_definitions/steps.rb +0 -32
  281. data/fixtures/json/features/tables.feature +0 -13
  282. data/fixtures/junit/features/one_passing_one_failing.feature +0 -8
  283. data/fixtures/junit/features/pending.feature +0 -7
  284. data/fixtures/junit/features/scenario_outline.feature +0 -9
  285. data/fixtures/junit/features/some_subdirectory/one_passing_one_failing.feature +0 -8
  286. data/fixtures/junit/features/step_definitions/steps.rb +0 -11
  287. data/fixtures/self_test/README.textile +0 -6
  288. data/fixtures/self_test/Rakefile +0 -6
  289. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +0 -7
  290. data/fixtures/self_test/features/failing_expectation.feature +0 -4
  291. data/fixtures/self_test/features/lots_of_undefined.feature +0 -8
  292. data/fixtures/self_test/features/multiline_name.feature +0 -27
  293. data/fixtures/self_test/features/outline_sample.feature +0 -15
  294. data/fixtures/self_test/features/sample.feature +0 -21
  295. data/fixtures/self_test/features/search_sample.feature +0 -32
  296. data/fixtures/self_test/features/step_definitions/sample_steps.rb +0 -84
  297. data/fixtures/self_test/features/support/bubble_256x256.png +0 -0
  298. data/fixtures/self_test/features/support/env.rb +0 -26
  299. data/fixtures/self_test/features/tags_sample.feature +0 -17
  300. data/fixtures/self_test/features/tons_of_cukes.feature +0 -52
  301. data/fixtures/self_test/features/undefined_multiline_args.feature +0 -12
  302. data/fixtures/self_test/list-of-features.txt +0 -1
  303. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +0 -8
  304. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +0 -8
  305. data/fixtures/tickets/Rakefile +0 -20
  306. data/fixtures/tickets/features/172.feature +0 -28
  307. data/fixtures/tickets/features/177/1.feature +0 -28
  308. data/fixtures/tickets/features/177/2.feature +0 -20
  309. data/fixtures/tickets/features/177/3.feature +0 -18
  310. data/fixtures/tickets/features/180.feature +0 -7
  311. data/fixtures/tickets/features/229/tagged_hooks.feature +0 -8
  312. data/fixtures/tickets/features/229/tagged_hooks.rb +0 -14
  313. data/fixtures/tickets/features/236.feature +0 -13
  314. data/fixtures/tickets/features/241.feature +0 -12
  315. data/fixtures/tickets/features/246.feature +0 -4
  316. data/fixtures/tickets/features/248.feature +0 -11
  317. data/fixtures/tickets/features/270/back.feature +0 -14
  318. data/fixtures/tickets/features/270/back.steps.rb +0 -14
  319. data/fixtures/tickets/features/272/hooks.feature +0 -26
  320. data/fixtures/tickets/features/272/hooks_steps.rb +0 -53
  321. data/fixtures/tickets/features/279/py_string_indent.feature +0 -25
  322. data/fixtures/tickets/features/279/py_string_indent.steps.rb +0 -12
  323. data/fixtures/tickets/features/279/wrong.feature_ +0 -11
  324. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +0 -6
  325. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +0 -12
  326. data/fixtures/tickets/features/306/only_background.feature +0 -4
  327. data/fixtures/tickets/features/around_timeout.feature +0 -6
  328. data/fixtures/tickets/features/gherkin_67.feature +0 -12
  329. data/fixtures/tickets/features/gherkin_68.feature +0 -4
  330. data/fixtures/tickets/features/half_manual.feature +0 -11
  331. data/fixtures/tickets/features/lib/eatting_machine.rb +0 -18
  332. data/fixtures/tickets/features/lib/pantry.rb +0 -20
  333. data/fixtures/tickets/features/scenario_outline.feature +0 -95
  334. data/fixtures/tickets/features/step_definitons/246_steps.rb +0 -3
  335. data/fixtures/tickets/features/step_definitons/248_steps.rb +0 -15
  336. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +0 -9
  337. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +0 -11
  338. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +0 -42
  339. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +0 -88
  340. data/fixtures/tickets/features/table_diffing.feature +0 -13
  341. data/fixtures/tickets/features/tickets.feature +0 -28
  342. data/fixtures/tickets/features.html +0 -138
  343. data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  344. data/gem_tasks/yard/default/layout/html/footer.erb +0 -5
  345. data/gem_tasks/yard/default/layout/html/index.erb +0 -1
  346. data/gem_tasks/yard/default/layout/html/layout.erb +0 -25
  347. data/gem_tasks/yard/default/layout/html/logo.erb +0 -1
  348. data/gem_tasks/yard/default/layout/html/setup.rb +0 -4
  349. data/gem_tasks/yard.rake +0 -40
  350. data/legacy_features/README.md +0 -14
  351. data/legacy_features/announce.feature +0 -152
  352. data/legacy_features/bug_371.feature +0 -32
  353. data/legacy_features/bug_464.feature +0 -16
  354. data/legacy_features/bug_475.feature +0 -42
  355. data/legacy_features/bug_585_tab_indentation.feature +0 -22
  356. data/legacy_features/bug_600.feature +0 -73
  357. data/legacy_features/cucumber_cli.feature +0 -584
  358. data/legacy_features/cucumber_cli_outlines.feature +0 -117
  359. data/legacy_features/default_snippets.feature +0 -43
  360. data/legacy_features/diffing.feature +0 -25
  361. data/legacy_features/drb_server_integration.feature +0 -174
  362. data/legacy_features/exclude_files.feature +0 -20
  363. data/legacy_features/expand.feature +0 -60
  364. data/legacy_features/junit_formatter.feature +0 -214
  365. data/legacy_features/language_from_header.feature +0 -30
  366. data/legacy_features/listener_debugger_formatter.feature +0 -42
  367. data/legacy_features/multiline_names.feature +0 -44
  368. data/legacy_features/report_called_undefined_steps.feature +0 -35
  369. data/legacy_features/rerun_formatter.feature +0 -52
  370. data/legacy_features/simplest.feature +0 -11
  371. data/legacy_features/snippet.feature +0 -23
  372. data/legacy_features/snippets_when_using_star_keyword.feature +0 -38
  373. data/legacy_features/step_definitions/cucumber_steps.rb +0 -179
  374. data/legacy_features/step_definitions/extra_steps.rb +0 -2
  375. data/legacy_features/step_definitions/simplest_steps.rb +0 -3
  376. data/legacy_features/step_definitions/wire_steps.rb +0 -34
  377. data/legacy_features/support/env.rb +0 -161
  378. data/legacy_features/support/env.rb.simplest +0 -7
  379. data/legacy_features/table_mapping.feature +0 -34
  380. data/legacy_features/transform.feature +0 -245
  381. data/legacy_features/unicode_table.feature +0 -35
  382. data/legacy_features/wire_protocol.feature +0 -332
  383. data/lib/README.rdoc +0 -12
  384. data/lib/cucumber/ast/background.rb +0 -116
  385. data/lib/cucumber/ast/comment.rb +0 -31
  386. data/lib/cucumber/ast/doc_string.rb +0 -61
  387. data/lib/cucumber/ast/empty_background.rb +0 -33
  388. data/lib/cucumber/ast/examples.rb +0 -49
  389. data/lib/cucumber/ast/feature.rb +0 -99
  390. data/lib/cucumber/ast/features.rb +0 -38
  391. data/lib/cucumber/ast/has_steps.rb +0 -74
  392. data/lib/cucumber/ast/location.rb +0 -41
  393. data/lib/cucumber/ast/multiline_argument.rb +0 -30
  394. data/lib/cucumber/ast/names.rb +0 -13
  395. data/lib/cucumber/ast/outline_table.rb +0 -194
  396. data/lib/cucumber/ast/scenario.rb +0 -103
  397. data/lib/cucumber/ast/scenario_outline.rb +0 -146
  398. data/lib/cucumber/ast/step.rb +0 -122
  399. data/lib/cucumber/ast/step_collection.rb +0 -92
  400. data/lib/cucumber/ast/step_invocation.rb +0 -196
  401. data/lib/cucumber/ast/tags.rb +0 -28
  402. data/lib/cucumber/ast/tree_walker.rb +0 -191
  403. data/lib/cucumber/ast/visitor.rb +0 -11
  404. data/lib/cucumber/broadcaster.rb +0 -13
  405. data/lib/cucumber/cli/drb_client.rb +0 -43
  406. data/lib/cucumber/feature_file.rb +0 -94
  407. data/lib/cucumber/formatter/ordered_xml_markup.rb +0 -24
  408. data/lib/cucumber/js_support/js_dsl.js +0 -57
  409. data/lib/cucumber/js_support/js_language.rb +0 -185
  410. data/lib/cucumber/js_support/js_snippets.rb +0 -27
  411. data/lib/cucumber/parser/gherkin_builder.rb +0 -284
  412. data/lib/cucumber/parser.rb +0 -2
  413. data/lib/cucumber/py_support/py_dsl.py +0 -10
  414. data/lib/cucumber/py_support/py_language.py +0 -10
  415. data/lib/cucumber/py_support/py_language.rb +0 -80
  416. data/lib/cucumber/runtime/features_loader.rb +0 -62
  417. data/lib/cucumber/runtime/results.rb +0 -64
  418. data/lib/cucumber/step_mother.rb +0 -10
  419. data/spec/cucumber/ast/background_spec.rb +0 -122
  420. data/spec/cucumber/ast/doc_string_spec.rb +0 -40
  421. data/spec/cucumber/ast/feature_factory.rb +0 -72
  422. data/spec/cucumber/ast/feature_spec.rb +0 -63
  423. data/spec/cucumber/ast/features_spec.rb +0 -51
  424. data/spec/cucumber/ast/outline_table_spec.rb +0 -21
  425. data/spec/cucumber/ast/scenario_outline_spec.rb +0 -74
  426. data/spec/cucumber/ast/step_spec.rb +0 -68
  427. data/spec/cucumber/ast/tree_walker_spec.rb +0 -19
  428. data/spec/cucumber/broadcaster_spec.rb +0 -15
  429. data/spec/cucumber/cli/drb_client_spec.rb +0 -76
  430. data/spec/cucumber/rake/rcov_spec.rb +0 -71
  431. data/spec/cucumber/runtime/results_spec.rb +0 -81
  432. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +0 -20
  433. /data/examples/i18n/ar/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  434. /data/examples/i18n/bg/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  435. /data/examples/i18n/ca/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  436. /data/examples/i18n/cs/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  437. /data/examples/i18n/da/features/{step_definitons → step_definitions}/lommeregner_steps.rb +0 -0
  438. /data/examples/i18n/de/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  439. /data/examples/i18n/en/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  440. /data/examples/i18n/eo/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  441. /data/examples/i18n/es/features/{step_definitons → step_definitions}/calculador_steps.rb +0 -0
  442. /data/examples/i18n/fi/features/{step_definitons → step_definitions}/laskin_steps.rb +0 -0
  443. /data/examples/i18n/he/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  444. /data/examples/i18n/hi/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  445. /data/examples/i18n/hu/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  446. /data/examples/i18n/id/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  447. /data/examples/i18n/it/features/{step_definitons → step_definitions}/calcolatrice_steps.rb +0 -0
  448. /data/examples/i18n/ja/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  449. /data/examples/i18n/ko/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  450. /data/examples/i18n/lt/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  451. /data/examples/i18n/lv/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  452. /data/examples/i18n/no/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  453. /data/examples/i18n/pl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  454. /data/examples/i18n/ro/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  455. /data/examples/i18n/ru/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  456. /data/examples/i18n/sk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  457. /data/examples/i18n/sr-Cyrl/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  458. /data/examples/i18n/sr-Latn/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  459. /data/examples/i18n/sv/features/{step_definitons → step_definitions}/kalkulator_steps.rb +0 -0
  460. /data/examples/i18n/tr/features/{step_definitons → step_definitions}/hesap_makinesi_adimlari.rb +0 -0
  461. /data/examples/i18n/uk/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  462. /data/examples/i18n/uz/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  463. /data/examples/i18n/zh-TW/features/{step_definitons → step_definitions}/calculator_steps.rb +0 -0
  464. /data/features/{nested_steps_with_second_arg.feature → docs/defining_steps/nested_steps_with_second_arg.feature} +0 -0
  465. /data/features/{iso-8859-1.feature → docs/iso-8859-1.feature} +0 -0
@@ -1,4 +1,6 @@
1
1
  require 'forwardable'
2
+ require 'cucumber/core/ast/doc_string'
3
+ require 'cucumber/core/ast/data_table'
2
4
 
3
5
  module Cucumber
4
6
  class Runtime
@@ -21,11 +23,11 @@ module Cucumber
21
23
  :step_match
22
24
 
23
25
  def_delegators :@support_code,
24
- :invoke_steps,
25
- :invoke,
26
+ :invoke_dynamic_steps,
27
+ :invoke_dynamic_step,
26
28
  :load_programming_language
27
29
 
28
- # Returns a Cucumber::Ast::Table for +text_or_table+, which can either
30
+ # Returns a Cucumber::MultilineArgument::DataTable for +text_or_table+, which can either
29
31
  # be a String:
30
32
  #
31
33
  # table(%{
@@ -42,18 +44,20 @@ module Cucumber
42
44
  # %w{ CUC-101 Peeler 22 }
43
45
  # ])
44
46
  #
45
- def table(text_or_table, file=nil, line_offset=0)
46
- if Array === text_or_table
47
- Ast::Table.new(text_or_table)
47
+ def table(text_or_table, file=nil, line=0)
48
+ if !file
49
+ location = Core::Ast::Location.of_caller
48
50
  else
49
- Ast::Table.parse(text_or_table, file, line_offset)
51
+ location = Core::Ast::Location.new(file, line)
50
52
  end
53
+ MultilineArgument::DataTable.from(text_or_table, location)
51
54
  end
52
55
 
53
- # Returns Ast::DocString for +string_without_triple_quotes+.
56
+ # Returns a Cucumber::MultilineArgument::DocString for +body+.
54
57
  #
55
- def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
56
- Ast::DocString.new(string_without_triple_quotes,content_type)
58
+ def doc_string(body, content_type='', line_offset=0)
59
+ location = Core::Ast::Location.of_caller
60
+ MultilineArgument.doc_string(body, content_type, location)
57
61
  end
58
62
  end
59
63
  end
@@ -0,0 +1,22 @@
1
+ module Cucumber
2
+ class Runtime
3
+ class StepHooks
4
+ def initialize(after)
5
+ @after = after
6
+ end
7
+
8
+ def apply(test_steps)
9
+ test_steps.flat_map do |test_step|
10
+ [test_step] + after_step_hooks(test_step)
11
+ end
12
+ end
13
+
14
+ private
15
+ def after_step_hooks(test_step)
16
+ @after.map do |action_block|
17
+ Hooks.after_step_hook(test_step.source, &action_block)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,6 +1,8 @@
1
1
  require 'cucumber/constantize'
2
- require 'cucumber/ast/multiline_argument'
3
2
  require 'cucumber/runtime/for_programming_languages'
3
+ require 'cucumber/runtime/step_hooks'
4
+ require 'cucumber/runtime/before_hooks'
5
+ require 'cucumber/runtime/after_hooks'
4
6
 
5
7
  module Cucumber
6
8
 
@@ -20,11 +22,20 @@ module Cucumber
20
22
  end
21
23
 
22
24
  def step(step)
23
- @support_code.invoke(step.name, Ast::MultilineArgument.from(step.doc_string || step.rows))
25
+ location = Core::Ast::Location.of_caller
26
+ @support_code.invoke_dynamic_step(step.name, multiline_arg(step, location))
24
27
  end
25
28
 
26
29
  def eof
27
30
  end
31
+
32
+ def multiline_arg(step, location)
33
+ if argument = step.doc_string
34
+ MultilineArgument.doc_string(argument.value, argument.content_type, location.on_line(argument.line_range))
35
+ else
36
+ MultilineArgument.from(step.rows, location)
37
+ end
38
+ end
28
39
  end
29
40
 
30
41
  include Constantize
@@ -47,20 +58,23 @@ module Cucumber
47
58
  # Given I have 8 cukes in my belly
48
59
  # Then I should not be thirsty
49
60
  # })
50
- def invoke_steps(steps_text, i18n, file_colon_line)
61
+ def invoke_dynamic_steps(steps_text, i18n, file_colon_line)
51
62
  file, line = file_colon_line.split(':')
52
63
  parser = Gherkin::Parser::Parser.new(StepInvoker.new(self), true, 'steps', false, i18n.iso_code)
53
64
  parser.parse(steps_text, file, line.to_i)
54
65
  end
55
66
 
56
- def invoke(step_name, multiline_argument=nil)
57
- multiline_argument = Cucumber::Ast::MultilineArgument.from(multiline_argument)
58
- # It is very important to leave multiline_argument=nil as a vararg. Cuke4Duke needs it that way.
67
+ # @api private
68
+ # This allows users to attempt to find, match and execute steps
69
+ # from code as the features are running, as opposed to regular
70
+ # steps which are compiled into test steps before execution.
71
+ #
72
+ # These are commonly called nested steps.
73
+ def invoke_dynamic_step(step_name, multiline_argument, location=nil)
59
74
  begin
60
75
  step_match(step_name).invoke(multiline_argument)
61
- rescue Exception => e
62
- e.nested! if Undefined === e
63
- raise e
76
+ rescue Undefined => exception
77
+ raise UndefinedDynamicStep, step_name
64
78
  end
65
79
  end
66
80
 
@@ -96,10 +110,10 @@ module Cucumber
96
110
  end.flatten
97
111
  end
98
112
 
99
- def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
113
+ def snippet_text(step_keyword, step_name, multiline_arg) #:nodoc:
100
114
  load_programming_language('rb') if unknown_programming_language?
101
115
  @programming_languages.map do |programming_language|
102
- programming_language.snippet_text(step_keyword, step_name, multiline_arg_class, @configuration.snippet_type)
116
+ programming_language.snippet_text(step_keyword, step_name, multiline_arg, @configuration.snippet_type)
103
117
  end.join("\n")
104
118
  end
105
119
 
@@ -113,22 +127,65 @@ module Cucumber
113
127
  end
114
128
  end
115
129
 
116
- def around(scenario, block)
117
- @programming_languages.reverse.inject(block) do |blk, programming_language|
118
- proc do
119
- programming_language.around(scenario) do
120
- blk.call(scenario)
121
- end
122
- end
123
- end.call
124
- end
125
-
126
130
  def step_definitions
127
131
  @programming_languages.map do |programming_language|
128
132
  programming_language.step_definitions
129
133
  end.flatten
130
134
  end
131
135
 
136
+ def find_match(test_step)
137
+ begin
138
+ match = step_match(test_step.name)
139
+ rescue Cucumber::Undefined
140
+ return NoStepMatch.new(test_step.source.last, test_step.name)
141
+ end
142
+ if @configuration.dry_run?
143
+ return SkippingStepMatch.new
144
+ end
145
+ match
146
+ end
147
+
148
+ def find_after_step_hooks(test_case)
149
+ ruby = load_programming_language('rb')
150
+ scenario = RunningTestCase.new(test_case)
151
+
152
+ action_blocks = ruby.hooks_for(:after_step, scenario).map do |hook|
153
+ ->(*args) { hook.invoke('AfterStep', args) }
154
+ end
155
+ StepHooks.new action_blocks
156
+ end
157
+
158
+ def apply_before_hooks(test_case)
159
+ ruby = load_programming_language('rb')
160
+ scenario = RunningTestCase.new(test_case)
161
+
162
+ action_blocks = ruby.hooks_for(:before, scenario).map do |hook|
163
+ ->(result) { hook.invoke('Before', scenario.with_result(result)) }
164
+ end
165
+ BeforeHooks.new(action_blocks).apply_to(test_case)
166
+ end
167
+
168
+ def apply_after_hooks(test_case)
169
+ ruby = load_programming_language('rb')
170
+ scenario = RunningTestCase.new(test_case)
171
+
172
+ action_blocks = ruby.hooks_for(:after, scenario).map do |hook|
173
+ ->(result) { hook.invoke('After', scenario.with_result(result)) }
174
+ end
175
+ AfterHooks.new(action_blocks).apply_to(test_case)
176
+ end
177
+
178
+ def find_around_hooks(test_case)
179
+ ruby = load_programming_language('rb')
180
+ scenario = RunningTestCase.new(test_case)
181
+
182
+ ruby.hooks_for(:around, scenario).map do |hook|
183
+ Hooks.around_hook(test_case.source) do |run_scenario|
184
+ hook.invoke('Around', scenario, &run_scenario)
185
+ end
186
+ end
187
+ end
188
+
132
189
  def step_match(step_name, name_to_report=nil) #:nodoc:
133
190
  @match_cache ||= {}
134
191
 
@@ -6,6 +6,10 @@ module Cucumber
6
6
  module UserInterface
7
7
  attr_writer :visitor
8
8
 
9
+ def visitor=(visitor)
10
+ @visitor = visitor
11
+ end
12
+
9
13
  # Output +messages+ alongside the formatted output.
10
14
  # This is an alternative to using Kernel#puts - it will display
11
15
  # nicer, and in all outputs (in case you use several formatters)
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'fileutils'
2
3
  require 'multi_json'
3
4
  require 'multi_test'
@@ -7,31 +8,53 @@ require 'cucumber/configuration'
7
8
  require 'cucumber/load_path'
8
9
  require 'cucumber/language_support/language_methods'
9
10
  require 'cucumber/formatter/duration'
10
- require 'cucumber/runtime/user_interface'
11
- require 'cucumber/runtime/features_loader'
12
- require 'cucumber/runtime/results'
13
- require 'cucumber/runtime/support_code'
11
+ require 'cucumber/file_specs'
12
+ require 'cucumber/filters'
13
+ require 'cucumber/formatter/fanout'
14
14
 
15
15
  module Cucumber
16
- # This is the meaty part of Cucumber that ties everything together.
16
+ module FixRuby21Bug9285
17
+ def message
18
+ String(super).gsub("@ rb_sysopen ", "")
19
+ end
20
+ end
21
+
22
+ class FileException < Exception
23
+ attr :path
24
+
25
+ def initialize(original_exception, path)
26
+ super(original_exception)
27
+ @path = path
28
+ end
29
+ end
30
+
31
+ class FileNotFoundException < FileException
32
+ end
33
+
34
+ class FeatureFolderNotFoundException < FileException
35
+ include FixRuby21Bug9285 if Cucumber::RUBY_2_1 || Cucumber::RUBY_2_2
36
+ end
37
+
38
+ require 'cucumber/core'
39
+ require 'cucumber/runtime/user_interface'
40
+ require 'cucumber/runtime/support_code'
17
41
  class Runtime
18
- attr_reader :results
42
+ attr_reader :results, :support_code, :configuration
19
43
 
44
+ include Cucumber::Core
20
45
  include Formatter::Duration
21
46
  include Runtime::UserInterface
22
47
 
23
48
  def initialize(configuration = Configuration.default)
24
- @current_scenario = nil
25
49
  @configuration = Configuration.parse(configuration)
26
50
  @support_code = SupportCode.new(self, @configuration)
27
- @results = Results.new(@configuration)
51
+ @results = Formatter::LegacyApi::Results.new
28
52
  end
29
53
 
30
- # Allows you to take an existing runtime and change it's configuration
54
+ # Allows you to take an existing runtime and change its configuration
31
55
  def configure(new_configuration)
32
56
  @configuration = Configuration.parse(new_configuration)
33
57
  @support_code.configure(@configuration)
34
- @results.configure(@configuration)
35
58
  end
36
59
 
37
60
  def load_programming_language(language)
@@ -40,21 +63,19 @@ module Cucumber
40
63
 
41
64
  def run!
42
65
  load_step_definitions
43
- disable_minitest_test_unit_autorun
44
66
  fire_after_configuration_hook
67
+ self.visitor = report
45
68
 
46
- tree_walker = @configuration.build_tree_walker(self)
47
- self.visitor = tree_walker # Ugly circular dependency, but needed to support World#puts
48
-
49
- tree_walker.visit_features(features)
69
+ receiver = Test::Runner.new(report)
70
+ compile features, receiver, filters
50
71
  end
51
72
 
52
73
  def features_paths
53
74
  @configuration.paths
54
75
  end
55
76
 
56
- def step_visited(step) #:nodoc:
57
- @results.step_visited(step)
77
+ def dry_run?
78
+ @configuration.dry_run?
58
79
  end
59
80
 
60
81
  def scenarios(status = nil)
@@ -73,110 +94,147 @@ module Cucumber
73
94
  @support_code.unmatched_step_definitions
74
95
  end
75
96
 
76
- def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
77
- @support_code.snippet_text(Gherkin::I18n.code_keyword_for(step_keyword), step_name, multiline_arg_class)
97
+ def snippet_text(step_keyword, step_name, multiline_arg) #:nodoc:
98
+ @support_code.snippet_text(::Gherkin::I18n.code_keyword_for(step_keyword), step_name, multiline_arg)
78
99
  end
79
100
 
80
- def with_hooks(scenario, skip_hooks=false)
81
- around(scenario, skip_hooks) do
82
- before_and_after(scenario, skip_hooks) do
83
- yield scenario
84
- end
85
- end
101
+ def begin_scenario(scenario)
102
+ @support_code.fire_hook(:begin_scenario, scenario)
86
103
  end
87
104
 
88
- def around(scenario, skip_hooks=false, &block) #:nodoc:
89
- if skip_hooks
90
- yield
91
- return
92
- end
105
+ def end_scenario(scenario)
106
+ @support_code.fire_hook(:end_scenario)
107
+ end
93
108
 
94
- @support_code.around(scenario, block)
109
+ def unknown_programming_language?
110
+ @support_code.unknown_programming_language?
95
111
  end
96
112
 
97
- def before_and_after(scenario, skip_hooks=false) #:nodoc:
98
- before(scenario) unless skip_hooks
99
- yield scenario
100
- after(scenario) unless skip_hooks
101
- @results.scenario_visited(scenario)
113
+ # Returns Ast::DocString for +string_without_triple_quotes+.
114
+ #
115
+ def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
116
+ location = Core::Ast::Location.of_caller
117
+ Core::Ast::DocString.new(string_without_triple_quotes, content_type, location)
102
118
  end
103
119
 
104
- def before(scenario) #:nodoc:
105
- return if @configuration.dry_run? || @current_scenario
106
- @current_scenario = scenario
107
- @support_code.fire_hook(:before, scenario)
120
+ private
121
+
122
+ def fire_after_configuration_hook #:nodoc
123
+ @support_code.fire_hook(:after_configuration, @configuration)
108
124
  end
109
125
 
110
- def after(scenario) #:nodoc:
111
- @current_scenario = nil
112
- return if @configuration.dry_run?
113
- @support_code.fire_hook(:after, scenario)
126
+ require 'cucumber/core/gherkin/document'
127
+ def features
128
+ @features ||= feature_files.map do |path|
129
+ source = NormalisedEncodingFile.read(path)
130
+ Cucumber::Core::Gherkin::Document.new(path, source)
131
+ end
114
132
  end
115
133
 
116
- def after_step #:nodoc:
117
- return if @configuration.dry_run?
118
- @support_code.fire_hook(:execute_after_step, @current_scenario)
134
+ def feature_files
135
+ filespecs.files
119
136
  end
120
137
 
121
- def unknown_programming_language?
122
- @support_code.unknown_programming_language?
138
+ def filespecs
139
+ @filespecs ||= FileSpecs.new(@configuration.feature_files)
123
140
  end
124
141
 
125
- def write_stepdefs_json
126
- if(@configuration.dotcucumber)
127
- stepdefs = []
128
- @support_code.step_definitions.sort{|a,b| a.to_hash['source'] <=> a.to_hash['source']}.each do |stepdef|
129
- stepdef_hash = stepdef.to_hash
130
- steps = []
131
- features.each do |feature|
132
- feature.feature_elements.each do |feature_element|
133
- feature_element.raw_steps.each do |step|
134
- args = stepdef.arguments_from(step.name)
135
- if(args)
136
- steps << {
137
- 'name' => step.name,
138
- 'args' => args.map do |arg|
139
- {
140
- 'offset' => arg.offset,
141
- 'val' => arg.val
142
- }
143
- end
144
- }
145
- end
146
- end
147
- end
148
- end
149
- stepdef_hash['file_colon_line'] = stepdef.file_colon_line
150
- stepdef_hash['steps'] = steps.uniq.sort {|a,b| a['name'] <=> b['name']}
151
- stepdefs << stepdef_hash
152
- end
153
- if !File.directory?(@configuration.dotcucumber)
154
- FileUtils.mkdir_p(@configuration.dotcucumber)
142
+ class NormalisedEncodingFile
143
+ COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/ #:nodoc:
144
+ ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/ #:nodoc:
145
+
146
+ def self.read(path)
147
+ new(path).read
148
+ end
149
+
150
+ def initialize(path)
151
+ begin
152
+ @file = File.new(path)
153
+ set_encoding
154
+ rescue Errno::EACCES => e
155
+ raise FileNotFoundException.new(e, File.expand_path(path))
156
+ rescue Errno::ENOENT => e
157
+ raise FeatureFolderNotFoundException.new(e, path)
155
158
  end
156
- File.open(File.join(@configuration.dotcucumber, 'stepdefs.json'), 'w') do |io|
157
- io.write(MultiJson.dump(stepdefs, :pretty => true))
159
+ end
160
+
161
+ def read
162
+ @file.read.encode("UTF-8")
163
+ end
164
+
165
+ private
166
+
167
+ def set_encoding
168
+ @file.each do |line|
169
+ if ENCODING_PATTERN =~ line
170
+ @file.set_encoding $1
171
+ break
172
+ end
173
+ break unless COMMENT_OR_EMPTY_LINE_PATTERN =~ line
158
174
  end
175
+ @file.rewind
159
176
  end
160
177
  end
161
178
 
162
- # Returns Ast::DocString for +string_without_triple_quotes+.
163
- #
164
- def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
165
- Ast::DocString.new(string_without_triple_quotes,content_type)
179
+ require 'cucumber/formatter/legacy_api/adapter'
180
+ require 'cucumber/formatter/legacy_api/runtime_facade'
181
+ require 'cucumber/formatter/legacy_api/results'
182
+ require 'cucumber/formatter/ignore_missing_messages'
183
+ require 'cucumber/core/report/summary'
184
+ def report
185
+ @report ||= Formatter::Fanout.new([summary_report] + formatters)
166
186
  end
167
187
 
168
- private
188
+ def summary_report
189
+ @summary_report ||= Core::Report::Summary.new
190
+ end
169
191
 
170
- def fire_after_configuration_hook #:nodoc
171
- @support_code.fire_hook(:after_configuration, @configuration)
192
+ def formatters
193
+ @formatters ||= @configuration.formatter_factories { |factory, path_or_io, options|
194
+ results = Formatter::LegacyApi::Results.new
195
+ runtime_facade = Formatter::LegacyApi::RuntimeFacade.new(results, @support_code, @configuration)
196
+ formatter = factory.new(runtime_facade, path_or_io, options)
197
+ Formatter::LegacyApi::Adapter.new(
198
+ Formatter::IgnoreMissingMessages.new(formatter),
199
+ results, @support_code, @configuration)
200
+ }
172
201
  end
173
202
 
174
- def features
175
- @loader ||= Runtime::FeaturesLoader.new(
176
- @configuration.feature_files,
177
- @configuration.filters,
178
- @configuration.tag_expression)
179
- @loader.features
203
+ def failure?
204
+ if @configuration.wip?
205
+ summary_report.test_cases.total_passed > 0
206
+ else
207
+ summary_report.test_cases.total_failed > 0 || summary_report.test_steps.total_failed > 0 ||
208
+ (@configuration.strict? && (summary_report.test_steps.total_undefined > 0 || summary_report.test_steps.total_pending > 0))
209
+ end
210
+ end
211
+ public :failure?
212
+
213
+ require 'cucumber/core/test/filters'
214
+ def filters
215
+ tag_expressions = @configuration.tag_expressions
216
+ name_regexps = @configuration.name_regexps
217
+ tag_limits = @configuration.tag_limits
218
+ [].tap do |filters|
219
+ filters << Filters::Randomizer.new(@configuration.seed) if @configuration.randomize?
220
+ filters << Filters::TagLimits.new(tag_limits) if tag_limits.any?
221
+ filters << Cucumber::Core::Test::TagFilter.new(tag_expressions)
222
+ filters << Cucumber::Core::Test::NameFilter.new(name_regexps)
223
+ filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
224
+ filters << Filters::Quit.new
225
+ filters << Filters::ActivateSteps.new(@support_code)
226
+ @configuration.filters.each do |filter|
227
+ filters << filter
228
+ end
229
+ unless configuration.dry_run?
230
+ filters << Filters::ApplyAfterStepHooks.new(@support_code)
231
+ filters << Filters::ApplyBeforeHooks.new(@support_code)
232
+ filters << Filters::ApplyAfterHooks.new(@support_code)
233
+ filters << Filters::ApplyAroundHooks.new(@support_code)
234
+ # need to do this last so it becomes the first test step
235
+ filters << Filters::PrepareWorld.new(self)
236
+ end
237
+ end
180
238
  end
181
239
 
182
240
  def load_step_definitions
@@ -184,13 +242,10 @@ module Cucumber
184
242
  @support_code.load_files!(files)
185
243
  end
186
244
 
187
- def disable_minitest_test_unit_autorun
188
- MultiTest.disable_autorun
189
- end
190
-
191
245
  def log
192
246
  Cucumber.logger
193
247
  end
248
+
194
249
  end
195
250
 
196
251
  end
@@ -1,3 +1,5 @@
1
+ require 'cucumber/multiline_argument'
2
+
1
3
  module Cucumber
2
4
  class StepMatch #:nodoc:
3
5
  attr_reader :step_definition, :step_arguments
@@ -12,16 +14,22 @@ module Cucumber
12
14
  end
13
15
 
14
16
  def args
15
- @step_arguments.map{|g| g.val}
17
+ @step_arguments.map{|g| g.val }
16
18
  end
17
19
 
18
20
  def name
19
21
  @name_to_report
20
22
  end
21
23
 
24
+ def activate(test_step)
25
+ test_step.with_action do
26
+ invoke(MultilineArgument.from_core(test_step.source.last.multiline_arg))
27
+ end
28
+ end
29
+
22
30
  def invoke(multiline_arg)
23
- all_args = args
24
- all_args << multiline_arg.to_step_definition_arg if multiline_arg
31
+ all_args = deep_clone_args
32
+ multiline_arg.append_to(all_args)
25
33
  @step_definition.invoke(all_args)
26
34
  end
27
35
 
@@ -80,6 +88,17 @@ module Cucumber
80
88
  def inspect #:nodoc:
81
89
  sprintf("#<%s:0x%x>", self.class, self.object_id)
82
90
  end
91
+
92
+ private
93
+ def deep_clone_args
94
+ Marshal.load( Marshal.dump( args ) )
95
+ end
96
+ end
97
+
98
+ class SkippingStepMatch
99
+ def activate(test_step)
100
+ return test_step.with_action { raise Core::Test::Result::Skipped.new }
101
+ end
83
102
  end
84
103
 
85
104
  class NoStepMatch #:nodoc:
@@ -110,5 +129,10 @@ module Cucumber
110
129
  def step_arguments
111
130
  []
112
131
  end
132
+
133
+ def activate(test_step)
134
+ # noop
135
+ return test_step
136
+ end
113
137
  end
114
138
  end
@@ -78,7 +78,7 @@ module Cucumber
78
78
 
79
79
 
80
80
  def self.included(klass)
81
- if version_is_greater_than_18? and klass == String
81
+ if klass == String
82
82
  ATTRIBUTES.delete(:clear)
83
83
  ATTRIBUTE_NAMES.delete(:clear)
84
84
  end
@@ -105,14 +105,6 @@ module Cucumber
105
105
  ATTRIBUTE_NAMES
106
106
  end
107
107
  extend self
108
-
109
- private
110
-
111
- def version_is_greater_than_18?
112
- version = RUBY_VERSION.split('.')
113
- version.map! &:to_i
114
- version[0] >= 1 && version[1] > 8
115
- end
116
108
  end
117
109
  end
118
110
  end