cucumber 3.0.0.pre.1 → 3.0.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.rubocop.yml +13 -0
  4. data/.rubocop_todo.yml +1075 -0
  5. data/.travis.yml +42 -8
  6. data/CONTRIBUTING.md +8 -1
  7. data/Gemfile +16 -10
  8. data/History.md +96 -36
  9. data/README.md +12 -3
  10. data/Rakefile +12 -2
  11. data/appveyor.yml +26 -0
  12. data/cucumber.gemspec +15 -10
  13. data/cucumber.yml +9 -10
  14. data/examples/i18n/Rakefile +1 -1
  15. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +2 -2
  16. data/examples/i18n/ar/lib/calculator.rb +2 -2
  17. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  18. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +4 -4
  19. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  20. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +4 -4
  21. data/examples/i18n/cs/lib/calculator.rb +3 -3
  22. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +4 -4
  23. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  24. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +4 -4
  25. data/examples/i18n/de/lib/calculator.rb +2 -2
  26. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +5 -5
  27. data/examples/i18n/el/lib/calculator.rb +2 -2
  28. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  29. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  30. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  31. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +4 -4
  32. data/examples/i18n/en/lib/calculator.rb +2 -2
  33. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +4 -4
  34. data/examples/i18n/eo/lib/calculator.rb +2 -2
  35. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +5 -5
  36. data/examples/i18n/es/lib/calculador.rb +2 -2
  37. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +4 -4
  38. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  39. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +3 -3
  40. data/examples/i18n/fi/lib/laskin.rb +1 -1
  41. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  42. data/examples/i18n/fr/features/support/env.rb +1 -1
  43. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  44. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +4 -4
  45. data/examples/i18n/he/lib/calculator.rb +1 -1
  46. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +3 -3
  47. data/examples/i18n/hi/lib/calculator.rb +1 -1
  48. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +4 -4
  49. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  50. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +4 -4
  51. data/examples/i18n/hu/lib/calculator.rb +1 -1
  52. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +4 -4
  53. data/examples/i18n/id/lib/calculator.rb +2 -2
  54. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +4 -4
  55. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  56. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  57. data/examples/i18n/ja/features/support/env.rb +1 -1
  58. data/examples/i18n/ja/lib/calculator.rb +2 -2
  59. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +4 -4
  60. data/examples/i18n/ko/lib/calculator.rb +2 -2
  61. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +4 -4
  62. data/examples/i18n/lt/lib/calculator.rb +2 -2
  63. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +4 -4
  64. data/examples/i18n/lv/lib/calculator.rb +2 -2
  65. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  66. data/examples/i18n/no/features/support/env.rb +1 -1
  67. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  68. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +4 -4
  69. data/examples/i18n/pl/lib/calculator.rb +2 -2
  70. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  71. data/examples/i18n/pt/features/support/env.rb +1 -1
  72. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  73. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +5 -5
  74. data/examples/i18n/ro/lib/calculator.rb +1 -1
  75. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  76. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +4 -4
  77. data/examples/i18n/sk/lib/calculator.rb +2 -2
  78. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  79. data/examples/i18n/sr-Cyrl/features/support/env.rb +1 -1
  80. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  81. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +4 -4
  82. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  83. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +3 -3
  84. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  85. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +4 -4
  86. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  87. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  88. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  89. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +5 -5
  90. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  91. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +4 -4
  92. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  93. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  94. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  95. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  96. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  97. data/examples/watir/features/step_definitions/search_steps.rb +3 -3
  98. data/examples/watir/features/support/screenshots.rb +5 -5
  99. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  100. data/features/docs/api/listen_for_events.feature +1 -1
  101. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  102. data/features/docs/cli/dry_run.feature +3 -0
  103. data/features/docs/cli/execute_with_tag_filter.feature +4 -4
  104. data/features/docs/cli/fail_fast.feature +2 -0
  105. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  106. data/features/docs/cli/randomize.feature +2 -2
  107. data/features/docs/cli/retry_failing_tests.feature +28 -3
  108. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  109. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  110. data/features/docs/cli/strict_mode.feature +6 -0
  111. data/features/docs/defining_steps/nested_steps.feature +5 -1
  112. data/features/docs/defining_steps/nested_steps_i18n.feature +1 -0
  113. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  114. data/features/docs/defining_steps/printing_messages.feature +1 -1
  115. data/features/docs/defining_steps/skip_scenario.feature +1 -0
  116. data/features/docs/defining_steps/snippets.feature +18 -18
  117. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  118. data/features/docs/events/step_activated_event.feature +36 -0
  119. data/features/docs/events/step_definition_registered_event.feature +29 -0
  120. data/features/docs/events/test_case_finished_event.feature +35 -0
  121. data/features/docs/events/test_case_starting_event.feature +54 -0
  122. data/features/docs/events/test_run_finished_event.feature +40 -0
  123. data/features/docs/events/test_run_starting_event.feature +41 -0
  124. data/features/docs/events/test_step_finished_event.feature +47 -0
  125. data/features/docs/events/test_step_starting_event.feature +43 -0
  126. data/features/docs/exception_in_after_hook.feature +3 -2
  127. data/features/docs/exception_in_after_step_hook.feature +2 -0
  128. data/features/docs/exception_in_around_hook.feature +2 -0
  129. data/features/docs/exception_in_before_hook.feature +3 -1
  130. data/features/docs/extending_cucumber/custom_formatter.feature +21 -1
  131. data/features/docs/formatters/json_formatter.feature +4 -4
  132. data/features/docs/formatters/junit_formatter.feature +7 -6
  133. data/features/docs/formatters/pretty_formatter.feature +1 -0
  134. data/features/docs/formatters/progress_formatter.feature +1 -0
  135. data/features/docs/formatters/rerun_formatter.feature +2 -0
  136. data/features/docs/formatters/summary_formatter.feature +1 -0
  137. data/features/docs/formatters/usage_formatter.feature +3 -0
  138. data/features/docs/getting_started.feature +2 -1
  139. data/features/docs/gherkin/background.feature +5 -5
  140. data/features/docs/gherkin/doc_strings.feature +2 -0
  141. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  142. data/features/docs/gherkin/outlines.feature +4 -0
  143. data/features/docs/gherkin/unicode_table.feature +1 -0
  144. data/features/docs/gherkin/using_descriptions.feature +1 -0
  145. data/features/docs/gherkin/using_star_notation.feature +1 -1
  146. data/features/docs/post_configuration_hook.feature +1 -1
  147. data/features/docs/rake_task.feature +5 -0
  148. data/features/docs/raketask.feature +3 -1
  149. data/features/docs/work_in_progress.feature +5 -2
  150. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  151. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  152. data/features/docs/writing_support_code/before_hook.feature +1 -0
  153. data/features/docs/writing_support_code/hook_order.feature +3 -1
  154. data/features/docs/writing_support_code/parameter_types.feature +75 -0
  155. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  156. data/features/lib/step_definitions/aruba_steps.rb +4 -10
  157. data/features/lib/step_definitions/cli_steps.rb +2 -2
  158. data/features/lib/step_definitions/cucumber_steps.rb +8 -12
  159. data/features/lib/step_definitions/iso-8859-1_steps.rb +2 -2
  160. data/features/lib/step_definitions/json_steps.rb +1 -1
  161. data/features/lib/step_definitions/junit_steps.rb +1 -1
  162. data/features/lib/step_definitions/language_steps.rb +2 -2
  163. data/features/lib/step_definitions/profile_steps.rb +6 -6
  164. data/features/lib/step_definitions/retry_steps.rb +3 -3
  165. data/features/lib/step_definitions/ruby_steps.rb +1 -1
  166. data/features/lib/support/env.rb +1 -1
  167. data/features/lib/support/fake_wire_server.rb +7 -2
  168. data/features/lib/support/feature_factory.rb +1 -1
  169. data/features/lib/support/normalise_output.rb +13 -12
  170. data/features/lib/support/parameter_types.rb +8 -0
  171. data/gem_tasks/contributors.rake +9 -6
  172. data/gem_tasks/environment.rake +1 -5
  173. data/gem_tasks/examples.rake +1 -1
  174. data/gem_tasks/fix_cr_lf.rake +1 -1
  175. data/gem_tasks/flog.rake +2 -2
  176. data/gem_tasks/rspec.rake +1 -1
  177. data/lib/autotest/cucumber_mixin.rb +15 -15
  178. data/lib/autotest/discover.rb +2 -2
  179. data/lib/cucumber/cli/configuration.rb +7 -13
  180. data/lib/cucumber/cli/main.rb +6 -6
  181. data/lib/cucumber/cli/options.rb +163 -126
  182. data/lib/cucumber/cli/profile_loader.rb +24 -20
  183. data/lib/cucumber/configuration.rb +12 -17
  184. data/lib/cucumber/constantize.rb +1 -1
  185. data/lib/cucumber/core_ext/string.rb +1 -1
  186. data/lib/cucumber/deprecate.rb +1 -1
  187. data/lib/cucumber/events.rb +11 -1
  188. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  189. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +2 -2
  190. data/lib/cucumber/events/step_definition_registered.rb +1 -1
  191. data/lib/cucumber/events/test_case_finished.rb +18 -0
  192. data/lib/cucumber/events/test_case_starting.rb +15 -0
  193. data/lib/cucumber/events/test_run_starting.rb +16 -0
  194. data/lib/cucumber/events/test_step_finished.rb +20 -0
  195. data/lib/cucumber/events/test_step_starting.rb +17 -0
  196. data/lib/cucumber/filters.rb +1 -0
  197. data/lib/cucumber/filters/activate_steps.rb +1 -1
  198. data/lib/cucumber/filters/broadcast_test_run_starting_event.rb +27 -0
  199. data/lib/cucumber/filters/retry.rb +1 -1
  200. data/lib/cucumber/filters/tag_limits.rb +3 -3
  201. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -1
  202. data/lib/cucumber/formatter/ansicolor.rb +8 -11
  203. data/lib/cucumber/formatter/backtrace_filter.rb +19 -7
  204. data/lib/cucumber/formatter/console.rb +16 -19
  205. data/lib/cucumber/formatter/console_counts.rb +8 -21
  206. data/lib/cucumber/formatter/console_issues.rb +30 -9
  207. data/lib/cucumber/formatter/duration.rb +1 -1
  208. data/lib/cucumber/formatter/fail_fast.rb +1 -1
  209. data/lib/cucumber/formatter/html.rb +168 -242
  210. data/lib/cucumber/formatter/html_builder.rb +110 -0
  211. data/lib/cucumber/formatter/inline-js.js +30 -0
  212. data/lib/cucumber/formatter/interceptor.rb +2 -2
  213. data/lib/cucumber/formatter/json.rb +12 -12
  214. data/lib/cucumber/formatter/junit.rb +11 -11
  215. data/lib/cucumber/formatter/legacy_api/adapter.rb +27 -27
  216. data/lib/cucumber/formatter/legacy_api/ast.rb +16 -20
  217. data/lib/cucumber/formatter/legacy_api/results.rb +6 -8
  218. data/lib/cucumber/formatter/pretty.rb +17 -17
  219. data/lib/cucumber/formatter/progress.rb +11 -12
  220. data/lib/cucumber/formatter/rerun.rb +1 -1
  221. data/lib/cucumber/formatter/steps.rb +1 -1
  222. data/lib/cucumber/formatter/unicode.rb +1 -1
  223. data/lib/cucumber/formatter/usage.rb +12 -12
  224. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +1 -1
  225. data/lib/cucumber/gherkin/formatter/escaping.rb +1 -1
  226. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +44 -17
  227. data/lib/cucumber/glue/hook.rb +43 -0
  228. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  229. data/lib/cucumber/glue/proto_world.rb +225 -0
  230. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +45 -86
  231. data/lib/cucumber/{rb_support → glue}/snippet.rb +62 -25
  232. data/lib/cucumber/glue/step_definition.rb +143 -0
  233. data/lib/cucumber/glue/world_factory.rb +23 -0
  234. data/lib/cucumber/hooks.rb +4 -4
  235. data/lib/cucumber/multiline_argument.rb +2 -2
  236. data/lib/cucumber/multiline_argument/data_table.rb +40 -178
  237. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  238. data/lib/cucumber/platform.rb +3 -5
  239. data/lib/cucumber/rake/task.rb +11 -11
  240. data/lib/cucumber/rspec/disable_option_parser.rb +1 -1
  241. data/lib/cucumber/rspec/doubles.rb +1 -1
  242. data/lib/cucumber/running_test_case.rb +2 -2
  243. data/lib/cucumber/runtime.rb +46 -34
  244. data/lib/cucumber/runtime/after_hooks.rb +1 -1
  245. data/lib/cucumber/runtime/for_programming_languages.rb +1 -36
  246. data/lib/cucumber/runtime/support_code.rb +19 -15
  247. data/lib/cucumber/runtime/user_interface.rb +4 -11
  248. data/lib/cucumber/step_argument.rb +0 -2
  249. data/lib/cucumber/step_definition_light.rb +1 -0
  250. data/lib/cucumber/step_match.rb +16 -15
  251. data/lib/cucumber/step_match_search.rb +2 -3
  252. data/lib/cucumber/term/ansicolor.rb +1 -1
  253. data/lib/cucumber/version +1 -1
  254. data/lib/simplecov_setup.rb +1 -1
  255. data/scripts/invite-collaborator +40 -0
  256. data/scripts/update-history +83 -0
  257. data/spec/cucumber/cli/configuration_spec.rb +95 -97
  258. data/spec/cucumber/cli/main_spec.rb +7 -7
  259. data/spec/cucumber/cli/options_spec.rb +112 -78
  260. data/spec/cucumber/cli/profile_loader_spec.rb +24 -5
  261. data/spec/cucumber/cli/rerun_spec.rb +20 -20
  262. data/spec/cucumber/configuration_spec.rb +47 -47
  263. data/spec/cucumber/constantize_spec.rb +2 -2
  264. data/spec/cucumber/events_spec.rb +9 -0
  265. data/spec/cucumber/file_specs_spec.rb +25 -25
  266. data/spec/cucumber/filters/activate_steps_spec.rb +16 -16
  267. data/spec/cucumber/filters/gated_receiver_spec.rb +6 -6
  268. data/spec/cucumber/filters/retry_spec.rb +22 -9
  269. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +11 -11
  270. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +14 -14
  271. data/spec/cucumber/filters/tag_limits_spec.rb +8 -8
  272. data/spec/cucumber/formatter/ansicolor_spec.rb +9 -9
  273. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  274. data/spec/cucumber/formatter/console_counts_spec.rb +1 -1
  275. data/spec/cucumber/formatter/duration_spec.rb +3 -3
  276. data/spec/cucumber/formatter/fail_fast_spec.rb +21 -21
  277. data/spec/cucumber/formatter/html_spec.rb +58 -58
  278. data/spec/cucumber/formatter/json_spec.rb +44 -46
  279. data/spec/cucumber/formatter/junit_spec.rb +43 -45
  280. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +43 -43
  281. data/spec/cucumber/formatter/pretty_spec.rb +107 -107
  282. data/spec/cucumber/formatter/progress_spec.rb +20 -20
  283. data/spec/cucumber/formatter/rerun_spec.rb +1 -1
  284. data/spec/cucumber/formatter/spec_helper.rb +6 -5
  285. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +20 -5
  286. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  287. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +61 -25
  288. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  289. data/spec/cucumber/hooks_spec.rb +3 -3
  290. data/spec/cucumber/multiline_argument/data_table_spec.rb +177 -133
  291. data/spec/cucumber/project_initializer_spec.rb +10 -10
  292. data/spec/cucumber/rake/forked_spec.rb +10 -10
  293. data/spec/cucumber/rake/task_spec.rb +20 -20
  294. data/spec/cucumber/running_test_case_spec.rb +35 -35
  295. data/spec/cucumber/runtime/for_programming_languages_spec.rb +1 -30
  296. data/spec/cucumber/runtime_spec.rb +2 -2
  297. data/spec/cucumber/step_argument_spec.rb +5 -5
  298. data/spec/cucumber/step_match_search_spec.rb +31 -41
  299. data/spec/cucumber/step_match_spec.rb +33 -33
  300. data/spec/cucumber/world/pending_spec.rb +10 -10
  301. metadata +117 -47
  302. data/features/docs/formatters/debug_formatter.feature +0 -47
  303. data/features/docs/writing_support_code/transforms.feature +0 -98
  304. data/features/lib/step_definitions/wire_steps.rb +0 -59
  305. data/gem_tasks/cucumber.rake +0 -26
  306. data/lib/cucumber/core_ext/instance_exec.rb +0 -71
  307. data/lib/cucumber/formatter/debug.rb +0 -36
  308. data/lib/cucumber/rb_support/rb_hook.rb +0 -20
  309. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -132
  310. data/lib/cucumber/rb_support/rb_transform.rb +0 -60
  311. data/lib/cucumber/rb_support/rb_world.rb +0 -171
  312. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -5
  313. data/spec/cucumber/formatter/debug_spec.rb +0 -65
  314. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -321
  315. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -200
  316. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -47
