cucumber 2.99.0 → 3.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/.cucumberproignore +6 -0
  3. data/.gitattributes +32 -0
  4. data/.github/ISSUE_TEMPLATE.md +1 -1
  5. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  6. data/.rubocop.yml +13 -0
  7. data/.rubocop_todo.yml +991 -0
  8. data/.travis.yml +56 -10
  9. data/{History.md → CHANGELOG.md} +166 -32
  10. data/CONTRIBUTING.md +21 -1
  11. data/Gemfile +18 -5
  12. data/README.md +13 -4
  13. data/Rakefile +12 -2
  14. data/appveyor.yml +27 -0
  15. data/bin/cucumber +2 -1
  16. data/cucumber.gemspec +15 -10
  17. data/cucumber.yml +10 -11
  18. data/examples/i18n/Rakefile +1 -1
  19. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
  20. data/examples/i18n/ar/lib/calculator.rb +2 -2
  21. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
  22. data/examples/i18n/bg/features/support/env.rb +6 -1
  23. data/examples/i18n/bg/lib/calculator.rb +2 -1
  24. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
  25. data/examples/i18n/ca/lib/calculadora.rb +2 -2
  26. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
  27. data/examples/i18n/cs/lib/calculator.rb +3 -3
  28. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
  29. data/examples/i18n/da/lib/lommeregner.rb +2 -2
  30. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
  31. data/examples/i18n/de/lib/calculator.rb +2 -2
  32. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
  33. data/examples/i18n/el/lib/calculator.rb +2 -2
  34. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
  35. data/examples/i18n/en/lib/calculator.rb +2 -2
  36. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
  37. data/examples/i18n/en-lol/features/support/env.rb +6 -2
  38. data/examples/i18n/en-lol/lib/basket.rb +2 -2
  39. data/examples/i18n/en-lol/lib/belly.rb +2 -2
  40. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
  41. data/examples/i18n/eo/lib/calculator.rb +2 -2
  42. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
  43. data/examples/i18n/es/lib/calculador.rb +2 -2
  44. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
  45. data/examples/i18n/et/lib/kalkulaator.rb +3 -3
  46. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
  47. data/examples/i18n/fi/lib/laskin.rb +1 -1
  48. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
  49. data/examples/i18n/fr/features/support/env.rb +7 -2
  50. data/examples/i18n/fr/lib/calculatrice.rb +2 -2
  51. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
  52. data/examples/i18n/he/lib/calculator.rb +1 -1
  53. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
  54. data/examples/i18n/hi/lib/calculator.rb +1 -1
  55. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
  56. data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
  57. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
  58. data/examples/i18n/hu/lib/calculator.rb +1 -1
  59. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
  60. data/examples/i18n/id/lib/calculator.rb +2 -2
  61. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
  62. data/examples/i18n/it/lib/calcolatrice.rb +3 -3
  63. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
  64. data/examples/i18n/ja/features/support/env.rb +7 -2
  65. data/examples/i18n/ja/lib/calculator.rb +2 -2
  66. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
  67. data/examples/i18n/ko/lib/calculator.rb +2 -2
  68. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
  69. data/examples/i18n/lt/lib/calculator.rb +2 -2
  70. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
  71. data/examples/i18n/lv/lib/calculator.rb +2 -2
  72. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
  73. data/examples/i18n/no/features/support/env.rb +7 -2
  74. data/examples/i18n/no/lib/kalkulator.rb +2 -2
  75. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
  76. data/examples/i18n/pl/features/support/env.rb +6 -1
  77. data/examples/i18n/pl/lib/calculator.rb +2 -2
  78. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
  79. data/examples/i18n/pt/features/support/env.rb +7 -2
  80. data/examples/i18n/pt/lib/calculadora.rb +1 -1
  81. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
  82. data/examples/i18n/ro/lib/calculator.rb +1 -1
  83. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
  84. data/examples/i18n/ru/features/support/env.rb +6 -1
  85. data/examples/i18n/ru/lib/calculator.rb +2 -1
  86. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
  87. data/examples/i18n/sk/lib/calculator.rb +2 -2
  88. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
  89. data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
  90. data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
  91. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
  92. data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
  93. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
  94. data/examples/i18n/sv/lib/kalkulator.rb +2 -2
  95. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
  96. data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
  97. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
  98. data/examples/i18n/uk/features/support/env.rb +6 -1
  99. data/examples/i18n/uk/lib/calculator.rb +2 -1
  100. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
  101. data/examples/i18n/uz/features/support/env.rb +6 -1
  102. data/examples/i18n/uz/lib/calculator.rb +2 -1
  103. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
  104. data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
  105. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
  106. data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
  107. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
  108. data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
  109. data/examples/sinatra/features/support/env.rb +6 -1
  110. data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
  111. data/examples/tcl/features/support/env.rb +2 -1
  112. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
  113. data/examples/watir/features/step_definitions/search_steps.rb +6 -5
  114. data/examples/watir/features/support/env.rb +5 -1
  115. data/examples/watir/features/support/screenshots.rb +5 -5
  116. data/features/docs/api/list_step_defs_as_json.feature +21 -7
  117. data/features/docs/api/listen_for_events.feature +9 -8
  118. data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
  119. data/features/docs/cli/dry_run.feature +3 -0
  120. data/features/docs/cli/execute_with_tag_filter.feature +8 -6
  121. data/features/docs/cli/fail_fast.feature +2 -0
  122. data/features/docs/cli/help.feature +8 -0
  123. data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
  124. data/features/docs/cli/randomize.feature +2 -2
  125. data/features/docs/cli/retry_failing_tests.feature +75 -15
  126. data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
  127. data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
  128. data/features/docs/cli/strict_mode.feature +6 -0
  129. data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
  130. data/features/docs/defining_steps/nested_steps.feature +5 -1
  131. data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
  132. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
  133. data/features/docs/defining_steps/printing_messages.feature +1 -2
  134. data/features/docs/defining_steps/skip_scenario.feature +1 -34
  135. data/features/docs/defining_steps/snippets.feature +18 -18
  136. data/features/docs/events/gherkin_source_read_event.feature +43 -0
  137. data/features/docs/events/step_activated_event.feature +36 -0
  138. data/features/docs/events/step_definition_registered_event.feature +29 -0
  139. data/features/docs/events/test_case_finished_event.feature +35 -0
  140. data/features/docs/events/test_case_started_event.feature +54 -0
  141. data/features/docs/events/test_run_finished_event.feature +40 -0
  142. data/features/docs/events/test_run_started_event.feature +41 -0
  143. data/features/docs/events/test_step_finished_event.feature +47 -0
  144. data/features/docs/events/test_step_started_event.feature +43 -0
  145. data/features/docs/exception_in_after_hook.feature +3 -2
  146. data/features/docs/exception_in_after_step_hook.feature +2 -0
  147. data/features/docs/exception_in_around_hook.feature +2 -0
  148. data/features/docs/exception_in_before_hook.feature +3 -1
  149. data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
  150. data/features/docs/formatters/json_formatter.feature +4 -4
  151. data/features/docs/formatters/junit_formatter.feature +7 -6
  152. data/features/docs/formatters/pretty_formatter.feature +1 -0
  153. data/features/docs/formatters/progress_formatter.feature +1 -0
  154. data/features/docs/formatters/rerun_formatter.feature +2 -0
  155. data/features/docs/formatters/summary_formatter.feature +35 -0
  156. data/features/docs/formatters/usage_formatter.feature +3 -0
  157. data/features/docs/getting_started.feature +2 -1
  158. data/features/docs/gherkin/background.feature +5 -5
  159. data/features/docs/gherkin/doc_strings.feature +2 -0
  160. data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
  161. data/features/docs/gherkin/outlines.feature +6 -4
  162. data/features/docs/gherkin/unicode_table.feature +2 -1
  163. data/features/docs/gherkin/using_descriptions.feature +1 -0
  164. data/features/docs/gherkin/using_star_notation.feature +1 -1
  165. data/features/docs/post_configuration_hook.feature +1 -17
  166. data/features/docs/rake_task.feature +5 -0
  167. data/features/docs/raketask.feature +3 -1
  168. data/features/docs/work_in_progress.feature +5 -2
  169. data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
  170. data/features/docs/writing_support_code/around_hooks.feature +6 -0
  171. data/features/docs/writing_support_code/before_hook.feature +1 -0
  172. data/features/docs/writing_support_code/hook_order.feature +3 -1
  173. data/features/docs/writing_support_code/parameter_types.feature +53 -0
  174. data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
  175. data/features/docs/writing_support_code/world.feature +129 -0
  176. data/features/lib/step_definitions/aruba_steps.rb +5 -10
  177. data/features/lib/step_definitions/cli_steps.rb +4 -0
  178. data/features/lib/step_definitions/cucumber_steps.rb +9 -12
  179. data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
  180. data/features/lib/step_definitions/json_steps.rb +2 -1
  181. data/features/lib/step_definitions/junit_steps.rb +2 -1
  182. data/features/lib/step_definitions/language_steps.rb +3 -2
  183. data/features/lib/step_definitions/profile_steps.rb +7 -6
  184. data/features/lib/step_definitions/retry_steps.rb +33 -13
  185. data/features/lib/step_definitions/ruby_steps.rb +2 -1
  186. data/features/lib/support/env.rb +3 -2
  187. data/features/lib/support/fake_wire_server.rb +17 -3
  188. data/features/lib/support/feature_factory.rb +2 -1
  189. data/features/lib/support/normalise_output.rb +14 -12
  190. data/features/lib/support/parameter_types.rb +5 -0
  191. data/gem_tasks/contributors.rake +10 -6
  192. data/gem_tasks/cov.rake +1 -0
  193. data/gem_tasks/downloads.rb +1 -0
  194. data/gem_tasks/environment.rake +2 -5
  195. data/gem_tasks/examples.rake +3 -2
  196. data/gem_tasks/fix_cr_lf.rake +19 -7
  197. data/gem_tasks/flog.rake +4 -3
  198. data/gem_tasks/rspec.rake +2 -1
  199. data/gem_tasks/sass.rake +2 -1
  200. data/lib/autotest/cucumber.rb +1 -0
  201. data/lib/autotest/cucumber_mixin.rb +17 -16
  202. data/lib/autotest/cucumber_rails.rb +1 -0
  203. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  204. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  205. data/lib/autotest/cucumber_rspec.rb +1 -0
  206. data/lib/autotest/cucumber_rspec2.rb +1 -0
  207. data/lib/autotest/discover.rb +3 -2
  208. data/lib/cucumber/cli/configuration.rb +12 -21
  209. data/lib/cucumber/cli/main.rb +8 -7
  210. data/lib/cucumber/cli/options.rb +341 -217
  211. data/lib/cucumber/cli/profile_loader.rb +26 -21
  212. data/lib/cucumber/cli/rerun_file.rb +1 -0
  213. data/lib/cucumber/configuration.rb +54 -37
  214. data/lib/cucumber/constantize.rb +2 -1
  215. data/lib/cucumber/core_ext/string.rb +2 -1
  216. data/lib/cucumber/deprecate.rb +4 -3
  217. data/lib/cucumber/encoding.rb +1 -0
  218. data/lib/cucumber/errors.rb +3 -1
  219. data/lib/cucumber/events/gherkin_source_read.rb +17 -0
  220. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
  221. data/lib/cucumber/events/step_definition_registered.rb +24 -0
  222. data/lib/cucumber/events/test_case_finished.rb +18 -0
  223. data/lib/cucumber/events/test_case_started.rb +15 -0
  224. data/lib/cucumber/events/test_run_finished.rb +12 -0
  225. data/lib/cucumber/events/test_run_started.rb +16 -0
  226. data/lib/cucumber/events/test_step_finished.rb +20 -0
  227. data/lib/cucumber/events/test_step_started.rb +17 -0
  228. data/lib/cucumber/events.rb +23 -3
  229. data/lib/cucumber/file_specs.rb +1 -0
  230. data/lib/cucumber/filters/activate_steps.rb +8 -3
  231. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  232. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  233. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  234. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  235. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
  236. data/lib/cucumber/filters/gated_receiver.rb +1 -0
  237. data/lib/cucumber/filters/prepare_world.rb +1 -0
  238. data/lib/cucumber/filters/quit.rb +1 -0
  239. data/lib/cucumber/filters/randomizer.rb +1 -0
  240. data/lib/cucumber/filters/retry.rb +4 -4
  241. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
  242. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
  243. data/lib/cucumber/filters/tag_limits.rb +4 -3
  244. data/lib/cucumber/filters.rb +3 -0
  245. data/lib/cucumber/formatter/ansicolor.rb +9 -11
  246. data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
  247. data/lib/cucumber/formatter/console.rb +72 -66
  248. data/lib/cucumber/formatter/console_counts.rb +44 -0
  249. data/lib/cucumber/formatter/console_issues.rb +58 -0
  250. data/lib/cucumber/formatter/duration.rb +2 -1
  251. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  252. data/lib/cucumber/formatter/fail_fast.rb +4 -2
  253. data/lib/cucumber/formatter/fanout.rb +1 -0
  254. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  255. data/lib/cucumber/formatter/html.rb +175 -249
  256. data/lib/cucumber/formatter/html_builder.rb +120 -0
  257. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
  258. data/lib/cucumber/formatter/inline-js.js +30 -0
  259. data/lib/cucumber/formatter/interceptor.rb +3 -2
  260. data/lib/cucumber/formatter/io.rb +2 -1
  261. data/lib/cucumber/formatter/json.rb +33 -30
  262. data/lib/cucumber/formatter/json_pretty.rb +1 -0
  263. data/lib/cucumber/formatter/junit.rb +26 -24
  264. data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
  265. data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
  266. data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
  267. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
  268. data/lib/cucumber/formatter/pretty.rb +24 -18
  269. data/lib/cucumber/formatter/progress.rb +55 -13
  270. data/lib/cucumber/formatter/rerun.rb +15 -18
  271. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  272. data/lib/cucumber/formatter/steps.rb +2 -1
  273. data/lib/cucumber/formatter/summary.rb +43 -20
  274. data/lib/cucumber/formatter/unicode.rb +2 -1
  275. data/lib/cucumber/formatter/usage.rb +33 -28
  276. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  277. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
  278. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
  279. data/lib/cucumber/gherkin/i18n.rb +1 -0
  280. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  281. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
  282. data/lib/cucumber/glue/hook.rb +43 -0
  283. data/lib/cucumber/glue/invoke_in_world.rb +70 -0
  284. data/lib/cucumber/glue/proto_world.rb +220 -0
  285. data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
  286. data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
  287. data/lib/cucumber/glue/step_definition.rb +143 -0
  288. data/lib/cucumber/glue/world_factory.rb +23 -0
  289. data/lib/cucumber/hooks.rb +9 -8
  290. data/lib/cucumber/load_path.rb +1 -0
  291. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
  292. data/lib/cucumber/multiline_argument/data_table.rb +47 -181
  293. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  294. data/lib/cucumber/multiline_argument.rb +6 -15
  295. data/lib/cucumber/platform.rb +4 -5
  296. data/lib/cucumber/project_initializer.rb +3 -2
  297. data/lib/cucumber/rake/task.rb +19 -14
  298. data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
  299. data/lib/cucumber/rspec/doubles.rb +2 -1
  300. data/lib/cucumber/running_test_case.rb +3 -27
  301. data/lib/cucumber/runtime/after_hooks.rb +2 -1
  302. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  303. data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
  304. data/lib/cucumber/runtime/step_hooks.rb +1 -0
  305. data/lib/cucumber/runtime/support_code.rb +21 -16
  306. data/lib/cucumber/runtime/user_interface.rb +10 -16
  307. data/lib/cucumber/runtime.rb +49 -32
  308. data/lib/cucumber/step_argument.rb +1 -2
  309. data/lib/cucumber/step_definition_light.rb +2 -0
  310. data/lib/cucumber/step_definitions.rb +1 -0
  311. data/lib/cucumber/step_match.rb +30 -15
  312. data/lib/cucumber/step_match_search.rb +3 -3
  313. data/lib/cucumber/term/ansicolor.rb +2 -1
  314. data/lib/cucumber/unit.rb +1 -0
  315. data/lib/cucumber/version +1 -1
  316. data/lib/cucumber.rb +1 -13
  317. data/lib/simplecov_setup.rb +2 -1
  318. data/scripts/invite-collaborator +40 -0
  319. data/scripts/update-changelog +86 -0
  320. data/spec/cucumber/cli/configuration_spec.rb +109 -98
  321. data/spec/cucumber/cli/main_spec.rb +8 -7
  322. data/spec/cucumber/cli/options_spec.rb +114 -79
  323. data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
  324. data/spec/cucumber/cli/rerun_spec.rb +21 -20
  325. data/spec/cucumber/configuration_spec.rb +48 -47
  326. data/spec/cucumber/constantize_spec.rb +3 -2
  327. data/spec/cucumber/events_spec.rb +9 -0
  328. data/spec/cucumber/file_specs_spec.rb +26 -25
  329. data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
  330. data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
  331. data/spec/cucumber/filters/retry_spec.rb +42 -23
  332. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
  333. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
  334. data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
  335. data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
  336. data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
  337. data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
  338. data/spec/cucumber/formatter/duration_spec.rb +4 -3
  339. data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
  340. data/spec/cucumber/formatter/html_spec.rb +65 -60
  341. data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
  342. data/spec/cucumber/formatter/json_spec.rb +71 -97
  343. data/spec/cucumber/formatter/junit_spec.rb +46 -47
  344. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
  345. data/spec/cucumber/formatter/pretty_spec.rb +105 -117
  346. data/spec/cucumber/formatter/progress_spec.rb +22 -21
  347. data/spec/cucumber/formatter/rerun_spec.rb +70 -64
  348. data/spec/cucumber/formatter/spec_helper.rb +14 -12
  349. data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
  350. data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
  351. data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
  352. data/spec/cucumber/glue/step_definition_spec.rb +207 -0
  353. data/spec/cucumber/hooks_spec.rb +5 -4
  354. data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
  355. data/spec/cucumber/project_initializer_spec.rb +12 -11
  356. data/spec/cucumber/rake/forked_spec.rb +22 -17
  357. data/spec/cucumber/rake/task_spec.rb +21 -20
  358. data/spec/cucumber/running_test_case_spec.rb +36 -35
  359. data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
  360. data/spec/cucumber/runtime/support_code_spec.rb +1 -0
  361. data/spec/cucumber/runtime_spec.rb +3 -2
  362. data/spec/cucumber/step_argument_spec.rb +6 -5
  363. data/spec/cucumber/step_match_search_spec.rb +32 -41
  364. data/spec/cucumber/step_match_spec.rb +34 -33
  365. data/spec/cucumber/world/pending_spec.rb +12 -11
  366. data/spec/spec_helper.rb +1 -0
  367. data/spec/support/standard_step_actions.rb +2 -1
  368. metadata +132 -61
  369. data/features/docs/formatters/debug_formatter.feature +0 -47
  370. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  371. data/features/docs/writing_support_code/transforms.feature +0 -98
  372. data/features/lib/step_definitions/wire_steps.rb +0 -58
  373. data/gem_tasks/cucumber.rake +0 -25
  374. data/lib/cucumber/ast.rb +0 -13
  375. data/lib/cucumber/core_ext/instance_exec.rb +0 -70
  376. data/lib/cucumber/events/after_test_case.rb +0 -25
  377. data/lib/cucumber/events/after_test_step.rb +0 -30
  378. data/lib/cucumber/events/before_test_case.rb +0 -18
  379. data/lib/cucumber/events/before_test_step.rb +0 -23
  380. data/lib/cucumber/events/bus.rb +0 -86
  381. data/lib/cucumber/events/finished_testing.rb +0 -9
  382. data/lib/cucumber/formatter/debug.rb +0 -35
  383. data/lib/cucumber/formatter/event_bus_report.rb +0 -38
  384. data/lib/cucumber/rb_support/rb_hook.rb +0 -19
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
  386. data/lib/cucumber/rb_support/rb_transform.rb +0 -59
  387. data/lib/cucumber/rb_support/rb_world.rb +0 -149
  388. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
  389. data/spec/cucumber/events/bus_spec.rb +0 -94
  390. data/spec/cucumber/formatter/debug_spec.rb +0 -64
  391. data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
  392. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
  393. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
  394. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
  395. data/spec/cucumber_spec.rb +0 -39
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'spec_helper'
3
4
  require 'cucumber/multiline_argument/data_table'
