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,137 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
- require 'cucumber/formatter/interceptor'
4
-
5
- module Cucumber::Formatter
6
- describe Interceptor::Pipe do
7
- let(:pipe) do
8
- pipe = double('original pipe')
9
-
10
- allow(pipe).to receive(:instance_of?) { true }
11
-
12
- pipe
13
- end
14
-
15
- describe '#wrap!' do
16
- it 'raises an ArgumentError if its not passed :stderr/:stdout' do
17
- expect {
18
- Interceptor::Pipe.wrap(:nonsense)
19
- }.to raise_error(ArgumentError)
20
- end
21
-
22
- context 'when passed :stderr' do
23
- before :each do
24
- @stderr = $stdout
25
- end
26
-
27
- it 'wraps $stderr' do
28
- wrapped = Interceptor::Pipe.wrap(:stderr)
29
-
30
- expect($stderr).to be_instance_of Interceptor::Pipe
31
- expect($stderr).to be wrapped
32
- end
33
-
34
- after :each do
35
- $stderr = @stderr
36
- end
37
- end
38
-
39
- context 'when passed :stdout' do
40
- before :each do
41
- @stdout = $stdout
42
- end
43
-
44
- it 'wraps $stdout' do
45
- wrapped = Interceptor::Pipe.wrap(:stdout)
46
-
47
- expect($stdout).to be_instance_of Interceptor::Pipe
48
- expect($stdout).to be wrapped
49
- end
50
-
51
- after :each do
52
- $stdout = @stdout
53
- end
54
- end
55
- end
56
-
57
- describe '#unwrap!' do
58
- before :each do
59
- @stdout = $stdout
60
- @wrapped = Interceptor::Pipe.wrap(:stdout)
61
- end
62
-
63
- it 'raises an ArgumentError if it wasn\'t passed :stderr/:stdout' do
64
- expect {
65
- Interceptor::Pipe.unwrap!(:nonsense)
66
- }.to raise_error(ArgumentError)
67
- end
68
-
69
- it 'resets $stdout when #unwrap! is called' do
70
- interceptor = Interceptor::Pipe.unwrap! :stdout
71
-
72
- expect(interceptor).to be_instance_of Interceptor::Pipe
73
- expect($stdout).not_to be interceptor
74
- end
75
-
76
- it 'noops if $stdout or $stderr has been overwritten' do
77
- $stdout = StringIO.new
78
- pipe = Interceptor::Pipe.unwrap! :stdout
79
- expect(pipe).to eq $stdout
80
-
81
- $stderr = StringIO.new
82
- pipe = Interceptor::Pipe.unwrap! :stderr
83
- expect(pipe).to eq $stderr
84
- end
85
-
86
- it 'disables the pipe bypass' do
87
- buffer = '(::)'
88
- Interceptor::Pipe.unwrap! :stdout
89
-
90
- expect(@wrapped).to receive(:write).with(buffer)
91
- expect(@wrapped.buffer).not_to receive(:<<)
92
-
93
- @wrapped.write(buffer)
94
- end
95
-
96
- after :each do
97
- $stdout = @stdout
98
- end
99
- end
100
-
101
- describe '#write' do
102
- let(:buffer) { 'Some stupid buffer' }
103
- let(:pi) { Interceptor::Pipe.new(pipe) }
104
-
105
- it 'writes arguments to the original pipe' do
106
- expect(pipe).to receive(:write).with(buffer) { buffer.size }
107
- expect(pi.write(buffer)).to eq buffer.size
108
- end
109
-
110
- it 'adds the buffer to its stored output' do
111
- allow(pipe).to receive(:write)
112
-
113
- pi.write(buffer)
114
-
115
- expect(pi.buffer).not_to be_empty
116
- expect(pi.buffer.first).to eq buffer
117
- end
118
- end
119
-
120
- describe '#method_missing' do
121
- let(:pi) { Interceptor::Pipe.new(pipe) }
122
-
123
- it 'passes #tty? to the original pipe' do
124
- expect(pipe).to receive(:tty?) { true }
125
- expect(pi.tty?).to be true
126
- end
127
- end
128
-
129
- describe '#respond_to' do
130
- let(:pi) { Interceptor::Pipe.wrap(:stderr) }
131
-
132
- it 'responds to all methods $stderr has' do
133
- $stderr.methods.each { |m| expect(pi.respond_to?(m)).to be true }
134
- end
135
- end
136
- end
137
- end
@@ -1,842 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
- require 'cucumber/formatter/spec_helper'
4
- require 'cucumber/formatter/json'
5
- require 'cucumber/cli/options'
6
- require 'multi_json'
7
-
8
- module Cucumber
9
- module Formatter
10
- describe Json do
11
- extend SpecHelperDsl
12
- include SpecHelper
13
-
14
- context "Given a single feature" do
15
- before(:each) do
16
- @out = StringIO.new
17
- @formatter = Json.new(actual_runtime.configuration.with_options(out_stream: @out))
18
- run_defined_feature
19
- end
20
-
21
- describe "with a scenario with no steps" do
22
- define_feature <<-FEATURE
23
- Feature: Banana party
24
-
25
- Scenario: Monkey eats bananas
26
- FEATURE
27
-
28
- it "outputs the json data" do
29
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
30
- [{"id": "banana-party",
31
- "uri": "spec.feature",
32
- "keyword": "Feature",
33
- "name": "Banana party",
34
- "line": 1,
35
- "description": "",
36
- "elements":
37
- [{"id": "banana-party;monkey-eats-bananas",
38
- "keyword": "Scenario",
39
- "name": "Monkey eats bananas",
40
- "line": 3,
41
- "description": "",
42
- "type": "scenario"}]}]})
43
- end
44
- end
45
-
46
- describe "with a scenario with an undefined step" do
47
- define_feature <<-FEATURE
48
- Feature: Banana party
49
-
50
- Scenario: Monkey eats bananas
51
- Given there are bananas
52
- FEATURE
53
-
54
- it "outputs the json data" do
55
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
56
- [{"id": "banana-party",
57
- "uri": "spec.feature",
58
- "keyword": "Feature",
59
- "name": "Banana party",
60
- "line": 1,
61
- "description": "",
62
- "elements":
63
- [{"id": "banana-party;monkey-eats-bananas",
64
- "keyword": "Scenario",
65
- "name": "Monkey eats bananas",
66
- "line": 3,
67
- "description": "",
68
- "type": "scenario",
69
- "steps":
70
- [{"keyword": "Given ",
71
- "name": "there are bananas",
72
- "line": 4,
73
- "match": {"location": "spec.feature:4"},
74
- "result": {"status": "undefined"}}]}]}]})
75
- end
76
- end
77
-
78
- describe "with a scenario with a passed step" do
79
- define_feature <<-FEATURE
80
- Feature: Banana party
81
-
82
- Scenario: Monkey eats bananas
83
- Given there are bananas
84
- FEATURE
85
-
86
- define_steps do
87
- Given(/^there are bananas$/) {}
88
- end
89
-
90
- it "outputs the json data" do
91
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
92
- [{"id": "banana-party",
93
- "uri": "spec.feature",
94
- "keyword": "Feature",
95
- "name": "Banana party",
96
- "line": 1,
97
- "description": "",
98
- "elements":
99
- [{"id": "banana-party;monkey-eats-bananas",
100
- "keyword": "Scenario",
101
- "name": "Monkey eats bananas",
102
- "line": 3,
103
- "description": "",
104
- "type": "scenario",
105
- "steps":
106
- [{"keyword": "Given ",
107
- "name": "there are bananas",
108
- "line": 4,
109
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:87"},
110
- "result": {"status": "passed",
111
- "duration": 1}}]}]}]})
112
- end
113
- end
114
-
115
- describe "with a scenario with a failed step" do
116
- define_feature <<-FEATURE
117
- Feature: Banana party
118
-
119
- Scenario: Monkey eats bananas
120
- Given there are bananas
121
- FEATURE
122
-
123
- define_steps do
124
- Given(/^there are bananas$/) { raise "no bananas" }
125
- end
126
-
127
- it "outputs the json data" do
128
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
129
- [{"id": "banana-party",
130
- "uri": "spec.feature",
131
- "keyword": "Feature",
132
- "name": "Banana party",
133
- "line": 1,
134
- "description": "",
135
- "elements":
136
- [{"id": "banana-party;monkey-eats-bananas",
137
- "keyword": "Scenario",
138
- "name": "Monkey eats bananas",
139
- "line": 3,
140
- "description": "",
141
- "type": "scenario",
142
- "steps":
143
- [{"keyword": "Given ",
144
- "name": "there are bananas",
145
- "line": 4,
146
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:124"},
147
- "result": {"status": "failed",
148
- "error_message": "no bananas (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:124:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
149
- "duration": 1}}]}]}]})
150
- end
151
- end
152
-
153
- describe "with a scenario with a pending step" do
154
- define_feature <<-FEATURE
155
- Feature: Banana party
156
-
157
- Scenario: Monkey eats bananas
158
- Given there are bananas
159
- FEATURE
160
-
161
- define_steps do
162
- Given(/^there are bananas$/) { pending }
163
- end
164
-
165
- it "outputs the json data" do
166
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
167
- [{"id": "banana-party",
168
- "uri": "spec.feature",
169
- "keyword": "Feature",
170
- "name": "Banana party",
171
- "line": 1,
172
- "description": "",
173
- "elements":
174
- [{"id": "banana-party;monkey-eats-bananas",
175
- "keyword": "Scenario",
176
- "name": "Monkey eats bananas",
177
- "line": 3,
178
- "description": "",
179
- "type": "scenario",
180
- "steps":
181
- [{"keyword": "Given ",
182
- "name": "there are bananas",
183
- "line": 4,
184
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:162"},
185
- "result": {"status": "pending",
186
- "error_message": "TODO (Cucumber::Pending)\\n./spec/cucumber/formatter/json_spec.rb:162:in `/^there are bananas$/'\\nspec.feature:4:in `Given there are bananas'",
187
- "duration": 1}}]}]}]})
188
- end
189
- end
190
-
191
- describe "with a scenario outline with one example" do
192
- define_feature <<-FEATURE
193
- Feature: Banana party
194
-
195
- Scenario Outline: Monkey eats bananas
196
- Given there are <fruit>
197
-
198
- Examples: Fruit Table
199
- | fruit |
200
- | bananas |
201
- FEATURE
202
-
203
- define_steps do
204
- Given(/^there are bananas$/) {}
205
- end
206
-
207
- it "outputs the json data" do
208
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
209
- [{"id": "banana-party",
210
- "uri": "spec.feature",
211
- "keyword": "Feature",
212
- "name": "Banana party",
213
- "line": 1,
214
- "description": "",
215
- "elements":
216
- [{"id": "banana-party;monkey-eats-bananas;fruit-table;2",
217
- "keyword": "Scenario Outline",
218
- "name": "Monkey eats bananas",
219
- "line": 8,
220
- "description": "",
221
- "type": "scenario",
222
- "steps":
223
- [{"keyword": "Given ",
224
- "name": "there are bananas",
225
- "line": 8,
226
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:204"},
227
- "result": {"status": "passed",
228
- "duration": 1}}]}]}]})
229
- end
230
- end
231
-
232
- describe "with tags in the feature file" do
233
- define_feature <<-FEATURE
234
- @f
235
- Feature: Banana party
236
-
237
- @s
238
- Scenario: Monkey eats bananas
239
- Given there are bananas
240
-
241
- @so
242
- Scenario Outline: Monkey eats bananas
243
- Given there are <fruit>
244
-
245
- @ex
246
- Examples: Fruit Table
247
- | fruit |
248
- | bananas |
249
- FEATURE
250
-
251
- define_steps do
252
- Given(/^there are bananas$/) {}
253
- end
254
-
255
- it "the tags are included in the json data" do
256
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
257
- [{"id": "banana-party",
258
- "uri": "spec.feature",
259
- "keyword": "Feature",
260
- "name": "Banana party",
261
- "line": 2,
262
- "description": "",
263
- "tags": [{"name": "@f",
264
- "line": 1}],
265
- "elements":
266
- [{"id": "banana-party;monkey-eats-bananas",
267
- "keyword": "Scenario",
268
- "name": "Monkey eats bananas",
269
- "line": 5,
270
- "description": "",
271
- "tags": [{"name": "@f",
272
- "line": 1},
273
- {"name": "@s",
274
- "line": 4}],
275
- "type": "scenario",
276
- "steps":
277
- [{"keyword": "Given ",
278
- "name": "there are bananas",
279
- "line": 6,
280
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:252"},
281
- "result": {"status": "passed",
282
- "duration": 1}}]},
283
- {"id": "banana-party;monkey-eats-bananas;fruit-table;2",
284
- "keyword": "Scenario Outline",
285
- "name": "Monkey eats bananas",
286
- "line": 15,
287
- "description": "",
288
- "tags": [{"name": "@f",
289
- "line": 1},
290
- {"name": "@so",
291
- "line": 8},
292
- {"name": "@ex",
293
- "line": 12}],
294
- "type": "scenario",
295
- "steps":
296
- [{"keyword": "Given ",
297
- "name": "there are bananas",
298
- "line": 15,
299
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:252"},
300
- "result": {"status": "passed",
301
- "duration": 1}}]}]}]})
302
- end
303
- end
304
-
305
- describe "with comments in the feature file" do
306
- define_feature <<-FEATURE
307
- #feature comment
308
- Feature: Banana party
309
-
310
- #background comment
311
- Background: There are bananas
312
- Given there are bananas
313
-
314
- #scenario comment
315
- Scenario: Monkey eats bananas
316
- #step comment1
317
- Then the monkey eats bananas
318
-
319
- #scenario outline comment
320
- Scenario Outline: Monkey eats bananas
321
- #step comment2
322
- Then the monkey eats <fruit>
323
-
324
- #examples table comment
325
- Examples: Fruit Table
326
- | fruit |
327
- #examples table row comment
328
- | bananas |
329
- FEATURE
330
-
331
- define_steps do
332
- Given(/^there are bananas$/) {}
333
- Then(/^the monkey eats bananas$/) {}
334
- end
335
-
336
- it "the comments are included in the json data" do
337
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
338
- [{"id": "banana-party",
339
- "uri": "spec.feature",
340
- "keyword": "Feature",
341
- "name": "Banana party",
342
- "line": 2,
343
- "description": "",
344
- "comments": [{"value": "#feature comment",
345
- "line": 1}],
346
- "elements":
347
- [{"keyword": "Background",
348
- "name": "There are bananas",
349
- "line": 5,
350
- "description": "",
351
- "comments": [{"value": "#background comment",
352
- "line": 4}],
353
- "type": "background",
354
- "steps":
355
- [{"keyword": "Given ",
356
- "name": "there are bananas",
357
- "line": 6,
358
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:332"},
359
- "result": {"status": "passed",
360
- "duration": 1}}]},
361
- {"id": "banana-party;monkey-eats-bananas",
362
- "keyword": "Scenario",
363
- "name": "Monkey eats bananas",
364
- "line": 9,
365
- "description": "",
366
- "comments": [{"value": "#scenario comment",
367
- "line": 8}],
368
- "type": "scenario",
369
- "steps":
370
- [{"keyword": "Then ",
371
- "name": "the monkey eats bananas",
372
- "line": 11,
373
- "comments": [{"value": "#step comment1",
374
- "line": 10}],
375
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:333"},
376
- "result": {"status": "passed",
377
- "duration": 1}}]},
378
- {"keyword": "Background",
379
- "name": "There are bananas",
380
- "line": 5,
381
- "description": "",
382
- "comments": [{"value": "#background comment",
383
- "line": 4}],
384
- "type": "background",
385
- "steps":
386
- [{"keyword": "Given ",
387
- "name": "there are bananas",
388
- "line": 6,
389
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:332"},
390
- "result": {"status": "passed",
391
- "duration": 1}}]},
392
- {"id": "banana-party;monkey-eats-bananas;fruit-table;2",
393
- "keyword": "Scenario Outline",
394
- "name": "Monkey eats bananas",
395
- "line": 22,
396
- "description": "",
397
- "comments": [{"value": "#scenario outline comment",
398
- "line": 13},
399
- {"value": "#examples table comment",
400
- "line": 18},
401
- {"value": "#examples table row comment",
402
- "line": 21}],
403
- "type": "scenario",
404
- "steps":
405
- [{"keyword": "Then ",
406
- "name": "the monkey eats bananas",
407
- "line": 22,
408
- "comments": [{"value": "#step comment2",
409
- "line": 15}],
410
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:333"},
411
- "result": {"status": "passed",
412
- "duration": 1}}]}]}]})
413
- end
414
- end
415
-
416
- describe "with a scenario with a step with a doc string" do
417
- define_feature <<-FEATURE
418
- Feature: Banana party
419
-
420
- Scenario: Monkey eats bananas
421
- Given there are bananas
422
- """
423
- the doc string
424
- """
425
- FEATURE
426
-
427
- define_steps do
428
- Given(/^there are bananas$/) { |s| s }
429
- end
430
-
431
- it "includes the doc string in the json data" do
432
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
433
- [{"id": "banana-party",
434
- "uri": "spec.feature",
435
- "keyword": "Feature",
436
- "name": "Banana party",
437
- "line": 1,
438
- "description": "",
439
- "elements":
440
- [{"id": "banana-party;monkey-eats-bananas",
441
- "keyword": "Scenario",
442
- "name": "Monkey eats bananas",
443
- "line": 3,
444
- "description": "",
445
- "type": "scenario",
446
- "steps":
447
- [{"keyword": "Given ",
448
- "name": "there are bananas",
449
- "line": 4,
450
- "doc_string": {"value": "the doc string",
451
- "content_type": "",
452
- "line": 5},
453
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:428"},
454
- "result": {"status": "passed",
455
- "duration": 1}}]}]}]})
456
- end
457
- end
458
-
459
- describe "with a scenario with a step that use puts" do
460
- define_feature <<-FEATURE
461
- Feature: Banana party
462
-
463
- Scenario: Monkey eats bananas
464
- Given there are bananas
465
- FEATURE
466
-
467
- define_steps do
468
- Given(/^there are bananas$/) { puts "from step" }
469
- end
470
-
471
- it "includes the output from the step in the json data" do
472
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
473
- [{"id": "banana-party",
474
- "uri": "spec.feature",
475
- "keyword": "Feature",
476
- "name": "Banana party",
477
- "line": 1,
478
- "description": "",
479
- "elements":
480
- [{"id": "banana-party;monkey-eats-bananas",
481
- "keyword": "Scenario",
482
- "name": "Monkey eats bananas",
483
- "line": 3,
484
- "description": "",
485
- "type": "scenario",
486
- "steps":
487
- [{"keyword": "Given ",
488
- "name": "there are bananas",
489
- "line": 4,
490
- "output": ["from step"],
491
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:468"},
492
- "result": {"status": "passed",
493
- "duration": 1}}]}]}]})
494
- end
495
- end
496
-
497
- describe "with a background" do
498
- define_feature <<-FEATURE
499
- Feature: Banana party
500
-
501
- Background: There are bananas
502
- Given there are bananas
503
-
504
- Scenario: Monkey eats bananas
505
- Then the monkey eats bananas
506
-
507
- Scenario: Monkey eats more bananas
508
- Then the monkey eats more bananas
509
- FEATURE
510
-
511
- it "includes the background in the json data each time it is executed" do
512
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
513
- [{"id": "banana-party",
514
- "uri": "spec.feature",
515
- "keyword": "Feature",
516
- "name": "Banana party",
517
- "line": 1,
518
- "description": "",
519
- "elements":
520
- [{"keyword": "Background",
521
- "name": "There are bananas",
522
- "line": 3,
523
- "description": "",
524
- "type": "background",
525
- "steps":
526
- [{"keyword": "Given ",
527
- "name": "there are bananas",
528
- "line": 4,
529
- "match": {"location": "spec.feature:4"},
530
- "result": {"status": "undefined"}}]},
531
- {"id": "banana-party;monkey-eats-bananas",
532
- "keyword": "Scenario",
533
- "name": "Monkey eats bananas",
534
- "line": 6,
535
- "description": "",
536
- "type": "scenario",
537
- "steps":
538
- [{"keyword": "Then ",
539
- "name": "the monkey eats bananas",
540
- "line": 7,
541
- "match": {"location": "spec.feature:7"},
542
- "result": {"status": "undefined"}}]},
543
- {"keyword": "Background",
544
- "name": "There are bananas",
545
- "line": 3,
546
- "description": "",
547
- "type": "background",
548
- "steps":
549
- [{"keyword": "Given ",
550
- "name": "there are bananas",
551
- "line": 4,
552
- "match": {"location": "spec.feature:4"},
553
- "result": {"status": "undefined"}}]},
554
- {"id": "banana-party;monkey-eats-more-bananas",
555
- "keyword": "Scenario",
556
- "name": "Monkey eats more bananas",
557
- "line": 9,
558
- "description": "",
559
- "type": "scenario",
560
- "steps":
561
- [{"keyword": "Then ",
562
- "name": "the monkey eats more bananas",
563
- "line": 10,
564
- "match": {"location": "spec.feature:10"},
565
- "result": {"status": "undefined"}}]}]}]})
566
- end
567
- end
568
-
569
- describe "with a scenario with a step that embeds data directly" do
570
- define_feature <<-FEATURE
571
- Feature: Banana party
572
-
573
- Scenario: Monkey eats bananas
574
- Given there are bananas
575
- FEATURE
576
-
577
- define_steps do
578
- Given(/^there are bananas$/) { data = "YWJj"
579
- embed data, "mime-type;base64" }
580
- end
581
-
582
- it "includes the data from the step in the json data" do
583
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
584
- [{"id": "banana-party",
585
- "uri": "spec.feature",
586
- "keyword": "Feature",
587
- "name": "Banana party",
588
- "line": 1,
589
- "description": "",
590
- "elements":
591
- [{"id": "banana-party;monkey-eats-bananas",
592
- "keyword": "Scenario",
593
- "name": "Monkey eats bananas",
594
- "line": 3,
595
- "description": "",
596
- "type": "scenario",
597
- "steps":
598
- [{"keyword": "Given ",
599
- "name": "there are bananas",
600
- "line": 4,
601
- "embeddings": [{"mime_type": "mime-type",
602
- "data": "YWJj"}],
603
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:578"},
604
- "result": {"status": "passed",
605
- "duration": 1}}]}]}]})
606
- end
607
- end
608
-
609
- describe "with a scenario with a step that embeds a file" do
610
- define_feature <<-FEATURE
611
- Feature: Banana party
612
-
613
- Scenario: Monkey eats bananas
614
- Given there are bananas
615
- FEATURE
616
-
617
- define_steps do
618
- Given(/^there are bananas$/) {
619
- RSpec::Mocks.allow_message(File, :file?) { true }
620
- f1 = RSpec::Mocks::Double.new
621
- RSpec::Mocks.allow_message(File, :open) { |&block| block.call(f1) }
622
- RSpec::Mocks.allow_message(f1, :read) { "foo" }
623
- embed('out/snapshot.jpeg', 'image/png')
624
- }
625
- end
626
-
627
- it "includes the file content in the json data" do
628
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
629
- [{"id": "banana-party",
630
- "uri": "spec.feature",
631
- "keyword": "Feature",
632
- "name": "Banana party",
633
- "line": 1,
634
- "description": "",
635
- "elements":
636
- [{"id": "banana-party;monkey-eats-bananas",
637
- "keyword": "Scenario",
638
- "name": "Monkey eats bananas",
639
- "line": 3,
640
- "description": "",
641
- "type": "scenario",
642
- "steps":
643
- [{"keyword": "Given ",
644
- "name": "there are bananas",
645
- "line": 4,
646
- "embeddings": [{"mime_type": "image/png",
647
- "data": "Zm9v"}],
648
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:618"},
649
- "result": {"status": "passed",
650
- "duration": 1}}]}]}]})
651
- end
652
- end
653
-
654
- describe "with a scenario with hooks" do
655
- define_feature <<-FEATURE
656
- Feature: Banana party
657
-
658
- Scenario: Monkey eats bananas
659
- Given there are bananas
660
- FEATURE
661
-
662
- define_steps do
663
- Before() {}
664
- Before() {}
665
- After() {}
666
- After() {}
667
- AfterStep() {}
668
- AfterStep() {}
669
- Around() { |scenario, block| block.call }
670
- Given(/^there are bananas$/) {}
671
- end
672
-
673
- it "includes all hooks except the around hook in the json data" do
674
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
675
- [{"id": "banana-party",
676
- "uri": "spec.feature",
677
- "keyword": "Feature",
678
- "name": "Banana party",
679
- "line": 1,
680
- "description": "",
681
- "elements":
682
- [{"id": "banana-party;monkey-eats-bananas",
683
- "keyword": "Scenario",
684
- "name": "Monkey eats bananas",
685
- "line": 3,
686
- "description": "",
687
- "type": "scenario",
688
- "before":
689
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:663"},
690
- "result": {"status": "passed",
691
- "duration": 1}},
692
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:664"},
693
- "result": {"status": "passed",
694
- "duration": 1}}],
695
- "steps":
696
- [{"keyword": "Given ",
697
- "name": "there are bananas",
698
- "line": 4,
699
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:670"},
700
- "result": {"status": "passed",
701
- "duration": 1},
702
- "after":
703
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:667"},
704
- "result": {"status": "passed",
705
- "duration": 1}},
706
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:668"},
707
- "result": {"status": "passed",
708
- "duration": 1}}]}],
709
- "after":
710
- [{"match": {"location": "spec/cucumber/formatter/json_spec.rb:666"},
711
- "result": {"status": "passed",
712
- "duration": 1}},
713
- {"match": {"location": "spec/cucumber/formatter/json_spec.rb:665"},
714
- "result": {"status": "passed",
715
- "duration": 1}}]}]}]})
716
- end
717
- end
718
-
719
- describe "with a scenario when only an around hook is failing" do
720
- define_feature <<-FEATURE
721
- Feature: Banana party
722
-
723
- Scenario: Monkey eats bananas
724
- Given there are bananas
725
- FEATURE
726
-
727
- define_steps do
728
- Around() { |scenario, block| block.call; raise RuntimeError, "error" }
729
- Given(/^there are bananas$/) {}
730
- end
731
-
732
- it "includes the around hook result in the json data" do
733
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
734
- [{"id": "banana-party",
735
- "uri": "spec.feature",
736
- "keyword": "Feature",
737
- "name": "Banana party",
738
- "line": 1,
739
- "description": "",
740
- "elements":
741
- [{"id": "banana-party;monkey-eats-bananas",
742
- "keyword": "Scenario",
743
- "name": "Monkey eats bananas",
744
- "line": 3,
745
- "description": "",
746
- "type": "scenario",
747
- "steps":
748
- [{"keyword": "Given ",
749
- "name": "there are bananas",
750
- "line": 4,
751
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:729"},
752
- "result": {"status": "passed",
753
- "duration": 1}}],
754
- "around":
755
- [{"match": {"location": "unknown_hook_location:1"},
756
- "result": {"status": "failed",
757
- "error_message": "error (RuntimeError)\\n./spec/cucumber/formatter/json_spec.rb:728:in `Around'",
758
- "duration": 1}}]}]}]})
759
- end
760
- end
761
-
762
- describe "with a scenario with a step with a data table" do
763
- define_feature <<-FEATURE
764
- Feature: Banana party
765
-
766
- Scenario: Monkey eats bananas
767
- Given there are bananas
768
- | aa | bb |
769
- | cc | dd |
770
- FEATURE
771
-
772
- define_steps do
773
- Given(/^there are bananas$/) { |s| s }
774
- end
775
-
776
- it "includes the doc string in the json data" do
777
- expect(load_normalised_json(@out)).to eq MultiJson.load(%{
778
- [{"id": "banana-party",
779
- "uri": "spec.feature",
780
- "keyword": "Feature",
781
- "name": "Banana party",
782
- "line": 1,
783
- "description": "",
784
- "elements":
785
- [{"id": "banana-party;monkey-eats-bananas",
786
- "keyword": "Scenario",
787
- "name": "Monkey eats bananas",
788
- "line": 3,
789
- "description": "",
790
- "type": "scenario",
791
- "steps":
792
- [{"keyword": "Given ",
793
- "name": "there are bananas",
794
- "line": 4,
795
- "rows":
796
- [{"cells": ["aa", "bb"]},
797
- {"cells": ["cc", "dd"]}],
798
- "match": {"location": "spec/cucumber/formatter/json_spec.rb:773"},
799
- "result": {"status": "passed",
800
- "duration": 1}}]}]}]})
801
- end
802
- end
803
- end
804
-
805
- def load_normalised_json(out)
806
- normalise_json(MultiJson.load(out.string))
807
- end
808
-
809
- def normalise_json(json)
810
- #make sure duration was captured (should be >= 0)
811
- #then set it to what is "expected" since duration is dynamic
812
- json.each do |feature|
813
- elements = feature.fetch('elements') { [] }
814
- elements.each do |scenario|
815
- ['steps', 'before', 'after', 'around'].each do |type|
816
- if scenario[type]
817
- scenario[type].each do |step_or_hook|
818
- normalise_json_step_or_hook(step_or_hook)
819
- if step_or_hook['after']
820
- step_or_hook['after'].each do |hook|
821
- normalise_json_step_or_hook(hook)
822
- end
823
- end
824
- end
825
- end
826
- end
827
- end
828
- end
829
- end
830
-
831
- def normalise_json_step_or_hook(step_or_hook)
832
- if step_or_hook['result']
833
- if step_or_hook['result']['duration']
834
- expect(step_or_hook['result']['duration']).to be >= 0
835
- step_or_hook['result']['duration'] = 1
836
- end
837
- end
838
- end
839
-
840
- end
841
- end
842
- end