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
@@ -0,0 +1,95 @@
1
+ Feature: Tagged hooks
2
+
3
+ Background:
4
+ Given the standard step definitions
5
+ And a file named "features/support/hooks.rb" with:
6
+ """
7
+ Before('~@no-boom') do
8
+ raise 'boom'
9
+ end
10
+ """
11
+ And a file named "features/f.feature" with:
12
+ """
13
+ Feature: With and without hooks
14
+ Scenario: using hook
15
+ Given this step passes
16
+
17
+ @no-boom
18
+ Scenario: omitting hook
19
+ Given this step passes
20
+
21
+ Scenario Outline: omitting hook on specified examples
22
+ Given this step passes
23
+
24
+ Examples:
25
+ | Value |
26
+ | Irrelevant |
27
+
28
+ @no-boom
29
+ Examples:
30
+ | Value |
31
+ | Also Irrelevant |
32
+ """
33
+
34
+ Scenario: omit tagged hook
35
+ When I run `cucumber features/f.feature:2`
36
+ Then it should fail with exactly:
37
+ """
38
+ Feature: With and without hooks
39
+
40
+ Scenario: using hook # features/f.feature:2
41
+ boom (RuntimeError)
42
+ ./features/support/hooks.rb:2:in `Before'
43
+ Given this step passes # features/step_definitions/steps.rb:1
44
+
45
+ Failing Scenarios:
46
+ cucumber features/f.feature:2 # Scenario: using hook
47
+
48
+ 1 scenario (1 failed)
49
+ 1 step (1 skipped)
50
+ 0m0.012s
51
+
52
+ """
53
+
54
+ Scenario: omit tagged hook
55
+ When I run `cucumber features/f.feature:6`
56
+ Then it should pass with exactly:
57
+ """
58
+ Feature: With and without hooks
59
+
60
+ @no-boom
61
+ Scenario: omitting hook # features/f.feature:6
62
+ Given this step passes # features/step_definitions/steps.rb:1
63
+
64
+ 1 scenario (1 passed)
65
+ 1 step (1 passed)
66
+ 0m0.012s
67
+
68
+ """
69
+ Scenario: Omit example hook
70
+ When I run `cucumber features/f.feature:12`
71
+ Then it should fail with exactly:
72
+ """
73
+ Feature: With and without hooks
74
+
75
+ Scenario Outline: omitting hook on specified examples # features/f.feature:9
76
+ Given this step passes # features/f.feature:10
77
+
78
+ Examples:
79
+ | Value |
80
+ boom (RuntimeError)
81
+ ./features/support/hooks.rb:2:in `Before'
82
+ | Irrelevant |
83
+
84
+ Failing Scenarios:
85
+ cucumber features/f.feature:14 # Scenario Outline: omitting hook on specified examples, Examples (#1)
86
+
87
+ 1 scenario (1 failed)
88
+ 1 step (1 skipped)
89
+ 0m0.012s
90
+
91
+ """
92
+ Scenario:
93
+ When I run `cucumber features/f.feature:17`
94
+ Then it should pass
95
+
@@ -0,0 +1,22 @@
1
+ Given('a Gemfile with:') do |content|
2
+ path = File.expand_path(current_dir + "/Gemfile")
3
+ write_file path, content
4
+ set_env "BUNDLE_GEMFILE", path
5
+ end
6
+
7
+ Then(/^it should (pass|fail)$/) do |result|
8
+ assert_success result == 'pass'
9
+ end
10
+
11
+ Then(/^"([^"]*)" should not be required$/) do |file_name|
12
+ expect(all_output).not_to include("* #{file_name}")
13
+ end
14
+
15
+ Then(/^"([^"]*)" should be required$/) do |file_name|
16
+ expect(all_output).to include("* #{file_name}")
17
+ end
18
+
19
+ Then /^it fails before running features with:$/ do |expected|
20
+ assert_matching_output("\\A#{expected}", all_output)
21
+ assert_success(false)
22
+ end
@@ -0,0 +1,50 @@
1
+ Given /^a directory without standard Cucumber project directory structure$/ do
2
+ in_current_dir do
3
+ FileUtils.rm_rf 'features' if File.directory?('features')
4
+ end
5
+ end
6
+
7
+ Given /^a scenario with a step that looks like this:$/ do |string|
8
+ create_feature do
9
+ create_scenario { string }
10
+ end
11
+ end
12
+
13
+ Given(/^a scenario with a step that looks like this in japanese:$/) do |string|
14
+ create_feature_ja do
15
+ create_scenario_ja { string }
16
+ end
17
+ end
18
+
19
+ Given(/^the standard step definitions$/) do
20
+ write_file 'features/step_definitions/steps.rb',
21
+
22
+ <<-STEPS
23
+ Given(/^this step passes$/) { }
24
+ Given(/^this step raises an error$/) { raise 'error' }
25
+ Given(/^this step is pending$/) { pending }
26
+ Given(/^this step fails$/) { fail }
27
+ Given(/^this step is a table step$/) {|t| }
28
+ STEPS
29
+ end
30
+
31
+ Given /^a step definition that looks like this:$/ do |string|
32
+ create_step_definition { string }
33
+ end
34
+
35
+ When /^I run the feature with the (\w+) formatter$/ do |formatter|
36
+ expect(features.length).to eq 1
37
+ run_feature features.first, formatter
38
+ end
39
+
40
+ Then /^the stderr should contain a warning message$/ do
41
+ expect(all_stderr).to include("[warning]")
42
+ end
43
+
44
+ module CucumberHelper
45
+ def run_feature(filename = 'features/a_feature.feature', formatter = 'progress')
46
+ run_simple "#{Cucumber::BINARY} #{filename} --format #{formatter}", false
47
+ end
48
+ end
49
+
50
+ World(CucumberHelper)
@@ -1,24 +1,12 @@
1
1
  # encoding: iso-8859-1