4
5
 
@@ -12,30 +13,30 @@ module Cucumber
12
13
  ])
13
14
  end
14
15
 
15
- it "should have rows" do
16
+ it 'should have rows' do
16
17
  expect( @table.cells_rows[0].map{|cell| cell.value} ).to eq %w{one four seven}
17
18
  end
18
19
 
19
- it "should have columns" do
20
+ it 'should have columns' do
20
21
  expect( @table.columns[1].map{|cell| cell.value} ).to eq %w{four 55555}
21
22
  end
22
23
 
23
- it "should have same cell objects in rows and columns" do
24
+ it 'should have same cell objects in rows and columns' do
24
25
  # 666666
25
26
  expect( @table.cells_rows[1][2] ).to equal(@table.columns[2][1])
26
27
  end
27
28
 
28
- it "should be convertible to an array of hashes" do
29
+ it 'should be convertible to an array of hashes' do
29
30
  expect( @table.hashes ).to eq [
30
31
  {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
31
32
  ]
32
33
  end
33
34
 
34
- it "should accept symbols as keys for the hashes" do
35
+ it 'should accept symbols as keys for the hashes' do
35
36
  expect( @table.hashes.first[:one] ).to eq '4444'
36
37
  end
37
38
 
38
- it "should return the row values in order" do
39
+ it 'should return the row values in order' do
39
40
  expect( @table.rows.first ).to eq %w{4444 55555 666666}
40
41
  end
41
42
 
@@ -52,15 +53,20 @@ module Cucumber
52
53
  expect{@table.symbolic_hashes}.to_not raise_error
53
54
  end
54
55
 
56
+ it 'should not interfere with use of #hashes' do
57
+ @table.symbolic_hashes
58
+ expect{@table.hashes}.to_not raise_error
59
+ end
60
+
55
61
  end
56
62
 
57
63
  describe '#map_column!' do
58
- it "should allow mapping columns" do
64
+ it 'should allow mapping columns' do
59
65
  @table.map_column!('one') { |v| v.to_i }
60
66
  expect( @table.hashes.first['one'] ).to eq 4444
61
67
  end
62
68
 
63
- it "applies the block once to each value" do
69
+ it 'applies the block once to each value' do
64
70
  headers = ['header']
65
71
  rows = ['value']
66
72
  table = DataTable.from [headers, rows]
@@ -70,43 +76,43 @@ module Cucumber
70
76
  expect( count ).to eq rows.size
71
77
  end
72
78
 
73
- it "should allow mapping columns and take a symbol as the column name" do
79
+ it 'should allow mapping columns and take a symbol as the column name' do
74
80
  @table.map_column!(:one) { |v| v.to_i }
75
81
  expect( @table.hashes.first['one'] ).to eq 4444
76
82
  end
77
83
 
78
- it "should allow mapping columns and modify the rows as well" do
84
+ it 'should allow mapping columns and modify the rows as well' do
79
85
  @table.map_column!(:one) { |v| v.to_i }
80
86
  expect( @table.rows.first ).to include(4444)
81
87
  expect( @table.rows.first ).to_not include('4444')
82
88
  end
83
89
 
84
- it "should pass silently if a mapped column does not exist in non-strict mode" do
90
+ it 'should pass silently if a mapped column does not exist in non-strict mode' do
85
91
  expect {
86
92
  @table.map_column!('two', false) { |v| v.to_i }
87
93
  @table.hashes
88
94
  }.not_to raise_error
89
95
  end
90
96
 
91
- it "should fail if a mapped column does not exist in strict mode" do
97
+ it 'should fail if a mapped column does not exist in strict mode' do
92
98
  expect {
93
99
  @table.map_column!('two', true) { |v| v.to_i }
94
100
  @table.hashes
95
101
  }.to raise_error('The column named "two" does not exist')
96
102
  end
97
103
 
98
- it "should return the table" do
104
+ it 'should return the table' do
99
105
  expect( (@table.map_column!(:one) { |v| v.to_i }) ).to eq @table
100
106
  end
101
107
  end
102
108
 
103
109
  describe '#map_column' do
104
- it "should allow mapping columns" do
110
+ it 'should allow mapping columns' do
105
111
  new_table = @table.map_column('one') { |v| v.to_i }
106
112
  expect( new_table.hashes.first['one'] ).to eq 4444
107
113
  end
108
114
 
109
- it "applies the block once to each value" do
115
+ it 'applies the block once to each value' do
110
116
  headers = ['header']
111
117
  rows = ['value']
112
118
  table = DataTable.from [headers, rows]
@@ -116,37 +122,37 @@ module Cucumber
116
122
  expect( count ).to eq rows.size
117
123
  end
118
124
 
119
- it "should allow mapping columns and take a symbol as the column name" do
125
+ it 'should allow mapping columns and take a symbol as the column name' do
120
126
  new_table = @table.map_column(:one) { |v| v.to_i }
121
127
  expect( new_table.hashes.first['one'] ).to eq 4444
122
128
  end
123
129
 
124
- it "should allow mapping columns and modify the rows as well" do
130
+ it 'should allow mapping columns and modify the rows as well' do
125
131
  new_table = @table.map_column(:one) { |v| v.to_i }
126
132
  expect( new_table.rows.first ).to include(4444)
127
133
  expect( new_table.rows.first ).to_not include('4444')
128
134
  end
129
135
 
130
- it "should pass silently if a mapped column does not exist in non-strict mode" do
136
+ it 'should pass silently if a mapped column does not exist in non-strict mode' do
131
137
  expect {
132
138
  new_table = @table.map_column('two', false) { |v| v.to_i }
133
139
  new_table.hashes
134
140
  }.not_to raise_error
135
141
  end
136
142
 
137
- it "should fail if a mapped column does not exist in strict mode" do
143
+ it 'should fail if a mapped column does not exist in strict mode' do
138
144
  expect {
139
145
  new_table = @table.map_column('two', true) { |v| v.to_i }
140
146
  new_table.hashes
141
147
  }.to raise_error('The column named "two" does not exist')
142
148
  end
143
149
 
144
- it "should return a new table" do
150
+ it 'should return a new table' do
145
151
  expect( (@table.map_column(:one) { |v| v.to_i }) ).to_not eq @table
146
152
  end
147
153
  end
148
154
 
149
- describe "#match" do
155
+ describe '#match' do
150
156
  before(:each) do
151
157
  @table = DataTable.from([
152
158
  %w{one four seven},
@@ -154,18 +160,18 @@ module Cucumber
154
160
  ])
155
161
  end
156
162
 
157
- it "returns nil if headers do not match" do
163
+ it 'returns nil if headers do not match' do
158
164
  expect( @table.match('does,not,match') ).to be_nil
159
165
  end
160
- it "requires a table: prefix on match" do
166
+ it 'requires a table: prefix on match' do
161
167
  expect( @table.match('table:one,four,seven') ).to_not be_nil
162
168
  end
163
- it "does not match if no table: prefix on match" do
169
+ it 'does not match if no table: prefix on match' do
164
170
  expect( @table.match('one,four,seven') ).to be_nil
165
171
  end
166
172
  end
167
173
 
168
- describe "#transpose" do
174
+ describe '#transpose' do
169
175
  before(:each) do
170
176
  @table = DataTable.from([
171
177
  %w{one 1111},
@@ -173,14 +179,14 @@ module Cucumber
173
179
  ])
174
180
  end
175
181
 
176
- it "should be convertible in to an array where each row is a hash" do
182
+ it 'should be convertible in to an array where each row is a hash' do
177
183
  expect( @table.transpose.hashes[0] ).to eq('one' => '1111', 'two' => '22222')
178
184
  end
179
185
  end
180
186
 
181
- describe "#rows_hash" do
187
+ describe '#rows_hash' do
182
188
 
183
- it "should return a hash of the rows" do
189
+ it 'should return a hash of the rows' do
184
190
  table = DataTable.from([
185
191
  %w{one 1111},
186
192
  %w{two 22222}
@@ -198,7 +204,7 @@ module Cucumber
198
204
  }.to raise_error('The table must have exactly 2 columns')
199
205
  end
200
206
 
201
- it "should support header and column mapping" do
207
+ it 'should support header and column mapping' do
202
208
  table = DataTable.from([
203
209
  %w{one 1111},
204
210
  %w{two 22222}
@@ -217,30 +223,30 @@ module Cucumber
217
223
  ])
218
224
  end
219
225
 
220
- it "renames the columns to the specified values in the provided hash" do
226
+ it 'renames the columns to the specified values in the provided hash' do
221
227
  @table.map_headers!('one' => :three)
222
228
  expect( @table.hashes.first[:three] ).to eq '4444'
223
229
  end
224
230
 
225
- it "allows renaming columns using regexp" do
231
+ it 'allows renaming columns using regexp' do
226
232
  @table.map_headers!(/one|uno/ => :three)
227
233
  expect( @table.hashes.first[:three] ).to eq '4444'
228
234
  end
229
235
 
230
- it "copies column mappings" do
236
+ it 'copies column mappings' do
231
237
  @table.map_column!('one') { |v| v.to_i }
232
238
  @table.map_headers!('one' => 'three')
233
239
  expect( @table.hashes.first['three'] ).to eq 4444
234
240
  end
235
241
 
236
- it "takes a block and operates on all the headers with it" do
242
+ it 'takes a block and operates on all the headers with it' do
237
243
  table.map_headers! do |header|
238
244
  header.downcase
239
245
  end
240
246
  expect( table.hashes.first.keys ).to match %w[hello world]
241
247
  end
242
248
 
243
- it "treats the mappings in the provided hash as overrides when used with a block" do
249
+ it 'treats the mappings in the provided hash as overrides when used with a block' do
244
250
  table.map_headers!('WORLD' => 'foo') do |header|
245
251
  header.downcase
246
252
  end
@@ -257,23 +263,23 @@ module Cucumber
257
263
  ])
