cucumber 3.0.0.pre.1 → 4.0.0.rc.4

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 (533) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +339 -37
  3. data/CONTRIBUTING.md +11 -21
  4. data/README.md +20 -12
  5. data/bin/cucumber +2 -1
  6. data/lib/autotest/cucumber.rb +1 -0
  7. data/lib/autotest/cucumber_mixin.rb +44 -48
  8. data/lib/autotest/cucumber_rails.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  10. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  11. data/lib/autotest/cucumber_rspec.rb +1 -0
  12. data/lib/autotest/cucumber_rspec2.rb +1 -0
  13. data/lib/autotest/discover.rb +3 -2
  14. data/lib/cucumber.rb +2 -1
  15. data/lib/cucumber/cli/configuration.rb +15 -20
  16. data/lib/cucumber/cli/main.rb +15 -15
  17. data/lib/cucumber/cli/options.rb +249 -197
  18. data/lib/cucumber/cli/profile_loader.rb +63 -38
  19. data/lib/cucumber/cli/rerun_file.rb +1 -0
  20. data/lib/cucumber/configuration.rb +49 -44
  21. data/lib/cucumber/constantize.rb +8 -10
  22. data/lib/cucumber/core_ext/string.rb +2 -1
  23. data/lib/cucumber/deprecate.rb +34 -10
  24. data/lib/cucumber/encoding.rb +2 -1
  25. data/lib/cucumber/errors.rb +10 -8
  26. data/lib/cucumber/events.rb +18 -3
  27. data/lib/cucumber/events/envelope.rb +9 -0
  28. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  29. data/lib/cucumber/events/gherkin_source_read.rb +14 -0
  30. data/lib/cucumber/events/hook_test_step_created.rb +13 -0
  31. data/lib/cucumber/events/{step_match.rb → step_activated.rb} +8 -8
  32. data/lib/cucumber/events/step_definition_registered.rb +5 -9
  33. data/lib/cucumber/events/test_case_created.rb +13 -0
  34. data/lib/cucumber/events/test_case_finished.rb +14 -0
  35. data/lib/cucumber/events/test_case_ready.rb +12 -0
  36. data/lib/cucumber/events/test_case_started.rb +11 -0
  37. data/lib/cucumber/events/test_run_finished.rb +2 -3
  38. data/lib/cucumber/events/test_run_started.rb +14 -0
  39. data/lib/cucumber/events/test_step_created.rb +13 -0
  40. data/lib/cucumber/events/test_step_finished.rb +14 -0
  41. data/lib/cucumber/events/test_step_started.rb +11 -0
  42. data/lib/cucumber/file_specs.rb +7 -6
  43. data/lib/cucumber/filters.rb +3 -0
  44. data/lib/cucumber/filters/activate_steps.rb +12 -6
  45. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  46. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  47. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  48. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  49. data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
  50. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +28 -0
  51. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  52. data/lib/cucumber/filters/prepare_world.rb +6 -13
  53. data/lib/cucumber/filters/quit.rb +3 -7
  54. data/lib/cucumber/filters/randomizer.rb +6 -7
  55. data/lib/cucumber/filters/retry.rb +3 -3
  56. data/lib/cucumber/filters/tag_limits.rb +5 -5
  57. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  58. data/lib/cucumber/filters/tag_limits/verifier.rb +4 -7
  59. data/lib/cucumber/formatter/ansicolor.rb +38 -45
  60. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  61. data/lib/cucumber/formatter/backtrace_filter.rb +24 -12
  62. data/lib/cucumber/formatter/console.rb +48 -88
  63. data/lib/cucumber/formatter/console_counts.rb +11 -29
  64. data/lib/cucumber/formatter/console_issues.rb +34 -10
  65. data/lib/cucumber/formatter/duration.rb +2 -1
  66. data/lib/cucumber/formatter/duration_extractor.rb +4 -2
  67. data/lib/cucumber/formatter/errors.rb +6 -0
  68. data/lib/cucumber/formatter/fail_fast.rb +8 -5
  69. data/lib/cucumber/formatter/fanout.rb +3 -3
  70. data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -4
  71. data/lib/cucumber/formatter/interceptor.rb +12 -14
  72. data/lib/cucumber/formatter/io.rb +5 -4
  73. data/lib/cucumber/formatter/json.rb +109 -115
  74. data/lib/cucumber/formatter/junit.rb +85 -80
  75. data/lib/cucumber/formatter/message.rb +246 -0
  76. data/lib/cucumber/formatter/pretty.rb +353 -153
  77. data/lib/cucumber/formatter/progress.rb +34 -38
  78. data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
  79. data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
  80. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
  81. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
  82. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
  83. data/lib/cucumber/formatter/rerun.rb +24 -5
  84. data/lib/cucumber/formatter/stepdefs.rb +2 -2
  85. data/lib/cucumber/formatter/steps.rb +5 -6
  86. data/lib/cucumber/formatter/summary.rb +18 -11
  87. data/lib/cucumber/formatter/unicode.rb +16 -18
  88. data/lib/cucumber/formatter/usage.rb +37 -33
  89. data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
  90. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
  91. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  92. data/lib/cucumber/gherkin/i18n.rb +1 -0
  93. data/lib/cucumber/gherkin/steps_parser.rb +18 -8
  94. data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +37 -23
  95. data/lib/cucumber/glue/hook.rb +67 -0
  96. data/lib/cucumber/glue/invoke_in_world.rb +65 -0
  97. data/lib/cucumber/glue/proto_world.rb +231 -0
  98. data/lib/cucumber/glue/registry_and_more.rb +221 -0
  99. data/lib/cucumber/glue/snippet.rb +205 -0
  100. data/lib/cucumber/glue/step_definition.rb +166 -0
  101. data/lib/cucumber/glue/world_factory.rb +21 -0
  102. data/lib/cucumber/hooks.rb +30 -20
  103. data/lib/cucumber/load_path.rb +1 -0
  104. data/lib/cucumber/multiline_argument.rb +9 -19
  105. data/lib/cucumber/multiline_argument/data_table.rb +143 -250
  106. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +154 -0
  107. data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
  108. data/lib/cucumber/platform.rb +5 -6
  109. data/lib/cucumber/project_initializer.rb +2 -2
  110. data/lib/cucumber/rake/task.rb +34 -27
  111. data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
  112. data/lib/cucumber/rspec/doubles.rb +2 -1
  113. data/lib/cucumber/running_test_case.rb +4 -54
  114. data/lib/cucumber/runtime.rb +54 -72
  115. data/lib/cucumber/runtime/after_hooks.rb +10 -5
  116. data/lib/cucumber/runtime/before_hooks.rb +9 -4
  117. data/lib/cucumber/runtime/for_programming_languages.rb +12 -44
  118. data/lib/cucumber/runtime/step_hooks.rb +5 -2
  119. data/lib/cucumber/runtime/support_code.rb +30 -32
  120. data/lib/cucumber/runtime/user_interface.rb +16 -34
  121. data/lib/cucumber/step_definition_light.rb +7 -4
  122. data/lib/cucumber/step_definitions.rb +3 -2
  123. data/lib/cucumber/step_match.rb +42 -26
  124. data/lib/cucumber/step_match_search.rb +11 -12
  125. data/lib/cucumber/term/ansicolor.rb +39 -39
  126. data/lib/cucumber/unit.rb +1 -0
  127. data/lib/cucumber/version +1 -1
  128. data/lib/simplecov_setup.rb +2 -1
  129. metadata +238 -623
  130. data/.coveralls.yml +0 -1
  131. data/.github/ISSUE_TEMPLATE.md +0 -48
  132. data/.github/PULL_REQUEST_TEMPLATE.md +0 -39
  133. data/.rspec +0 -1
  134. data/.ruby-gemset +0 -1
  135. data/.travis.yml +0 -35
  136. data/.yardopts +0 -1
  137. data/Gemfile +0 -22
  138. data/Rakefile +0 -22
  139. data/cucumber.gemspec +0 -47
  140. data/cucumber.yml +0 -20
  141. data/examples/i18n/README.textile +0 -3
  142. data/examples/i18n/Rakefile +0 -33
  143. data/examples/i18n/ar/Rakefile +0 -6
  144. data/examples/i18n/ar/features/addition.feature +0 -17
  145. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +0 -24
  146. data/examples/i18n/ar/lib/calculator.rb +0 -11
  147. data/examples/i18n/bg/Rakefile +0 -6
  148. data/examples/i18n/bg/features/addition.feature +0 -12
  149. data/examples/i18n/bg/features/consecutive_calculations.feature +0 -19
  150. data/examples/i18n/bg/features/division.feature +0 -17
  151. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +0 -24
  152. data/examples/i18n/bg/features/support/env.rb +0 -5
  153. data/examples/i18n/bg/features/support/world.rb +0 -8
  154. data/examples/i18n/bg/lib/calculator.rb +0 -24
  155. data/examples/i18n/ca/Rakefile +0 -6
  156. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +0 -21
  157. data/examples/i18n/ca/features/suma.feature +0 -17
  158. data/examples/i18n/ca/lib/calculadora.rb +0 -16
  159. data/examples/i18n/cs/Rakefile +0 -6
  160. data/examples/i18n/cs/features/addition.feature +0 -17
  161. data/examples/i18n/cs/features/division.feature +0 -11
  162. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +0 -24
  163. data/examples/i18n/cs/lib/calculator.rb +0 -14
  164. data/examples/i18n/da/Rakefile +0 -6
  165. data/examples/i18n/da/features/sammenlaegning.feature +0 -18
  166. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +0 -24
  167. data/examples/i18n/da/lib/lommeregner.rb +0 -11
  168. data/examples/i18n/de/Rakefile +0 -6
  169. data/examples/i18n/de/features/addition.feature +0 -17
  170. data/examples/i18n/de/features/division.feature +0 -10
  171. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +0 -24
  172. data/examples/i18n/de/lib/calculator.rb +0 -14
  173. data/examples/i18n/el/Rakefile +0 -6
  174. data/examples/i18n/el/features/addition.feature +0 -17
  175. data/examples/i18n/el/features/division.feature +0 -10
  176. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +0 -24
  177. data/examples/i18n/el/lib/calculator.rb +0 -14
  178. data/examples/i18n/en-lol/Rakefile +0 -4
  179. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +0 -16
  180. data/examples/i18n/en-lol/features/stuffing.feature +0 -8
  181. data/examples/i18n/en-lol/features/support/env.rb +0 -7
  182. data/examples/i18n/en-lol/lib/basket.rb +0 -12
  183. data/examples/i18n/en-lol/lib/belly.rb +0 -11
  184. data/examples/i18n/en/Rakefile +0 -6
  185. data/examples/i18n/en/features/addition.feature +0 -17
  186. data/examples/i18n/en/features/division.feature +0 -10
  187. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +0 -24
  188. data/examples/i18n/en/lib/calculator.rb +0 -14
  189. data/examples/i18n/eo/Rakefile +0 -6
  190. data/examples/i18n/eo/features/adicio.feature +0 -17
  191. data/examples/i18n/eo/features/divido.feature +0 -10
  192. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +0 -24
  193. data/examples/i18n/eo/lib/calculator.rb +0 -14
  194. data/examples/i18n/es/Rakefile +0 -6
  195. data/examples/i18n/es/features/adicion.feature +0 -17
  196. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +0 -21
  197. data/examples/i18n/es/lib/calculador.rb +0 -14
  198. data/examples/i18n/et/Rakefile +0 -6
  199. data/examples/i18n/et/features/jagamine.feature +0 -10
  200. data/examples/i18n/et/features/liitmine.feature +0 -17
  201. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +0 -24
  202. data/examples/i18n/et/lib/kalkulaator.rb +0 -14
  203. data/examples/i18n/fi/Rakefile +0 -6
  204. data/examples/i18n/fi/features/jakolasku.feature +0 -10
  205. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +0 -24
  206. data/examples/i18n/fi/features/yhteenlasku.feature +0 -17
  207. data/examples/i18n/fi/lib/laskin.rb +0 -14
  208. data/examples/i18n/fr/Rakefile +0 -8
  209. data/examples/i18n/fr/features/addition.feature +0 -18
  210. data/examples/i18n/fr/features/addition2.feature +0 -17
  211. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +0 -32
  212. data/examples/i18n/fr/features/support/env.rb +0 -5
  213. data/examples/i18n/fr/lib/calculatrice.rb +0 -10
  214. data/examples/i18n/he/Rakefile +0 -6
  215. data/examples/i18n/he/features/addition.feature +0 -17
  216. data/examples/i18n/he/features/division.feature +0 -10
  217. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +0 -24
  218. data/examples/i18n/he/lib/calculator.rb +0 -15
  219. data/examples/i18n/hi/Rakefile +0 -6
  220. data/examples/i18n/hi/features/addition.feature +0 -16
  221. data/examples/i18n/hi/features/division.feature +0 -10
  222. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +0 -24
  223. data/examples/i18n/hi/lib/calculator.rb +0 -15
  224. data/examples/i18n/ht/Rakefile +0 -6
  225. data/examples/i18n/ht/features/adisyon.feature +0 -17
  226. data/examples/i18n/ht/features/divizyon.feature +0 -10
  227. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +0 -25
  228. data/examples/i18n/ht/lib/kalkilatris.rb +0 -14
  229. data/examples/i18n/hu/Rakefile +0 -6
  230. data/examples/i18n/hu/features/osszeadas.feature +0 -17
  231. data/examples/i18n/hu/features/osztas.feature +0 -10
  232. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +0 -25
  233. data/examples/i18n/hu/lib/calculator.rb +0 -14
  234. data/examples/i18n/id/Rakefile +0 -6
  235. data/examples/i18n/id/features/addition.feature +0 -17
  236. data/examples/i18n/id/features/division.feature +0 -10
  237. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +0 -24
  238. data/examples/i18n/id/lib/calculator.rb +0 -14
  239. data/examples/i18n/it/Rakefile +0 -6
  240. data/examples/i18n/it/features/somma.feature +0 -11
  241. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +0 -24
  242. data/examples/i18n/it/lib/calcolatrice.rb +0 -11
  243. data/examples/i18n/ja/Rakefile +0 -6
  244. data/examples/i18n/ja/features/addition.feature +0 -17
  245. data/examples/i18n/ja/features/division.feature +0 -10
  246. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +0 -19
  247. data/examples/i18n/ja/features/support/env.rb +0 -5
  248. data/examples/i18n/ja/lib/calculator.rb +0 -14
  249. data/examples/i18n/ko/Rakefile +0 -6
  250. data/examples/i18n/ko/features/addition.feature +0 -17
  251. data/examples/i18n/ko/features/division.feature +0 -11
  252. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +0 -24
  253. data/examples/i18n/ko/lib/calculator.rb +0 -14
  254. data/examples/i18n/lt/Rakefile +0 -6
  255. data/examples/i18n/lt/features/addition.feature +0 -17
  256. data/examples/i18n/lt/features/division.feature +0 -10
  257. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +0 -24
  258. data/examples/i18n/lt/lib/calculator.rb +0 -14
  259. data/examples/i18n/lv/Rakefile +0 -6
  260. data/examples/i18n/lv/features/addition.feature +0 -17
  261. data/examples/i18n/lv/features/division.feature +0 -10
  262. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +0 -24
  263. data/examples/i18n/lv/lib/calculator.rb +0 -14
  264. data/examples/i18n/no/Rakefile +0 -6
  265. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +0 -17
  266. data/examples/i18n/no/features/summering.feature +0 -19
  267. data/examples/i18n/no/features/support/env.rb +0 -6
  268. data/examples/i18n/no/lib/kalkulator.rb +0 -11
  269. data/examples/i18n/pl/Rakefile +0 -6
  270. data/examples/i18n/pl/features/addition.feature +0 -17
  271. data/examples/i18n/pl/features/division.feature +0 -10
  272. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +0 -24
  273. data/examples/i18n/pl/features/support/env.rb +0 -5
  274. data/examples/i18n/pl/lib/calculator.rb +0 -14
  275. data/examples/i18n/pt/Rakefile +0 -6
  276. data/examples/i18n/pt/features/adicao.feature +0 -11
  277. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +0 -20
  278. data/examples/i18n/pt/features/support/env.rb +0 -5
  279. data/examples/i18n/pt/lib/calculadora.rb +0 -10
  280. data/examples/i18n/ro/Rakefile +0 -6
  281. data/examples/i18n/ro/features/adunare.feature +0 -12
  282. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +0 -21
  283. data/examples/i18n/ro/lib/calculator.rb +0 -11
  284. data/examples/i18n/ru/Rakefile +0 -6
  285. data/examples/i18n/ru/features/addition.feature +0 -11
  286. data/examples/i18n/ru/features/consecutive_calculations.feature +0 -17
  287. data/examples/i18n/ru/features/division.feature +0 -16
  288. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +0 -19
  289. data/examples/i18n/ru/features/support/env.rb +0 -5
  290. data/examples/i18n/ru/features/support/world.rb +0 -8
  291. data/examples/i18n/ru/lib/calculator.rb +0 -24
  292. data/examples/i18n/sk/Rakefile +0 -6
  293. data/examples/i18n/sk/features/addition.feature +0 -17
  294. data/examples/i18n/sk/features/division.feature +0 -10
  295. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +0 -24
  296. data/examples/i18n/sk/lib/calculator.rb +0 -14
  297. data/examples/i18n/sr-Cyrl/Rakefile +0 -6
  298. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +0 -18
  299. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +0 -20
  300. data/examples/i18n/sr-Cyrl/features/support/env.rb +0 -5
  301. data/examples/i18n/sr-Cyrl/lib/calculator.rb +0 -12
  302. data/examples/i18n/sr-Latn/Rakefile +0 -6
  303. data/examples/i18n/sr-Latn/features/sabiranje.feature +0 -18
  304. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +0 -24
  305. data/examples/i18n/sr-Latn/lib/calculator.rb +0 -12
  306. data/examples/i18n/sv/Rakefile +0 -6
  307. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +0 -24
  308. data/examples/i18n/sv/features/summering.feature +0 -18
  309. data/examples/i18n/sv/lib/kalkulator.rb +0 -11
  310. data/examples/i18n/tr/Rakefile +0 -6
  311. data/examples/i18n/tr/features/bolme.feature +0 -10
  312. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +0 -24
  313. data/examples/i18n/tr/features/toplama.feature +0 -18
  314. data/examples/i18n/tr/lib/hesap_makinesi.rb +0 -15
  315. data/examples/i18n/uk/Rakefile +0 -6
  316. data/examples/i18n/uk/features/addition.feature +0 -11
  317. data/examples/i18n/uk/features/consecutive_calculations.feature +0 -17
  318. data/examples/i18n/uk/features/division.feature +0 -16
  319. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +0 -19
  320. data/examples/i18n/uk/features/support/env.rb +0 -5
  321. data/examples/i18n/uk/features/support/world.rb +0 -8
  322. data/examples/i18n/uk/lib/calculator.rb +0 -24
  323. data/examples/i18n/uz/Rakefile +0 -6
  324. data/examples/i18n/uz/features/addition.feature +0 -10
  325. data/examples/i18n/uz/features/consecutive_calculations.feature +0 -17
  326. data/examples/i18n/uz/features/division.feature +0 -17
  327. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +0 -19
  328. data/examples/i18n/uz/features/support/env.rb +0 -5
  329. data/examples/i18n/uz/features/support/world.rb +0 -8
  330. data/examples/i18n/uz/lib/calculator.rb +0 -24
  331. data/examples/i18n/zh-CN/Rakefile +0 -4
  332. data/examples/i18n/zh-CN/features/addition.feature +0 -18
  333. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +0 -26
  334. data/examples/i18n/zh-CN/lib/calculator.rb +0 -10
  335. data/examples/i18n/zh-TW/Rakefile +0 -4
  336. data/examples/i18n/zh-TW/features/addition.feature +0 -17
  337. data/examples/i18n/zh-TW/features/division.feature +0 -11
  338. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +0 -24
  339. data/examples/i18n/zh-TW/lib/calculator.rb +0 -14
  340. data/examples/rspec_doubles/Rakefile +0 -4
  341. data/examples/rspec_doubles/features/mocking.feature +0 -9
  342. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +0 -19
  343. data/examples/rspec_doubles/features/support/env.rb +0 -12
  344. data/examples/sinatra/README.textile +0 -13
  345. data/examples/sinatra/Rakefile +0 -6
  346. data/examples/sinatra/app.rb +0 -14
  347. data/examples/sinatra/features/add.feature +0 -11
  348. data/examples/sinatra/features/step_definitions/add_steps.rb +0 -15
  349. data/examples/sinatra/features/support/env.rb +0 -10
  350. data/examples/sinatra/views/add.erb +0 -7
  351. data/examples/sinatra/views/layout.erb +0 -8
  352. data/examples/tcl/README.textile +0 -11
  353. data/examples/tcl/Rakefile +0 -6
  354. data/examples/tcl/features/fibonnacci.feature +0 -17
  355. data/examples/tcl/features/step_definitions/fib_steps.rb +0 -7
  356. data/examples/tcl/features/support/env.rb +0 -6
  357. data/examples/tcl/src/fib.tcl +0 -3
  358. data/examples/test_unit/Gemfile +0 -4
  359. data/examples/test_unit/Rakefile +0 -6
  360. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +0 -20
  361. data/examples/test_unit/features/test_unit.feature +0 -9
  362. data/examples/watir/README.textile +0 -16
  363. data/examples/watir/Rakefile +0 -12
  364. data/examples/watir/cucumber.yml +0 -1
  365. data/examples/watir/features/search.feature +0 -12
  366. data/examples/watir/features/step_definitions/search_steps.rb +0 -26
  367. data/examples/watir/features/support/env.rb +0 -35
  368. data/examples/watir/features/support/screenshots.rb +0 -47
  369. data/features/docs/api/list_step_defs_as_json.feature +0 -50
  370. data/features/docs/api/listen_for_events.feature +0 -59
  371. data/features/docs/api/run_cli_main_with_existing_runtime.feature +0 -26
  372. data/features/docs/cli/backtraces.feature +0 -36
  373. data/features/docs/cli/dry_run.feature +0 -70
  374. data/features/docs/cli/exclude_files.feature +0 -18
  375. data/features/docs/cli/execute_with_tag_filter.feature +0 -117
  376. data/features/docs/cli/fail_fast.feature +0 -46
  377. data/features/docs/cli/finding_steps.feature +0 -28
  378. data/features/docs/cli/help.feature +0 -8
  379. data/features/docs/cli/randomize.feature +0 -140
  380. data/features/docs/cli/require.feature +0 -27
  381. data/features/docs/cli/retry_failing_tests.feature +0 -67
  382. data/features/docs/cli/run_scenarios_matching_name.feature +0 -104
  383. data/features/docs/cli/run_specific_scenarios.feature +0 -77
  384. data/features/docs/cli/showing_differences.feature +0 -43
  385. data/features/docs/cli/specifying_multiple_formatters.feature +0 -65
  386. data/features/docs/cli/strict_mode.feature +0 -64
  387. data/features/docs/defining_steps/nested_steps.feature +0 -177
  388. data/features/docs/defining_steps/nested_steps_i18n.feature +0 -36
  389. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +0 -54
  390. data/features/docs/defining_steps/one_line_step_definitions.feature +0 -65
  391. data/features/docs/defining_steps/printing_messages.feature +0 -147
  392. data/features/docs/defining_steps/skip_scenario.feature +0 -30
  393. data/features/docs/defining_steps/snippets.feature +0 -56
  394. data/features/docs/defining_steps/table_diffing.feature +0 -50
  395. data/features/docs/exception_in_after_hook.feature +0 -126
  396. data/features/docs/exception_in_after_step_hook.feature +0 -102
  397. data/features/docs/exception_in_around_hook.feature +0 -78
  398. data/features/docs/exception_in_before_hook.feature +0 -96
  399. data/features/docs/extending_cucumber/custom_filter.feature +0 -29
  400. data/features/docs/extending_cucumber/custom_formatter.feature +0 -102
  401. data/features/docs/formatters/api_methods.feature +0 -37
  402. data/features/docs/formatters/debug_formatter.feature +0 -47
  403. data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
  404. data/features/docs/formatters/html_formatter.feature +0 -91
  405. data/features/docs/formatters/json_formatter.feature +0 -767
  406. data/features/docs/formatters/junit_formatter.feature +0 -454
  407. data/features/docs/formatters/pretty_formatter.feature +0 -73
  408. data/features/docs/formatters/progress_formatter.feature +0 -31
  409. data/features/docs/formatters/rerun_formatter.feature +0 -188
  410. data/features/docs/formatters/summary_formatter.feature +0 -34
  411. data/features/docs/formatters/usage_formatter.feature +0 -98
  412. data/features/docs/getting_started.feature +0 -27
  413. data/features/docs/gherkin/background.feature +0 -548
  414. data/features/docs/gherkin/doc_strings.feature +0 -74
  415. data/features/docs/gherkin/expand_option_for_outlines.feature +0 -46
  416. data/features/docs/gherkin/language_from_header.feature +0 -32
  417. data/features/docs/gherkin/language_help.feature +0 -42
  418. data/features/docs/gherkin/outlines.feature +0 -156
  419. data/features/docs/gherkin/unicode_table.feature +0 -32
  420. data/features/docs/gherkin/using_descriptions.feature +0 -82
  421. data/features/docs/gherkin/using_star_notation.feature +0 -37
  422. data/features/docs/iso-8859-1.feature +0 -6
  423. data/features/docs/post_configuration_hook.feature +0 -33
  424. data/features/docs/profiles.feature +0 -120
  425. data/features/docs/rake_task.feature +0 -141
  426. data/features/docs/raketask.feature +0 -44
  427. data/features/docs/work_in_progress.feature +0 -154
  428. data/features/docs/writing_support_code/after_hooks.feature +0 -102
  429. data/features/docs/writing_support_code/after_step_hooks.feature +0 -53
  430. data/features/docs/writing_support_code/around_hooks.feature +0 -260
  431. data/features/docs/writing_support_code/before_hook.feature +0 -65
  432. data/features/docs/writing_support_code/hook_order.feature +0 -61
  433. data/features/docs/writing_support_code/load_path.feature +0 -17
  434. data/features/docs/writing_support_code/state.feature +0 -32
  435. data/features/docs/writing_support_code/tagged_hooks.feature +0 -95
  436. data/features/docs/writing_support_code/transforms.feature +0 -98
  437. data/features/docs/writing_support_code/world.feature +0 -129
  438. data/features/lib/step_definitions/aruba_steps.rb +0 -27
  439. data/features/lib/step_definitions/cli_steps.rb +0 -4
  440. data/features/lib/step_definitions/cucumber_steps.rb +0 -79
  441. data/features/lib/step_definitions/iso-8859-1_steps.rb +0 -13
  442. data/features/lib/step_definitions/json_steps.rb +0 -8
  443. data/features/lib/step_definitions/junit_steps.rb +0 -14
  444. data/features/lib/step_definitions/language_steps.rb +0 -9
  445. data/features/lib/step_definitions/profile_steps.rb +0 -16
  446. data/features/lib/step_definitions/retry_steps.rb +0 -55
  447. data/features/lib/step_definitions/ruby_steps.rb +0 -4
  448. data/features/lib/step_definitions/wire_steps.rb +0 -59
  449. data/features/lib/support/env.rb +0 -22
  450. data/features/lib/support/fake_wire_server.rb +0 -81
  451. data/features/lib/support/feature_factory.rb +0 -68
  452. data/features/lib/support/normalise_output.rb +0 -51
  453. data/gem_tasks/contributors.rake +0 -16
  454. data/gem_tasks/cov.rake +0 -6
  455. data/gem_tasks/cucumber.rake +0 -26
  456. data/gem_tasks/downloads.rb +0 -8
  457. data/gem_tasks/environment.rake +0 -8
  458. data/gem_tasks/examples.rake +0 -12
  459. data/gem_tasks/fix_cr_lf.rake +0 -11
  460. data/gem_tasks/flog.rake +0 -5
  461. data/gem_tasks/rspec.rake +0 -7
  462. data/gem_tasks/sass.rake +0 -5
  463. data/gem_tasks/stats +0 -16
  464. data/gem_tasks/versions.txt +0 -74
  465. data/lib/cucumber/core_ext/instance_exec.rb +0 -71
  466. data/lib/cucumber/formatter/cucumber.css +0 -286
  467. data/lib/cucumber/formatter/cucumber.sass +0 -247
  468. data/lib/cucumber/formatter/debug.rb +0 -36
  469. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
  470. data/lib/cucumber/formatter/html.rb +0 -690
  471. data/lib/cucumber/formatter/jquery-min.js +0 -154
  472. data/lib/cucumber/formatter/json_pretty.rb +0 -11
  473. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1012
  474. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -390
  475. data/lib/cucumber/formatter/legacy_api/results.rb +0 -52
  476. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  477. data/lib/cucumber/rb_support/rb_hook.rb +0 -20
  478. data/lib/cucumber/rb_support/rb_language.rb +0 -227
  479. data/lib/cucumber/rb_support/rb_step_definition.rb +0 -132
  480. data/lib/cucumber/rb_support/rb_transform.rb +0 -60
  481. data/lib/cucumber/rb_support/rb_world.rb +0 -171
  482. data/lib/cucumber/rb_support/snippet.rb +0 -171
  483. data/lib/cucumber/step_argument.rb +0 -26
  484. data/spec/cucumber/cli/configuration_spec.rb +0 -436
  485. data/spec/cucumber/cli/main_spec.rb +0 -84
  486. data/spec/cucumber/cli/options_spec.rb +0 -411
  487. data/spec/cucumber/cli/profile_loader_spec.rb +0 -47
  488. data/spec/cucumber/cli/rerun_spec.rb +0 -86
  489. data/spec/cucumber/configuration_spec.rb +0 -148
  490. data/spec/cucumber/constantize_spec.rb +0 -20
  491. data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -5
  492. data/spec/cucumber/file_specs_spec.rb +0 -61
  493. data/spec/cucumber/filters/activate_steps_spec.rb +0 -152
  494. data/spec/cucumber/filters/gated_receiver_spec.rb +0 -48
  495. data/spec/cucumber/filters/retry_spec.rb +0 -85
  496. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +0 -39
  497. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +0 -58
  498. data/spec/cucumber/filters/tag_limits_spec.rb +0 -60
  499. data/spec/cucumber/formatter/ansicolor_spec.rb +0 -33
  500. data/spec/cucumber/formatter/console_counts_spec.rb +0 -14
  501. data/spec/cucumber/formatter/debug_spec.rb +0 -65
  502. data/spec/cucumber/formatter/duration_spec.rb +0 -23
  503. data/spec/cucumber/formatter/fail_fast_spec.rb +0 -88
  504. data/spec/cucumber/formatter/html_spec.rb +0 -543
  505. data/spec/cucumber/formatter/interceptor_spec.rb +0 -137
  506. data/spec/cucumber/formatter/json_spec.rb +0 -842
  507. data/spec/cucumber/formatter/junit_spec.rb +0 -253
  508. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +0 -2187
  509. data/spec/cucumber/formatter/pretty_spec.rb +0 -920
  510. data/spec/cucumber/formatter/progress_spec.rb +0 -170
  511. data/spec/cucumber/formatter/rerun_spec.rb +0 -97
  512. data/spec/cucumber/formatter/spec_helper.rb +0 -83
  513. data/spec/cucumber/hooks_spec.rb +0 -31
  514. data/spec/cucumber/multiline_argument/data_table_spec.rb +0 -604
  515. data/spec/cucumber/project_initializer_spec.rb +0 -88
  516. data/spec/cucumber/rake/forked_spec.rb +0 -54
  517. data/spec/cucumber/rake/task_spec.rb +0 -86
  518. data/spec/cucumber/rb_support/rb_language_spec.rb +0 -321
  519. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -200
  520. data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -47
  521. data/spec/cucumber/rb_support/rb_world_spec.rb +0 -48
  522. data/spec/cucumber/rb_support/snippet_spec.rb +0 -138
  523. data/spec/cucumber/running_test_case_spec.rb +0 -140
  524. data/spec/cucumber/runtime/for_programming_languages_spec.rb +0 -37
  525. data/spec/cucumber/runtime/support_code_spec.rb +0 -17
  526. data/spec/cucumber/runtime_spec.rb +0 -21
  527. data/spec/cucumber/sell_cucumbers.feature +0 -19
  528. data/spec/cucumber/step_argument_spec.rb +0 -19
  529. data/spec/cucumber/step_match_search_spec.rb +0 -123
  530. data/spec/cucumber/step_match_spec.rb +0 -86
  531. data/spec/cucumber/world/pending_spec.rb +0 -48
  532. data/spec/spec_helper.rb +0 -30
  533. data/spec/support/standard_step_actions.rb +0 -19