@@ -16,12 +16,12 @@ module Cucumber
16
16
  @formatter = Progress.new(actual_runtime.configuration.with_options(out_stream: @out))
17
17
  end
18
18
 
19
- describe "given a single feature" do
19
+ describe 'given a single feature' do
20
20
  before(:each) do
21
21
  run_defined_feature
22
22
  end
23
23
 
24
- describe "with a scenario" do
24
+ describe 'with a scenario' do
25
25
  define_feature <<-FEATURE
26
26
  Feature: Banana party
27
27
 
@@ -29,12 +29,12 @@ module Cucumber
29
29
  Given there are bananas
30
30
  FEATURE
31
31
 
32
- it "outputs the undefined step" do
32
+ it 'outputs the undefined step' do
33
33
  expect(@out.string).to include "U\n"
34
34
  end
35
35
  end
36
36
 
37
- describe "with a background" do
37
+ describe 'with a background' do
38
38
  define_feature <<-FEATURE
39
39
  Feature: Banana party
40
40
 
@@ -45,12 +45,12 @@ module Cucumber
45
45
  Given there are bananas
46
46
  FEATURE
47
47
 
48
- it "outputs the two undefined steps" do
48
+ it 'outputs the two undefined steps' do
49
49
  expect(@out.string).to include "UU\n"