258
264
  end
259
265
 
260
- it "renames the columns to the specified values in the provided hash" do
266
+ it 'renames the columns to the specified values in the provided hash' do
261
267
  table2 = @table.map_headers('one' => :three)
262
268
  expect( table2.hashes.first[:three] ).to eq '4444'
263
269
  end
264
270
 
265
- it "allows renaming columns using regexp" do
271
+ it 'allows renaming columns using regexp' do
266
272
  table2 = @table.map_headers(/one|uno/ => :three)
267
273
  expect( table2.hashes.first[:three] ).to eq '4444'
268
274
  end
269
275
 
270
- it "copies column mappings" do
276
+ it 'copies column mappings' do
271
277
  @table.map_column!('one') { |v| v.to_i }
272
278
  table2 = @table.map_headers('one' => 'three')
273
279
  expect( table2.hashes.first['three'] ).to eq 4444
274
280
  end
275
281
 
276
- it "takes a block and operates on all the headers with it" do
282
+ it 'takes a block and operates on all the headers with it' do
277
283
  table2 = table.map_headers do |header|
278
284
  header.downcase
279
285
  end
@@ -281,7 +287,7 @@ module Cucumber
281
287
  expect( table2.hashes.first.keys ).to match %w[hello world]
282
288
  end
283
289
 