2
2
  # Ideally we would use Norwegian keywords here, but that won't work unless this file is UTF-8 encoded.
3
3
  # Alternatively it would be possible to use Norwegian keywords and encode the file as UTF-8.
4
- #
4
+ #
5
5
  # In both cases, stepdef arguments will be sent in as UTF-8, regardless of what encoding is used.
6
6
  Given /^jeg drikker en "([^"]*)"$/ do |drink|
7
- drink.should == utf8('�l', 'iso-8859-1')
7
+ expect(drink).to eq '�l'.encode('UTF-8')
8
8
  end
9
9
 
10
10
  When /^skal de andre si "([^"]*)"$/ do |greeting|
11
- greeting.should == utf8('sk�l', 'iso-8859-1')
11
+ expect(greeting).to eq 'sk�l'.encode('UTF-8')
12
12
  end
13
-
14
- module EncodingHelper
15
- def utf8(string, encoding)
16
- if string.respond_to?(:encode) # Ruby 1.9
17
- string.encode('UTF-8')
18
- else # Ruby 1.8
19
- require 'iconv'
20
- Iconv.new('UTF-8', encoding).iconv(string)
21
- end
22
- end
23
- end
24
- World(EncodingHelper)
@@ -0,0 +1,7 @@
1
+ Then /^it should (pass|fail) with JSON:$/ do |pass_fail, json|
2
+ actual = normalise_json(MultiJson.load(all_stdout))
3
+ expected = MultiJson.load(json)
4
+
5
+ expect(actual).to eq expected
6
+ assert_success(pass_fail == 'pass')
7
+ end
@@ -0,0 +1,13 @@
1
+ Then(/^the junit output file "(.*?)" should contain:$/) do |actual_file, text|
2
+ actual = IO.read(current_dir + '/' + actual_file)
3
+ actual = replace_junit_time(actual)
4
+ expect(actual).to eq text.to_s
5
+ end
6
+
7
+ module JUnitHelper
8
+ def replace_junit_time(s)
9
+ s.gsub(/\d+\.\d\d+/m, '0.05')
10
+ end
11
+ end
12
+
13
+ World(JUnitHelper)
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  Then(/^cucumber lists all the supported languages$/) do
4
- all_output.should include("Arabic")
5
- all_output.should include("български")
6
- all_output.should include("Pirate")
7
- all_output.should include("English")
8
- all_output.should include("日本語")
4
+ sample_languages = ["Arabic", "български", "Pirate", "English", "日本語"]
5
+ sample_languages.each do |language|
6
+ expect(all_output.force_encoding('utf-8')).to include(language)
7
+ end
9
8
  end
