cucumber 3.0.1 → 3.2.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 (517) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +84 -4
  3. data/CONTRIBUTING.md +3 -4
  4. data/README.md +12 -12
  5. data/lib/autotest/cucumber.rb +1 -0
  6. data/lib/autotest/cucumber_mixin.rb +1 -0
  7. data/lib/autotest/cucumber_rails.rb +1 -0
  8. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  10. data/lib/autotest/cucumber_rspec.rb +1 -0
  11. data/lib/autotest/cucumber_rspec2.rb +1 -0
  12. data/lib/autotest/discover.rb +1 -0
  13. data/lib/cucumber.rb +1 -0
  14. data/lib/cucumber/cli/configuration.rb +1 -0
  15. data/lib/cucumber/cli/main.rb +2 -2
  16. data/lib/cucumber/cli/options.rb +63 -55
  17. data/lib/cucumber/cli/profile_loader.rb +5 -7
  18. data/lib/cucumber/cli/rerun_file.rb +1 -0
  19. data/lib/cucumber/configuration.rb +8 -7
  20. data/lib/cucumber/constantize.rb +6 -5
  21. data/lib/cucumber/core_ext/string.rb +1 -0
  22. data/lib/cucumber/deprecate.rb +1 -1
  23. data/lib/cucumber/encoding.rb +2 -1
  24. data/lib/cucumber/errors.rb +2 -1
  25. data/lib/cucumber/events.rb +1 -2
  26. data/lib/cucumber/events/gherkin_source_read.rb +1 -4
  27. data/lib/cucumber/events/step_activated.rb +4 -5
  28. data/lib/cucumber/events/step_definition_registered.rb +4 -8
  29. data/lib/cucumber/events/test_case_finished.rb +0 -4
  30. data/lib/cucumber/events/test_case_started.rb +0 -4
  31. data/lib/cucumber/events/test_run_finished.rb +2 -3
  32. data/lib/cucumber/events/test_run_started.rb +2 -4
  33. data/lib/cucumber/events/test_step_finished.rb +0 -6
  34. data/lib/cucumber/events/test_step_started.rb +1 -7
  35. data/lib/cucumber/file_specs.rb +2 -1
  36. data/lib/cucumber/filters.rb +1 -0
  37. data/lib/cucumber/filters/activate_steps.rb +1 -1
  38. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  39. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  40. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  41. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  42. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
  43. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  44. data/lib/cucumber/filters/prepare_world.rb +2 -5
  45. data/lib/cucumber/filters/quit.rb +2 -4
  46. data/lib/cucumber/filters/randomizer.rb +6 -7
  47. data/lib/cucumber/filters/retry.rb +2 -2
  48. data/lib/cucumber/filters/tag_limits.rb +2 -2
  49. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  50. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -2
  51. data/lib/cucumber/formatter/ansicolor.rb +13 -12
  52. data/lib/cucumber/formatter/backtrace_filter.rb +1 -2
  53. data/lib/cucumber/formatter/console.rb +11 -12
  54. data/lib/cucumber/formatter/console_counts.rb +4 -4
  55. data/lib/cucumber/formatter/console_issues.rb +3 -3
  56. data/lib/cucumber/formatter/duration.rb +1 -0
  57. data/lib/cucumber/formatter/duration_extractor.rb +1 -1
  58. data/lib/cucumber/formatter/fail_fast.rb +9 -6
  59. data/lib/cucumber/formatter/fanout.rb +1 -3
  60. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  61. data/lib/cucumber/formatter/html.rb +28 -32
  62. data/lib/cucumber/formatter/html_builder.rb +3 -2
  63. data/lib/cucumber/formatter/http_io.rb +146 -0
  64. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -3
  65. data/lib/cucumber/formatter/interceptor.rb +18 -5
  66. data/lib/cucumber/formatter/io.rb +18 -11
  67. data/lib/cucumber/formatter/json.rb +11 -4
  68. data/lib/cucumber/formatter/json_pretty.rb +1 -1
  69. data/lib/cucumber/formatter/junit.rb +22 -17
  70. data/lib/cucumber/formatter/pretty.rb +4 -3
  71. data/lib/cucumber/formatter/progress.rb +3 -2
  72. data/lib/cucumber/formatter/rerun.rb +2 -1
  73. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  74. data/lib/cucumber/formatter/steps.rb +2 -2
  75. data/lib/cucumber/formatter/summary.rb +1 -2
  76. data/lib/cucumber/formatter/unicode.rb +2 -2
  77. data/lib/cucumber/formatter/usage.rb +22 -19
  78. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  79. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +86 -85
  80. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  81. data/lib/cucumber/gherkin/i18n.rb +1 -0
  82. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  83. data/lib/cucumber/glue/dsl.rb +1 -0
  84. data/lib/cucumber/glue/hook.rb +1 -0
  85. data/lib/cucumber/glue/invoke_in_world.rb +3 -3
  86. data/lib/cucumber/glue/proto_world.rb +10 -9
  87. data/lib/cucumber/glue/registry_and_more.rb +13 -12
  88. data/lib/cucumber/glue/snippet.rb +1 -5
  89. data/lib/cucumber/glue/step_definition.rb +10 -10
  90. data/lib/cucumber/glue/world_factory.rb +1 -3
  91. data/lib/cucumber/hooks.rb +13 -3
  92. data/lib/cucumber/load_path.rb +1 -0
  93. data/lib/cucumber/multiline_argument.rb +3 -3
  94. data/lib/cucumber/multiline_argument/data_table.rb +16 -20
  95. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +7 -11
  96. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  97. data/lib/cucumber/platform.rb +2 -1
  98. data/lib/cucumber/project_initializer.rb +1 -1
  99. data/lib/cucumber/rake/task.rb +8 -5
  100. data/lib/cucumber/rspec/disable_option_parser.rb +1 -0
  101. data/lib/cucumber/rspec/doubles.rb +1 -0
  102. data/lib/cucumber/running_test_case.rb +2 -1
  103. data/lib/cucumber/runtime.rb +6 -6
  104. data/lib/cucumber/runtime/after_hooks.rb +1 -0
  105. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  106. data/lib/cucumber/runtime/for_programming_languages.rb +8 -7
  107. data/lib/cucumber/runtime/step_hooks.rb +2 -0
  108. data/lib/cucumber/runtime/support_code.rb +3 -7
  109. data/lib/cucumber/runtime/user_interface.rb +2 -3
  110. data/lib/cucumber/step_argument.rb +1 -0
  111. data/lib/cucumber/step_definition_light.rb +2 -1
  112. data/lib/cucumber/step_definitions.rb +2 -1
  113. data/lib/cucumber/step_match.rb +9 -8
  114. data/lib/cucumber/step_match_search.rb +8 -9
  115. data/lib/cucumber/term/ansicolor.rb +30 -30
  116. data/lib/cucumber/unit.rb +1 -0
  117. data/lib/cucumber/version +1 -1
  118. data/lib/simplecov_setup.rb +1 -0
  119. metadata +64 -659
  120. data/.coveralls.yml +0 -1
  121. data/.cucumberproignore +0 -6
  122. data/.gitattributes +0 -32
  123. data/.github/ISSUE_TEMPLATE.md +0 -48
  124. data/.github/PULL_REQUEST_TEMPLATE.md +0 -40
  125. data/.rspec +0 -1
  126. data/.rubocop.yml +0 -13
  127. data/.rubocop_todo.yml +0 -991
  128. data/.ruby-gemset +0 -1
  129. data/.travis.yml +0 -70
  130. data/.yardopts +0 -1
  131. data/Gemfile +0 -28
  132. data/Rakefile +0 -32
  133. data/appveyor.yml +0 -27
  134. data/cucumber.gemspec +0 -52
  135. data/cucumber.yml +0 -19
  136. data/examples/i18n/README.textile +0 -3
  137. data/examples/i18n/Rakefile +0 -33
  138. data/examples/i18n/ar/Rakefile +0 -6
  139. data/examples/i18n/ar/features/addition.feature +0 -17
  140. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -29
  141. data/examples/i18n/ar/lib/calculator.rb +0 -11
  142. data/examples/i18n/bg/Rakefile +0 -6
  143. data/examples/i18n/bg/features/addition.feature +0 -12
  144. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  145. data/examples/i18n/bg/features/division.feature +0 -17
  146. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  147. data/examples/i18n/bg/features/support/env.rb +0 -10
  148. data/examples/i18n/bg/features/support/world.rb +0 -8
  149. data/examples/i18n/bg/lib/calculator.rb +0 -25
  150. data/examples/i18n/ca/Rakefile +0 -6
  151. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -26
  152. data/examples/i18n/ca/features/suma.feature +0 -17
  153. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  154. data/examples/i18n/cs/Rakefile +0 -6
  155. data/examples/i18n/cs/features/addition.feature +0 -17
  156. data/examples/i18n/cs/features/division.feature +0 -11
  157. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -29
  158. data/examples/i18n/cs/lib/calculator.rb +0 -14
  159. data/examples/i18n/da/Rakefile +0 -6
  160. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  161. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -29
  162. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  163. data/examples/i18n/de/Rakefile +0 -6
  164. data/examples/i18n/de/features/addition.feature +0 -17
  165. data/examples/i18n/de/features/division.feature +0 -10
  166. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -29
  167. data/examples/i18n/de/lib/calculator.rb +0 -14
  168. data/examples/i18n/el/Rakefile +0 -6
  169. data/examples/i18n/el/features/addition.feature +0 -17
  170. data/examples/i18n/el/features/division.feature +0 -10
  171. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -29
  172. data/examples/i18n/el/lib/calculator.rb +0 -14
  173. data/examples/i18n/en-lol/Rakefile +0 -4
  174. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  175. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  176. data/examples/i18n/en-lol/features/support/env.rb +0 -11
  177. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  178. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  179. data/examples/i18n/en/Rakefile +0 -6
  180. data/examples/i18n/en/features/addition.feature +0 -17
  181. data/examples/i18n/en/features/division.feature +0 -10
  182. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -29
  183. data/examples/i18n/en/lib/calculator.rb +0 -14
  184. data/examples/i18n/eo/Rakefile +0 -6
  185. data/examples/i18n/eo/features/adicio.feature +0 -17
  186. data/examples/i18n/eo/features/divido.feature +0 -10
  187. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -29
  188. data/examples/i18n/eo/lib/calculator.rb +0 -14
  189. data/examples/i18n/es/Rakefile +0 -6
  190. data/examples/i18n/es/features/adicion.feature +0 -17
  191. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -26
  192. data/examples/i18n/es/lib/calculador.rb +0 -14
  193. data/examples/i18n/et/Rakefile +0 -6
  194. data/examples/i18n/et/features/jagamine.feature +0 -10
  195. data/examples/i18n/et/features/liitmine.feature +0 -17
  196. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -29
  197. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  198. data/examples/i18n/fi/Rakefile +0 -6
  199. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  200. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -29
  201. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  202. data/examples/i18n/fi/lib/laskin.rb +0 -14
  203. data/examples/i18n/fr/Rakefile +0 -8
  204. data/examples/i18n/fr/features/addition.feature +0 -18
  205. data/examples/i18n/fr/features/addition2.feature +0 -17
  206. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  207. data/examples/i18n/fr/features/support/env.rb +0 -10
  208. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  209. data/examples/i18n/he/Rakefile +0 -6
  210. data/examples/i18n/he/features/addition.feature +0 -17
  211. data/examples/i18n/he/features/division.feature +0 -10
  212. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -29
  213. data/examples/i18n/he/lib/calculator.rb +0 -15
  214. data/examples/i18n/hi/Rakefile +0 -6
  215. data/examples/i18n/hi/features/addition.feature +0 -16
  216. data/examples/i18n/hi/features/division.feature +0 -10
  217. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -29
  218. data/examples/i18n/hi/lib/calculator.rb +0 -15
  219. data/examples/i18n/ht/Rakefile +0 -6
  220. data/examples/i18n/ht/features/adisyon.feature +0 -17
  221. data/examples/i18n/ht/features/divizyon.feature +0 -10
  222. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +0 -29
  223. data/examples/i18n/ht/lib/kalkilatris.rb +0 -14
  224. data/examples/i18n/hu/Rakefile +0 -6
  225. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  226. data/examples/i18n/hu/features/osztas.feature +0 -10
  227. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -30
  228. data/examples/i18n/hu/lib/calculator.rb +0 -14
  229. data/examples/i18n/id/Rakefile +0 -6
  230. data/examples/i18n/id/features/addition.feature +0 -17
  231. data/examples/i18n/id/features/division.feature +0 -10
  232. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -29
  233. data/examples/i18n/id/lib/calculator.rb +0 -14
  234. data/examples/i18n/it/Rakefile +0 -6
  235. data/examples/i18n/it/features/somma.feature +0 -11
  236. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -29
  237. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  238. data/examples/i18n/ja/Rakefile +0 -6
  239. data/examples/i18n/ja/features/addition.feature +0 -17
  240. data/examples/i18n/ja/features/division.feature +0 -10
  241. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  242. data/examples/i18n/ja/features/support/env.rb +0 -10
  243. data/examples/i18n/ja/lib/calculator.rb +0 -14
  244. data/examples/i18n/ko/Rakefile +0 -6
  245. data/examples/i18n/ko/features/addition.feature +0 -17
  246. data/examples/i18n/ko/features/division.feature +0 -11
  247. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -29
  248. data/examples/i18n/ko/lib/calculator.rb +0 -14
  249. data/examples/i18n/lt/Rakefile +0 -6
  250. data/examples/i18n/lt/features/addition.feature +0 -17
  251. data/examples/i18n/lt/features/division.feature +0 -10
  252. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -29
  253. data/examples/i18n/lt/lib/calculator.rb +0 -14
  254. data/examples/i18n/lv/Rakefile +0 -6
  255. data/examples/i18n/lv/features/addition.feature +0 -17
  256. data/examples/i18n/lv/features/division.feature +0 -10
  257. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -29
  258. data/examples/i18n/lv/lib/calculator.rb +0 -14
  259. data/examples/i18n/no/Rakefile +0 -6
  260. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  261. data/examples/i18n/no/features/summering.feature +0 -19
  262. data/examples/i18n/no/features/support/env.rb +0 -11
  263. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  264. data/examples/i18n/pl/Rakefile +0 -6
  265. data/examples/i18n/pl/features/addition.feature +0 -17
  266. data/examples/i18n/pl/features/division.feature +0 -10
  267. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -29
  268. data/examples/i18n/pl/features/support/env.rb +0 -10
  269. data/examples/i18n/pl/lib/calculator.rb +0 -14
  270. data/examples/i18n/pt/Rakefile +0 -6
  271. data/examples/i18n/pt/features/adicao.feature +0 -11
  272. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  273. data/examples/i18n/pt/features/support/env.rb +0 -10
  274. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  275. data/examples/i18n/ro/Rakefile +0 -6
  276. data/examples/i18n/ro/features/adunare.feature +0 -12
  277. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -26
  278. data/examples/i18n/ro/lib/calculator.rb +0 -11
  279. data/examples/i18n/ru/Rakefile +0 -6
  280. data/examples/i18n/ru/features/addition.feature +0 -11
  281. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  282. data/examples/i18n/ru/features/division.feature +0 -16
  283. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  284. data/examples/i18n/ru/features/support/env.rb +0 -10
  285. data/examples/i18n/ru/features/support/world.rb +0 -8
  286. data/examples/i18n/ru/lib/calculator.rb +0 -25
  287. data/examples/i18n/sk/Rakefile +0 -6
  288. data/examples/i18n/sk/features/addition.feature +0 -17
  289. data/examples/i18n/sk/features/division.feature +0 -10
  290. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -29
  291. data/examples/i18n/sk/lib/calculator.rb +0 -14
  292. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  293. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  294. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  295. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -10
  296. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  297. data/examples/i18n/sr-Latn/Rakefile +0 -6
  298. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  299. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -29
  300. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  301. data/examples/i18n/sv/Rakefile +0 -6
  302. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -29
  303. data/examples/i18n/sv/features/summering.feature +0 -18
  304. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  305. data/examples/i18n/tr/Rakefile +0 -6
  306. data/examples/i18n/tr/features/bolme.feature +0 -10
  307. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -29
  308. data/examples/i18n/tr/features/toplama.feature +0 -18
  309. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  310. data/examples/i18n/uk/Rakefile +0 -6
  311. data/examples/i18n/uk/features/addition.feature +0 -11
  312. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  313. data/examples/i18n/uk/features/division.feature +0 -16
  314. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  315. data/examples/i18n/uk/features/support/env.rb +0 -10
  316. data/examples/i18n/uk/features/support/world.rb +0 -8
  317. data/examples/i18n/uk/lib/calculator.rb +0 -25
  318. data/examples/i18n/uz/Rakefile +0 -6
  319. data/examples/i18n/uz/features/addition.feature +0 -10
  320. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  321. data/examples/i18n/uz/features/division.feature +0 -17
  322. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  323. data/examples/i18n/uz/features/support/env.rb +0 -10
  324. data/examples/i18n/uz/features/support/world.rb +0 -8
  325. data/examples/i18n/uz/lib/calculator.rb +0 -25
  326. data/examples/i18n/zh-CN/Rakefile +0 -4
  327. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  328. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -31
  329. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  330. data/examples/i18n/zh-TW/Rakefile +0 -4
  331. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  332. data/examples/i18n/zh-TW/features/division.feature +0 -11
  333. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -29
  334. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  335. data/examples/rspec_doubles/Rakefile +0 -4
  336. data/examples/rspec_doubles/features/mocking.feature +0 -9
  337. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  338. data/examples/rspec_doubles/features/support/env.rb +0 -12
  339. data/examples/sinatra/README.textile +0 -13
  340. data/examples/sinatra/Rakefile +0 -6
  341. data/examples/sinatra/app.rb +0 -14
  342. data/examples/sinatra/features/add.feature +0 -11
  343. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  344. data/examples/sinatra/features/support/env.rb +0 -15
  345. data/examples/sinatra/views/add.erb +0 -7
  346. data/examples/sinatra/views/layout.erb +0 -8
  347. data/examples/tcl/README.textile +0 -11
  348. data/examples/tcl/Rakefile +0 -6
  349. data/examples/tcl/features/fibonnacci.feature +0 -17
  350. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  351. data/examples/tcl/features/support/env.rb +0 -7
  352. data/examples/tcl/src/fib.tcl +0 -3
  353. data/examples/test_unit/Gemfile +0 -4
  354. data/examples/test_unit/Rakefile +0 -6
  355. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  356. data/examples/test_unit/features/test_unit.feature +0 -9
  357. data/examples/watir/README.textile +0 -16
  358. data/examples/watir/Rakefile +0 -12
  359. data/examples/watir/cucumber.yml +0 -1
  360. data/examples/watir/features/search.feature +0 -12
  361. data/examples/watir/features/step_definitions/search_steps.rb +0 -27
  362. data/examples/watir/features/support/env.rb +0 -39
  363. data/examples/watir/features/support/screenshots.rb +0 -47
  364. data/features/docs/api/list_step_defs_as_json.feature +0 -64
  365. data/features/docs/api/listen_for_events.feature +0 -59
  366. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -27
  367. data/features/docs/cli/backtraces.feature +0 -36
  368. data/features/docs/cli/dry_run.feature +0 -73
  369. data/features/docs/cli/exclude_files.feature +0 -18
  370. data/features/docs/cli/execute_with_tag_filter.feature +0 -119
  371. data/features/docs/cli/fail_fast.feature +0 -48
  372. data/features/docs/cli/finding_steps.feature +0 -28
  373. data/features/docs/cli/help.feature +0 -8
  374. data/features/docs/cli/i18n.feature +0 -42
  375. data/features/docs/cli/randomize.feature +0 -140
  376. data/features/docs/cli/require.feature +0 -27
  377. data/features/docs/cli/retry_failing_tests.feature +0 -92
  378. data/features/docs/cli/run_scenarios_matching_name.feature +0 -105
  379. data/features/docs/cli/run_specific_scenarios.feature +0 -77
  380. data/features/docs/cli/showing_differences.feature +0 -43
  381. data/features/docs/cli/specifying_multiple_formatters.feature +0 -68
  382. data/features/docs/cli/strict_mode.feature +0 -70
  383. data/features/docs/defining_steps/ambiguous_steps.feature +0 -89
  384. data/features/docs/defining_steps/nested_steps.feature +0 -181
  385. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -37
  386. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -56
  387. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  388. data/features/docs/defining_steps/printing_messages.feature +0 -147
  389. data/features/docs/defining_steps/skip_scenario.feature +0 -31
  390. data/features/docs/defining_steps/snippets.feature +0 -56
  391. data/features/docs/defining_steps/table_diffing.feature +0 -50
  392. data/features/docs/events/gherkin_source_read_event.feature +0 -43
  393. data/features/docs/events/step_activated_event.feature +0 -36
  394. data/features/docs/events/step_definition_registered_event.feature +0 -29
  395. data/features/docs/events/test_case_finished_event.feature +0 -35
  396. data/features/docs/events/test_case_started_event.feature +0 -54
  397. data/features/docs/events/test_run_finished_event.feature +0 -40
  398. data/features/docs/events/test_run_started_event.feature +0 -41
  399. data/features/docs/events/test_step_finished_event.feature +0 -47
  400. data/features/docs/events/test_step_started_event.feature +0 -43
  401. data/features/docs/exception_in_after_hook.feature +0 -127
  402. data/features/docs/exception_in_after_step_hook.feature +0 -104
  403. data/features/docs/exception_in_around_hook.feature +0 -80
  404. data/features/docs/exception_in_before_hook.feature +0 -98
  405. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  406. data/features/docs/extending_cucumber/custom_formatter.feature +0 -94
  407. data/features/docs/formatters/api_methods.feature +0 -37
  408. data/features/docs/formatters/html_formatter.feature +0 -91
  409. data/features/docs/formatters/json_formatter.feature +0 -767
  410. data/features/docs/formatters/junit_formatter.feature +0 -455
  411. data/features/docs/formatters/pretty_formatter.feature +0 -74
  412. data/features/docs/formatters/progress_formatter.feature +0 -32
  413. data/features/docs/formatters/rerun_formatter.feature +0 -190
  414. data/features/docs/formatters/summary_formatter.feature +0 -35
  415. data/features/docs/formatters/usage_formatter.feature +0 -101
  416. data/features/docs/getting_started.feature +0 -28
  417. data/features/docs/gherkin/background.feature +0 -548
  418. data/features/docs/gherkin/doc_strings.feature +0 -76
  419. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -47
  420. data/features/docs/gherkin/language_from_header.feature +0 -32
  421. data/features/docs/gherkin/outlines.feature +0 -158
  422. data/features/docs/gherkin/unicode_table.feature +0 -33
  423. data/features/docs/gherkin/using_descriptions.feature +0 -83
  424. data/features/docs/gherkin/using_star_notation.feature +0 -37
  425. data/features/docs/iso-8859-1.feature +0 -6
  426. data/features/docs/post_configuration_hook.feature +0 -33
  427. data/features/docs/profiles.feature +0 -120
  428. data/features/docs/rake_task.feature +0 -146
  429. data/features/docs/raketask.feature +0 -46
  430. data/features/docs/work_in_progress.feature +0 -157
  431. data/features/docs/writing_support_code/after_hooks.feature +0 -102
  432. data/features/docs/writing_support_code/after_step_hooks.feature +0 -55
  433. data/features/docs/writing_support_code/around_hooks.feature +0 -266
  434. data/features/docs/writing_support_code/before_hook.feature +0 -66
  435. data/features/docs/writing_support_code/hook_order.feature +0 -63
  436. data/features/docs/writing_support_code/load_path.feature +0 -17
  437. data/features/docs/writing_support_code/parameter_types.feature +0 -69
  438. data/features/docs/writing_support_code/state.feature +0 -32
  439. data/features/docs/writing_support_code/tagged_hooks.feature +0 -95
  440. data/features/docs/writing_support_code/world.feature +0 -129
  441. data/features/lib/step_definitions/aruba_steps.rb +0 -21
  442. data/features/lib/step_definitions/cli_steps.rb +0 -4
  443. data/features/lib/step_definitions/cucumber_steps.rb +0 -75
  444. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -16
  445. data/features/lib/step_definitions/json_steps.rb +0 -8
  446. data/features/lib/step_definitions/junit_steps.rb +0 -14
  447. data/features/lib/step_definitions/language_steps.rb +0 -9
  448. data/features/lib/step_definitions/profile_steps.rb +0 -16
  449. data/features/lib/step_definitions/retry_steps.rb +0 -55
  450. data/features/lib/step_definitions/ruby_steps.rb +0 -4
  451. data/features/lib/support/env.rb +0 -22
  452. data/features/lib/support/fake_wire_server.rb +0 -94
  453. data/features/lib/support/feature_factory.rb +0 -68
  454. data/features/lib/support/normalise_output.rb +0 -52
  455. data/features/lib/support/parameter_types.rb +0 -5
  456. data/gem_tasks/contributors.rake +0 -19
  457. data/gem_tasks/cov.rake +0 -6
  458. data/gem_tasks/downloads.rb +0 -8
  459. data/gem_tasks/environment.rake +0 -4
  460. data/gem_tasks/examples.rake +0 -12
  461. data/gem_tasks/fix_cr_lf.rake +0 -22
  462. data/gem_tasks/flog.rake +0 -5
  463. data/gem_tasks/rspec.rake +0 -7
  464. data/gem_tasks/sass.rake +0 -5
  465. data/gem_tasks/stats +0 -16
  466. data/gem_tasks/versions.txt +0 -74
  467. data/scripts/invite-collaborator +0 -40
  468. data/scripts/update-changelog +0 -86
  469. data/spec/cucumber/cli/configuration_spec.rb +0 -446
  470. data/spec/cucumber/cli/main_spec.rb +0 -84
  471. data/spec/cucumber/cli/options_spec.rb +0 -445
  472. data/spec/cucumber/cli/profile_loader_spec.rb +0 -66
  473. data/spec/cucumber/cli/rerun_spec.rb +0 -86
  474. data/spec/cucumber/configuration_spec.rb +0 -148
  475. data/spec/cucumber/constantize_spec.rb +0 -20
  476. data/spec/cucumber/events_spec.rb +0 -9
  477. data/spec/cucumber/file_specs_spec.rb +0 -61
  478. data/spec/cucumber/filters/activate_steps_spec.rb +0 -152
  479. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -48
  480. data/spec/cucumber/filters/retry_spec.rb +0 -98
  481. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -39
  482. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -58
  483. data/spec/cucumber/filters/tag_limits_spec.rb +0 -60
  484. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -33
  485. data/spec/cucumber/formatter/backtrace_filter_spec.rb +0 -32
  486. data/spec/cucumber/formatter/console_counts_spec.rb +0 -14
  487. data/spec/cucumber/formatter/duration_spec.rb +0 -23
  488. data/spec/cucumber/formatter/fail_fast_spec.rb +0 -88
  489. data/spec/cucumber/formatter/html_spec.rb +0 -543
  490. data/spec/cucumber/formatter/interceptor_spec.rb +0 -137
  491. data/spec/cucumber/formatter/json_spec.rb +0 -815
  492. data/spec/cucumber/formatter/junit_spec.rb +0 -251
  493. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2175
  494. data/spec/cucumber/formatter/pretty_spec.rb +0 -907
  495. data/spec/cucumber/formatter/progress_spec.rb +0 -170
  496. data/spec/cucumber/formatter/rerun_spec.rb +0 -97
  497. data/spec/cucumber/formatter/spec_helper.rb +0 -84
  498. data/spec/cucumber/glue/proto_world_spec.rb +0 -63
  499. data/spec/cucumber/glue/registry_and_more_spec.rb +0 -213
  500. data/spec/cucumber/glue/snippet_spec.rb +0 -174
  501. data/spec/cucumber/glue/step_definition_spec.rb +0 -207
  502. data/spec/cucumber/hooks_spec.rb +0 -31
  503. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -653
  504. data/spec/cucumber/project_initializer_spec.rb +0 -88
  505. data/spec/cucumber/rake/forked_spec.rb +0 -58
  506. data/spec/cucumber/rake/task_spec.rb +0 -86
  507. data/spec/cucumber/running_test_case_spec.rb +0 -140
  508. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -8
  509. data/spec/cucumber/runtime/support_code_spec.rb +0 -17
  510. data/spec/cucumber/runtime_spec.rb +0 -21
  511. data/spec/cucumber/sell_cucumbers.feature +0 -19
  512. data/spec/cucumber/step_argument_spec.rb +0 -19
  513. data/spec/cucumber/step_match_search_spec.rb +0 -113
  514. data/spec/cucumber/step_match_spec.rb +0 -86
  515. data/spec/cucumber/world/pending_spec.rb +0 -48
  516. data/spec/spec_helper.rb +0 -30
  517. data/spec/support/standard_step_actions.rb +0 -19