284
- it "treats the mappings in the provided hash as overrides when used with a block" do
290
+ it 'treats the mappings in the provided hash as overrides when used with a block' do
285
291
  table2 = table.map_headers('WORLD' => 'foo') do |header|
286
292
  header.downcase
287
293
  end
@@ -290,8 +296,8 @@ module Cucumber
290
296
  end
291
297
  end
292
298
 
293
- describe "diff!" do
294
- it "should detect a complex diff" do
299
+ describe 'diff!' do
300
+ it 'should detect a complex diff' do
295
301
  t1 = DataTable.from(%{
296
302
  | 1 | 22 | 333 | 4444 |
297
303
  | 55555 | 666666 | 7777777 | 88888888 |
@@ -306,18 +312,19 @@ module Cucumber
306
312
  | dddd | 4000 | 300 |
307
313
  | e | 50000 | 4000 |
308
314
  })
309
- expect { t1.diff!(t2) }.to raise_error
310
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
311
- | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
312
- | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
313
- | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
314
- | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
315
- | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
316
- | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
317
- }
315
+ expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
316
+ expect(error.table.to_s(indent: 14, color: false)).to eq %{
317
+ | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
318
+ | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
319
+ | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
320
+ | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
321
+ | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
322
+ | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
323
+ }
324
+ end
318
325
  end