50
50
  end
51
51
  end
52
52
 
53
- describe "with a scenario outline" do
53
+ describe 'with a scenario outline' do
54
54
  define_feature <<-FEATURE
55
55
  Feature: Fud Pyramid
56
56
 
@@ -67,23 +67,23 @@ module Cucumber
67
67
  | carrots |
68
68
  FEATURE
69
69
 
70
- it "outputs each undefined step" do
70
+ it 'outputs each undefined step' do
71
71
  expect(@out.string).to include "UUUU\n"
72
72
  end
73
73
 
74
- it "has 4 undefined scenarios" do
75
- expect(@out.string).to include "4 scenarios (4 undefined)"
74
+ it 'has 4 undefined scenarios' do
75
+ expect(@out.string).to include '4 scenarios (4 undefined)'
76
76
  end
77
77
 
78
- it "has 4 undefined steps" do
79
- expect(@out.string).to include "4 steps (4 undefined)"
78
+ it 'has 4 undefined steps' do
79
+ expect(@out.string).to include '4 steps (4 undefined)'
80
80
  end
81
81
 
82
82
  end
83
83
 
84
- describe "with hooks" do
84
+ describe 'with hooks' do
85
85
 
86
- describe "all hook passes" do
86
+ describe 'all hook passes' do
87
87
  define_feature <<-FEATURE
