mobiusloop 0.1.2

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 (516) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.travis.yml +22 -0
  6. data/.yardopts +1 -0
  7. data/CONTRIBUTING.md +68 -0
  8. data/Gemfile +5 -0
  9. data/History.md +2280 -0
  10. data/LICENSE +22 -0
  11. data/README.md +373 -0
  12. data/Rakefile +22 -0
  13. data/bin/mobiusloop +8 -0
  14. data/cucumber.gemspec +47 -0
  15. data/cucumber.yml +20 -0
  16. data/examples/i18n/README.textile +3 -0
  17. data/examples/i18n/Rakefile +33 -0
  18. data/examples/i18n/ar/Rakefile +6 -0
  19. data/examples/i18n/ar/features/addition.feature +17 -0
  20. data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +24 -0
  21. data/examples/i18n/ar/lib/calculator.rb +11 -0
  22. data/examples/i18n/bg/Rakefile +6 -0
  23. data/examples/i18n/bg/features/addition.feature +12 -0
  24. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  25. data/examples/i18n/bg/features/division.feature +17 -0
  26. data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +24 -0
  27. data/examples/i18n/bg/features/support/env.rb +5 -0
  28. data/examples/i18n/bg/features/support/world.rb +8 -0
  29. data/examples/i18n/bg/lib/calculator.rb +24 -0
  30. data/examples/i18n/ca/Rakefile +6 -0
  31. data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +21 -0
  32. data/examples/i18n/ca/features/suma.feature +17 -0
  33. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  34. data/examples/i18n/cs/Rakefile +6 -0
  35. data/examples/i18n/cs/features/addition.feature +17 -0
  36. data/examples/i18n/cs/features/division.feature +11 -0
  37. data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +24 -0
  38. data/examples/i18n/cs/lib/calculator.rb +14 -0
  39. data/examples/i18n/da/Rakefile +6 -0
  40. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  41. data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +24 -0
  42. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  43. data/examples/i18n/de/Rakefile +6 -0
  44. data/examples/i18n/de/features/addition.feature +17 -0
  45. data/examples/i18n/de/features/division.feature +10 -0
  46. data/examples/i18n/de/features/step_definitions/calculator_steps.rb +24 -0
  47. data/examples/i18n/de/lib/calculator.rb +14 -0
  48. data/examples/i18n/el/Rakefile +6 -0
  49. data/examples/i18n/el/features/addition.feature +17 -0
  50. data/examples/i18n/el/features/division.feature +10 -0
  51. data/examples/i18n/el/features/step_definitions/calculator_steps.rb +24 -0
  52. data/examples/i18n/el/lib/calculator.rb +14 -0
  53. data/examples/i18n/en-lol/Rakefile +4 -0
  54. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  55. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  56. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  57. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  58. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  59. data/examples/i18n/en/Rakefile +6 -0
  60. data/examples/i18n/en/features/addition.feature +17 -0
  61. data/examples/i18n/en/features/division.feature +10 -0
  62. data/examples/i18n/en/features/step_definitions/calculator_steps.rb +24 -0
  63. data/examples/i18n/en/lib/calculator.rb +14 -0
  64. data/examples/i18n/eo/Rakefile +6 -0
  65. data/examples/i18n/eo/features/adicio.feature +17 -0
  66. data/examples/i18n/eo/features/divido.feature +10 -0
  67. data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +24 -0
  68. data/examples/i18n/eo/lib/calculator.rb +14 -0
  69. data/examples/i18n/es/Rakefile +6 -0
  70. data/examples/i18n/es/features/adicion.feature +17 -0
  71. data/examples/i18n/es/features/step_definitions/calculador_steps.rb +21 -0
  72. data/examples/i18n/es/lib/calculador.rb +14 -0
  73. data/examples/i18n/et/Rakefile +6 -0
  74. data/examples/i18n/et/features/jagamine.feature +10 -0
  75. data/examples/i18n/et/features/liitmine.feature +17 -0
  76. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  77. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  78. data/examples/i18n/fi/Rakefile +6 -0
  79. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  80. data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +24 -0
  81. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  82. data/examples/i18n/fi/lib/laskin.rb +14 -0
  83. data/examples/i18n/fr/Rakefile +8 -0
  84. data/examples/i18n/fr/features/addition.feature +18 -0
  85. data/examples/i18n/fr/features/addition2.feature +17 -0
  86. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  87. data/examples/i18n/fr/features/support/env.rb +5 -0
  88. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  89. data/examples/i18n/he/Rakefile +6 -0
  90. data/examples/i18n/he/features/addition.feature +17 -0
  91. data/examples/i18n/he/features/division.feature +10 -0
  92. data/examples/i18n/he/features/step_definitions/calculator_steps.rb +24 -0
  93. data/examples/i18n/he/lib/calculator.rb +15 -0
  94. data/examples/i18n/hi/Rakefile +6 -0
  95. data/examples/i18n/hi/features/addition.feature +16 -0
  96. data/examples/i18n/hi/features/division.feature +10 -0
  97. data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +24 -0
  98. data/examples/i18n/hi/lib/calculator.rb +15 -0
  99. data/examples/i18n/ht/Rakefile +6 -0
  100. data/examples/i18n/ht/features/adisyon.feature +17 -0
  101. data/examples/i18n/ht/features/divizyon.feature +10 -0
  102. data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +25 -0
  103. data/examples/i18n/ht/lib/kalkilatris.rb +14 -0
  104. data/examples/i18n/hu/Rakefile +6 -0
  105. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  106. data/examples/i18n/hu/features/osztas.feature +10 -0
  107. data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +25 -0
  108. data/examples/i18n/hu/lib/calculator.rb +14 -0
  109. data/examples/i18n/id/Rakefile +6 -0
  110. data/examples/i18n/id/features/addition.feature +17 -0
  111. data/examples/i18n/id/features/division.feature +10 -0
  112. data/examples/i18n/id/features/step_definitions/calculator_steps.rb +24 -0
  113. data/examples/i18n/id/lib/calculator.rb +14 -0
  114. data/examples/i18n/it/Rakefile +6 -0
  115. data/examples/i18n/it/features/somma.feature +11 -0
  116. data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +24 -0
  117. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  118. data/examples/i18n/ja/Rakefile +6 -0
  119. data/examples/i18n/ja/features/addition.feature +17 -0
  120. data/examples/i18n/ja/features/division.feature +10 -0
  121. data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +19 -0
  122. data/examples/i18n/ja/features/support/env.rb +5 -0
  123. data/examples/i18n/ja/lib/calculator.rb +14 -0
  124. data/examples/i18n/ko/Rakefile +6 -0
  125. data/examples/i18n/ko/features/addition.feature +17 -0
  126. data/examples/i18n/ko/features/division.feature +11 -0
  127. data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +24 -0
  128. data/examples/i18n/ko/lib/calculator.rb +14 -0
  129. data/examples/i18n/lt/Rakefile +6 -0
  130. data/examples/i18n/lt/features/addition.feature +17 -0
  131. data/examples/i18n/lt/features/division.feature +10 -0
  132. data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +24 -0
  133. data/examples/i18n/lt/lib/calculator.rb +14 -0
  134. data/examples/i18n/lv/Rakefile +6 -0
  135. data/examples/i18n/lv/features/addition.feature +17 -0
  136. data/examples/i18n/lv/features/division.feature +10 -0
  137. data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +24 -0
  138. data/examples/i18n/lv/lib/calculator.rb +14 -0
  139. data/examples/i18n/no/Rakefile +6 -0
  140. data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +17 -0
  141. data/examples/i18n/no/features/summering.feature +19 -0
  142. data/examples/i18n/no/features/support/env.rb +6 -0
  143. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  144. data/examples/i18n/pl/Rakefile +6 -0
  145. data/examples/i18n/pl/features/addition.feature +17 -0
  146. data/examples/i18n/pl/features/division.feature +10 -0
  147. data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +24 -0
  148. data/examples/i18n/pl/features/support/env.rb +5 -0
  149. data/examples/i18n/pl/lib/calculator.rb +14 -0
  150. data/examples/i18n/pt/Rakefile +6 -0
  151. data/examples/i18n/pt/features/adicao.feature +11 -0
  152. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  153. data/examples/i18n/pt/features/support/env.rb +5 -0
  154. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  155. data/examples/i18n/ro/Rakefile +6 -0
  156. data/examples/i18n/ro/features/adunare.feature +12 -0
  157. data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +21 -0
  158. data/examples/i18n/ro/lib/calculator.rb +11 -0
  159. data/examples/i18n/ru/Rakefile +6 -0
  160. data/examples/i18n/ru/features/addition.feature +11 -0
  161. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  162. data/examples/i18n/ru/features/division.feature +16 -0
  163. data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +19 -0
  164. data/examples/i18n/ru/features/support/env.rb +5 -0
  165. data/examples/i18n/ru/features/support/world.rb +8 -0
  166. data/examples/i18n/ru/lib/calculator.rb +24 -0
  167. data/examples/i18n/sk/Rakefile +6 -0
  168. data/examples/i18n/sk/features/addition.feature +17 -0
  169. data/examples/i18n/sk/features/division.feature +10 -0
  170. data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +24 -0
  171. data/examples/i18n/sk/lib/calculator.rb +14 -0
  172. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  173. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  174. data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +20 -0
  175. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  176. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  177. data/examples/i18n/sr-Latn/Rakefile +6 -0
  178. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  179. data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +24 -0
  180. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  181. data/examples/i18n/sv/Rakefile +6 -0
  182. data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +24 -0
  183. data/examples/i18n/sv/features/summering.feature +18 -0
  184. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  185. data/examples/i18n/tr/Rakefile +6 -0
  186. data/examples/i18n/tr/features/bolme.feature +10 -0
  187. data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +24 -0
  188. data/examples/i18n/tr/features/toplama.feature +18 -0
  189. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  190. data/examples/i18n/uk/Rakefile +6 -0
  191. data/examples/i18n/uk/features/addition.feature +11 -0
  192. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  193. data/examples/i18n/uk/features/division.feature +16 -0
  194. data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +19 -0
  195. data/examples/i18n/uk/features/support/env.rb +5 -0
  196. data/examples/i18n/uk/features/support/world.rb +8 -0
  197. data/examples/i18n/uk/lib/calculator.rb +24 -0
  198. data/examples/i18n/uz/Rakefile +6 -0
  199. data/examples/i18n/uz/features/addition.feature +10 -0
  200. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  201. data/examples/i18n/uz/features/division.feature +17 -0
  202. data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +19 -0
  203. data/examples/i18n/uz/features/support/env.rb +5 -0
  204. data/examples/i18n/uz/features/support/world.rb +8 -0
  205. data/examples/i18n/uz/lib/calculator.rb +24 -0
  206. data/examples/i18n/zh-CN/Rakefile +4 -0
  207. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  208. data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +26 -0
  209. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  210. data/examples/i18n/zh-TW/Rakefile +4 -0
  211. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  212. data/examples/i18n/zh-TW/features/division.feature +11 -0
  213. data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +24 -0
  214. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  215. data/examples/mobiusloop/increase_readers.goal +13 -0
  216. data/examples/mobiusloop/scale_page_response.rb +20 -0
  217. data/examples/mobiusloop/total_articles_scale.rb +10 -0
  218. data/examples/mobiusloop/total_readers_scale.rb +10 -0
  219. data/examples/rspec_doubles/Rakefile +4 -0
  220. data/examples/rspec_doubles/features/mocking.feature +9 -0
  221. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  222. data/examples/rspec_doubles/features/support/env.rb +12 -0
  223. data/examples/sinatra/README.textile +13 -0
  224. data/examples/sinatra/Rakefile +6 -0
  225. data/examples/sinatra/app.rb +14 -0
  226. data/examples/sinatra/features/add.feature +11 -0
  227. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  228. data/examples/sinatra/features/support/env.rb +10 -0
  229. data/examples/sinatra/views/add.erb +7 -0
  230. data/examples/sinatra/views/layout.erb +8 -0
  231. data/examples/tcl/README.textile +11 -0
  232. data/examples/tcl/Rakefile +6 -0
  233. data/examples/tcl/features/fibonnacci.feature +17 -0
  234. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  235. data/examples/tcl/features/support/env.rb +6 -0
  236. data/examples/tcl/src/fib.tcl +3 -0
  237. data/examples/test_unit/Gemfile +4 -0
  238. data/examples/test_unit/Rakefile +6 -0
  239. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +20 -0
  240. data/examples/test_unit/features/test_unit.feature +9 -0
  241. data/examples/watir/README.textile +16 -0
  242. data/examples/watir/Rakefile +12 -0
  243. data/examples/watir/cucumber.yml +1 -0
  244. data/examples/watir/features/search.feature +12 -0
  245. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  246. data/examples/watir/features/support/env.rb +35 -0
  247. data/examples/watir/features/support/screenshots.rb +47 -0
  248. data/features/docs/api/list_step_defs_as_json.feature +50 -0
  249. data/features/docs/api/listen_for_events.feature +58 -0
  250. data/features/docs/api/run_cli_main_with_existing_runtime.feature +26 -0
  251. data/features/docs/cli/backtraces.feature +36 -0
  252. data/features/docs/cli/dry_run.feature +70 -0
  253. data/features/docs/cli/exclude_files.feature +18 -0
  254. data/features/docs/cli/execute_with_tag_filter.feature +117 -0
  255. data/features/docs/cli/fail_fast.feature +46 -0
  256. data/features/docs/cli/finding_steps.feature +28 -0
  257. data/features/docs/cli/randomize.feature +140 -0
  258. data/features/docs/cli/require.feature +27 -0
  259. data/features/docs/cli/retry_failing_tests.feature +32 -0
  260. data/features/docs/cli/run_scenarios_matching_name.feature +104 -0
  261. data/features/docs/cli/run_specific_scenarios.feature +77 -0
  262. data/features/docs/cli/showing_differences.feature +43 -0
  263. data/features/docs/cli/specifying_multiple_formatters.feature +65 -0
  264. data/features/docs/cli/strict_mode.feature +64 -0
  265. data/features/docs/defining_steps/nested_steps.feature +177 -0
  266. data/features/docs/defining_steps/nested_steps_i18n.feature +34 -0
  267. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +54 -0
  268. data/features/docs/defining_steps/one_line_step_definitions.feature +65 -0
  269. data/features/docs/defining_steps/printing_messages.feature +148 -0
  270. data/features/docs/defining_steps/skip_scenario.feature +64 -0
  271. data/features/docs/defining_steps/snippets.feature +56 -0
  272. data/features/docs/defining_steps/table_diffing.feature +50 -0
  273. data/features/docs/exception_in_after_hook.feature +126 -0
  274. data/features/docs/exception_in_after_step_hook.feature +102 -0
  275. data/features/docs/exception_in_around_hook.feature +78 -0
  276. data/features/docs/exception_in_before_hook.feature +96 -0
  277. data/features/docs/extending_cucumber/custom_filter.feature +29 -0
  278. data/features/docs/extending_cucumber/custom_formatter.feature +130 -0
  279. data/features/docs/formatters/api_methods.feature +37 -0
  280. data/features/docs/formatters/debug_formatter.feature +47 -0
  281. data/features/docs/formatters/formatter_step_file_colon_line.feature +44 -0
  282. data/features/docs/formatters/html_formatter.feature +91 -0
  283. data/features/docs/formatters/json_formatter.feature +767 -0
  284. data/features/docs/formatters/junit_formatter.feature +454 -0
  285. data/features/docs/formatters/pretty_formatter.feature +73 -0
  286. data/features/docs/formatters/progress_formatter.feature +31 -0
  287. data/features/docs/formatters/rerun_formatter.feature +188 -0
  288. data/features/docs/formatters/usage_formatter.feature +98 -0
  289. data/features/docs/getting_started.feature +27 -0
  290. data/features/docs/gherkin/background.feature +548 -0
  291. data/features/docs/gherkin/doc_strings.feature +74 -0
  292. data/features/docs/gherkin/expand_option_for_outlines.feature +46 -0
  293. data/features/docs/gherkin/language_from_header.feature +32 -0
  294. data/features/docs/gherkin/language_help.feature +42 -0
  295. data/features/docs/gherkin/outlines.feature +156 -0
  296. data/features/docs/gherkin/unicode_table.feature +32 -0
  297. data/features/docs/gherkin/using_descriptions.feature +82 -0
  298. data/features/docs/gherkin/using_star_notation.feature +37 -0
  299. data/features/docs/iso-8859-1.feature +6 -0
  300. data/features/docs/post_configuration_hook.feature +49 -0
  301. data/features/docs/profiles.feature +120 -0
  302. data/features/docs/rake_task.feature +141 -0
  303. data/features/docs/raketask.feature +44 -0
  304. data/features/docs/work_in_progress.feature +154 -0
  305. data/features/docs/writing_support_code/after_hooks.feature +102 -0
  306. data/features/docs/writing_support_code/after_step_hooks.feature +53 -0
  307. data/features/docs/writing_support_code/around_hooks.feature +260 -0
  308. data/features/docs/writing_support_code/before_hook.feature +65 -0
  309. data/features/docs/writing_support_code/hook_order.feature +61 -0
  310. data/features/docs/writing_support_code/load_path.feature +17 -0
  311. data/features/docs/writing_support_code/state.feature +32 -0
  312. data/features/docs/writing_support_code/tagged_hooks.feature +95 -0
  313. data/features/docs/writing_support_code/transforms.feature +98 -0
  314. data/features/lib/step_definitions/aruba_steps.rb +26 -0
  315. data/features/lib/step_definitions/cucumber_steps.rb +78 -0
  316. data/features/lib/step_definitions/iso-8859-1_steps.rb +12 -0
  317. data/features/lib/step_definitions/json_steps.rb +7 -0
  318. data/features/lib/step_definitions/junit_steps.rb +13 -0
  319. data/features/lib/step_definitions/language_steps.rb +8 -0
  320. data/features/lib/step_definitions/profile_steps.rb +15 -0
  321. data/features/lib/step_definitions/retry_steps.rb +35 -0
  322. data/features/lib/step_definitions/ruby_steps.rb +3 -0
  323. data/features/lib/step_definitions/wire_steps.rb +58 -0
  324. data/features/lib/support/env.rb +21 -0
  325. data/features/lib/support/fake_wire_server.rb +80 -0
  326. data/features/lib/support/feature_factory.rb +67 -0
  327. data/features/lib/support/normalise_output.rb +50 -0
  328. data/gem_tasks/contributors.rake +15 -0
  329. data/gem_tasks/cov.rake +5 -0
  330. data/gem_tasks/cucumber.rake +25 -0
  331. data/gem_tasks/downloads.rb +7 -0
  332. data/gem_tasks/environment.rake +7 -0
  333. data/gem_tasks/examples.rake +11 -0
  334. data/gem_tasks/fix_cr_lf.rake +10 -0
  335. data/gem_tasks/flog.rake +4 -0
  336. data/gem_tasks/rspec.rake +6 -0
  337. data/gem_tasks/sass.rake +4 -0
  338. data/gem_tasks/stats +16 -0
  339. data/gem_tasks/versions.txt +74 -0
  340. data/gherkin-languages.json +2972 -0
  341. data/lib/autotest/cucumber.rb +6 -0
  342. data/lib/autotest/cucumber_mixin.rb +135 -0
  343. data/lib/autotest/cucumber_rails.rb +6 -0
  344. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  345. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  346. data/lib/autotest/cucumber_rspec.rb +6 -0
  347. data/lib/autotest/cucumber_rspec2.rb +6 -0
  348. data/lib/autotest/discover.rb +11 -0
  349. data/lib/cucumber.rb +37 -0
  350. data/lib/cucumber/ast.rb +13 -0
  351. data/lib/cucumber/cli/configuration.rb +146 -0
  352. data/lib/cucumber/cli/main.rb +99 -0
  353. data/lib/cucumber/cli/options.rb +465 -0
  354. data/lib/cucumber/cli/profile_loader.rb +91 -0
  355. data/lib/cucumber/cli/rerun_file.rb +29 -0
  356. data/lib/cucumber/configuration.rb +268 -0
  357. data/lib/cucumber/constantize.rb +45 -0
  358. data/lib/cucumber/core_ext/instance_exec.rb +70 -0
  359. data/lib/cucumber/core_ext/string.rb +9 -0
  360. data/lib/cucumber/deprecate.rb +29 -0
  361. data/lib/cucumber/encoding.rb +5 -0
  362. data/lib/cucumber/errors.rb +51 -0
  363. data/lib/cucumber/events.rb +20 -0
  364. data/lib/cucumber/events/after_test_case.rb +25 -0
  365. data/lib/cucumber/events/after_test_step.rb +30 -0
  366. data/lib/cucumber/events/before_test_case.rb +18 -0
  367. data/lib/cucumber/events/before_test_step.rb +23 -0
  368. data/lib/cucumber/events/bus.rb +86 -0
  369. data/lib/cucumber/events/finished_testing.rb +9 -0
  370. data/lib/cucumber/events/step_match.rb +23 -0
  371. data/lib/cucumber/file_specs.rb +37 -0
  372. data/lib/cucumber/filters.rb +9 -0
  373. data/lib/cucumber/filters/activate_steps.rb +67 -0
  374. data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
  375. data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
  376. data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
  377. data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
  378. data/lib/cucumber/filters/gated_receiver.rb +25 -0
  379. data/lib/cucumber/filters/prepare_world.rb +45 -0
  380. data/lib/cucumber/filters/quit.rb +28 -0
  381. data/lib/cucumber/filters/randomizer.rb +45 -0
  382. data/lib/cucumber/filters/retry.rb +32 -0
  383. data/lib/cucumber/filters/tag_limits.rb +45 -0
  384. data/lib/cucumber/filters/tag_limits/test_case_index.rb +31 -0
  385. data/lib/cucumber/filters/tag_limits/verifier.rb +59 -0
  386. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  387. data/lib/cucumber/formatter/backtrace_filter.rb +41 -0
  388. data/lib/cucumber/formatter/console.rb +252 -0
  389. data/lib/cucumber/formatter/cucumber.css +286 -0
  390. data/lib/cucumber/formatter/cucumber.sass +247 -0
  391. data/lib/cucumber/formatter/debug.rb +35 -0
  392. data/lib/cucumber/formatter/duration.rb +13 -0
  393. data/lib/cucumber/formatter/duration_extractor.rb +28 -0
  394. data/lib/cucumber/formatter/event_bus_report.rb +38 -0
  395. data/lib/cucumber/formatter/fail_fast.rb +18 -0
  396. data/lib/cucumber/formatter/fanout.rb +27 -0
  397. data/lib/cucumber/formatter/hook_query_visitor.rb +40 -0
  398. data/lib/cucumber/formatter/html.rb +689 -0
  399. data/lib/cucumber/formatter/ignore_missing_messages.rb +20 -0
  400. data/lib/cucumber/formatter/interceptor.rb +80 -0
  401. data/lib/cucumber/formatter/io.rb +34 -0
  402. data/lib/cucumber/formatter/jquery-min.js +154 -0
  403. data/lib/cucumber/formatter/json.rb +334 -0
  404. data/lib/cucumber/formatter/json_pretty.rb +10 -0
  405. data/lib/cucumber/formatter/junit.rb +238 -0
  406. data/lib/cucumber/formatter/legacy_api/adapter.rb +1016 -0
  407. data/lib/cucumber/formatter/legacy_api/ast.rb +389 -0
  408. data/lib/cucumber/formatter/legacy_api/results.rb +51 -0
  409. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +31 -0
  410. data/lib/cucumber/formatter/pretty.rb +247 -0
  411. data/lib/cucumber/formatter/progress.rb +73 -0
  412. data/lib/cucumber/formatter/rerun.rb +35 -0
  413. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  414. data/lib/cucumber/formatter/steps.rb +49 -0
  415. data/lib/cucumber/formatter/summary.rb +35 -0
  416. data/lib/cucumber/formatter/unicode.rb +53 -0
  417. data/lib/cucumber/formatter/usage.rb +136 -0
  418. data/lib/cucumber/gherkin/data_table_parser.rb +31 -0
  419. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +99 -0
  420. data/lib/cucumber/gherkin/formatter/escaping.rb +17 -0
  421. data/lib/cucumber/gherkin/i18n.rb +15 -0
  422. data/lib/cucumber/gherkin/steps_parser.rb +31 -0
  423. data/lib/cucumber/hooks.rb +99 -0
  424. data/lib/cucumber/load_path.rb +13 -0
  425. data/lib/cucumber/multiline_argument.rb +71 -0
  426. data/lib/cucumber/multiline_argument/data_table.rb +744 -0
  427. data/lib/cucumber/multiline_argument/doc_string.rb +9 -0
  428. data/lib/cucumber/platform.rb +27 -0
  429. data/lib/cucumber/project_initializer.rb +82 -0
  430. data/lib/cucumber/rake/task.rb +168 -0
  431. data/lib/cucumber/rb_support/rb_dsl.rb +119 -0
  432. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  433. data/lib/cucumber/rb_support/rb_language.rb +216 -0
  434. data/lib/cucumber/rb_support/rb_step_definition.rb +131 -0
  435. data/lib/cucumber/rb_support/rb_transform.rb +59 -0
  436. data/lib/cucumber/rb_support/rb_world.rb +149 -0
  437. data/lib/cucumber/rb_support/snippet.rb +170 -0
  438. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  439. data/lib/cucumber/rspec/doubles.rb +19 -0
  440. data/lib/cucumber/running_test_case.rb +134 -0
  441. data/lib/cucumber/runtime.rb +266 -0
  442. data/lib/cucumber/runtime/after_hooks.rb +25 -0
  443. data/lib/cucumber/runtime/before_hooks.rb +27 -0
  444. data/lib/cucumber/runtime/for_programming_languages.rb +66 -0
  445. data/lib/cucumber/runtime/step_hooks.rb +23 -0
  446. data/lib/cucumber/runtime/support_code.rb +151 -0
  447. data/lib/cucumber/runtime/user_interface.rb +85 -0
  448. data/lib/cucumber/step_argument.rb +25 -0
  449. data/lib/cucumber/step_definition_light.rb +20 -0
  450. data/lib/cucumber/step_definitions.rb +13 -0
  451. data/lib/cucumber/step_match.rb +141 -0
  452. data/lib/cucumber/step_match_search.rb +67 -0
  453. data/lib/cucumber/term/ansicolor.rb +110 -0
  454. data/lib/cucumber/unit.rb +11 -0
  455. data/lib/cucumber/version +1 -0
  456. data/lib/mobiusloop/measure.rb +19 -0
  457. data/lib/mobiusloop/mobius_steps.rb +36 -0
  458. data/lib/mobiusloop/objective.rb +10 -0
  459. data/lib/mobiusloop/outcome.rb +99 -0
  460. data/lib/mobiusloop/scale.rb +32 -0
  461. data/lib/simplecov_setup.rb +18 -0
  462. data/major_changes_to_cucumber.md +45 -0
  463. data/mobiusloop.gemspec +47 -0
  464. data/spec/cucumber/cli/configuration_spec.rb +435 -0
  465. data/spec/cucumber/cli/main_spec.rb +83 -0
  466. data/spec/cucumber/cli/options_spec.rb +410 -0
  467. data/spec/cucumber/cli/profile_loader_spec.rb +46 -0
  468. data/spec/cucumber/cli/rerun_spec.rb +85 -0
  469. data/spec/cucumber/configuration_spec.rb +147 -0
  470. data/spec/cucumber/constantize_spec.rb +19 -0
  471. data/spec/cucumber/core_ext/instance_exec_spec.rb +4 -0
  472. data/spec/cucumber/events/bus_spec.rb +94 -0
  473. data/spec/cucumber/file_specs_spec.rb +60 -0
  474. data/spec/cucumber/filters/activate_steps_spec.rb +149 -0
  475. data/spec/cucumber/filters/gated_receiver_spec.rb +47 -0
  476. data/spec/cucumber/filters/retry_spec.rb +79 -0
  477. data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +38 -0
  478. data/spec/cucumber/filters/tag_limits/verifier_spec.rb +57 -0
  479. data/spec/cucumber/filters/tag_limits_spec.rb +59 -0
  480. data/spec/cucumber/formatter/ansicolor_spec.rb +32 -0
  481. data/spec/cucumber/formatter/debug_spec.rb +64 -0
  482. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  483. data/spec/cucumber/formatter/event_bus_report_spec.rb +88 -0
  484. data/spec/cucumber/formatter/fail_fast_spec.rb +88 -0
  485. data/spec/cucumber/formatter/html_spec.rb +538 -0
  486. data/spec/cucumber/formatter/interceptor_spec.rb +136 -0
  487. data/spec/cucumber/formatter/json_spec.rb +841 -0
  488. data/spec/cucumber/formatter/junit_spec.rb +252 -0
  489. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +2182 -0
  490. data/spec/cucumber/formatter/pretty_spec.rb +919 -0
  491. data/spec/cucumber/formatter/progress_spec.rb +169 -0
  492. data/spec/cucumber/formatter/rerun_spec.rb +91 -0
  493. data/spec/cucumber/formatter/spec_helper.rb +82 -0
  494. data/spec/cucumber/hooks_spec.rb +30 -0
  495. data/spec/cucumber/multiline_argument/data_table_spec.rb +603 -0
  496. data/spec/cucumber/project_initializer_spec.rb +87 -0
  497. data/spec/cucumber/rake/forked_spec.rb +53 -0
  498. data/spec/cucumber/rake/task_spec.rb +85 -0
  499. data/spec/cucumber/rb_support/rb_language_spec.rb +243 -0
  500. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +199 -0
  501. data/spec/cucumber/rb_support/rb_transform_spec.rb +46 -0
  502. data/spec/cucumber/rb_support/rb_world_spec.rb +47 -0
  503. data/spec/cucumber/rb_support/snippet_spec.rb +137 -0
  504. data/spec/cucumber/running_test_case_spec.rb +139 -0
  505. data/spec/cucumber/runtime/for_programming_languages_spec.rb +36 -0
  506. data/spec/cucumber/runtime/support_code_spec.rb +16 -0
  507. data/spec/cucumber/runtime_spec.rb +20 -0
  508. data/spec/cucumber/sell_cucumbers.feature +19 -0
  509. data/spec/cucumber/step_argument_spec.rb +18 -0
  510. data/spec/cucumber/step_match_search_spec.rb +122 -0
  511. data/spec/cucumber/step_match_spec.rb +85 -0
  512. data/spec/cucumber/world/pending_spec.rb +47 -0
  513. data/spec/cucumber_spec.rb +39 -0
  514. data/spec/spec_helper.rb +29 -0
  515. data/spec/support/standard_step_actions.rb +18 -0
  516. metadata +1007 -0