319
326
 
320
- it "should not change table when diffed with identical" do
327
+ it 'should not change table when diffed with identical' do
321
328
  t = DataTable.from(%{
322
329
  |a|b|c|
323
330
  |d|e|f|
@@ -331,8 +338,48 @@ module Cucumber
331
338
  }
332
339
  end
333
340
 
334
- context "in case of duplicate header values" do
335
- it "raises no error for two identical tables" do
341
+ context 'with empty tables' do
342
+ it 'should allow diffing empty tables' do
343
+ t1 = DataTable.from([[]])
344
+ t2 = DataTable.from([[]])
345
+ expect{ t1.diff!(t2) }.not_to raise_error
346
+ end
347
+
348
+ it 'should be able to diff when the right table is empty' do
349
+ t1 = DataTable.from(%{
350
+ |a|b|c|
351
+ |d|e|f|
352
+ |g|h|i|
353
+ })
354
+ t2 = DataTable.from([[]])
355
+ expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
356
+ expect(error.table.to_s(indent: 16, color: false)).to eq %{
357
+ | (-) a | (-) b | (-) c |
358
+ | (-) d | (-) e | (-) f |
359
+ | (-) g | (-) h | (-) i |
360
+ }
361
+ end
362
+ end
363
+
364
+ it 'should be able to diff when the left table is empty' do
365
+ t1 = DataTable.from([[]])
366
+ t2 = DataTable.from(%{
367
+ |a|b|c|
368
+ |d|e|f|
369
+ |g|h|i|
370
+ })
371
+ expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
372
+ expect(error.table.to_s(indent: 16, color: false)).to eq %{
373
+ | (+) a | (+) b | (+) c |
374
+ | (+) d | (+) e | (+) f |
375
+ | (+) g | (+) h | (+) i |
376
+ }
377
+ end
378
+ end
379
+ end
380
+
381
+ context 'in case of duplicate header values' do
382
+ it 'raises no error for two identical tables' do
336
383
  t = DataTable.from(%{
337
384
  |a|a|c|
338
385
  |d|e|f|
@@ -346,7 +393,7 @@ module Cucumber
346
393
  }
347
394
  end
348
395
 
349
- it "detects a diff in one cell" do
396
+ it 'detects a diff in one cell' do
350
397
  t1 = DataTable.from(%{
351
398
  |a|a|c|
352
399
  |d|e|f|
@@ -357,16 +404,17 @@ module Cucumber
357
404
  |d|oops|f|
358
405
  |g|h|i|
359
406
  })
360
- expect{ t1.diff!(t2) }.to raise_error
361
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
362
- | a | a | c |
363
- | (-) d | (-) e | (-) f |
364
- | (+) d | (+) oops | (+) f |
365
- | g | h | i |
366
- }
407
+ expect{ t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
408
+ expect(error.table.to_s(indent: 16, color: false)).to eq %{
409
+ | a | a | c |
410
+ | (-) d | (-) e | (-) f |
411
+ | (+) d | (+) oops | (+) f |
412
+ | g | h | i |
413
+ }
414
+ end
367
415
  end
368
416
 
369
- it "detects missing columns" do
417
+ it 'detects missing columns' do
370
418
  t1 = DataTable.from(%{
371
419
  |a|a|b|c|
372
420
  |d|d|e|f|
@@ -377,15 +425,16 @@ module Cucumber
377
425
  |d|e|f|
378
426
  |g|h|i|
379
427
  })
380
- expect{ t1.diff!(t2) }.to raise_error
381
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
382
- | a | (-) a | b | c |
383
- | d | (-) d | e | f |
384
- | g | (-) g | h | i |
385
- }
428
+ expect{ t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
429
+ expect(error.table.to_s(indent: 16, color: false)).to eq %{
430
+ | a | (-) a | b | c |
431
+ | d | (-) d | e | f |
432
+ | g | (-) g | h | i |
433
+ }
434
+ end
386
435
  end
387
436
 
388
- it "detects surplus columns" do
437
+ it 'detects surplus columns' do
389
438
  t1 = DataTable.from(%{
390
439
  |a|b|c|
391
440
  |d|e|f|
@@ -396,41 +445,42 @@ module Cucumber
396
445
  |d|e|d|f|
397
446
  |g|h|g|i|
398
447
  })
399
- expect{ t1.diff!(t2, :surplus_col => true) }.to raise_error
400
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
401
- | a | b | c | (+) a |
402
- | d | e | f | (+) d |
403
- | g | h | i | (+) g |
404
- }
448
+ expect{ t1.diff!(t2, :surplus_col => true) }.to raise_error(DataTable::Different) do |error|
449
+ expect(error.table.to_s(indent: 16, color: false)).to eq %{
450
+ | a | b | c | (+) a |
451
+ | d | e | f | (+) d |
452
+ | g | h | i | (+) g |
453
+ }
454
+ end
405
455
  end
406
456
  end
407
457
 
408
- it "should inspect missing and surplus cells" do
458
+ it 'should inspect missing and surplus cells' do
409
459
  t1 = DataTable.from([
410
- ['name', 'male', 'lastname', 'swedish'],
411
- ['aslak', 'true', 'hellesøy', 'false']
460
+ %w(name male lastname swedish),
461
+ %w(aslak true hellesøy false)
412
462
  ])
413
463
  t2 = DataTable.from([
414
- ['name', 'male', 'lastname', 'swedish'],
415
- ['aslak', true, 'hellesøy', false]
464
+ %w(name male lastname swedish),
465
+ ['aslak', true, 'hellesøy', false]
416
466
  ])
417
- expect { t1.diff!(t2) }.to raise_error
418
-
419
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
420
- | name | male | lastname | swedish |
421
- | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
422
- | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
423
- }
467
+ expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
468
+ expect(error.table.to_s(indent: 14, color: false)).to eq %{
469
+ | name | male | lastname | swedish |
470
+ | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
471
+ | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
472
+ }
473
+ end
424
474
  end