88
88
  Feature:
89
89
  Scenario:
@@ -100,7 +100,7 @@ module Cucumber
100
100
  Given(/^this step passes$/) {}
101
101
  end
102
102
 
103
- it "only steps generate output" do
103
+ it 'only steps generate output' do
104
104
  lines = <<-OUTPUT
105
105
  .
106
106
  1 scenario (1 passed)
@@ -112,7 +112,7 @@ module Cucumber
112
112
  end
113
113
  end
114
114
 
115
- describe "with a failing before hook" do
115
+ describe 'with a failing before hook' do
116
116
  define_feature <<-FEATURE
117
117
  Feature:
118
118
  Scenario:
@@ -121,12 +121,12 @@ module Cucumber
121
121
 
122
122
  define_steps do
123
123
  Before do
124
- fail "hook failed"
124
+ fail 'hook failed'
125
125
  end
126
126
  Given(/^this step passes$/) {}
127
127
  end
128
128
 
129
- it "the failing hook generate output" do
129
+ it 'the failing hook generate output' do
130
130
  lines = <<-OUTPUT
131
131
  F-
132
132
  1 scenario (1 failed)
@@ -138,7 +138,7 @@ module Cucumber
138
138
  end
139
139
  end
140
140
 
141
- describe "with a failing after hook" do
141
+ describe 'with a failing after hook' do
142
142
  define_feature <<-FEATURE