@@ -1,170 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
- require 'cucumber/formatter/spec_helper'
4
- require 'cucumber/formatter/progress'
5
- require 'cucumber/cli/options'
6
-
7
- module Cucumber
8
- module Formatter
9
- describe Progress do
10
- extend SpecHelperDsl
11
- include SpecHelper
12
-
13
- before(:each) do
14
- Cucumber::Term::ANSIColor.coloring = false
15
- @out = StringIO.new
16
- @formatter = Progress.new(actual_runtime.configuration.with_options(out_stream: @out))
17
- end
18
-
19
- describe "given a single feature" do
20
- before(:each) do
21
- run_defined_feature
22
- end
23
-
24
- describe "with a scenario" do
25
- define_feature <<-FEATURE
26
- Feature: Banana party
27
-
28
- Scenario: Monkey eats banana
29
- Given there are bananas
30
- FEATURE
31
-
32
- it "outputs the undefined step" do
33
- expect(@out.string).to include "U\n"
34
- end
35
- end
36
-
37
- describe "with a background" do
38
- define_feature <<-FEATURE
39
- Feature: Banana party
40
-
41
- Background:
42
- Given a tree
43
-
44
- Scenario: Monkey eats banana
45
- Given there are bananas
46
- FEATURE
47
-
48
- it "outputs the two undefined steps" do
49
- expect(@out.string).to include "UU\n"
50
- end
51
- end
52
-
53
- describe "with a scenario outline" do
54
- define_feature <<-FEATURE
55
- Feature: Fud Pyramid
56
-
57
- Scenario Outline: Monkey eats a balanced diet
58
- Given there are <Things>
59
-
60
- Examples: Fruit
61
- | Things |
62
- | apples |
63
- | bananas |
64
- Examples: Vegetables
65
- | Things |
66
- | broccoli |
67
- | carrots |
68
- FEATURE
69
-
70
- it "outputs each undefined step" do
71
- expect(@out.string).to include "UUUU\n"
72
- end
73
-
74
- it "has 4 undefined scenarios" do
75
- expect(@out.string).to include "4 scenarios (4 undefined)"
76
- end
77
-
78
- it "has 4 undefined steps" do
79
- expect(@out.string).to include "4 steps (4 undefined)"
80
- end
81
-
82
- end
83
-
84
- describe "with hooks" do
85
-
86
- describe "all hook passes" do
87
- define_feature <<-FEATURE
88
- Feature:
89
- Scenario:
90
- Given this step passes
91
- FEATURE
92
-
93
- define_steps do
94
- Before do
95
- end
96
- AfterStep do
97
- end
98
- After do
99
- end
100
- Given(/^this step passes$/) {}
101
- end
102
-
103
- it "only steps generate output" do
104
- lines = <<-OUTPUT
105
- .
106
- 1 scenario (1 passed)
107
- 1 step (1 passed)
108
- OUTPUT
109
- lines.split("\n").each do |line|
110
- expect(@out.string).to include line.strip
111
- end
112
- end
113
- end
114
-
115
- describe "with a failing before hook" do
116
- define_feature <<-FEATURE
117
- Feature:
118
- Scenario:
119
- Given this step passes
120
- FEATURE
121
-
122
- define_steps do
123
- Before do
124
- fail "hook failed"
125
- end
126
- Given(/^this step passes$/) {}
127
- end
128
-
129
- it "the failing hook generate output" do
130
- lines = <<-OUTPUT
131
- F-
132
- 1 scenario (1 failed)
133
- 1 step (1 skipped)
134
- OUTPUT
135
- lines.split("\n").each do |line|
136
- expect(@out.string).to include line.strip
137
- end
138
- end
139
- end
140
-
141
- describe "with a failing after hook" do
142
- define_feature <<-FEATURE
143
- Feature:
144
- Scenario:
145
- Given this step passes
146
- FEATURE
147
-
148
- define_steps do
149
- After do
150
- fail "hook failed"
151
- end
152
- Given(/^this step passes$/) {}
153
- end
154
-
155
- it "the failing hook generate output" do
156
- lines = <<-OUTPUT
157
- .F
158
- 1 scenario (1 failed)
159
- 1 step (1 passed)
160
- OUTPUT
161
- lines.split("\n").each do |line|
162
- expect(@out.string).to include line.strip
163
- end
164
- end
165
- end
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,97 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'cucumber/formatter/rerun'
3
- require 'cucumber/core'
4
- require 'cucumber/core/gherkin/writer'
5
- require 'cucumber/core/filter'
6
- require 'support/standard_step_actions'
7
- require 'cucumber/configuration'
8
-
9
- module Cucumber
10
- module Formatter
11
- describe Rerun do
12
- include Cucumber::Core::Gherkin::Writer
13
- include Cucumber::Core
14
-
15
- let(:config) { Cucumber::Configuration.new(out_stream: io) }
16
- let(:io) { StringIO.new }
17
-
18
- # after_test_case
19
- context 'when 2 scenarios fail in the same file' do
20
- it 'Prints the locations of the failed scenarios' do
21
- gherkin = gherkin('foo.feature') do
22
- feature do
23
- scenario do
24
- step 'failing'
25
- end
26
-
27
- scenario do
28
- step 'failing'
29
- end
30
-
31
- scenario do
32
- step 'passing'
33
- end
34
- end
35
- end
36
- Rerun.new(config)
37
- execute [gherkin], [StandardStepActions.new], config.event_bus
38
- config.event_bus.test_run_finished
39
-
40
- expect( io.string ).to eq 'foo.feature:3:6'
41
- end
42
- end
43
-
44
- context 'with failures in multiple files' do
45
- it 'prints the location of the failed scenarios in each file' do
46
- foo = gherkin('foo.feature') do
47
- feature do
48
- scenario do
49
- step 'failing'
50
- end
51
-
52
- scenario do
53
- step 'failing'
54
- end
55
-
56
- scenario do
57
- step 'passing'
58
- end
59
- end
60
- end
61
-
62
- bar = gherkin('bar.feature') do
63
- feature do
64
- scenario do
65
- step 'failing'
66
- end
67
- end
68
- end
69
-
70
- Rerun.new(config)
71
- execute [foo, bar], [StandardStepActions.new], config.event_bus
72
- config.event_bus.test_run_finished
73
-
74
- expect(io.string).to eq 'foo.feature:3:6 bar.feature:3'
75
- end
76
- end
77
-
78
- context 'when there are no failing scenarios' do
79
- it 'prints nothing' do
80
- gherkin = gherkin('foo.feature') do
81
- feature do
82
- scenario do
83
- step 'passing'
84
- end
85
- end
86
- end
87
-
88
- Rerun.new(config)
89
- execute [gherkin], [StandardStepActions.new], config.event_bus
90
- config.event_bus.test_run_finished
91
-
92
- expect(io.string).to eq ''
93
- end
94
- end
95
- end
96
- end
97
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
- module Cucumber
3
- module Formatter
4
- module SpecHelperDsl
5
- attr_reader :feature_content, :step_defs, :feature_filename
6
-
7
- def define_feature(string, feature_file = 'spec.feature')
8
- @feature_content = string
9
- @feature_filename = feature_file
10
- end
11
-
12
- def define_steps(&block)
13
- @step_defs = block
14
- end
15
- end
16
-
17
- require 'cucumber/core'
18
- module SpecHelper
19
- include Core
20
-
21
- def run_defined_feature
22
- define_steps
23
- actual_runtime.visitor = report
24
-
25
- receiver = Test::Runner.new(event_bus)
26
- filters = [
27
- Filters::ActivateSteps.new(
28
- StepMatchSearch.new(actual_runtime.support_code.ruby.method(:step_matches), actual_runtime.configuration),
29
- actual_runtime.configuration
30
- ),
31
- Filters::ApplyAfterStepHooks.new(actual_runtime.support_code),
32
- Filters::ApplyBeforeHooks.new(actual_runtime.support_code),
33
- Filters::ApplyAfterHooks.new(actual_runtime.support_code),
34
- Filters::ApplyAroundHooks.new(actual_runtime.support_code),
35
- Filters::PrepareWorld.new(actual_runtime)
36
- ]
37
- compile [gherkin_doc], receiver, filters
38
- event_bus.test_run_finished
39
- end
40
-
41
- require 'cucumber/formatter/legacy_api/adapter'
42
- def report
43
- @report ||= LegacyApi::Adapter.new(
44
- Fanout.new([@formatter]),
45
- actual_runtime.results,
46
- actual_runtime.configuration)
47
- end
48
-
49
- require 'cucumber/core/gherkin/document'
50
- def gherkin_doc
51
- Core::Gherkin::Document.new(self.class.feature_filename, gherkin)
52
- end
53
-
54
- def gherkin
55
- self.class.feature_content || raise("No feature content defined!")
56
- end
57
-
58
- def runtime
59
- @runtime_facade ||= LegacyApi::RuntimeFacade.new(actual_runtime.results, actual_runtime.support_code, actual_runtime.configuration)
60
- end
61
-
62
- def actual_runtime
63
- @runtime ||= Runtime.new(options)
64
- end
65
-
66
- def event_bus
67
- actual_runtime.configuration.event_bus
68
- end
69
-
70
- def define_steps
71
- return unless step_defs = self.class.step_defs
72
- rb = runtime.support_code.ruby
73
- dsl = Object.new
74
- dsl.extend RbSupport::RbDsl
75
- dsl.instance_exec &step_defs
76
- end
77
-
78
- def options
79
- {}
80
- end
81
- end
82
- end
83
- 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 name" do
6
- expect( subject.name ).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,604 +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
- end
57
-
58
- describe '#map_column!' do
59
- it "should allow mapping columns" do
60
- @table.map_column!('one') { |v| v.to_i }
61
- expect( @table.hashes.first['one'] ).to eq 4444
62
- end
63
-
64
- it "applies the block once to each value" do
65
- headers = ['header']
66
- rows = ['value']
67
- table = DataTable.from [headers, rows]
68
- count = 0
69
- table.map_column!('header') { |value| count +=1 }
70
- table.rows
71
- expect( count ).to eq rows.size
72
- end
73
-
74
- it "should allow mapping columns and take a symbol as the column name" do
75
- @table.map_column!(:one) { |v| v.to_i }
76
- expect( @table.hashes.first['one'] ).to eq 4444
77
- end
78
-
79
- it "should allow mapping columns and modify the rows as well" do
80
- @table.map_column!(:one) { |v| v.to_i }
81
- expect( @table.rows.first ).to include(4444)
82
- expect( @table.rows.first ).to_not include('4444')
83
- end
84
-
85
- it "should pass silently if a mapped column does not exist in non-strict mode" do
86
- expect {
87
- @table.map_column!('two', false) { |v| v.to_i }
88
- @table.hashes
89
- }.not_to raise_error
90
- end
91
-
92
- it "should fail if a mapped column does not exist in strict mode" do
93
- expect {
94
- @table.map_column!('two', true) { |v| v.to_i }
95
- @table.hashes
96
- }.to raise_error('The column named "two" does not exist')
97
- end
98
-
99
- it "should return the table" do
100
- expect( (@table.map_column!(:one) { |v| v.to_i }) ).to eq @table
101
- end
102
- end
103
-
104
- describe '#map_column' do
105
- it "should allow mapping columns" do
106
- new_table = @table.map_column('one') { |v| v.to_i }
107
- expect( new_table.hashes.first['one'] ).to eq 4444
108
- end
109
-
110
- it "applies the block once to each value" do
111
- headers = ['header']
112
- rows = ['value']
113
- table = DataTable.from [headers, rows]
114
- count = 0
115
- new_table = table.map_column('header') { |value| count +=1 }
116
- new_table.rows
117
- expect( count ).to eq rows.size
118
- end
119
-
120
- it "should allow mapping columns and take a symbol as the column name" do
121
- new_table = @table.map_column(:one) { |v| v.to_i }
122
- expect( new_table.hashes.first['one'] ).to eq 4444
123
- end
124
-
125
- it "should allow mapping columns and modify the rows as well" do
126
- new_table = @table.map_column(:one) { |v| v.to_i }
127
- expect( new_table.rows.first ).to include(4444)
128
- expect( new_table.rows.first ).to_not include('4444')
129
- end
130
-
131
- it "should pass silently if a mapped column does not exist in non-strict mode" do
132
- expect {
133
- new_table = @table.map_column('two', false) { |v| v.to_i }
134
- new_table.hashes
135
- }.not_to raise_error
136
- end
137
-
138
- it "should fail if a mapped column does not exist in strict mode" do
139
- expect {
140
- new_table = @table.map_column('two', true) { |v| v.to_i }
141
- new_table.hashes
142
- }.to raise_error('The column named "two" does not exist')
143
- end
144
-
145
- it "should return a new table" do
146
- expect( (@table.map_column(:one) { |v| v.to_i }) ).to_not eq @table
147
- end
148
- end
149
-
150
- describe "#match" do
151
- before(:each) do
152
- @table = DataTable.from([
153
- %w{one four seven},
154
- %w{4444 55555 666666}
155
- ])
156
- end
157
-
158
- it "returns nil if headers do not match" do
159
- expect( @table.match('does,not,match') ).to be_nil
160
- end
161
- it "requires a table: prefix on match" do
162
- expect( @table.match('table:one,four,seven') ).to_not be_nil
163
- end
164
- it "does not match if no table: prefix on match" do
165
- expect( @table.match('one,four,seven') ).to be_nil
166
- end
167
- end
168
-
169
- describe "#transpose" do
170
- before(:each) do
171
- @table = DataTable.from([
172
- %w{one 1111},
173
- %w{two 22222}
174
- ])
175
- end
176
-
177
- it "should be convertible in to an array where each row is a hash" do
178
- expect( @table.transpose.hashes[0] ).to eq('one' => '1111', 'two' => '22222')
179
- end
180
- end
181
-
182
- describe "#rows_hash" do
183
-
184
- it "should return a hash of the rows" do
185
- table = DataTable.from([
186
- %w{one 1111},
187
- %w{two 22222}
188
- ])
189
- expect( table.rows_hash ).to eq( 'one' => '1111', 'two' => '22222' )
190
- end
191
-
192
- it "should fail if the table doesn't have two columns" do
193
- faulty_table = DataTable.from([
194
- %w{one 1111 abc},
195
- %w{two 22222 def}
196
- ])
197
- expect {
198
- faulty_table.rows_hash
199
- }.to raise_error('The table must have exactly 2 columns')
200
- end
201
-
202
- it "should support header and column mapping" do
203
- table = DataTable.from([
204
- %w{one 1111},
205
- %w{two 22222}
206
- ])
207
- t2 = table.map_headers({ 'two' => 'Two' }) { |header| header.upcase }.
208
- map_column('two', false) { |val| val.to_i }
209
- expect( t2.rows_hash ).to eq( 'ONE' => '1111', 'Two' => 22222 )
210
- end
211
- end
212
-
213
- describe '#map_headers!' do
214
- let(:table) do
215
- DataTable.from([
216
- %w{HELLO WORLD},
217
- %w{4444 55555}
218
- ])
219
- end
220
-
221
- it "renames the columns to the specified values in the provided hash" do
222
- @table.map_headers!('one' => :three)
223
- expect( @table.hashes.first[:three] ).to eq '4444'
224
- end
225
-
226
- it "allows renaming columns using regexp" do
227
- @table.map_headers!(/one|uno/ => :three)
228
- expect( @table.hashes.first[:three] ).to eq '4444'
229
- end
230
-
231
- it "copies column mappings" do
232
- @table.map_column!('one') { |v| v.to_i }
233
- @table.map_headers!('one' => 'three')
234
- expect( @table.hashes.first['three'] ).to eq 4444
235
- end
236
-
237
- it "takes a block and operates on all the headers with it" do
238
- table.map_headers! do |header|
239
- header.downcase
240
- end
241
- expect( table.hashes.first.keys ).to match %w[hello world]
242
- end
243
-
244
- it "treats the mappings in the provided hash as overrides when used with a block" do
245
- table.map_headers!('WORLD' => 'foo') do |header|
246
- header.downcase
247
- end
248
-
249
- expect( table.hashes.first.keys ).to match %w[hello foo]
250
- end
251
- end
252
-
253
- describe '#map_headers' do
254
- let(:table) do
255
- DataTable.from([
256
- %w{HELLO WORLD},
257
- %w{4444 55555}
258
- ])
259
- end
260
-
261
- it "renames the columns to the specified values in the provided hash" do
262
- table2 = @table.map_headers('one' => :three)
263
- expect( table2.hashes.first[:three] ).to eq '4444'
264
- end
265
-
266
- it "allows renaming columns using regexp" do
267
- table2 = @table.map_headers(/one|uno/ => :three)
268
- expect( table2.hashes.first[:three] ).to eq '4444'
269
- end
270
-
271
- it "copies column mappings" do
272
- @table.map_column!('one') { |v| v.to_i }
273
- table2 = @table.map_headers('one' => 'three')
274
- expect( table2.hashes.first['three'] ).to eq 4444
275
- end
276
-
277
- it "takes a block and operates on all the headers with it" do
278
- table2 = table.map_headers do |header|
279
- header.downcase
280
- end
281
-
282
- expect( table2.hashes.first.keys ).to match %w[hello world]
283
- end
284
-
285
- it "treats the mappings in the provided hash as overrides when used with a block" do
286
- table2 = table.map_headers('WORLD' => 'foo') do |header|
287
- header.downcase
288
- end
289
-
290
- expect( table2.hashes.first.keys ).to match %w[hello foo]
291
- end
292
- end
293
-
294
- describe "diff!" do
295
- it "should detect a complex diff" do
296
- t1 = DataTable.from(%{
297
- | 1 | 22 | 333 | 4444 |
298
- | 55555 | 666666 | 7777777 | 88888888 |
299
- | 999999999 | 0000000000 | 01010101010 | 121212121212 |
300
- | 4000 | ABC | DEF | 50000 |
301
- })
302
-
303
- t2 = DataTable.from(%{
304
- | a | 4444 | 1 |
305
- | bb | 88888888 | 55555 |
306
- | ccc | xxxxxxxx | 999999999 |
307
- | dddd | 4000 | 300 |
308
- | e | 50000 | 4000 |
309
- })
310
- expect { t1.diff!(t2) }.to raise_error
311
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
312
- | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
313
- | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
314
- | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
315
- | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
316
- | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
317
- | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
318
- }
319
- end
320
-
321
- it "should not change table when diffed with identical" do
322
- t = DataTable.from(%{
323
- |a|b|c|
324
- |d|e|f|
325
- |g|h|i|
326
- })
327
- t.diff!(t.dup)
328
- expect( t.to_s(:indent => 12, :color => false) ).to eq %{
329
- | a | b | c |
330
- | d | e | f |
331
- | g | h | i |
332
- }
333
- end
334
-
335
- context "in case of duplicate header values" do
336
- it "raises no error for two identical tables" do
337
- t = DataTable.from(%{
338
- |a|a|c|
339
- |d|e|f|
340
- |g|h|i|
341
- })
342
- t.diff!(t.dup)
343
- expect( t.to_s(:indent => 12, :color => false) ).to eq %{
344
- | a | a | c |
345
- | d | e | f |
346
- | g | h | i |
347
- }
348
- end
349
-
350
- it "detects a diff in one cell" do
351
- t1 = DataTable.from(%{
352
- |a|a|c|
353
- |d|e|f|
354
- |g|h|i|
355
- })
356
- t2 = DataTable.from(%{
357
- |a|a|c|
358
- |d|oops|f|
359
- |g|h|i|
360
- })
361
- expect{ t1.diff!(t2) }.to raise_error
362
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
363
- | a | a | c |
364
- | (-) d | (-) e | (-) f |
365
- | (+) d | (+) oops | (+) f |
366
- | g | h | i |
367
- }
368
- end
369
-
370
- it "detects missing columns" do
371
- t1 = DataTable.from(%{
372
- |a|a|b|c|
373
- |d|d|e|f|
374
- |g|g|h|i|
375
- })
376
- t2 = DataTable.from(%{
377
- |a|b|c|
378
- |d|e|f|
379
- |g|h|i|
380
- })
381
- expect{ t1.diff!(t2) }.to raise_error
382
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
383
- | a | (-) a | b | c |
384
- | d | (-) d | e | f |
385
- | g | (-) g | h | i |
386
- }
387
- end
388
-
389
- it "detects surplus columns" do
390
- t1 = DataTable.from(%{
391
- |a|b|c|
392
- |d|e|f|
393
- |g|h|i|
394
- })
395
- t2 = DataTable.from(%{
396
- |a|b|a|c|
397
- |d|e|d|f|
398
- |g|h|g|i|
399
- })
400
- expect{ t1.diff!(t2, :surplus_col => true) }.to raise_error
401
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
402
- | a | b | c | (+) a |
403
- | d | e | f | (+) d |
404
- | g | h | i | (+) g |
405
- }
406
- end
407
- end
408
-
409
- it "should inspect missing and surplus cells" do
410
- t1 = DataTable.from([
411
- ['name', 'male', 'lastname', 'swedish'],
412
- ['aslak', 'true', 'hellesøy', 'false']
413
- ])
414
- t2 = DataTable.from([
415
- ['name', 'male', 'lastname', 'swedish'],
416
- ['aslak', true, 'hellesøy', false]
417
- ])
418
- expect { t1.diff!(t2) }.to raise_error
419
-
420
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
421
- | name | male | lastname | swedish |
422
- | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
423
- | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
424
- }
425
- end
426
-
427
- it "should allow column mapping of target before diffing" do
428
- t1 = DataTable.from([
429
- ['name', 'male'],
430
- ['aslak', 'true']
431
- ])
432
- t1.map_column!('male') { |m| m == 'true' }
433
- t2 = DataTable.from([
434
- ['name', 'male'],
435
- ['aslak', true]
436
- ])
437
- t1.diff!(t2)
438
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
439
- | name | male |
440
- | aslak | true |
441
- }
442
- end
443
-
444
- it "should allow column mapping of argument before diffing" do
445
- t1 = DataTable.from([
446
- ['name', 'male'],
447
- ['aslak', true]
448
- ])
449
- t1.map_column!('male') {
450
- 'true'
451
- }
452
- t2 = DataTable.from([
453
- ['name', 'male'],
454
- ['aslak', 'true']
455
- ])
456
- t2.diff!(t1)
457
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
458
- | name | male |
459
- | aslak | true |
460
- }
461
- end
462
-
463
- it "should allow header mapping before diffing" do
464
- t1 = DataTable.from([
465
- ['Name', 'Male'],
466
- ['aslak', 'true']
467
- ])
468
- t1.map_headers!('Name' => 'name', 'Male' => 'male')
469
- t1.map_column!('male') { |m| m == 'true' }
470
- t2 = DataTable.from([
471
- ['name', 'male'],
472
- ['aslak', true]
473
- ])
474
- t1.diff!(t2)
475
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
476
- | name | male |
477
- | aslak | true |
478
- }
479
- end
480
-
481
- it "should detect seemingly identical tables as different" do
482
- t1 = DataTable.from([
483
- ['X', 'Y'],
484
- ['2', '1']
485
- ])
486
- t2 = DataTable.from([
487
- ['X', 'Y'],
488
- [2, 1]
489
- ])
490
- expect { t1.diff!(t2) }.to raise_error
491
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
492
- | X | Y |
493
- | (-) (i) "2" | (-) (i) "1" |
494
- | (+) (i) 2 | (+) (i) 1 |
495
- }
496
- end
497
-
498
- it "should not allow mappings that match more than 1 column" do
499
- t1 = DataTable.from([
500
- ['Cuke', 'Duke'],
501
- ['Foo', 'Bar']
502
- ])
503
- expect do
504
- t1.map_headers!(/uk/ => 'u')
505
- t1.hashes
506
- end.to raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
507
- end
508
-
509
- describe "raising" do
510
- before do
511
- @t = DataTable.from(%{
512
- | a | b |
513
- | c | d |
514
- })
515
- expect( @t ).not_to eq nil
516
- end
517
-
518
- it "should raise on missing rows" do
519
- t = DataTable.from(%{
520
- | a | b |
521
- })
522
- expect( lambda { @t.dup.diff!(t) } ).to raise_error
523
- expect { @t.dup.diff!(t, :missing_row => false) }.not_to raise_error
524
- end
525
-
526
- it "should not raise on surplus rows when surplus is at the end" do
527
- t = DataTable.from(%{
528
- | a | b |
529
- | c | d |
530
- | e | f |
531
- })
532
- expect { @t.dup.diff!(t) }.to raise_error
533
- expect { @t.dup.diff!(t, :surplus_row => false) }.not_to raise_error
534
- end
535
-
536
- it "should not raise on surplus rows when surplus is interleaved" do
537
- t1 = DataTable.from(%{
538
- | row_1 | row_2 |
539
- | four | 4 |
540
- })
541
- t2 = DataTable.from(%{
542
- | row_1 | row_2 |
543
- | one | 1 |
544
- | two | 2 |
545
- | three | 3 |
546
- | four | 4 |
547
- | five | 5 |
548
- })
549
- expect { t1.dup.diff!(t2) }.to raise_error
550
-
551
- expect { t1.dup.diff!(t2, :surplus_row => false) }.not_to raise_error
552
- end
553
-
554
- it "should raise on missing columns" do
555
- t = DataTable.from(%{
556
- | a |
557
- | c |
558
- })
559
- expect { @t.dup.diff!(t) }.to raise_error
560
- expect { @t.dup.diff!(t, :missing_col => false) }.not_to raise_error
561
- end
562
-
563
- it "should not raise on surplus columns" do
564
- t = DataTable.from(%{
565
- | a | b | x |
566
- | c | d | y |
567
- })
568
- expect { @t.dup.diff!(t) }.not_to raise_error
569
- expect { @t.dup.diff!(t, :surplus_col => true) }.to raise_error
570
- end
571
-
572
- it "should not raise on misplaced columns" do
573
- t = DataTable.from(%{
574
- | b | a |
575
- | d | c |
576
- })
577
- expect { @t.dup.diff!(t) }.not_to raise_error
578
- expect { @t.dup.diff!(t, :misplaced_col => true) }.to raise_error
579
- end
580
- end
581
-
582
- it "can compare to an Array" do
583
- t = DataTable.from(%{
584
- | b | a |
585
- | d | c |
586
- })
587
- other = [ %w{b a}, %w{d c} ]
588
-
589
- expect { t.diff!(other) }.not_to raise_error
590
- end
591
- end
592
-
593
- describe "#from" do
594
- it "should allow Array of Hash" do
595
- t1 = DataTable.from([{'name' => 'aslak', 'male' => 'true'}])
596
- expect( t1.to_s(:indent => 12, :color => false) ).to eq %{
597
- | male | name |
598
- | true | aslak |
599
- }
600
- end
601
- end
602
- end
603
- end
604
- end