425
475
 
426
- it "should allow column mapping of target before diffing" do
476
+ it 'should allow column mapping of target before diffing' do
427
477
  t1 = DataTable.from([
428
- ['name', 'male'],
429
- ['aslak', 'true']
478
+ %w(name male),
479
+ %w(aslak true)
430
480
  ])
431
481
  t1.map_column!('male') { |m| m == 'true' }
432
482
  t2 = DataTable.from([
433
- ['name', 'male'],
483
+ %w(name male),
434
484
  ['aslak', true]
435
485
  ])
436
486
  t1.diff!(t2)
@@ -440,17 +490,17 @@ module Cucumber
440
490
  }
441
491
  end
442
492
 
443
- it "should allow column mapping of argument before diffing" do
493
+ it 'should allow column mapping of argument before diffing' do
444
494
  t1 = DataTable.from([
445
- ['name', 'male'],
495
+ %w(name male),
446
496
  ['aslak', true]
447
497
  ])
448
498
  t1.map_column!('male') {
449
499
  'true'
450
500
  }
451
501
  t2 = DataTable.from([
452
- ['name', 'male'],
453
- ['aslak', 'true']
502
+ %w(name male),
503
+ %w(aslak true)
454
504
  ])
455
505
  t2.diff!(t1)
456
506
  expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