@@ -0,0 +1,15 @@
1
+ Given /^the following profiles? (?:are|is) defined:$/ do |profiles|
2
+ write_file 'cucumber.yml', profiles
3
+ end
4
+
5
+ Then /^the (.*) profile should be used$/ do |profile|
6
+ step 'the stdout should contain:', profile
7
+ end
8
+
9
+ Then /^exactly these files should be loaded:\s*(.*)$/ do |files|
10
+ expect(all_stdout.scan(/^ \* (.*\.rb)$/).flatten).to eq files.split(/,\s+/)
11
+ end
12
+
13
+ Then /^exactly these features should be ran:\s*(.*)$/ do |files|
14
+ expect(all_stdout.scan(/^ \* (.*\.feature)$/).flatten).to eq files.split(/,\s+/)
15
+ end
@@ -0,0 +1,3 @@
1
+ When(/^I run the following Ruby code:$/) do |code|
2
+ run_simple %{ruby -e "#{code}"}
3
+ end
@@ -0,0 +1,58 @@
1
+ Given /^there is a wire server (running |)on port (\d+) which understands the following protocol:$/ do |running, port, table|
2
+ protocol = table.hashes.map do |table_hash|
3
+ table_hash['response'] = table_hash['response'].gsub(/\n/, '\n')
4
+ table_hash
5
+ end
6
+
7
+ @server = FakeWireServer.new(port.to_i, protocol)
8
+ start_wire_server if running.strip == "running"
9
+ end
10
+
11
+ Given /^the wire server takes (.*) seconds to respond to the invoke message$/ do |timeout|
12
+ @server.delay_response(:invoke, timeout.to_f)
13
+ start_wire_server
14
+ end
15
+
16
+ Given /^I have environment variable (\w+) set to "([^"]*)"$/ do |variable, value|
17
+ set_env(variable, value)
18
+ end
19
+
20
+ Then(/^the wire server should have received the following messages:$/) do |expected_messages|
21
+ expect(messages_received).to eq expected_messages.raw.flatten
22
+ end
23
+
24
+ module WireHelper
25
+ attr_reader :messages_received
26
+
27
+ def start_wire_server
28
+ @messages_received = []
29
+ reader, writer = IO.pipe
30
+ @wire_pid = fork {
31
+ reader.close
32
+ @server.run(writer)
33
+ }
34
+ writer.close
35
+ Thread.new do
36
+ while message = reader.gets
37
+ @messages_received << message.strip
38
+ end
39
+ end
40
+ at_exit { stop_wire_server }
41
+ end
42
+
43
+ def stop_wire_server
44
+ return unless @wire_pid
45
+ Process.kill('KILL', @wire_pid)
46
+ Process.wait(@wire_pid)
47
+ rescue Errno::ESRCH
48
+ # No such process - wire server has already been stopped by the After hook
49
+ end
50
+ end
51
+
52
+ Before('@wire') do
53
+ extend(WireHelper)
54
+ end
55
+
56
+ After('@wire') do
57
+ stop_wire_server
58
+ end
@@ -0,0 +1,21 @@
1
+ require 'aruba/cucumber'
2
+ require 'aruba/in_process'
3
+ require 'aruba/spawn_process'
4
+ require 'cucumber/cli/main'
5
+
6
+ Before('@spawn') do
7
+ Aruba.process = Aruba::SpawnProcess
8
+ end
9
+
10
+ Before('~@spawn') do
11
+ Aruba::InProcess.main_class = Cucumber::Cli::Main
12
+ Aruba.process = Aruba::InProcess
13
+ end
14
+
15
+ Before do
16
+ # Make sure bin/cucumber runs with SimpleCov enabled
17
+ # set_env('SIMPLECOV', 'true')
18
+
19
+ # Set a longer timeout for aruba, and a really long one if running on JRuby
20
+ @aruba_timeout_seconds = Cucumber::JRUBY ? 35 : 15
21
+ end
@@ -7,9 +7,9 @@ class FakeWireServer
7
7
  @delays = {}
