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,83 @@
1
+ require 'spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Main do
7
+ before(:each) do
8
+ allow(File).to receive(:exist?) { false } # When Configuration checks for cucumber.yml
9
+ allow(Dir).to receive(:[]) { [] } # to prevent cucumber's features dir to being laoded
10
+ end
11
+
12
+ let(:args) { [] }
13
+ let(:stdin) { StringIO.new }
14
+ let(:stdout) { StringIO.new }
15
+ let(:stderr) { StringIO.new }
16
+ let(:kernel) { double(:kernel) }
17
+ subject { Main.new(args, stdin, stdout, stderr, kernel)}
18
+
19
+ describe "#execute!" do
20
+ context "passed an existing runtime" do
21
+ let(:existing_runtime) { double('runtime').as_null_object }
22
+
23
+ def do_execute
24
+ subject.execute!(existing_runtime)
25
+ end
26
+
27
+ it "configures that runtime" do
28
+ expected_configuration = double('Configuration').as_null_object
29
+
30
+ allow(Configuration).to receive(:new) { expected_configuration }
31
+ expect(existing_runtime).to receive(:configure).with(expected_configuration)
32
+ expect(kernel).to receive(:exit).with(1)
33
+
34
+ do_execute
35
+ end
36
+
37
+ it "uses that runtime for running and reporting results" do
38
+ expected_results = double('results', :failure? => true)
39
+
40
+ expect(existing_runtime).to receive(:run!)
41
+ allow(existing_runtime).to receive(:results) { expected_results }
42
+ expect(kernel).to receive(:exit).with(1)
43
+
44
+ do_execute
45
+ end
46
+ end
47
+
48
+ context "interrupted with ctrl-c" do
49
+ after do
50
+ Cucumber.wants_to_quit = false
51
+ end
52
+
53
+ it "exits with error code" do
54
+ results = double('results', :failure? => false)
55
+
56
+ allow_any_instance_of(Runtime).to receive(:run!)
57
+ allow_any_instance_of(Runtime).to receive(:results) { results }
58
+
59
+ Cucumber.wants_to_quit = true
60
+
61
+ expect(kernel).to receive(:exit).with(2)
62
+
63
+ subject.execute!
64
+ end
65
+ end
66
+ end
67
+
68
+ [ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
69
+ it "rescues #{exception_klass}, prints the message to the error stream" do
70
+ configuration = double('configuration')
71
+
72
+ allow(Configuration).to receive(:new) { configuration }
73
+ allow(configuration).to receive(:parse!).and_raise(exception_klass.new("error message"))
74
+ allow(kernel).to receive(:exit).with(2)
75
+
76
+ subject.execute!
77
+
78
+ expect(stderr.string).to eq "error message\n"
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,410 @@
1
+ require 'spec_helper'
2
+ require 'yaml'
3
+ require 'cucumber/cli/options'
4
+
5
+ module Cucumber
6
+ module Cli
7
+ describe Options do
8
+
9
+ def given_cucumber_yml_defined_as(hash_or_string)
10
+ allow(File).to receive(:exist?) { true }
11
+
12
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
13
+
14
+ allow(IO).to receive(:read).with('cucumber.yml') { cucumber_yml }
15
+ end
16
+
17
+ before(:each) do
18
+ allow(File).to receive(:exist?) { false } # Meaning, no cucumber.yml exists
19
+ allow(Kernel).to receive(:exit)
20
+ end
21
+
22
+ def output_stream
23
+ @output_stream ||= StringIO.new
24
+ end
25
+
26
+ def error_stream
27
+ @error_stream ||= StringIO.new
28
+ end
29
+
30
+ def options
31
+ @options ||= Options.new(output_stream, error_stream)
32
+ end
33
+
34
+ def prepare_args(args)
35
+ args.is_a?(Array) ? args : args.split(' ')
36
+ end
37
+
38
+ describe 'parsing' do
39
+
40
+ def when_parsing(args)
41
+ yield
42
+ options.parse!(prepare_args(args))
43
+ end
44
+
45
+ def after_parsing(args)
46
+ options.parse!(prepare_args(args))
47
+ yield
48
+ end
49
+
50
+ context '-r or --require' do
51
+ it "collects all specified files into an array" do
52
+ after_parsing('--require some_file.rb -r another_file.rb') do
53
+ expect(options[:require]).to eq ['some_file.rb', 'another_file.rb']
54
+ end
55
+ end
56
+ end
57
+
58
+ context '--i18n' do
59
+ context "with LANG specified as 'help'" do
60
+ include RSpec::WorkInProgress
61
+
62
+ it "lists all known languages" do
63
+ when_parsing '--i18n help' do
64
+ expect(Kernel).to receive(:exit)
65
+ end
66
+ end
67
+
68
+ it "exits the program" do
69
+ when_parsing('--i18n help') { expect(Kernel).to receive(:exit) }
70
+ end
71
+ end
72
+
73
+ context "with invalid LANG" do
74
+ include RSpec::WorkInProgress
75
+
76
+ it "exits" do
77
+ when_parsing '--i18n foo' do
78
+ expect(Kernel).to receive(:exit)
79
+ end
80
+ end
81
+
82
+ it "says the language was invalid" do
83
+ after_parsing '--i18n foo' do
84
+ expect(@output_stream.string).to include("Invalid language 'foo'. Available languages are:")
85
+ end
86
+ end
87
+
88
+ it "displays the language table" do
89
+ after_parsing '--i18n foo' do
90
+ ::Gherkin::DIALECTS.keys.map do |key|
91
+ expect(@output_stream.string).to include("#{key}");
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ context '-f FORMAT or --format FORMAT' do
99
+ it "defaults the output for the formatter to the output stream (STDOUT)" do
100
+ after_parsing('-f pretty') { expect(options[:formats]).to eq [['pretty', output_stream]] }
101
+ end
102
+ end
103
+
104
+ context '-o [FILE|DIR] or --out [FILE|DIR]' do
105
+ it "defaults the formatter to 'pretty' when not specified earlier" do
106
+ after_parsing('-o file.txt') { expect(options[:formats]).to eq [['pretty', 'file.txt']] }
107
+ end
108
+ it "sets the output for the formatter defined immediatly before it" do
109
+ after_parsing('-f profile --out file.txt -f pretty -o file2.txt') do
110
+ expect(options[:formats]).to eq [['profile', 'file.txt'], ['pretty', 'file2.txt']]
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'handling multiple formatters' do
116
+ it "catches multiple command line formatters using the same stream" do
117
+ expect{ options.parse!(prepare_args('-f pretty -f progress')) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
118
+ end
119
+
120
+ it "catches multiple profile formatters using the same stream" do
121
+ given_cucumber_yml_defined_as({'default' => '-f progress -f pretty'})
122
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
123
+
124
+ expect{ options.parse!(%w{}) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
125
+ end
126
+
127
+ it "profiles does not affect the catching of multiple command line formatters using the same stream" do
128
+ given_cucumber_yml_defined_as({'default' => '-q'})
129
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
130
+
131
+ expect{ options.parse!(%w{-f progress -f pretty}) }.to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
132
+ end
133
+
134
+ it "merges profile formatters and command line formatters" do
135
+ given_cucumber_yml_defined_as({'default' => '-f junit -o result.xml'})
136
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
137
+
138
+ options.parse!(%w{-f pretty})
139
+
140
+ expect(options[:formats]).to eq [['pretty', output_stream], ["junit", "result.xml"]]
141
+ end
142
+ end
143
+
144
+ context '-t TAGS --tags TAGS' do
145
+ it "designates tags prefixed with ~ as tags to be excluded" do
146
+ after_parsing('--tags ~@foo,@bar') { expect(options[:tag_expressions]).to eq ['~@foo,@bar'] }
147
+ end
148
+
149
+ it "stores tags passed with different --tags seperately" do
150
+ after_parsing('--tags @foo --tags @bar') { expect(options[:tag_expressions]).to eq ['@foo', '@bar'] }
151
+ end
152
+ end
153
+
154
+ context '-n NAME or --name NAME' do
155
+ it "stores the provided names as regular expressions" do
156
+ after_parsing('-n foo --name bar') { expect(options[:name_regexps]).to eq [/foo/,/bar/] }
157
+ end
158
+ end
159
+
160
+ context '-e PATTERN or --exclude PATTERN' do
161
+ it "stores the provided exclusions as regular expressions" do
162
+ after_parsing('-e foo --exclude bar') { expect(options[:excludes]).to eq [/foo/,/bar/] }
163
+ end
164
+ end
165
+
166
+ context '-l LINES or --lines LINES' do
167
+ it "adds line numbers to args" do
168
+ options.parse!(%w{-l24 FILE})
169
+
170
+ expect(options.instance_variable_get(:@args)).to eq ['FILE:24']
171
+ end
172
+ end
173
+
174
+ context '-p PROFILE or --profile PROFILE' do
175
+ it "uses the default profile passed in during initialization if none are specified by the user" do
176
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
177
+
178
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
179
+ options.parse!(%w{--format progress})
180
+
181
+ expect(options[:require]).to include('some_file')
182
+ end
183
+
184
+ it "merges all uniq values from both cmd line and the profile" do
185
+ given_cucumber_yml_defined_as('foo' => %w[--verbose])
186
+ options.parse!(%w[--wip --profile foo])
187
+
188
+ expect(options[:wip]).to be true
189
+ expect(options[:verbose]).to be true
190
+ end
191
+
192
+ it "gives precendene to the origianl options' paths" do
193
+ given_cucumber_yml_defined_as('foo' => %w[features])
194
+ options.parse!(%w[my.feature -p foo])
195
+
196
+ expect(options[:paths]).to eq %w[my.feature]
197
+ end
198
+
199
+ it "combines the require files of both" do
200
+ given_cucumber_yml_defined_as('bar' => %w[--require features -r dog.rb])
201
+ options.parse!(%w[--require foo.rb -p bar])
202
+
203
+ expect(options[:require]).to eq %w[foo.rb features dog.rb]
204
+ end
205
+
206
+ it "combines the tag names of both" do
207
+ given_cucumber_yml_defined_as('baz' => %w[-t @bar])
208
+ options.parse!(%w[--tags @foo -p baz])
209
+
210
+ expect(options[:tag_expressions]).to eq ["@foo", "@bar"]
211
+ end
212
+
213
+ it "only takes the paths from the original options, and disgregards the profiles" do
214
+ given_cucumber_yml_defined_as('baz' => %w[features])
215
+ options.parse!(%w[my.feature -p baz])
216
+
217
+ expect(options[:paths]).to eq ['my.feature']
218
+ end
219
+
220
+ it "uses the paths from the profile when none are specified originally" do
221
+ given_cucumber_yml_defined_as('baz' => %w[some.feature])
222
+ options.parse!(%w[-p baz])
223
+
224
+ expect(options[:paths]).to eq ['some.feature']
225
+ end
226
+
227
+ it "combines environment variables from the profile but gives precendene to cmd line args" do
228
+ given_cucumber_yml_defined_as('baz' => %w[FOO=bar CHEESE=swiss])
229
+ options.parse!(%w[-p baz CHEESE=cheddar BAR=foo])
230
+
231
+ expect(options[:env_vars]).to eq({ 'BAR' => 'foo', 'FOO' => 'bar', 'CHEESE' => 'cheddar' })
232
+ end
233
+
234
+ it "disregards STDOUT formatter defined in profile when another is passed in (via cmd line)" do
235
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
236
+ options.parse!(%w{--format progress --profile foo})
237
+
238
+ expect(options[:formats]).to eq [['progress', output_stream]]
239
+ end
240
+
241
+ it "includes any non-STDOUT formatters from the profile" do
242
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html]})
243
+ options.parse!(%w{--format progress --profile html})
244
+
245
+ expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
246
+ end
247
+
248
+ it "does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line" do
249
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html --format pretty]})
250
+ options.parse!(%w{--format progress --profile html})
251
+
252
+ expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
253
+ end
254
+
255
+ it "includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line" do
256
+ given_cucumber_yml_defined_as({'html' => %w[--format html]})
257
+ options.parse!(%w{--format rerun -o rerun.txt --profile html})
258
+
259
+ expect(options[:formats]).to eq [['html', output_stream], ['rerun', 'rerun.txt']]
260
+ end
261
+
262
+ it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
263
+ given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
264
+ options.parse!(%w{--profile html})
265
+
266
+ expect(options[:formats]).to eq [['progress', output_stream], ['html', 'features.html']]
267
+ end
268
+
269
+ it "only reads cucumber.yml once" do
270
+ original_parse_count = $cucumber_yml_read_count
271
+ $cucumber_yml_read_count = 0
272
+
273
+ begin
274
+ given_cucumber_yml_defined_as(<<-END
275
+ <% $cucumber_yml_read_count += 1 %>
276
+ default: --format pretty
277
+ END
278
+ )
279
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
280
+ options.parse!(%w(-f progress))
281
+
282
+ expect($cucumber_yml_read_count).to eq 1
283
+ ensure
284
+ $cucumber_yml_read_count = original_parse_count
285
+ end
286
+ end
287
+
288
+ it "respects --quiet when defined in the profile" do
289
+ given_cucumber_yml_defined_as('foo' => '-q')
290
+ options.parse!(%w[-p foo])
291
+
292
+ expect(options[:snippets]).to be false
293
+ expect(options[:source]).to be false
294
+ expect(options[:duration]).to be false
295
+ end
296
+
297
+ it "uses --no-duration when defined in the profile" do
298
+ given_cucumber_yml_defined_as('foo' => '--no-duration')
299
+ options.parse!(%w[-p foo])
300
+
301
+ expect(options[:duration]).to be false
302
+ end
303
+ end
304
+
305
+ context '-P or --no-profile' do
306
+ it "disables profiles" do
307
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
308
+
309
+ after_parsing("-P --require some_file.rb") do
310
+ expect(options[:require]).to eq ['some_file.rb']
311
+ end
312
+ end
313
+
314
+ it "notifies the user that the profiles are being disabled" do
315
+ given_cucumber_yml_defined_as({'default' => '-v'})
316
+
317
+ after_parsing("--no-profile --require some_file.rb") do
318
+ expect(output_stream.string).to match(/Disabling profiles.../)
319
+ end
320
+ end
321
+ end
322
+
323
+ context '-b or --backtrace' do
324
+ it "turns on cucumber's full backtrace" do
325
+ when_parsing("-b") do
326
+ expect(Cucumber).to receive(:use_full_backtrace=).with(true)
327
+ end
328
+ end
329
+ end
330
+
331
+ context '--version' do
332
+ it "displays Cucumber's version" do
333
+ after_parsing('--version') do
334
+ expect(output_stream.string).to match(/#{Cucumber::VERSION}/)
335
+ end
336
+ end
337
+
338
+ it "exits the program" do
339
+ when_parsing('--version') { expect(Kernel).to receive(:exit) }
340
+ end
341
+ end
342
+
343
+ context 'environment variables (i.e. MODE=webrat)' do
344
+ it "places all of the environment variables into a hash" do
345
+ after_parsing('MODE=webrat FOO=bar') do
346
+ expect(options[:env_vars]).to eq({ 'MODE' => 'webrat', 'FOO' => 'bar' })
347
+ end
348
+ end
349
+ end
350
+
351
+ context '--retry ATTEMPTS' do
352
+ it 'is 0 by default' do
353
+ after_parsing("") do
354
+ expect(options[:retry]).to eql 0
355
+ end
356
+ end
357
+
358
+ it 'sets the options[:retry] value' do
359
+ after_parsing("--retry 4") do
360
+ expect(options[:retry]).to eql 4
361
+ end
362
+ end
363
+ end
364
+
365
+ it "assigns any extra arguments as paths to features" do
366
+ after_parsing('-f pretty my_feature.feature my_other_features') do
367
+ expect(options[:paths]).to eq ['my_feature.feature', 'my_other_features']
368
+ end
369
+ end
370
+
371
+ it "does not mistake environment variables as feature paths" do
372
+ after_parsing('my_feature.feature FOO=bar') do
373
+ expect(options[:paths]).to eq ['my_feature.feature']
374
+ end
375
+ end
376
+
377
+ context '--snippet-type' do
378
+ it "parses the snippet type argument" do
379
+ after_parsing('--snippet-type classic') do
380
+ expect(options[:snippet_type]).to eq :classic
381
+ end
382
+ end
383
+ end
384
+ end
385
+
386
+ describe "dry-run" do
387
+ it "has the default value for snippets" do
388
+ given_cucumber_yml_defined_as({'foo' => %w[--dry-run]})
389
+ options.parse!(%w{--dry-run})
390
+
391
+ expect(options[:snippets]).to be true
392
+ end
393
+
394
+ it "sets snippets to false when no-snippets provided after dry-run" do
395
+ given_cucumber_yml_defined_as({'foo' => %w[--dry-run --no-snippets]})
396
+ options.parse!(%w{--dry-run --no-snippets})
397
+
398
+ expect(options[:snippets]).to be false
399
+ end
400
+
401
+ it "sets snippets to false when no-snippets provided before dry-run" do
402
+ given_cucumber_yml_defined_as({'foo' => %w[--no-snippet --dry-run]})
403
+ options.parse!(%w{--no-snippets --dry-run})
404
+
405
+ expect(options[:snippets]).to be false
406
+ end
407
+ end
408
+ end
409
+ end
410
+ end