143
143
  Feature:
144
144
  Scenario:
@@ -147,12 +147,12 @@ module Cucumber
147
147
 
148
148
  define_steps do
149
149
  After do
150
- fail "hook failed"
150
+ fail 'hook failed'
151
151
  end
152
152
  Given(/^this step passes$/) {}
153
153
  end
154
154
 
155
- it "the failing hook generate output" do
155
+ it 'the failing hook generate output' do
156
156
  lines = <<-OUTPUT
157
157
  .F
158
158
  1 scenario (1 failed)
@@ -71,7 +71,7 @@ module Cucumber
71
71
  execute [foo, bar], [StandardStepActions.new], config.event_bus
72
72
  config.event_bus.test_run_finished
73
73
 
74
- expect(io.string).to eq 'foo.feature:3:6 bar.feature:3'
74
+ expect(io.string).to eq 'foo.feature:3:6\nbar.feature:3'
75
75
  end
76
76
  end
77
77
 
@@ -25,7 +25,7 @@ module Cucumber
25
25
  receiver = Test::Runner.new(event_bus)
26
26
  filters = [
27
27
  Filters::ActivateSteps.new(
28
- StepMatchSearch.new(actual_runtime.support_code.ruby.method(:step_matches), actual_runtime.configuration),
28
+ StepMatchSearch.new(actual_runtime.support_code.registry.method(:step_matches), actual_runtime.configuration),
29
29
  actual_runtime.configuration
30
30
  ),
31
31
  Filters::ApplyAfterStepHooks.new(actual_runtime.support_code),
@@ -52,7 +52,7 @@ module Cucumber
52
52
  end
53
53
 
54
54
  def gherkin
55
- self.class.feature_content || raise("No feature content defined!")
55
+ self.class.feature_content || raise('No feature content defined!')
56
56
  end
57
57
 
58
58
  def runtime
@@ -68,10 +68,11 @@ module Cucumber
68
68
  end
69
69
 
70
70
  def define_steps
71
- return unless step_defs = self.class.step_defs
72
- rb = runtime.support_code.ruby
71
+ step_defs = self.class.step_defs
72
+
73
+ return unless step_defs
73
74
  dsl = Object.new
74
- dsl.extend RbSupport::RbDsl
75
+ dsl.extend Glue::Dsl
75
76
  dsl.instance_exec &step_defs
76
77
  end
77
78
 
@@ -4,12 +4,27 @@ require 'cucumber/formatter/spec_helper'
4
4
  require 'cucumber/formatter/pretty'
5
5
 
6
6
  module Cucumber
7
- module RbSupport
8
- describe RbWorld do
9
- extend Cucumber::Formatter::SpecHelperDsl
10
- include Cucumber::Formatter::SpecHelper
7
+ module Glue
8
+ describe ProtoWorld do
9
+
10
+ let(:runtime) { double('runtime') }
11
+ let(:language) { double('language') }
12
+ let(:world) { Object.new.extend(ProtoWorld.for(runtime, language)) }
13
+
14
+ describe '#table' do
15
+ it 'produces Ast::Table by #table' do
16
+ expect(world.table(%{
17
+ | account | description | amount |
18
+ | INT-100 | Taxi | 114 |
19
+ | CUC-101 | Peeler | 22 |
20
+ })).to be_kind_of(MultilineArgument::DataTable)
21
+ end
22
+ end
11
23
 
12
24
  describe 'Handling puts in step definitions' do
25
+ extend Cucumber::Formatter::SpecHelperDsl
26
+ include Cucumber::Formatter::SpecHelper
27
+
13
28
  before(:each) do
14
29
  Cucumber::Term::ANSIColor.coloring = false
15
30
  @out = StringIO.new
@@ -35,7 +50,7 @@ module Cucumber
35
50
  end
36
51
 
37
52
  it 'prints the variable value at the time puts was called' do
38
- expect( @out.string ).to include <<OUTPUT
53
+ expect(@out.string).to include <<OUTPUT
39
54
  When puts is called twice for the same variable
40
55
  a
41
56
  A
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'cucumber/glue/registry_and_more'
4
+
5
+ module Cucumber
6
+ module Glue
7
+ describe StepDefinition do
8
+ let(:user_interface) { double('user interface') }
9
+ let(:registry) { support_code.registry }
10
+ let(:support_code) do
11
+ Cucumber::Runtime::SupportCode.new(user_interface)
12
+ end
13
+ let(:dsl) do
14
+ registry
15
+ Object.new.extend(Glue::Dsl)
16
+ end
17
+
18
+ describe '#load_code_file' do
19
+ after do
20
+ FileUtils.rm_rf('tmp.rb')
21
+ FileUtils.rm_rf('docs.md')
22
+ end
23
+
24
+ def a_file_called(name)
25
+ File.open(name, 'w') do |f|
26
+ f.puts yield
27
+ end
28
+ end
29
+
30
+ it 're-loads the file when called multiple times' do
31
+ a_file_called('tmp.rb') do
32
+ '$foo = 1'
33
+ end
34
+
35
+ registry.load_code_file('tmp.rb')
36
+ expect($foo).to eq 1
37
+
38
+ a_file_called('tmp.rb') do
39
+ '$foo = 2'
40
+ end
41
+
42
+ registry.load_code_file('tmp.rb')
43
+
44
+ expect($foo).to eq 2
45
+ end
46
+
47
+ it 'only loads ruby files' do
48
+ a_file_called('docs.md') do
49
+ 'yo'
50
+ end
51
+ registry.load_code_file('docs.md')
52
+ end
53
+ end
54
+
55
+ describe 'Handling the World' do
56
+ it 'raises an error if the world is nil' do
57
+ dsl.World {}
58
+
59
+ begin
60
+ registry.begin_scenario(nil)
61
+ raise 'Should fail'
62
+ rescue Glue::NilWorld => e
63
+ expect(e.message).to eq 'World procs should never return nil'
64
+ expect(e.backtrace.length).to eq 1
65
+ expect(e.backtrace[0]).to match(/spec\/cucumber\/glue\/registry_and_more_spec\.rb\:\d+\:in `World'/)
66
+ end
67
+ end
68
+
69
+ module ModuleOne
70
+ end
71
+
72
+ module ModuleTwo
73
+ end
74
+
75
+ class ClassOne
76
+ end
77
+
78
+ it 'implicitlys extend world with modules' do
79
+ dsl.World(ModuleOne, ModuleTwo)
80
+ registry.begin_scenario(double('scenario').as_null_object)
81
+ class << registry.current_world
82
+ extend RSpec::Matchers
83
+
84
+ expect(included_modules.inspect).to match(/ModuleOne/) # Workaround for RSpec/Ruby 1.9 issue with namespaces
85
+ expect(included_modules.inspect).to match(/ModuleTwo/)
86
+ end
87
+ expect(registry.current_world.class).to eq Object
88
+ end
89
+
90
+ it 'raises error when we try to register more than one World proc' do
91
+ expected_error = %{You can only pass a proc to #World once, but it's happening
92
+ in 2 places:
93
+
94
+ spec/cucumber/glue/registry_and_more_spec.rb:\\d+:in `World'
95
+ spec/cucumber/glue/registry_and_more_spec.rb:\\d+:in `World'
96
+
97
+ Use Ruby modules instead to extend your worlds. See the Cucumber::Glue::Dsl#World RDoc
98
+ or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.
99
+
100
+ }
101
+ dsl.World { Hash.new }
102
+
103
+ expect(-> {
104
+ dsl.World { Array.new }
105
+ }).to raise_error(Glue::MultipleWorld, /#{expected_error}/)
106
+ end
107
+ end
108
+
109
+ describe 'Handling namespaced World' do
110
+ module ModuleOne
111
+ def method_one
112
+ 1
113
+ end
114
+ end
115
+
116
+ module ModuleMinusOne
117
+ def method_one
118
+ -1
119
+ end
120
+ end
121
+
122
+ module ModuleTwo
123
+ def method_two
124
+ 2
125
+ end
126
+ end
127
+
128
+ module ModuleThree
129
+ def method_three
130
+ 3
131
+ end
132
+ end
133
+
134
+ it 'extends the world with namespaces' do
135
+ dsl.World(ModuleOne, module_two: ModuleTwo, module_three: ModuleThree)
136
+ registry.begin_scenario(double('scenario').as_null_object)
137
+ class << registry.current_world
138
+ extend RSpec::Matchers
139
+ expect(included_modules.inspect).to match(/ModuleOne/)
140
+ end
141
+ expect(registry.current_world.class).to eq Object
142
+ expect(registry.current_world).to respond_to(:method_one)
143
+
144
+ expect(registry.current_world.module_two.class).to eq Object
145
+ expect(registry.current_world.module_two).to respond_to(:method_two)
146
+
147
+ expect(registry.current_world.module_three.class).to eq Object
148
+ expect(registry.current_world.module_three).to respond_to(:method_three)
149
+ end
150
+
151
+ it 'allows to inspect the included modules' do
152
+ dsl.World(ModuleOne, module_two: ModuleTwo, module_three: ModuleThree)
153
+ registry.begin_scenario(double('scenario').as_null_object)
154
+ class << registry.current_world
155
+ extend RSpec::Matchers
156
+ end
157
+ expect(registry.current_world.inspect).to match(/ModuleOne/)
158
+ expect(registry.current_world.inspect).to include('ModuleTwo (as module_two)')
159
+ expect(registry.current_world.inspect).to include('ModuleThree (as module_three)')
160
+ end
161
+
162
+ it 'merges methods when assigning different modules to the same namespace' do
163
+ dsl.World(namespace: ModuleOne)
164
+ dsl.World(namespace: ModuleTwo)
165
+ registry.begin_scenario(double('scenario').as_null_object)
166
+ class << registry.current_world
167
+ extend RSpec::Matchers
168
+ end
169
+ expect(registry.current_world.namespace).to respond_to(:method_one)
170
+ expect(registry.current_world.namespace).to respond_to(:method_two)
171
+ end
172
+
173
+ it 'resolves conflicts when assigning different modules to the same namespace' do
174
+ dsl.World(namespace: ModuleOne)
175
+ dsl.World(namespace: ModuleMinusOne)
176
+ registry.begin_scenario(double('scenario').as_null_object)
177
+ class << registry.current_world
178
+ extend RSpec::Matchers
179
+ end
180
+ expect(registry.current_world.namespace).to respond_to(:method_one)
181
+ expect(registry.current_world.namespace.method_one).to eql(-1)
182
+ end
183
+ end
184
+
185
+ describe 'hooks' do
186
+ it 'finds before hooks' do
187
+ fish = dsl.Before('@fish'){}
188
+ meat = dsl.Before('@meat'){}
189
+
190
+ scenario = double('Scenario')
191
+
192
+ expect(scenario).to receive(:accept_hook?).with(fish) { true }
193
+ expect(scenario).to receive(:accept_hook?).with(meat) { false }
194
+ expect(registry.hooks_for(:before, scenario)).to eq [fish]
195
+ end
196
+
197
+ it 'finds around hooks' do
198
+ a = dsl.Around do |scenario, block|
199
+ end
200
+
201
+ b = dsl.Around('@tag') do |scenario, block|
202
+ end
203
+
204
+ scenario = double('Scenario')
205
+
206
+ expect(scenario).to receive(:accept_hook?).with(a) { true }
207
+ expect(scenario).to receive(:accept_hook?).with(b) { false }
208
+ expect(registry.hooks_for(:around, scenario)).to eq [a]
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
@@ -1,19 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
  require 'spec_helper'
3
- require 'cucumber/rb_support/snippet'
3
+ require 'cucumber/cucumber_expressions/parameter_type_registry'
4
+ require 'cucumber/cucumber_expressions/parameter_type'
5
+ require 'cucumber/cucumber_expressions/cucumber_expression_generator'
6
+ require 'cucumber/glue/snippet'
4
7
 
5
8
  module Cucumber
6
- module RbSupport
9
+ module Glue
7
10
  describe Snippet do
8
- let(:code_keyword) { "Given" }
11
+ let(:code_keyword) { 'Given' }
9
12
 
10
13
  before do
11
- @pattern = 'we have a missing step'
14
+ @step_text = 'we have a missing step'
12
15
  @multiline_argument = Core::Ast::EmptyMultilineArgument.new
16
+ @registry = CucumberExpressions::ParameterTypeRegistry.new
17
+ @cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@registry)
13
18
  end
14
19
 
15
20
  let(:snippet) do
16
- snippet_class.new(code_keyword, @pattern, @multiline_argument)
21
+ snippet_class.new(@cucumber_expression_generator, code_keyword, @step_text, @multiline_argument)
17
22
  end
18
23
 
19
24
  def unindented(s)
@@ -24,8 +29,8 @@ module Cucumber
24
29
  let(:snippet_class) { Snippet::Regexp }
25
30
  let(:snippet_text) { snippet.to_s }
26
31
 
27
- it "wraps snippet patterns in parentheses" do
28
- @pattern = 'A "string" with 4 spaces'
32
+ it 'wraps snippet patterns in parentheses' do
33
+ @step_text = 'A "string" with 4 spaces'
29
34
 
30
35
  expect(snippet_text).to eq unindented(%{
31
36
  Given(/^A "([^"]*)" with (\\d+) spaces$/) do |arg1, arg2|
@@ -34,8 +39,8 @@ module Cucumber
34
39
  })
35
40
  end
36
41
 
37
- it "recognises numbers in name and make according regexp" do
38
- @pattern = 'Cloud 9 yeah'
42
+ it 'recognises numbers in name and make according regexp' do
43
+ @step_text = 'Cloud 9 yeah'
39
44
 
40
45
  expect(snippet_text).to eq unindented(%{
41
46
  Given(/^Cloud (\\d+) yeah$/) do |arg1|
@@ -44,8 +49,8 @@ module Cucumber
44
49
  })
45
50
  end
46
51
 
47
- it "recognises a mix of ints, strings and why not a table too" do
48
- @pattern = 'I have 9 "awesome" cukes in 37 "boxes"'
52
+ it 'recognises a mix of ints, strings and why not a table too' do
53
+ @step_text = 'I have 9 "awesome" cukes in 37 "boxes"'
49
54
  @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
50
55
 
51
56
  expect(snippet_text).to eq unindented(%{
@@ -56,8 +61,8 @@ module Cucumber
56
61
  })
57
62
  end
58
63
 
59
- it "recognises quotes in name and make according regexp" do
60
- @pattern = 'A "first" arg'
64
+ it 'recognises quotes in name and make according regexp' do
65
+ @step_text = 'A "first" arg'
61
66
 
62
67
  expect(snippet_text).to eq unindented(%{
63
68
  Given(/^A "([^"]*)" arg$/) do |arg1|
@@ -66,8 +71,8 @@ module Cucumber
66
71
  })
67
72
  end
68
73
 
69
- it "recognises several quoted words in name and make according regexp and args" do
70
- @pattern = 'A "first" and "second" arg'
74
+ it 'recognises several quoted words in name and make according regexp and args' do
75
+ @step_text = 'A "first" and "second" arg'
71
76
 
72
77
  expect(snippet_text).to eq unindented(%{
73
78
  Given(/^A "([^"]*)" and "([^"]*)" arg$/) do |arg1, arg2|
@@ -76,8 +81,8 @@ module Cucumber
76
81
  })
77
82
  end
78
83
 
79
- it "does not use quote group when there are no quotes" do
80
- @pattern = 'A first arg'
84
+ it 'does not use quote group when there are no quotes' do
85
+ @step_text = 'A first arg'
81
86
 
82
87
  expect(snippet_text).to eq unindented(%{
83
88
  Given(/^A first arg$/) do
@@ -86,9 +91,9 @@ module Cucumber
86
91
  })
87
92
  end
88
93
 
89
- it "is helpful with tables" do
90
- @pattern = 'A "first" arg'
91
- @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(""))
94
+ it 'is helpful with tables' do
95
+ @step_text = 'A "first" arg'
96
+ @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
92
97
 
93
98
  expect(snippet_text).to eq unindented(%{
94
99
  Given(/^A "([^"]*)" arg$/) do |arg1, table|
@@ -98,9 +103,9 @@ module Cucumber
98
103
  })
99
104
  end
100
105
 
101
- it "is helpful with doc string" do
102
- @pattern = 'A "first" arg'
103
- @multiline_argument = MultilineArgument.from("", Core::Ast::Location.new(""))
106
+ it 'is helpful with doc string' do
107
+ @step_text = 'A "first" arg'
108
+ @multiline_argument = MultilineArgument.from('', Core::Ast::Location.new(''))
104
109
 
105
110
  expect(snippet_text).to eq unindented(%{
106
111
  Given(/^A "([^"]*)" arg$/) do |arg1, string|
@@ -113,7 +118,7 @@ module Cucumber
113
118
  describe Snippet::Classic do
114
119
  let(:snippet_class) { Snippet::Classic }
115
120
 
116
- it "renders snippet as unwrapped regular expression" do
121
+ it 'renders snippet as unwrapped regular expression' do
117
122
  expect(snippet.to_s).to eq unindented(%{
118
123
  Given /^we have a missing step$/ do
119
124
  pending # Write code here that turns the phrase above into concrete actions
@@ -125,7 +130,7 @@ module Cucumber
125
130
  describe Snippet::Percent do
126
131
  let(:snippet_class) { Snippet::Percent }
127
132
 
128
- it "renders snippet as percent-style regular expression" do
133
+ it 'renders snippet as percent-style regular expression' do
129
134
  expect(snippet.to_s).to eq unindented(%{
130
135
  Given %r{^we have a missing step$} do
131
136
  pending # Write code here that turns the phrase above into concrete actions
@@ -133,6 +138,37 @@ module Cucumber
133
138
  })
134
139
  end
135
140
  end
141
+
142
+ describe Snippet::CucumberExpression do
143
+ let(:snippet_class) { Snippet::CucumberExpression }
144
+
145
+ it 'renders snippet as cucumber expression' do
146
+ @step_text = 'I have 2.3 cukes in my belly'
147
+ @registry.define_parameter_type(CucumberExpressions::ParameterType.new(
148
+ 'veg',
149
+ /(cuke|banana)s?/,
150
+ Object,
151
+ ->(s) { s},
152
+ true,
153
+ false
154
+ ))
155
+ @registry.define_parameter_type(CucumberExpressions::ParameterType.new(
156
+ 'cucumis',
157
+ /(bella|cuke)s?/,
158
+ Object,
159
+ ->(s) { s},
160
+ true,
161
+ false
162
+ ))
163
+
164
+ expect(snippet.to_s).to eq unindented(%{
165
+ Given("I have {float} {cucumis} in my belly") do |float, cucumis|
166
+ # Given("I have {float} {veg} in my belly") do |float, veg|
167
+ pending # Write code here that turns the phrase above into concrete actions
168
+ end
169
+ })
170
+ end
171
+ end
136
172
  end
137
173
  end
138
174
  end