8
8
  end
9
9
 
10
- def run
10
+ def run(io)
11
11
  @server = TCPServer.open(@port)
12
- loop { handle_connections }
12
+ loop { handle_connections(io) }
13
13
  end
14
14
 
15
15
  def delay_response(message, delay)
@@ -18,13 +18,14 @@ class FakeWireServer
18
18
 
19
19
  private
20
20
 
21
- def handle_connections
22
- Thread.start(@server.accept) { |socket| open_session_on socket }
21
+ def handle_connections(io)
22
+ Thread.start(@server.accept) { |socket| open_session_on socket, io }
23
23
  end
24
24
 
25
- def open_session_on(socket)
25
+ def open_session_on(socket, io)
26
26
  begin
27
- SocketSession.new(socket, @protocol_table, @delays).start
27
+ on_message = lambda { |message| io.puts message }
28
+ SocketSession.new(socket, @protocol_table, @delays, on_message).start
28
29
  rescue Exception => e
29
30
  raise e
30
31
  ensure
@@ -33,10 +34,11 @@ class FakeWireServer
33
34
  end
34
35
 
35
36
  class SocketSession
36
- def initialize(socket, protocol, delays)
37
+ def initialize(socket, protocol, delays, on_message)
37
38
  @socket = socket
38
39
  @protocol = protocol
39
40
  @delays = delays
41
+ @on_message = on_message
40
42
  end
41
43
 
42
44
  def start
@@ -50,6 +52,7 @@ class FakeWireServer
50
52
  def handle(data)
51
53
  if protocol_entry = response_to(data.strip)
52
54
  sleep delay(data)
55
+ @on_message.call(MultiJson.load(protocol_entry['request'])[0])
53
56
  send_response(protocol_entry['response'])
54
57
  else
55
58
  serialized_exception = { :message => "Not understood: #{data}", :backtrace => [] }
@@ -50,7 +50,7 @@ Feature: #{name}
50
50
  end
51
51
 
52
52
  def generate_step_definition_filename
53
- "features/step_definitions/test_steps#{next_increment(:step_defs)}.rb"
53
+ "features/step_definitions/steps#{next_increment(:step_defs)}.rb"
54
54
  end
55
55
 
56
56
  def filename(name)