@@ -1,174 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
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'
7
-
8
- module Cucumber
9
- module Glue
10
- describe Snippet do
11
- let(:code_keyword) { 'Given' }
12
-
13
- before do
14
- @step_text = 'we have a missing step'
15
- @multiline_argument = Core::Ast::EmptyMultilineArgument.new
16
- @registry = CucumberExpressions::ParameterTypeRegistry.new
17
- @cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@registry)
18
- end
19
-
20
- let(:snippet) do
21
- snippet_class.new(@cucumber_expression_generator, code_keyword, @step_text, @multiline_argument)
22
- end
23
-
24
- def unindented(s)
25
- s.split("\n")[1..-2].join("\n").indent(-10)
26
- end
27
-
28
- describe Snippet::Regexp do
29
- let(:snippet_class) { Snippet::Regexp }
30
- let(:snippet_text) { snippet.to_s }
31
-
32
- it 'wraps snippet patterns in parentheses' do
33
- @step_text = 'A "string" with 4 spaces'
34
-
35
- expect(snippet_text).to eq unindented(%{
36
- Given(/^A "([^"]*)" with (\\d+) spaces$/) do |arg1, arg2|
37
- pending # Write code here that turns the phrase above into concrete actions
38
- end
39
- })
40
- end
41
-
42
- it 'recognises numbers in name and make according regexp' do
43
- @step_text = 'Cloud 9 yeah'
44
-
45
- expect(snippet_text).to eq unindented(%{
46
- Given(/^Cloud (\\d+) yeah$/) do |arg1|
47
- pending # Write code here that turns the phrase above into concrete actions
48
- end
49
- })
50
- end
51
-
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"'
54
- @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
55
-
56
- expect(snippet_text).to eq unindented(%{
57
- Given(/^I have (\\d+) "([^"]*)" cukes in (\\d+) "([^"]*)"$/) do |arg1, arg2, arg3, arg4, table|
58
- # table is a Cucumber::MultilineArgument::DataTable
59
- pending # Write code here that turns the phrase above into concrete actions
60
- end
61
- })
62
- end
63
-
64
- it 'recognises quotes in name and make according regexp' do
65
- @step_text = 'A "first" arg'
66
-
67
- expect(snippet_text).to eq unindented(%{
68
- Given(/^A "([^"]*)" arg$/) do |arg1|
69
- pending # Write code here that turns the phrase above into concrete actions
70
- end
71
- })
72
- end
73
-
74
- it 'recognises several quoted words in name and make according regexp and args' do
75
- @step_text = 'A "first" and "second" arg'
76
-
77
- expect(snippet_text).to eq unindented(%{
78
- Given(/^A "([^"]*)" and "([^"]*)" arg$/) do |arg1, arg2|
79
- pending # Write code here that turns the phrase above into concrete actions
80
- end
81
- })
82
- end
83
-
84
- it 'does not use quote group when there are no quotes' do
85
- @step_text = 'A first arg'
86
-
87
- expect(snippet_text).to eq unindented(%{
88
- Given(/^A first arg$/) do
89
- pending # Write code here that turns the phrase above into concrete actions
90
- end
91
- })
92
- end
93
-
94
- it 'is helpful with tables' do
95
- @step_text = 'A "first" arg'
96
- @multiline_argument = Core::Ast::DataTable.new([[]], Core::Ast::Location.new(''))
97
-
98
- expect(snippet_text).to eq unindented(%{
99
- Given(/^A "([^"]*)" arg$/) do |arg1, table|
100
- # table is a Cucumber::MultilineArgument::DataTable
101
- pending # Write code here that turns the phrase above into concrete actions
102
- end
103
- })
104
- end
105
-
106
- it 'is helpful with doc string' do
107
- @step_text = 'A "first" arg'
108
- @multiline_argument = MultilineArgument.from('', Core::Ast::Location.new(''))
109
-
110
- expect(snippet_text).to eq unindented(%{
111
- Given(/^A "([^"]*)" arg$/) do |arg1, string|
112
- pending # Write code here that turns the phrase above into concrete actions
113
- end
114
- })
115
- end
116
- end
117
-
118
- describe Snippet::Classic do
119
- let(:snippet_class) { Snippet::Classic }
120
-
121
- it 'renders snippet as unwrapped regular expression' do
122
- expect(snippet.to_s).to eq unindented(%{
123
- Given /^we have a missing step$/ do
124
- pending # Write code here that turns the phrase above into concrete actions
125
- end
126
- })
127
- end
128
- end
129
-
130
- describe Snippet::Percent do
131
- let(:snippet_class) { Snippet::Percent }
132
-
133
- it 'renders snippet as percent-style regular expression' do
134
- expect(snippet.to_s).to eq unindented(%{
135
- Given %r{^we have a missing step$} do
136
- pending # Write code here that turns the phrase above into concrete actions
137
- end
138
- })
139
- end
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
172
- end
173
- end
174
- end
@@ -1,207 +0,0 @@
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(:support_code) { Cucumber::Runtime::SupportCode.new(user_interface) }
10
- let(:registry) { support_code.registry }
11
- let(:scenario) { double('scenario', iso_code: 'en').as_null_object }
12
- let(:dsl) do
13
- registry
14
- Object.new.extend(Cucumber::Glue::Dsl)
15
- end
16
-
17
- before do
18
- registry.begin_scenario(scenario)
19
- $inside = nil
20
- end
21
-
22
- def run_step(text)
23
- step_match(text).invoke(MultilineArgument::None.new)
24
- end
25
-
26
- def step_match(text)
27
- StepMatchSearch.new(registry.method(:step_matches), Configuration.default).call(text).first
28
- end
29
-
30
- it 'allows calling of other steps' do
31
- dsl.Given(/Outside/) do
32
- step 'Inside'
33
- end
34
- dsl.Given(/Inside/) do
35
- $inside = true
36
- end
37
-
38
- run_step 'Outside'
39
-
40
- expect($inside).to be true
41
- end
42
-
43
- it 'allows calling of other steps with inline arg' do
44
- dsl.Given(/Outside/) do
45
- step 'Inside', table([['inside']])
46
- end
47
- dsl.Given(/Inside/) do |t|
48
- $inside = t.raw[0][0]
49
- end
50
-
51
- run_step 'Outside'
52
-
53
- expect($inside).to eq 'inside'
54
- end
55
-
56
- context 'mapping to world methods' do
57
- it 'calls a method on the world when specified with a symbol' do
58
- expect(registry.current_world).to receive(:with_symbol)
59
-
60
- dsl.Given(/With symbol/, :with_symbol)
61
-
62
- run_step 'With symbol'
63
- end
64
-
65
- it 'calls a method on a specified object' do
66
- target = double('target')
67
-
68
- allow(registry.current_world).to receive(:target) { target }
69
-
70
- dsl.Given(/With symbol on block/, :with_symbol, :on => lambda { target })
71
-
72
- expect(target).to receive(:with_symbol)
73
-
74
- run_step 'With symbol on block'
75
- end
76
-
77
- it 'calls a method on a specified world attribute' do
78
- target = double('target')
79
-
80
- allow(registry.current_world).to receive(:target) { target }
81
-
82
- dsl.Given(/With symbol on symbol/, :with_symbol, :on => :target)
83
-
84
- expect(target).to receive(:with_symbol)
85
-
86
- run_step 'With symbol on symbol'
87
- end
88
-
89
- it 'has the correct location' do
90
- dsl.Given(/With symbol/, :with_symbol)
91
- expect(step_match('With symbol').file_colon_line).to eq "spec/cucumber/glue/step_definition_spec.rb:#{__LINE__-1}"
92
- end
93
- end
94
-
95
- it 'raises UndefinedDynamicStep when inside step is not defined' do
96
- dsl.Given(/Outside/) do
97
- step 'Inside'
98
- end
99
-
100
- expect(-> {
101
- run_step 'Outside'
102
- }).to raise_error(Cucumber::UndefinedDynamicStep)
103
- end
104
-
105
- it 'raises UndefinedDynamicStep when an undefined step is parsed dynamically' do
106
- dsl.Given(/Outside/) do
107
- steps %{
108
- Given Inside
109
- }
110
- end
111
-
112
- expect(-> {
113
- run_step 'Outside'
114
- }).to raise_error(Cucumber::UndefinedDynamicStep)
115
- end
116
-
117
- it 'raises UndefinedDynamicStep when an undefined step with doc string is parsed dynamically' do
118
- dsl.Given(/Outside/) do
119
- steps %{
120
- Given Inside
121
- """
122
- abc
123
- """
124
- }
125
- end
126
-
127
- expect(-> {
128
- run_step 'Outside'
129
- }).to raise_error(Cucumber::UndefinedDynamicStep)
130
- end
131
-
132
- it 'raises UndefinedDynamicStep when an undefined step with data table is parsed dynamically' do
133
- dsl.Given(/Outside/) do
134
- steps %{
135
- Given Inside
136
- | a |
137
- | 1 |
138
- }
139
- end
140
-
141
- expect(-> {
142
- run_step 'Outside'
143
- }).to raise_error(Cucumber::UndefinedDynamicStep)
144
- end
145
-
146
- it 'allows forced pending' do
147
- dsl.Given(/Outside/) do
148
- pending('Do me!')
149
- end
150
-
151
- expect(-> {
152
- run_step 'Outside'
153
- }).to raise_error(Cucumber::Pending, 'Do me!')
154
- end
155
-
156
- it 'raises ArityMismatchError when the number of capture groups differs from the number of step arguments' do
157
- dsl.Given(/No group: \w+/) do |arg|
158
- end
159
-
160
- expect(-> {
161
- run_step 'No group: arg'
162
- }).to raise_error(Cucumber::Glue::ArityMismatchError)
163
- end
164
-
165
- it 'does not modify the step_match arg when arg is modified in a step' do
166
- dsl.Given(/My car is (.*)/) do |colour|
167
- colour << 'xxx'
168
- end
169
-
170
- step_name = 'My car is white'
171
- step_args = step_match(step_name).args
172
-
173
- expect(-> {
174
- run_step step_name
175
- }).not_to change{ step_args.first }
176
- end
177
-
178
- it 'allows puts' do
179
- expect(user_interface).to receive(:puts).with('wasup')
180
- dsl.Given(/Loud/) do
181
- puts 'wasup'
182
- end
183
- run_step 'Loud'
184
- end
185
-
186
- it 'recognizes $arg style captures' do
187
- arg_value = 'up'
188
- dsl.Given 'capture this: {word}' do |arg|
189
- expect(arg).to eq arg_value
190
- end
191
- run_step 'capture this: up'
192
- end
193
-
194
- it 'has a JSON representation of the signature' do
195
- expect(StepDefinition.new(registry, /I CAN HAZ (\d+) CUKES/i, lambda{}, {}).to_hash).to eq({
196
- source: {
197
- type: 'regular expression',
198
- expression: 'I CAN HAZ (\\d+) CUKES'
199
- },
200
- regexp: {
201
- source: 'I CAN HAZ (\\d+) CUKES', flags: 'i'
202
- }
203
- })
204
- end
205
- end
206
- end
207
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'cucumber/hooks'
3
- module Cucumber::Hooks
4
- shared_examples_for 'a source node' do
5
- it 'responds to text' do
6
- expect( subject.text ).to be_a(String)
7
- end
8
-
9
- it 'responds to location' do
10
- expect( subject.location ).to eq(location)
11
- end
12
-
13
- it 'responds to match_locations?' do
14
- expect( subject.match_locations? [location] ).to be_truthy
15
- expect( subject.match_locations? [] ).to be_falsey
16
- end
17
- end
18
-
19
- require 'cucumber/core/ast/location'
20
- describe BeforeHook do
21
- subject { BeforeHook.new(location) }
22
- let(:location) { Cucumber::Core::Ast::Location.new('hooks.rb', 1) }
23
- it_behaves_like 'a source node'
24
- end
25
-
26
- describe AfterHook do
27
- subject { AfterHook.new(location) }
28
- let(:location) { Cucumber::Core::Ast::Location.new('hooks.rb', 1) }
29
- it_behaves_like 'a source node'
30
- end
31
- end
@@ -1,653 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- require 'spec_helper'
4
- require 'cucumber/multiline_argument/data_table'
5
-
6
- module Cucumber
7
- module MultilineArgument
8
- describe DataTable do
9
- before do
10
- @table = DataTable.from([
11
- %w{one four seven},
12
- %w{4444 55555 666666}
13
- ])
14
- end
15
-
16
- it 'should have rows' do
17
- expect( @table.cells_rows[0].map{|cell| cell.value} ).to eq %w{one four seven}
18
- end
19
-
20
- it 'should have columns' do
21
- expect( @table.columns[1].map{|cell| cell.value} ).to eq %w{four 55555}
22
- end
23
-
24
- it 'should have same cell objects in rows and columns' do
25
- # 666666
26
- expect( @table.cells_rows[1][2] ).to equal(@table.columns[2][1])
27
- end
28
-
29
- it 'should be convertible to an array of hashes' do
30
- expect( @table.hashes ).to eq [
31
- {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
32
- ]
33
- end
34
-
35
- it 'should accept symbols as keys for the hashes' do
36
- expect( @table.hashes.first[:one] ).to eq '4444'
37
- end
38
-
39
- it 'should return the row values in order' do
40
- expect( @table.rows.first ).to eq %w{4444 55555 666666}
41
- end
42
-
43
- describe '#symbolic_hashes' do
44
-
45
- it 'should covert data table to an array of hashes with symbols as keys' do
46
- ast_table = Cucumber::Core::Ast::DataTable.new([['foo', 'Bar', 'Foo Bar'], %w{1 22 333}], nil)
47
- data_table = DataTable.new(ast_table)
48
- expect(data_table.symbolic_hashes).to eq([{:foo => '1', :bar => '22', :foo_bar => '333'}])
49
- end
50
-
51
- it 'should be able to be accessed multiple times' do
52
- @table.symbolic_hashes
53
- expect{@table.symbolic_hashes}.to_not raise_error
54
- end
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
-
61
- end
62
-
63
- describe '#map_column!' do
64
- it 'should allow mapping columns' do
65
- @table.map_column!('one') { |v| v.to_i }
66
- expect( @table.hashes.first['one'] ).to eq 4444
67
- end
68
-
69
- it 'applies the block once to each value' do
70
- headers = ['header']
71
- rows = ['value']
72
- table = DataTable.from [headers, rows]
73
- count = 0
74
- table.map_column!('header') { |value| count +=1 }
75
- table.rows
76
- expect( count ).to eq rows.size
77
- end
78
-
79
- it 'should allow mapping columns and take a symbol as the column name' do
80
- @table.map_column!(:one) { |v| v.to_i }
81
- expect( @table.hashes.first['one'] ).to eq 4444
82
- end
83
-
84
- it 'should allow mapping columns and modify the rows as well' do
85
- @table.map_column!(:one) { |v| v.to_i }
86
- expect( @table.rows.first ).to include(4444)
87
- expect( @table.rows.first ).to_not include('4444')
88
- end
89
-
90
- it 'should pass silently if a mapped column does not exist in non-strict mode' do
91
- expect {
92
- @table.map_column!('two', false) { |v| v.to_i }
93
- @table.hashes
94
- }.not_to raise_error
95
- end
96
-
97
- it 'should fail if a mapped column does not exist in strict mode' do
98
- expect {
99
- @table.map_column!('two', true) { |v| v.to_i }
100
- @table.hashes
101
- }.to raise_error('The column named "two" does not exist')
102
- end
103
-
104
- it 'should return the table' do
105
- expect( (@table.map_column!(:one) { |v| v.to_i }) ).to eq @table
106
- end
107
- end
108
-
109
- describe '#map_column' do
110
- it 'should allow mapping columns' do
111
- new_table = @table.map_column('one') { |v| v.to_i }
112
- expect( new_table.hashes.first['one'] ).to eq 4444
113
- end
114
-
115
- it 'applies the block once to each value' do
116
- headers = ['header']
117
- rows = ['value']
118
- table = DataTable.from [headers, rows]
119
- count = 0
120
- new_table = table.map_column('header') { |value| count +=1 }
121
- new_table.rows
122
- expect( count ).to eq rows.size
123
- end
124
-
125
- it 'should allow mapping columns and take a symbol as the column name' do
126
- new_table = @table.map_column(:one) { |v| v.to_i }
127
- expect( new_table.hashes.first['one'] ).to eq 4444
128
- end
129
-
130
- it 'should allow mapping columns and modify the rows as well' do
131
- new_table = @table.map_column(:one) { |v| v.to_i }
132
- expect( new_table.rows.first ).to include(4444)
133
- expect( new_table.rows.first ).to_not include('4444')
134
- end
135
-
136
- it 'should pass silently if a mapped column does not exist in non-strict mode' do
137
- expect {
138
- new_table = @table.map_column('two', false) { |v| v.to_i }
139
- new_table.hashes
140
- }.not_to raise_error
141
- end
142
-
143
- it 'should fail if a mapped column does not exist in strict mode' do
144
- expect {
145
- new_table = @table.map_column('two', true) { |v| v.to_i }
146
- new_table.hashes
147
- }.to raise_error('The column named "two" does not exist')
148
- end
149
-
150
- it 'should return a new table' do
151
- expect( (@table.map_column(:one) { |v| v.to_i }) ).to_not eq @table
152
- end
153
- end
154
-
155
- describe '#match' do
156
- before(:each) do
157
- @table = DataTable.from([
158
- %w{one four seven},
159
- %w{4444 55555 666666}
160
- ])
161
- end
162
-
163
- it 'returns nil if headers do not match' do
164
- expect( @table.match('does,not,match') ).to be_nil
165
- end
166
- it 'requires a table: prefix on match' do
167
- expect( @table.match('table:one,four,seven') ).to_not be_nil
168
- end
169
- it 'does not match if no table: prefix on match' do
170
- expect( @table.match('one,four,seven') ).to be_nil
171
- end
172
- end
173
-
174
- describe '#transpose' do
175
- before(:each) do
176
- @table = DataTable.from([
177
- %w{one 1111},
178
- %w{two 22222}
179
- ])
180
- end
181
-
182
- it 'should be convertible in to an array where each row is a hash' do
183
- expect( @table.transpose.hashes[0] ).to eq('one' => '1111', 'two' => '22222')
184
- end
185
- end
186
-
187
- describe '#rows_hash' do
188
-
189
- it 'should return a hash of the rows' do
190
- table = DataTable.from([
191
- %w{one 1111},
192
- %w{two 22222}
193
- ])
194
- expect( table.rows_hash ).to eq( 'one' => '1111', 'two' => '22222' )
195
- end
196
-
197
- it "should fail if the table doesn't have two columns" do
198
- faulty_table = DataTable.from([
199
- %w{one 1111 abc},
200
- %w{two 22222 def}
201
- ])
202
- expect {
203
- faulty_table.rows_hash
204
- }.to raise_error('The table must have exactly 2 columns')
205
- end
206
-
207
- it 'should support header and column mapping' do
208
- table = DataTable.from([
209
- %w{one 1111},
210
- %w{two 22222}
211
- ])
212
- t2 = table.map_headers({ 'two' => 'Two' }) { |header| header.upcase }.
213
- map_column('two', false) { |val| val.to_i }
214
- expect( t2.rows_hash ).to eq( 'ONE' => '1111', 'Two' => 22222 )
215
- end
216
- end
217
-
218
- describe '#map_headers!' do
219
- let(:table) do
220
- DataTable.from([
221
- %w{HELLO WORLD},
222
- %w{4444 55555}
223
- ])
224
- end
225
-
226
- it 'renames the columns to the specified values in the provided hash' do
227
- @table.map_headers!('one' => :three)
228
- expect( @table.hashes.first[:three] ).to eq '4444'
229
- end
230
-
231
- it 'allows renaming columns using regexp' do
232
- @table.map_headers!(/one|uno/ => :three)
233
- expect( @table.hashes.first[:three] ).to eq '4444'
234
- end
235
-
236
- it 'copies column mappings' do
237
- @table.map_column!('one') { |v| v.to_i }
238
- @table.map_headers!('one' => 'three')
239
- expect( @table.hashes.first['three'] ).to eq 4444
240
- end
241
-
242
- it 'takes a block and operates on all the headers with it' do
243
- table.map_headers! do |header|
244
- header.downcase
245
- end
246
- expect( table.hashes.first.keys ).to match %w[hello world]
247
- end
248
-
249
- it 'treats the mappings in the provided hash as overrides when used with a block' do
250
- table.map_headers!('WORLD' => 'foo') do |header|
251
- header.downcase
252
- end
253
-
254
- expect( table.hashes.first.keys ).to match %w[hello foo]
255
- end
256
- end
257
-
258
- describe '#map_headers' do
259
- let(:table) do
260
- DataTable.from([
261
- %w{HELLO WORLD},
262
- %w{4444 55555}
263
- ])
264
- end
265
-
266
- it 'renames the columns to the specified values in the provided hash' do
267
- table2 = @table.map_headers('one' => :three)
268
- expect( table2.hashes.first[:three] ).to eq '4444'
269
- end
270
-
271
- it 'allows renaming columns using regexp' do
272
- table2 = @table.map_headers(/one|uno/ => :three)
273
- expect( table2.hashes.first[:three] ).to eq '4444'
274
- end
275
-
276
- it 'copies column mappings' do
277
- @table.map_column!('one') { |v| v.to_i }
278
- table2 = @table.map_headers('one' => 'three')
279
- expect( table2.hashes.first['three'] ).to eq 4444
280
- end
281
-
282
- it 'takes a block and operates on all the headers with it' do
283
- table2 = table.map_headers do |header|
284
- header.downcase
285
- end
286
-
287
- expect( table2.hashes.first.keys ).to match %w[hello world]
288
- end
289
-
290
- it 'treats the mappings in the provided hash as overrides when used with a block' do
291
- table2 = table.map_headers('WORLD' => 'foo') do |header|
292
- header.downcase
293
- end
294
-
295
- expect( table2.hashes.first.keys ).to match %w[hello foo]
296
- end
297
- end
298
-
299
- describe 'diff!' do
300
- it 'should detect a complex diff' do
301
- t1 = DataTable.from(%{
302
- | 1 | 22 | 333 | 4444 |
303
- | 55555 | 666666 | 7777777 | 88888888 |
304
- | 999999999 | 0000000000 | 01010101010 | 121212121212 |
305
- | 4000 | ABC | DEF | 50000 |
306
- })
307
-
308
- t2 = DataTable.from(%{
309
- | a | 4444 | 1 |
310
- | bb | 88888888 | 55555 |
311
- | ccc | xxxxxxxx | 999999999 |
312
- | dddd | 4000 | 300 |
313
- | e | 50000 | 4000 |
314
- })
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
325
- end
326
-
327
- it 'should not change table when diffed with identical' do
328
- t = DataTable.from(%{
329
- |a|b|c|
330
- |d|e|f|
331
- |g|h|i|
332
- })
333
- t.diff!(t.dup)
334
- expect( t.to_s(:indent => 12, :color => false) ).to eq %{
335
- | a | b | c |
336
- | d | e | f |
337
- | g | h | i |
338
- }
339
- end
340
-
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
383
- t = DataTable.from(%{
384
- |a|a|c|
385
- |d|e|f|
386
- |g|h|i|
387
- })
388
- t.diff!(t.dup)
389
- expect( t.to_s(:indent => 12, :color => false) ).to eq %{
390
- | a | a | c |
391
- | d | e | f |
392
- | g | h | i |
393
- }
394
- end
395
-
396
- it 'detects a diff in one cell' do
397
- t1 = DataTable.from(%{
398
- |a|a|c|
399
- |d|e|f|
400
- |g|h|i|
401
- })
402
- t2 = DataTable.from(%{
403
- |a|a|c|
404
- |d|oops|f|
405
- |g|h|i|
406
- })
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
415
- end
416
-
417
- it 'detects missing columns' do
418
- t1 = DataTable.from(%{
419
- |a|a|b|c|
420
- |d|d|e|f|
421
- |g|g|h|i|
422
- })
423
- t2 = DataTable.from(%{
424
- |a|b|c|
425
- |d|e|f|
426
- |g|h|i|
427
- })
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
435
- end
436
-
437
- it 'detects surplus columns' do
438
- t1 = DataTable.from(%{
439
- |a|b|c|
440
- |d|e|f|
441
- |g|h|i|
442
- })
443
- t2 = DataTable.from(%{
444
- |a|b|a|c|
445
- |d|e|d|f|
446
- |g|h|g|i|
447
- })
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
455
- end
456
- end
457
-
458
- it 'should inspect missing and surplus cells' do
459
- t1 = DataTable.from([
460
- %w(name male lastname swedish),
461
- %w(aslak true hellesøy false)
462
- ])
463
- t2 = DataTable.from([
464
- %w(name male lastname swedish),
465
- ['aslak', true, 'hellesøy', false]
466
- ])
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
474
- end
475
-
476
- it 'should allow column mapping of target before diffing' do
477
- t1 = DataTable.from([
478
- %w(name male),
479
- %w(aslak true)
480
- ])
481
- t1.map_column!('male') { |m| m == 'true' }
482
- t2 = DataTable.from([
483
- %w(name male),
484
- ['aslak', true]
485
- ])
486
- t1.diff!(t2)
487
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
488
- | name | male |
489
- | aslak | true |
490
- }
491
- end
492
-
493
- it 'should allow column mapping of argument before diffing' do
494
- t1 = DataTable.from([
495
- %w(name male),
496
- ['aslak', true]
497
- ])
498
- t1.map_column!('male') {
499
- 'true'
500
- }
501
- t2 = DataTable.from([
502
- %w(name male),
503
- %w(aslak true)
504
- ])
505
- t2.diff!(t1)
506
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
507
- | name | male |
508
- | aslak | true |
509
- }
510
- end
511
-
512
- it 'should allow header mapping before diffing' do
513
- t1 = DataTable.from([
514
- %w(Name Male),
515
- %w(aslak true)
516
- ])
517
- t1.map_headers!('Name' => 'name', 'Male' => 'male')
518
- t1.map_column!('male') { |m| m == 'true' }
519
- t2 = DataTable.from([
520
- %w(name male),
521
- ['aslak', true]
522
- ])
523
- t1.diff!(t2)
524
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
525
- | name | male |
526
- | aslak | true |
527
- }
528
- end
529
-
530
- it 'should detect seemingly identical tables as different' do
531
- t1 = DataTable.from([
532
- %w(X Y),
533
- %w(2 1)
534
- ])
535
- t2 = DataTable.from([
536
- %w(X Y),
537
- [2, 1]
538
- ])
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
546
- end
547
-
548
- it 'should not allow mappings that match more than 1 column' do
549
- t1 = DataTable.from([
550
- %w(Cuke Duke),
551
- %w(Foo Bar)
552
- ])
553
- expect do
554
- t1.map_headers!(/uk/ => 'u')
555
- t1.hashes
556
- end.to raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
557
- end
558
-
559
- describe 'raising' do
560
- before do
561
- @t = DataTable.from(%{
562
- | a | b |
563
- | c | d |
564
- })
565
- expect( @t ).not_to eq nil
566
- end
567
-
568
- it 'should raise on missing rows' do
569
- t = DataTable.from(%{
570
- | a | b |
571
- })
572
- expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
573
- expect { @t.dup.diff!(t, :missing_row => false) }.not_to raise_error
574
- end
575
-
576
- it 'should not raise on surplus rows when surplus is at the end' do
577
- t = DataTable.from(%{
578
- | a | b |
579
- | c | d |
580
- | e | f |
581
- })
582
- expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
583
- expect { @t.dup.diff!(t, :surplus_row => false) }.not_to raise_error
584
- end
585
-
586
- it 'should not raise on surplus rows when surplus is interleaved' do
587
- t1 = DataTable.from(%{
588
- | row_1 | row_2 |
589
- | four | 4 |
590
- })
591
- t2 = DataTable.from(%{
592
- | row_1 | row_2 |
593
- | one | 1 |
594
- | two | 2 |
595
- | three | 3 |
596
- | four | 4 |
597
- | five | 5 |
598
- })
599
- expect { t1.dup.diff!(t2) }.to raise_error(DataTable::Different)
600
- expect { t1.dup.diff!(t2, :surplus_row => false) }.not_to raise_error
601
- end
602
-
603
- it 'should raise on missing columns' do
604
- t = DataTable.from(%{
605
- | a |
606
- | c |
607
- })
608
- expect { @t.dup.diff!(t) }.to raise_error(DataTable::Different)
609
- expect { @t.dup.diff!(t, :missing_col => false) }.not_to raise_error
610
- end
611
-
612
- it 'should not raise on surplus columns' do
613
- t = DataTable.from(%{
614
- | a | b | x |
615
- | c | d | y |
616
- })
617
- expect { @t.dup.diff!(t) }.not_to raise_error
618
- expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error(DataTable::Different)
619
- end
620
-
621
- it 'should not raise on misplaced columns' do
622
- t = DataTable.from(%{
623
- | b | a |
624
- | d | c |
625
- })
626
- expect { @t.dup.diff!(t) }.not_to raise_error
627
- expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error(DataTable::Different)
628
- end
629
- end
630
-
631
- it 'can compare to an Array' do
632
- t = DataTable.from(%{
633
- | b | a |
634
- | d | c |
635
- })
636
- other = [ %w{b a}, %w{d c} ]
637
-
638
- expect { t.diff!(other) }.not_to raise_error
639
- end
640
- end
641
-
642
- describe '#from' do
643
- it 'should allow Array of Hash' do
644
- t1 = DataTable.from([{'name' => 'aslak', 'male' => 'true'}])
645
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
646
- | male | name |
647
- | true | aslak |
648
- }
649
- end
650
- end
651
- end
652
- end
653
- end