@@ -0,0 +1,37 @@
1
+ Feature: Formatter API methods
2
+
3
+ Some utility methods are provided to make it easier to write your own formatters.
4
+
5
+ Here are some examples.
6
+
7
+ Scenario: A formatter that uses `Cucumber::Formatter::Io#ensure_file`
8
+
9
+ The ensure_file method is a little helper function that some formatters use,
10
+ normally when given a CLI argument with `--out` to check that the file passed
11
+ by the user actually exists.
12
+
13
+ The second argument is the name of the formatter, used to print a useful
14
+ error message if the file can't be created for some reason.
15
+
16
+ Given a file named "features/f.feature" with:
17
+ """
18
+ Feature: Test
19
+ Scenario: Test
20
+ """
21
+ And a directory named "my/special"
22
+ And a file named "features/support/custom_formatter.rb" with:
23
+ """
24
+ require 'cucumber/formatter/io'
25
+ module Cucumber
26
+ module Formatter
27
+ class Test
28
+ include Io
29
+ def initialize(runtime, path_or_io, options)
30
+ ensure_file("my/special/output.file", "custom formatter")
31
+ end
32
+ end
33
+ end
34
+ end
35
+ """
36
+ When I run `cucumber features/f.feature --format Cucumber::Formatter::Test`
37
+ Then it should pass
@@ -0,0 +1,47 @@
1
+ Feature: Debug formatter
2
+
3
+ In order to help you easily visualise the listener API, you can use
4
+ the `debug` formatter that prints the calls to the listener as a
5
+ feature is run.
6
+
7
+ Background:
8
+ Given the standard step definitions
9
+
10
+ Scenario: title
11
+ Given a file named "features/test.feature" with:
12
+ """
13
+ Feature:
14
+ Scenario:
15
+ Given this step passes
16
+ """
17
+ When I run `cucumber -f debug`
18
+ Then the stderr should not contain anything
19
+ Then it should pass with:
20
+ """
21
+ before_test_case
22
+ before_features
23
+ before_feature
24
+ before_tags
25
+ after_tags
26
+ feature_name
27
+ before_test_step
28
+ after_test_step
29
+ before_test_step
30
+ before_feature_element
31
+ before_tags
32
+ after_tags
33
+ scenario_name
34
+ before_steps
35
+ before_step
36
+ before_step_result
37
+ step_name
38
+ after_step_result
39
+ after_step
40
+ after_test_step
41
+ after_steps
42
+ after_feature_element
43
+ after_test_case
44
+ after_feature
45
+ after_features
46
+ done
47
+ """
@@ -0,0 +1,44 @@
1
+ Feature: Formatter API: Step file path and line number (Issue #179)
2
+ To all reporter to understand location of current executing step let's fetch this information
3
+ from step/step_invocation and pass to reporters
4
+
5
+ Scenario: my own formatter
6
+ Given a file named "features/f.feature" with:
7
+ """
8
+ Feature: I'll use my own
9
+ because I'm worth it
10
+ Scenario: just print step current line and feature file name
11
+ Given step at line 4
12
+ Given step at line 5
13
+ """
14
+ And a file named "features/step_definitions/steps.rb" with:
15
+ """
16
+ Given(/^step at line (.*)$/) {|line| }
17
+ """
18
+ And a file named "features/support/jb/formatter.rb" with:
19
+ """
20
+ module Jb
21
+ class Formatter
22
+ def initialize(runtime, io, options)
23
+ @io = io
24
+ end
25
+
26
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
27
+ @io.puts "step result event: #{file_colon_line}"
28
+ end
29
+
30
+ def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
31
+ @io.puts "step name event: #{file_colon_line}"
32
+ end
33
+ end
34
+ end
35
+ """
36
+ When I run `cucumber features/f.feature --format Jb::Formatter`
37
+ Then it should pass with exactly:
38
+ """
39
+ step result event: features/f.feature:4
40
+ step name event: features/f.feature:4
41
+ step result event: features/f.feature:5
42
+ step name event: features/f.feature:5
43
+
44
+ """
@@ -0,0 +1,91 @@
1
+ Feature: HTML output formatter
2
+
3
+ Background:
4
+ Given the standard step definitions
5
+ And a file named "features/scenario_outline_with_undefined_steps.feature" with:
6
+ """
7
+ Feature:
8
+
9
+ Scenario Outline:
10
+ Given this step is undefined
11
+
12
+ Examples:
13
+ |foo|
14
+ |bar|
15
+ """
16
+ And a file named "features/scenario_outline_with_pending_step.feature" with:
17
+ """
18
+ Feature: Outline
19
+
20
+ Scenario Outline: Will it blend?
21
+ Given this step is pending
22
+ And other step
23
+ When I do something with <example>
24
+ Then I should see something
25
+ Examples:
26
+ | example |
27
+ | one |
28
+ | two |
29
+ | three |
30
+ """
31
+ And a file named "features/failing_background_step.feature" with:
32
+ """
33
+ Feature: Feature with failing background step
34
+
35
+ Background:
36
+ Given this step fails
37
+
38
+ Scenario:
39
+ When I do something
40
+ Then I should see something
41
+ """
42
+
43
+ Scenario: an scenario outline, one undefined step, one random example, expand flag on
44
+ When I run `cucumber features/scenario_outline_with_undefined_steps.feature --format html --expand `
45
+ Then it should pass
46
+
47
+ Scenario Outline: an scenario outline, one pending step
48
+ When I run `cucumber <file> --format html <flag>`
49
+ Then it should pass
50
+ And the output should contain:
51
+ """
52
+ makeYellow('scenario_1')
53
+ """
54
+ And the output should not contain:
55
+ """
56
+ makeRed('scenario_1')
57
+ """
58
+
59
+ Examples:
60
+ | file | flag |
61
+ | features/scenario_outline_with_pending_step.feature | --expand |
62
+ | features/scenario_outline_with_pending_step.feature | |
63
+
64
+ Examples:
65
+ | file | flag |
66
+ | features/scenario_outline_with_undefined_steps.feature | --expand |
67
+ | features/scenario_outline_with_undefined_steps.feature | |
68
+
69
+ Scenario: when using a profile the html shouldn't include 'Using the default profile...'
70
+ And a file named "cucumber.yml" with:
71
+ """
72
+ default: -r features
73
+ """
74
+ When I run `cucumber features/scenario_outline_with_undefined_steps.feature --profile default --format html`
75
+ Then it should pass
76
+ And the output should not contain:
77
+ """
78
+ Using the default profile...
79
+ """
80
+
81
+ Scenario: a feature with a failing background step
82
+ When I run `cucumber features/failing_background_step.feature --format html`
83
+ Then the output should not contain:
84
+ """
85
+ makeRed('scenario_0')
86
+ """
87
+ And the output should contain:
88
+ """
89
+ makeRed('background_0')
90
+ """
91
+
@@ -0,0 +1,767 @@
1
+ Feature: JSON output formatter
2
+ In order to simplify processing of Cucumber features and results
3
+ Developers should be able to consume features as JSON
4
+
5
+ Background:
6
+ Given the standard step definitions
7
+ And a file named "features/one_passing_one_failing.feature" with:
8
+ """
9
+ @a
10
+ Feature: One passing scenario, one failing scenario
11
+
12
+ @b
13
+ Scenario: Passing
14
+ Given this step passes
15
+
16
+ @c
17
+ Scenario: Failing
18
+ Given this step fails
19
+ """
20
+ And a file named "features/step_definitions/json_steps.rb" with:
21
+ """
22
+ Given /^I embed a screenshot/ do
23
+ File.open("screenshot.png", "w") { |file| file << "foo" }
24
+ embed "screenshot.png", "image/png"
25
+ end
26
+
27
+ Given /^I print from step definition/ do
28
+ puts "from step definition"
29
+ end
30
+
31
+ Given /^I embed data directly/ do
32
+ data = "YWJj"
33
+ embed data, "mime-type;base64"
34
+ end
35
+ """
36
+ And a file named "features/embed.feature" with:
37
+ """
38
+ Feature: A screenshot feature
39
+
40
+ Scenario:
41
+ Given I embed a screenshot
42
+
43
+ """
44
+ And a file named "features/outline.feature" with:
45
+ """
46
+ Feature: An outline feature
47
+
48
+ Scenario Outline: outline
49
+ Given this step <status>
50
+
51
+ Examples: examples1
52
+ | status |
53
+ | passes |
54
+ | fails |
55
+
56
+ Examples: examples2
57
+ | status |
58
+ | passes |
59
+ """
60
+ And a file named "features/print_from_step_definition.feature" with:
61
+ """
62
+ Feature: A print from step definition feature
63
+
64
+ Scenario:
65
+ Given I print from step definition
66
+ And I print from step definition
67
+
68
+ """
69
+ And a file named "features/print_from_step_definition.feature" with:
70
+ """
71
+ Feature: A print from step definition feature
72
+
73
+ Scenario:
74
+ Given I print from step definition
75
+ And I print from step definition
76
+
77
+ """
78
+ And a file named "features/embed_data_directly.feature" with:
79
+ """
80
+ Feature: An embed data directly feature
81
+
82
+ Scenario:
83
+ Given I embed data directly
84
+
85
+ Scenario Outline:
86
+ Given I embed data directly
87
+
88
+ Examples:
89
+ | dummy |
90
+ | 1 |
91
+ | 2 |
92
+
93
+ """
94
+ And a file named "features/out_scenario_out_scenario_outline.feature" with:
95
+ """
96
+ Feature:
97
+ Scenario:
98
+ Given this step passes
99
+ Scenario Outline:
100
+ Given this step <status>
101
+ Examples:
102
+ | status |
103
+ | passes |
104
+ """
105
+
106
+ # Need to investigate why this won't pass in-process. error_message doesn't get det?
107
+ @spawn
108
+ Scenario: one feature, one passing scenario, one failing scenario
109
+ When I run `cucumber --format json features/one_passing_one_failing.feature`
110
+ Then it should fail with JSON:
111
+ """
112
+ [
113
+ {
114
+ "uri": "features/one_passing_one_failing.feature",
115
+ "keyword": "Feature",
116
+ "id": "one-passing-scenario,-one-failing-scenario",
117
+ "name": "One passing scenario, one failing scenario",
118
+ "line": 2,
119
+ "description": "",
120
+ "tags": [
121
+ {
122
+ "name": "@a",
123
+ "line": 1
124
+ }
125
+ ],
126
+ "elements": [
127
+ {
128
+ "keyword": "Scenario",
129
+ "id": "one-passing-scenario,-one-failing-scenario;passing",
130
+ "name": "Passing",
131
+ "line": 5,
132
+ "description": "",
133
+ "tags": [
134
+ {
135
+ "name": "@a",
136
+ "line": 1
137
+ },
138
+ {
139
+ "name": "@b",
140
+ "line": 4
141
+ }
142
+ ],
143
+ "type": "scenario",
144
+ "steps": [
145
+ {
146
+ "keyword": "Given ",
147
+ "name": "this step passes",
148
+ "line": 6,
149
+ "match": {
150
+ "location": "features/step_definitions/steps.rb:1"
151
+ },
152
+ "result": {
153
+ "status": "passed",
154
+ "duration": 1
155
+ }
156
+ }
157
+ ]
158
+ },
159
+ {
160
+ "keyword": "Scenario",
161
+ "id": "one-passing-scenario,-one-failing-scenario;failing",
162
+ "name": "Failing",
163
+ "line": 9,
164
+ "description": "",
165
+ "tags": [
166
+ {
167
+ "name": "@a",
168
+ "line": 1
169
+ },
170
+ {
171
+ "name": "@c",
172
+ "line": 8
173
+ }
174
+ ],
175
+ "type": "scenario",
176
+ "steps": [
177
+ {
178
+ "keyword": "Given ",
179
+ "name": "this step fails",
180
+ "line": 10,
181
+ "match": {
182
+ "location": "features/step_definitions/steps.rb:4"
183
+ },
184
+ "result": {
185
+ "status": "failed",
186
+ "error_message": " (RuntimeError)\n./features/step_definitions/steps.rb:4:in `/^this step fails$/'\nfeatures/one_passing_one_failing.feature:10:in `Given this step fails'",
187
+ "duration": 1
188
+ }
189
+ }
190
+ ]
191
+ }
192
+ ]
193
+ }
194
+ ]
195
+
196
+ """
197
+
198
+ @spawn
199
+ Scenario: one feature, one passing scenario, one failing scenario with prettyfied json
200
+ When I run `cucumber --format json_pretty features/one_passing_one_failing.feature`
201
+ Then it should fail with JSON:
202
+ """
203
+ [
204
+ {
205
+ "uri": "features/one_passing_one_failing.feature",
206
+ "keyword": "Feature",
207
+ "id": "one-passing-scenario,-one-failing-scenario",
208
+ "name": "One passing scenario, one failing scenario",
209
+ "line": 2,
210
+ "description": "",
211
+ "tags": [
212
+ {
213
+ "name": "@a",
214
+ "line": 1
215
+ }
216
+ ],
217
+ "elements": [
218
+ {
219
+ "keyword": "Scenario",
220
+ "id": "one-passing-scenario,-one-failing-scenario;passing",
221
+ "name": "Passing",
222
+ "line": 5,
223
+ "description": "",
224
+ "tags": [
225
+ {
226
+ "name": "@a",
227
+ "line": 1
228
+ },
229
+ {
230
+ "name": "@b",
231
+ "line": 4
232
+ }
233
+ ],
234
+ "type": "scenario",
235
+ "steps": [
236
+ {
237
+ "keyword": "Given ",
238
+ "name": "this step passes",
239
+ "line": 6,
240
+ "match": {
241
+ "location": "features/step_definitions/steps.rb:1"
242
+ },
243
+ "result": {
244
+ "status": "passed",
245
+ "duration": 1
246
+ }
247
+ }
248
+ ]
249
+ },
250
+ {
251
+ "keyword": "Scenario",
252
+ "id": "one-passing-scenario,-one-failing-scenario;failing",
253
+ "name": "Failing",
254
+ "line": 9,
255
+ "description": "",
256
+ "tags": [
257
+ {
258
+ "name": "@a",
259
+ "line": 1
260
+ },
261
+ {
262
+ "name": "@c",
263
+ "line": 8
264
+ }
265
+ ],
266
+ "type": "scenario",
267
+ "steps": [
268
+ {
269
+ "keyword": "Given ",
270
+ "name": "this step fails",
271
+ "line": 10,
272
+ "match": {
273
+ "location": "features/step_definitions/steps.rb:4"
274
+ },
275
+ "result": {
276
+ "status": "failed",
277
+ "error_message": " (RuntimeError)\n./features/step_definitions/steps.rb:4:in `/^this step fails$/'\nfeatures/one_passing_one_failing.feature:10:in `Given this step fails'",
278
+ "duration": 1
279
+ }
280
+ }
281
+ ]
282
+ }
283
+ ]
284
+ }
285
+ ]
286
+
287
+ """
288
+
289
+ Scenario: DocString
290
+ Given a file named "features/doc_string.feature" with:
291
+ """
292
+ Feature: A DocString feature
293
+
294
+ Scenario:
295
+ Then I should fail with
296
+ \"\"\"
297
+ a string
298
+ \"\"\"
299
+ """
300
+ And a file named "features/step_definitions/steps.rb" with:
301
+ """
302
+ Then /I should fail with/ do |s|
303
+ raise RuntimeError, s
304
+ end
305
+ """
306
+ When I run `cucumber --format json features/doc_string.feature`
307
+ Then it should fail with JSON:
308
+ """
309
+ [
310
+ {
311
+ "id": "a-docstring-feature",
312
+ "uri": "features/doc_string.feature",
313
+ "keyword": "Feature",
314
+ "name": "A DocString feature",
315
+ "line": 1,
316
+ "description": "",
317
+ "elements": [
318
+ {
319
+ "id": "a-docstring-feature;",
320
+ "keyword": "Scenario",
321
+ "name": "",
322
+ "line": 3,
323
+ "description": "",
324
+ "type": "scenario",
325
+ "steps": [
326
+ {
327
+ "keyword": "Then ",
328
+ "name": "I should fail with",
329
+ "line": 4,
330
+ "doc_string": {
331
+ "content_type": "",
332
+ "value": "a string",
333
+ "line": 5
334
+ },
335
+ "match": {
336
+ "location": "features/step_definitions/steps.rb:1"
337
+ },
338
+ "result": {
339
+ "status": "failed",
340
+ "error_message": "a string (RuntimeError)\n./features/step_definitions/steps.rb:2:in `/I should fail with/'\nfeatures/doc_string.feature:4:in `Then I should fail with'",
341
+ "duration": 1
342
+ }
343
+ }
344
+ ]
345
+ }
346
+ ]
347
+ }
348
+ ]
349
+ """
350
+
351
+ Scenario: embedding screenshot
352
+ When I run `cucumber --format json features/embed.feature`
353
+ Then it should pass with JSON:
354
+ """
355
+ [
356
+ {
357
+ "uri": "features/embed.feature",
358
+ "id": "a-screenshot-feature",
359
+ "keyword": "Feature",
360
+ "name": "A screenshot feature",
361
+ "line": 1,
362
+ "description": "",
363
+ "elements": [
364
+ {
365
+ "id": "a-screenshot-feature;",
366
+ "keyword": "Scenario",
367
+ "name": "",
368
+ "line": 3,
369
+ "description": "",
370
+ "type": "scenario",
371
+ "steps": [
372
+ {
373
+ "keyword": "Given ",
374
+ "name": "I embed a screenshot",
375
+ "line": 4,
376
+ "embeddings": [
377
+ {
378
+ "mime_type": "image/png",
379
+ "data": "Zm9v"
380
+ }
381
+ ],
382
+ "match": {
383
+ "location": "features/step_definitions/json_steps.rb:1"
384
+ },
385
+ "result": {
386
+ "status": "passed",
387
+ "duration": 1
388
+ }
389
+ }
390
+ ]
391
+ }
392
+ ]
393
+ }
394
+ ]
395
+
396
+ """
397
+
398
+ @spawn
399
+ Scenario: scenario outline
400
+ When I run `cucumber --format json features/outline.feature`
401
+ Then it should fail with JSON:
402
+ """
403
+ [
404
+ {
405
+ "uri": "features/outline.feature",
406
+ "id": "an-outline-feature",
407
+ "keyword": "Feature",
408
+ "name": "An outline feature",
409
+ "line": 1,
410
+ "description": "",
411
+ "elements": [
412
+ {
413
+ "id": "an-outline-feature;outline;examples1;2",
414
+ "keyword": "Scenario Outline",
415
+ "name": "outline",
416
+ "description": "",
417
+ "line": 8,
418
+ "type": "scenario",
419
+ "steps": [
420
+ {
421
+ "keyword": "Given ",
422
+ "name": "this step passes",
423
+ "line": 8,
424
+ "match": {
425
+ "location": "features/step_definitions/steps.rb:1"
426
+ },
427
+ "result": {
428
+ "status": "passed",
429
+ "duration": 1
430
+ }
431
+ }
432
+ ]
433
+ },
434
+ {
435
+ "id": "an-outline-feature;outline;examples1;3",
436
+ "keyword": "Scenario Outline",
437
+ "name": "outline",
438
+ "description": "",
439
+ "line": 9,
440
+ "type": "scenario",
441
+ "steps": [
442
+ {
443
+ "keyword": "Given ",
444
+ "name": "this step fails",
445
+ "line": 9,
446
+ "match": {
447
+ "location": "features/step_definitions/steps.rb:4"
448
+ },
449
+ "result": {
450
+ "status": "failed",
451
+ "error_message": " (RuntimeError)\n./features/step_definitions/steps.rb:4:in `/^this step fails$/'\nfeatures/outline.feature:9:in `Given this step fails'\nfeatures/outline.feature:4:in `Given this step <status>'",
452
+ "duration": 1
453
+ }
454
+ }
455
+ ]
456
+ },
457
+ {
458
+ "id": "an-outline-feature;outline;examples2;2",
459
+ "keyword": "Scenario Outline",
460
+ "name": "outline",
461
+ "description": "",
462
+ "line": 13,
463
+ "type": "scenario",
464
+ "steps": [
465
+ {
466
+ "keyword": "Given ",
467
+ "name": "this step passes",
468
+ "line": 13,
469
+ "match": {
470
+ "location": "features/step_definitions/steps.rb:1"
471
+ },
472
+ "result": {
473
+ "status": "passed",
474
+ "duration": 1
475
+ }
476
+ }
477
+ ]
478
+ }
479
+ ]
480
+ }
481
+ ]
482
+
483
+ """
484
+
485
+ Scenario: print from step definition
486
+ When I run `cucumber --format json features/print_from_step_definition.feature`
487
+ Then it should pass with JSON:
488
+ """
489
+ [
490
+ {
491
+ "uri": "features/print_from_step_definition.feature",
492
+ "id": "a-print-from-step-definition-feature",
493
+ "keyword": "Feature",
494
+ "name": "A print from step definition feature",
495
+ "line": 1,
496
+ "description": "",
497
+ "elements": [
498
+ {
499
+ "id": "a-print-from-step-definition-feature;",
500
+ "keyword": "Scenario",
501
+ "name": "",
502
+ "line": 3,
503
+ "description": "",
504
+ "type": "scenario",
505
+ "steps": [
506
+ {
507
+ "keyword": "Given ",
508
+ "name": "I print from step definition",
509
+ "line": 4,
510
+ "output": [
511
+ "from step definition"
512
+ ],
513
+ "match": {
514
+ "location": "features/step_definitions/json_steps.rb:6"
515
+ },
516
+ "result": {
517
+ "status": "passed",
518
+ "duration": 1
519
+ }
520
+ },
521
+ {
522
+ "keyword": "And ",
523
+ "name": "I print from step definition",
524
+ "line": 5,
525
+ "output": [
526
+ "from step definition"
527
+ ],
528
+ "match": {
529
+ "location": "features/step_definitions/json_steps.rb:6"
530
+ },
531
+ "result": {
532
+ "status": "passed",
533
+ "duration": 1
534
+ }
535
+ }
536
+ ]
537
+ }
538
+ ]
539
+ }
540
+ ]
541
+
542
+ """
543
+
544
+ @spawn
545
+ Scenario: scenario outline expanded
546
+ When I run `cucumber --expand --format json features/outline.feature`
547
+ Then it should fail with JSON:
548
+ """
549
+ [
550
+ {
551
+ "uri": "features/outline.feature",
552
+ "id": "an-outline-feature",
553
+ "keyword": "Feature",
554
+ "name": "An outline feature",
555
+ "line": 1,
556
+ "description": "",
557
+ "elements": [
558
+ {
559
+ "id": "an-outline-feature;outline;examples1;2",
560
+ "keyword": "Scenario Outline",
561
+ "name": "outline",
562
+ "line": 8,
563
+ "description": "",
564
+ "type": "scenario",
565
+ "steps": [
566
+ {
567
+ "keyword": "Given ",
568
+ "name": "this step passes",
569
+ "line": 8,
570
+ "match": {
571
+ "location": "features/step_definitions/steps.rb:1"
572
+ },
573
+ "result": {
574
+ "status": "passed",
575
+ "duration": 1
576
+ }
577
+ }
578
+ ]
579
+ },
580
+ {
581
+ "id": "an-outline-feature;outline;examples1;3",
582
+ "keyword": "Scenario Outline",
583
+ "name": "outline",
584
+ "line": 9,
585
+ "description": "",
586
+ "type": "scenario",
587
+ "steps": [
588
+ {
589
+ "keyword": "Given ",
590
+ "name": "this step fails",
591
+ "line": 9,
592
+ "match": {
593
+ "location": "features/step_definitions/steps.rb:4"
594
+ },
595
+ "result": {
596
+ "status": "failed",
597
+ "error_message" : " (RuntimeError)\n./features/step_definitions/steps.rb:4:in `/^this step fails$/'\nfeatures/outline.feature:9:in `Given this step fails'\nfeatures/outline.feature:4:in `Given this step <status>'",
598
+ "duration": 1
599
+ }
600
+ }
601
+ ]
602
+ },
603
+ {
604
+ "id": "an-outline-feature;outline;examples2;2",
605
+ "keyword": "Scenario Outline",
606
+ "name": "outline",
607
+ "line": 13,
608
+ "description": "",
609
+ "type": "scenario",
610
+ "steps": [
611
+ {
612
+ "keyword": "Given ",
613
+ "name": "this step passes",
614
+ "line": 13,
615
+ "match": {
616
+ "location": "features/step_definitions/steps.rb:1"
617
+ },
618
+ "result": {
619
+ "status": "passed",
620
+ "duration": 1
621
+ }
622
+ }
623
+ ]
624
+ }
625
+ ]
626
+ }
627
+ ]
628
+
629
+ """
630
+
631
+ Scenario: embedding data directly
632
+ When I run `cucumber --format json -x features/embed_data_directly.feature`
633
+ Then it should pass with JSON:
634
+ """
635
+ [
636
+ {
637
+ "uri": "features/embed_data_directly.feature",
638
+ "id": "an-embed-data-directly-feature",
639
+ "keyword": "Feature",
640
+ "name": "An embed data directly feature",
641
+ "line": 1,
642
+ "description": "",
643
+ "elements": [
644
+ {
645
+ "id": "an-embed-data-directly-feature;",
646
+ "keyword": "Scenario",
647
+ "name": "",
648
+ "line": 3,
649
+ "description": "",
650
+ "type": "scenario",
651
+ "steps": [
652
+ {
653
+ "keyword": "Given ",
654
+ "name": "I embed data directly",
655
+ "line": 4,
656
+ "embeddings": [
657
+ {
658
+ "mime_type": "mime-type",
659
+ "data": "YWJj"
660
+ }
661
+ ],
662
+ "match": {
663
+ "location": "features/step_definitions/json_steps.rb:10"
664
+ },
665
+ "result": {
666
+ "status": "passed",
667
+ "duration": 1
668
+ }
669
+ }
670
+ ]
671
+ },
672
+ {
673
+ "keyword": "Scenario Outline",
674
+ "name": "",
675
+ "line": 11,
676
+ "description": "",
677
+ "id": "an-embed-data-directly-feature;;;2",
678
+ "type": "scenario",
679
+ "steps": [
680
+ {
681
+ "keyword": "Given ",
682
+ "name": "I embed data directly",
683
+ "line": 11,
684
+ "embeddings": [
685
+ {
686
+ "mime_type": "mime-type",
687
+ "data": "YWJj"
688
+ }
689
+ ],
690
+ "match": {
691
+ "location": "features/step_definitions/json_steps.rb:10"
692
+ },
693
+ "result": {
694
+ "status": "passed",
695
+ "duration": 1
696
+ }
697
+ }
698
+ ]
699
+ },
700
+ {
701
+ "keyword": "Scenario Outline",
702
+ "name": "",
703
+ "line": 12,
704
+ "description": "",
705
+ "id": "an-embed-data-directly-feature;;;3",
706
+ "type": "scenario",
707
+ "steps": [
708
+ {
709
+ "keyword": "Given ",
710
+ "name": "I embed data directly",
711
+ "line": 12,
712
+ "embeddings": [
713
+ {
714
+ "mime_type": "mime-type",
715
+ "data": "YWJj"
716
+ }
717
+ ],
718
+ "match": {
719
+ "location": "features/step_definitions/json_steps.rb:10"
720
+ },
721
+ "result": {
722
+ "status": "passed",
723
+ "duration": 1
724
+ }
725
+ }
726
+ ]
727
+ }
728
+ ]
729
+ }
730
+ ]
731
+
732
+ """
733
+ Scenario: handle output from hooks
734
+ Given a file named "features/step_definitions/output_steps.rb" with:
735
+ """
736
+ Before do
737
+ puts "Before hook 1"
738
+ embed "src", "mime_type", "label"
739
+ end
740
+
741
+ Before do
742
+ puts "Before hook 2"
743
+ embed "src", "mime_type", "label"
744
+ end
745
+
746
+ AfterStep do
747
+ puts "AfterStep hook 1"
748
+ embed "src", "mime_type", "label"
749
+ end
750
+
751
+ AfterStep do
752
+ puts "AfterStep hook 2"
753
+ embed "src", "mime_type", "label"
754
+ end
755
+
756
+ After do
757
+ puts "After hook 1"
758
+ embed "src", "mime_type", "label"
759
+ end
760
+
761
+ After do
762
+ puts "After hook 2"
763
+ embed "src", "mime_type", "label"
764
+ end
765
+ """
766
+ When I run `cucumber --format json features/out_scenario_out_scenario_outline.feature`
767
+ Then it should pass