@@ -459,15 +509,15 @@ module Cucumber
459
509
  }
460
510
  end
461
511
 
462
- it "should allow header mapping before diffing" do
512
+ it 'should allow header mapping before diffing' do
463
513
  t1 = DataTable.from([
464
- ['Name', 'Male'],
465
- ['aslak', 'true']
514
+ %w(Name Male),
515
+ %w(aslak true)
466
516
  ])
467
517
  t1.map_headers!('Name' => 'name', 'Male' => 'male')
468
518
  t1.map_column!('male') { |m| m == 'true' }
469
519
  t2 = DataTable.from([
470
- ['name', 'male'],
520
+ %w(name male),
471
521
  ['aslak', true]
472
522
  ])
473
523
  t1.diff!(t2)
@@ -477,27 +527,28 @@ module Cucumber
477
527
  }
478
528
  end
479
529
 
480
- it "should detect seemingly identical tables as different" do
530
+ it 'should detect seemingly identical tables as different' do
481
531
  t1 = DataTable.from([
482
- ['X', 'Y'],
483
- ['2', '1']
532
+ %w(X Y),
533
+ %w(2 1)
484
534
  ])
485
535
  t2 = DataTable.from([
486
- ['X', 'Y'],
536
+ %w(X Y),
487
537
  [2, 1]
488
538
  ])