@@ -0,0 +1,33 @@
1
+ # override aruba to filter out some stuff
2
+ module NormaliseArubaOutput
3
+ def all_stdout
4
+ normalise_output(super)
5
+ end
6
+
7
+ def normalise_output(out)
8
+ out = out.gsub(/#{Dir.pwd}\/tmp\/aruba/, '.') # Remove absolute paths
9
+ out = out.gsub(/tmp\/aruba\//, '') # Fix aruba path
10
+ out = out.gsub(/^.*cucumber_process\.rb.*$\n/, '')
11
+ out = out.gsub(/^\d+m\d+\.\d+s$/, '0m0.012s') # Make duration predictable
12
+ out = out.gsub(/Coverage report generated .+$\n/, '') # Remove SimpleCov message
13
+ end
14
+
15
+ def normalise_json(json)
16
+ #make sure duration was captured (should be >= 0)
17
+ #then set it to what is "expected" since duration is dynamic
18
+ json.each do |feature|
19
+ elements = feature.fetch('elements') { [] }
20
+ elements.each do |scenario|
21
+ scenario['steps'].each do |step|
22
+ if step['result']
23
+ expect(step['result']['duration']).to be >= 0
24
+ step['result']['duration'] = 1
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ World(NormaliseArubaOutput)
33
+
@@ -0,0 +1,5 @@
1
+ desc 'Run all tests and collect code coverage'
2
+ task :cov do
3
+ ENV['SIMPLECOV'] = 'features'
4
+ Rake::Task['default'].invoke
5
+ end
@@ -7,12 +7,12 @@ class Cucumber::Rake::Task
7
7
  Cucumber::WINDOWS ? 'jruby_win' : 'jruby'
8
8
  elsif Cucumber::WINDOWS_MRI
9
9
  'windows_mri'
10
- elsif Cucumber::RUBY_1_8_7
11
- 'ruby_1_8_7'
12
10
  elsif Cucumber::RUBY_1_9
13
11
  'ruby_1_9'
14
12
  elsif Cucumber::RUBY_2_0
15
13
  'ruby_2_0'
14
+ elsif Cucumber::RUBY_2_1
15
+ 'ruby_2_1'
16
16
  end
17
17
  end
18
18
  end
@@ -22,9 +22,4 @@ Cucumber::Rake::Task.new(:features) do |t|
22
22
  t.set_profile_for_current_ruby
23
23
  end
24
24
 
25
- Cucumber::Rake::Task.new(:legacy_features) do |t|
26
- t.fork = true
27
- t.profile = :legacy
28
- end
29
-
30
- task :cucumber => [:features, :legacy_features]
25
+ task :cucumber => :features
data/gem_tasks/rspec.rake CHANGED
@@ -2,7 +2,5 @@ require 'rspec/core/rake_task'
2
2
 
3
3
  desc "Run RSpec"
4
4
  RSpec::Core::RakeTask.new do |t|
5
- t.rcov = ENV['RCOV']
6
- t.rcov_opts = %w{--exclude osx\/objc,gems\/,spec\/}
7
5
  t.verbose = true
8
6
  end
data/lib/cucumber/ast.rb CHANGED
@@ -1,30 +1,13 @@
1
- require 'cucumber/ast/comment'
2
- require 'cucumber/ast/features'
3
- require 'cucumber/ast/feature'
4
- require 'cucumber/ast/background'
5
- require 'cucumber/ast/scenario'
6
- require 'cucumber/ast/scenario_outline'
7
- require 'cucumber/ast/step_invocation'
8
- require 'cucumber/ast/step_collection'
9
- require 'cucumber/ast/step'
10
- require 'cucumber/ast/table'
11
- require 'cucumber/ast/tags'
12
- require 'cucumber/ast/doc_string'
13
- require 'cucumber/ast/outline_table'
14
- require 'cucumber/ast/examples'
15
- require 'cucumber/ast/visitor'
16
- require 'cucumber/ast/tree_walker'
1
+ require 'cucumber/multiline_argument'
17
2
 
18
3
  module Cucumber
19
- # Classes in this module represent the Abstract Syntax Tree (AST)
20
- # that gets built when feature files are parsed.
21
- #
22
- # AST classes don't expose any internal data directly. This is
23
- # in order to encourage a less coupled design in the classes
24
- # that operate on the AST. The only public method is #accept.
25
- #
26
- # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
27
- # for an example.
28
4
  module Ast
5
+ def self.const_missing(const_name)
6
+ if const_name == :Table
7
+ warn "`Cucumber::Ast::Table` has been deprecated. Use `Cucumber::MultilineArgument::DataTable` instead."
8
+ return Cucumber::MultilineArgument::DataTable
9
+ end
10
+ raise "`Cucumber::Ast` no longer exists. These classes have moved into the `Cucumber::Core::Ast` namespace, but may not have the same API."
11
+ end
29
12
  end
30
13
  end
@@ -25,10 +25,8 @@ module Cucumber
25
25
  @options.parse!(args)
26
26
  arrange_formats
27
27
  raise("You can't use both --strict and --wip") if strict? && wip?
28
-
28
+ # todo: remove
29
29
  @options[:tag_expression] = Gherkin::TagExpression.new(@options[:tag_expressions])
30
- return @args.replace(@options.expanded_args_without_drb) if drb?
31
-
32
30
  set_environment_variables
33
31
  end
34
32
 
@@ -36,6 +34,14 @@ module Cucumber
36
34
  @options[:verbose]
37
35
  end
38
36
 
37
+ def randomize?
38
+ @options[:order] == 'random'
39
+ end
40
+
41
+ def seed
42
+ Integer(@options[:seed] || rand(0xFFFF))
43
+ end
44
+
39
45
  def strict?
40
46
  @options[:strict]
41
47
  end
@@ -48,14 +54,6 @@ module Cucumber
48
54
  @options[:guess]
49
55
  end
50
56
 
51
- def drb?
52
- @options[:drb]
53
- end
54
-
55
- def drb_port
56
- @options[:drb_port].to_i if @options[:drb_port]
57
- end
58
-
59
57
  def dry_run?
60
58
  @options[:dry_run]
61
59
  end
@@ -64,18 +62,10 @@ module Cucumber
64
62
  @options[:expand]
65
63
  end
66
64
 
67
- def dotcucumber
68
- @options[:dotcucumber]
69
- end
70
-
71
65
  def snippet_type
72
66
  @options[:snippet_type] || :regexp
73
67
  end
74
68
 
75
- def build_tree_walker(runtime)
76
- Ast::TreeWalker.new(runtime, formatters(runtime), self)
77
- end
78
-
79
69
  def formatter_class(format)
80
70
  if(builtin = Options::BUILTIN_FORMATS[format])
81
71
  constantize(builtin[0])
@@ -117,7 +107,7 @@ module Cucumber
117
107
  Dir["#{path}/**/*.feature"].sort
118
108
  elsif path[0..0] == '@' and # @listfile.txt
119
109
  File.file?(path[1..-1]) # listfile.txt is a file
120
- IO.read(path[1..-1]).split
110
+ IO.read(path[1..-1]).split(/(.*?\.feature.*?) /).collect(&:strip).reject(&:empty?)
121
111
  else
122
112
  path
123
113
  end
@@ -140,10 +130,23 @@ module Cucumber
140
130
  logger
141
131
  end
142
132
 
133
+ # todo: remove
143
134
  def tag_expression
144
135
  Gherkin::TagExpression.new(@options[:tag_expressions])
145
136
  end
146
137
 
138
+ def tag_limits
139
+ tag_expression.limits.to_hash
140
+ end
141
+
142
+ def tag_expressions
143
+ @options[:tag_expressions]
144
+ end
145
+
146
+ def name_regexps
147
+ @options[:name_regexps]
148
+ end
149
+
147
150
  def filters
148
151
  @options.filters
149
152
  end
@@ -160,27 +163,14 @@ module Cucumber
160
163
  def paths
161
164
  @options[:paths]
162
165
  end
163
- private
164
- def with_default_features_path(paths)
165
- return ['features'] if paths.empty?
166
- paths
167
- end
168
-
169
-
170
- def formatters(runtime)
171
- # TODO: We should remove the autoformat functionality. That
172
- # can be done with the gherkin CLI.
173
- if @options[:autoformat]
174
- require 'cucumber/formatter/pretty'
175
- return [Formatter::Pretty.new(runtime, out_stream, @options)]
176
- end
177
166
 
167
+ def formatter_factories
178
168
  @options[:formats].map do |format_and_out|
179
169
  format = format_and_out[0]
180
170
  path_or_io = format_and_out[1]
181
171
  begin
182
- formatter_class = formatter_class(format)
183
- formatter_class.new(runtime, path_or_io, @options)
172
+ factory = formatter_class(format)
173
+ yield factory, path_or_io, @options
184
174
  rescue Exception => e
185
175
  e.message << "\nError creating formatter: #{format}"
186
176
  raise e
@@ -188,13 +178,19 @@ module Cucumber
188
178
  end
189
179
  end
190
180
 
181
+ private
182
+
183
+ def with_default_features_path(paths)
184
+ return ['features'] if paths.empty?
185
+ paths
186
+ end
187
+
191
188
  class LogFormatter < ::Logger::Formatter
192
189
  def call(severity, time, progname, msg)
193
190
  msg
194
191
  end
195
192
  end
196
193
 
197
-
198
194
  def set_environment_variables
199
195
  @options[:env_vars].each do |var, value|
200
196
  ENV[var] = value