489
- expect { t1.diff!(t2) }.to raise_error
490
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
491
- | X | Y |
492
- | (-) (i) "2" | (-) (i) "1" |
493
- | (+) (i) 2 | (+) (i) 1 |
494
- }
539
+ expect { t1.diff!(t2) }.to raise_error(DataTable::Different) do |error|
540
+ expect(error.table.to_s(indent: 14, color: false)).to eq %{
541
+ | X | Y |
542
+ | (-) (i) "2" | (-) (i) "1" |
543
+ | (+) (i) 2 | (+) (i) 1 |
544
+ }
545
+ end
495
546
  end
496
547
 
497
- it "should not allow mappings that match more than 1 column" do
548
+ it 'should not allow mappings that match more than 1 column' do
498
549
  t1 = DataTable.from([
499
- ['Cuke', 'Duke'],
500
- ['Foo', 'Bar']
550
+ %w(Cuke Duke),
551
+ %w(Foo Bar)
501
552
  ])
502
553
  expect do
503
554
  t1.map_headers!(/uk/ => 'u')
@@ -505,7 +556,7 @@ module Cucumber
505
556
  end.to raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
506
557
  end
507
558
 
508
- describe "raising" do
559
+ describe 'raising' do
509
560
  before do
510
561
  @t = DataTable.from(%{
511
562
  | a | b |
@@ -514,25 +565,25 @@ module Cucumber
514
565
  expect( @t ).not_to eq nil
515
566
  end
516
567
 
517
- it "should raise on missing rows" do
568
+ it 'should raise on missing rows' do
518
569
  t = DataTable.from(%{
519
570
  | a | b |
520
571
  })
521
- expect( lambda { @t.dup.diff!(t) } ).to raise_error
572
+ expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
522
573
  expect { @t.dup.diff!(t, :missing_row => false) }.not_to raise_error
523
574
  end
524
575
 
525
- it "should not raise on surplus rows when surplus is at the end" do
576
+ it 'should not raise on surplus rows when surplus is at the end' do
526
577
  t = DataTable.from(%{
527
578
  | a | b |
528
579
  | c | d |
529
580
  | e | f |
530
581
  })
531
- expect { @t.dup.diff!(t) }.to raise_error
582
+ expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
532
583
  expect { @t.dup.diff!(t, :surplus_row => false) }.not_to raise_error
533
584
  end
534
585
 
535
- it "should not raise on surplus rows when surplus is interleaved" do
586
+ it 'should not raise on surplus rows when surplus is interleaved' do
536
587
  t1 = DataTable.from(%{
537
588
  | row_1 | row_2 |
538
589
  | four | 4 |
@@ -545,40 +596,39 @@ module Cucumber
545
596
  | four | 4 |
546
597
  | five | 5 |
547
598
  })
548
- expect { t1.dup.diff!(t2) }.to raise_error
549
-
599
+ expect { t1.dup.diff!(t2) }.to raise_error(DataTable::Different)
550
600
  expect { t1.dup.diff!(t2, :surplus_row => false) }.not_to raise_error
551
601
  end
552
602
 
553
- it "should raise on missing columns" do
603
+ it 'should raise on missing columns' do
554
604
  t = DataTable.from(%{
555
605
  | a |
556
606
  | c |
557
607
  })
558
- expect { @t.dup.diff!(t) }.to raise_error
608
+ expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
559
609
  expect { @t.dup.diff!(t, :missing_col => false) }.not_to raise_error
560
610
  end
561
611
 
562
- it "should not raise on surplus columns" do
612
+ it 'should not raise on surplus columns' do
563
613
  t = DataTable.from(%{
564
614
  | a | b | x |
565
615
  | c | d | y |
566
616
  })
567
617
  expect { @t.dup.diff!(t) }.not_to raise_error
568
- expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error
618
+ expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error(DataTable::Different)
569
619
  end
570
620
 
571
- it "should not raise on misplaced columns" do
621
+ it 'should not raise on misplaced columns' do
572
622
  t = DataTable.from(%{
573
623
  | b | a |
574
624
  | d | c |
575
625
  })
576
626
  expect { @t.dup.diff!(t) }.not_to raise_error
577
- expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error
627
+ expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error(DataTable::Different)
578
628
  end
579
629
  end
580
630
 
581
- it "can compare to an Array" do
631
+ it 'can compare to an Array' do
582
632
  t = DataTable.from(%{
583
633
  | b | a |
584
634
  | d | c |
@@ -589,8 +639,8 @@ module Cucumber
589
639
  end
590
640
  end
591
641
 
592
- describe "#from" do
593
- it "should allow Array of Hash" do
642
+ describe '#from' do
643
+ it 'should allow Array of Hash' do
594
644
  t1 = DataTable.from([{'name' => 'aslak', 'male' => 'true'}])
595
645
  expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
596
646
  | male | name |