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,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |s|
3
+ s.name = 'mobiusloop'
4
+ s.version = File.read(File.expand_path("../lib/mobiusloop/version", __FILE__))
5
+ s.authors = ["Ryan Shriver"]
6
+ s.description = 'mobiusloop provides continuous feedback to people on whether they are building the right things'
7
+ s.summary = "mobiusloop-#{s.version}"
8
+ s.email = 'ryanshriver@mac.com'
9
+ s.license = 'MIT'
10
+ s.homepage = "http://mobiusloop.com"
11
+ s.platform = Gem::Platform::RUBY
12
+ s.required_ruby_version = ">= 1.9.3"
13
+ s.add_dependency 'cucumber-core', '~> 1.4.0'
14
+ s.add_dependency 'builder', '>= 2.1.2'
15
+ s.add_dependency 'diff-lcs', '>= 1.1.3'
16
+ s.add_dependency 'gherkin', '~> 3.2'
17
+ s.add_dependency 'multi_json', '>= 1.7.5', '< 2.0'
18
+ s.add_dependency 'multi_test', '>= 0.1.2'
19
+ s.add_dependency 'cucumber-wire', '~> 0.0.1'
20
+
21
+ s.add_development_dependency 'aruba', '~> 0.6.1'
22
+ s.add_development_dependency 'json', '~> 1.7'
23
+ s.add_development_dependency 'nokogiri', '~> 1.5'
24
+ s.add_development_dependency 'rake', '>= 0.9.2'
25
+ s.add_development_dependency 'rspec', '>= 3.0'
26
+ s.add_development_dependency 'simplecov', '>= 0.6.2'
27
+ s.add_development_dependency 'coveralls', '~> 0.7'
28
+ s.add_development_dependency 'syntax', '>= 1.0.0'
29
+ s.add_development_dependency 'pry'
30
+
31
+ # For Documentation:
32
+ s.add_development_dependency 'bcat', '~> 0.6.2'
33
+ s.add_development_dependency 'kramdown', '~> 0.14'
34
+ s.add_development_dependency 'yard', '~> 0.8.0'
35
+
36
+ # Needed for examples (rake examples)
37
+ s.add_development_dependency 'capybara', '>= 2.1'
38
+ s.add_development_dependency 'rack-test', '>= 0.6.1'
39
+ s.add_development_dependency 'sinatra', '>= 1.3.2'
40
+
41
+ s.rubygems_version = ">= 1.6.1"
42
+ s.files = `git ls-files`.split("\n").reject {|path| path =~ /\.gitignore$/ }
43
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
44
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_path = "lib"
47
+ end
@@ -0,0 +1,435 @@
1
+ require 'spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Configuration do
7
+ module ExposesOptions
8
+ attr_reader :options
9
+ end
10
+
11
+ def given_cucumber_yml_defined_as(hash_or_string)
12
+ allow(File).to receive(:exist?) { true }
13
+
14
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
15
+
16
+ allow(IO).to receive(:read).with('cucumber.yml') { cucumber_yml }
17
+ end
18
+
19
+ def given_the_following_files(*files)
20
+ allow(File).to receive(:directory?) { true }
21
+ allow(File).to receive(:file?) { true }
22
+ allow(Dir).to receive(:[]) { files }
23
+ end
24
+
25
+ before(:each) do
26
+ allow(File).to receive(:exist?) { false } # Meaning, no cucumber.yml exists
27
+ allow(Kernel).to receive(:exit)
28
+ end
29
+
30
+ def config
31
+ @config ||= Configuration.new(@out = StringIO.new, @error = StringIO.new).extend(ExposesOptions)
32
+ end
33
+
34
+ def reset_config
35
+ @config = nil
36
+ end
37
+
38
+ attr_reader :out, :error
39
+
40
+ it "uses the default profile when no profile is defined" do
41
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
42
+
43
+ config.parse!(%w{--format progress})
44
+
45
+ expect(config.options[:require]).to include('some_file')
46
+ end
47
+
48
+ context '--profile' do
49
+ include RSpec::WorkInProgress
50
+
51
+ it "expands args from profiles in the cucumber.yml file" do
52
+ given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
53
+
54
+ config.parse!(%w{--format progress --profile bongo})
55
+
56
+ expect(config.options[:formats]).to eq [['progress', out]]
57
+ expect(config.options[:require]).to eq ['from/yml']
58
+ end
59
+
60
+ it "expands args from the default profile when no flags are provided" do
61
+ given_cucumber_yml_defined_as({'default' => '--require from/yml'})
62
+
63
+ config.parse!([])
64
+
65
+ expect(config.options[:require]).to eq ['from/yml']
66
+ end
67
+
68
+ it "allows --strict to be set by a profile" do
69
+ given_cucumber_yml_defined_as({'bongo' => '--strict'})
70
+
71
+ config.parse!(%w{--profile bongo})
72
+
73
+ expect(config.options[:strict]).to be true
74
+ end
75
+
76
+ it "parses ERB syntax in the cucumber.yml file" do
77
+ given_cucumber_yml_defined_as("---\ndefault: \"<%=\"--require some_file\"%>\"\n")
78
+
79
+ config.parse!([])
80
+
81
+ expect(config.options[:require]).to include('some_file')
82
+ end
83
+
84
+ it "parses ERB in cucumber.yml that makes uses nested ERB sessions" do
85
+ given_cucumber_yml_defined_as(<<ERB_YML)
86
+ <%= ERB.new({'standard' => '--require some_file'}.to_yaml).result %>
87
+ <%= ERB.new({'enhanced' => '--require other_file'}.to_yaml).result %>
88
+ ERB_YML
89
+
90
+ config.parse!(%w(-p standard))
91
+
92
+ expect(config.options[:require]).to include('some_file')
93
+ end
94
+
95
+ it "provides a helpful error message when a specified profile does not exists in cucumber.yml" do
96
+ given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
97
+
98
+ expected_message = <<-END_OF_MESSAGE
99
+ Could not find profile: 'i_do_not_exist'
100
+
101
+ Defined profiles in cucumber.yml:
102
+ * default
103
+ * html_report
104
+ END_OF_MESSAGE
105
+
106
+ expect(-> { config.parse!(%w{--profile i_do_not_exist}) }).to raise_error(ProfileNotFound, expected_message)
107
+ end
108
+
109
+ it "allows profiles to be defined in arrays" do
110
+ given_cucumber_yml_defined_as({'foo' => ['-f','progress']})
111
+
112
+ config.parse!(%w{--profile foo})
113
+
114
+ expect(config.options[:formats]).to eq [['progress', out]]
115
+ end
116
+
117
+ it "disregards default STDOUT formatter defined in profile when another is passed in (via cmd line)" do
118
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
119
+ config.parse!(%w{--format progress --profile foo})
120
+
121
+ expect(config.options[:formats]).to eq [['progress', out]]
122
+ end
123
+
124
+ ["--no-profile", "-P"].each do |flag|
125
+ context 'when none is specified with #{flag}' do
126
+ it "disables profiles" do
127
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
128
+
129
+ config.parse!("#{flag} --require some_file.rb".split(" "))
130
+
131
+ expect(config.options[:require]).to eq ['some_file.rb']
132
+ end
133
+
134
+ it "notifies the user that the profiles are being disabled" do
135
+ given_cucumber_yml_defined_as({'default' => '-v'})
136
+
137
+ config.parse!("#{flag} --require some_file.rb".split(" "))
138
+
139
+ expect(out.string).to match /Disabling profiles.../
140
+ end
141
+ end
142
+ end
143
+
144
+ it "issues a helpful error message when a specified profile exists but is nil or blank" do
145
+ [nil, ' '].each do |bad_input|
146
+ given_cucumber_yml_defined_as({'foo' => bad_input})
147
+
148
+ expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
149
+
150
+ expect(-> { config.parse!(%w{--profile foo}) }).to raise_error(expected_error)
151
+ end
152
+ end
153
+
154
+ it "issues a helpful error message when no YAML file exists and a profile is specified" do
155
+ expect(File).to receive(:exist?).with('cucumber.yml') { false }
156
+
157
+ expected_error = /cucumber\.yml was not found/
158
+
159
+ expect(-> { config.parse!(%w{--profile i_do_not_exist}) }).to raise_error(expected_error)
160
+ end
161
+
162
+ it "issues a helpful error message when cucumber.yml is blank or malformed" do
163
+ expected_error_message = /cucumber\.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
164
+
165
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
166
+ given_cucumber_yml_defined_as(bad_input)
167
+
168
+ expect(-> { config.parse!([]) }).to raise_error(expected_error_message)
169
+
170
+ reset_config
171
+ end
172
+ end
173
+
174
+ it "issues a helpful error message when cucumber.yml can not be parsed" do
175
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
176
+
177
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
178
+
179
+ expect(YAML).to receive(:load).and_raise(ArgumentError)
180
+ expect(-> { config.parse!([]) }).to raise_error(expected_error_message)
181
+ end
182
+
183
+ it "issues a helpful error message when cucumber.yml can not be parsed by ERB" do
184
+ expected_error_message = /cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage./
185
+ given_cucumber_yml_defined_as("<% this_fails %>")
186
+
187
+ expect(-> { config.parse!([]) }).to raise_error(expected_error_message)
188
+ end
189
+ end
190
+
191
+ it "accepts --dry-run option" do
192
+ config.parse!(%w{--dry-run})
193
+
194
+ expect(config.options[:dry_run]).to be true
195
+ end
196
+
197
+ it "implies --no-duration with --dry-run option" do
198
+ config.parse!(%w{--dry-run})
199
+
200
+ expect(config.options[:duration]).to be false
201
+ end
202
+
203
+ it "accepts --no-source option" do
204
+ config.parse!(%w{--no-source})
205
+
206
+ expect(config.options[:source]).to be false
207
+ end
208
+
209
+ it "accepts --no-snippets option" do
210
+ config.parse!(%w{--no-snippets})
211
+
212
+ expect(config.options[:snippets]).to be false
213
+ end
214
+
215
+ it "sets snippets and source and duration to false with --quiet option" do
216
+ config.parse!(%w{--quiet})
217
+
218
+ expect(config.options[:snippets]).to be false
219
+ expect(config.options[:source]).to be false
220
+ expect(config.options[:duration]).to be false
221
+ end
222
+
223
+ it "sets duration to false with --no-duration" do
224
+ config.parse!(%w{--no-duration})
225
+
226
+ expect(config.options[:duration]).to be false
227
+ end
228
+
229
+ it "accepts --verbose option" do
230
+ config.parse!(%w{--verbose})
231
+
232
+ expect(config.options[:verbose]).to be true
233
+ end
234
+
235
+ it "accepts --out option" do
236
+ config.parse!(%w{--out jalla.txt})
237
+
238
+ expect(config.formats).to eq [['pretty', 'jalla.txt']]
239
+ end
240
+
241
+ it "accepts multiple --out options" do
242
+ config.parse!(%w{--format progress --out file1 --out file2})
243
+
244
+ expect(config.formats).to eq [['progress', 'file2']]
245
+ end
246
+
247
+ it "accepts multiple --format options and put the STDOUT one first so progress is seen" do
248
+ config.parse!(%w{--format pretty --out pretty.txt --format progress})
249
+
250
+ expect(config.formats).to eq [['progress', out], ['pretty', 'pretty.txt']]
251
+ end
252
+
253
+ it "does not accept multiple --format options when both use implicit STDOUT" do
254
+ expect(-> { config.parse!(%w{--format pretty --format progress}) }).to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
255
+ end
256
+
257
+ it "does not accept multiple --format options when both use implicit STDOUT (using profile with no formatters)" do
258
+ given_cucumber_yml_defined_as({'default' => ['-q']})
259
+ expect(-> { config.parse!(%w{--format pretty --format progress}) }).to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
260
+ end
261
+
262
+ it "accepts same --format options with implicit STDOUT, and keep only one" do
263
+ config.parse!(%w{--format pretty --format pretty})
264
+
265
+ expect(config.formats).to eq [["pretty", out]]
266
+ end
267
+
268
+ it "does not accept multiple --out streams pointing to the same place" do
269
+ expect(-> { config.parse!(%w{--format pretty --out file1 --format progress --out file1}) }).to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
270
+ end
271
+
272
+ it "does not accept multiple --out streams pointing to the same place (one from profile, one from command line)" do
273
+ given_cucumber_yml_defined_as({'default' => ['-f','progress', '--out', 'file1']})
274
+ expect(-> { config.parse!(%w{--format pretty --out file1}) }).to raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
275
+ end
276
+
277
+ it "associates --out to previous --format" do
278
+ config.parse!(%w{--format progress --out file1 --format profile --out file2})
279
+
280
+ expect(config.formats).to eq [["progress", "file1"], ["profile" ,"file2"]]
281
+ end
282
+
283
+ it "accepts same --format options with same --out streams and keep only one" do
284
+ config.parse!(%w{--format html --out file --format pretty --format html --out file})
285
+
286
+ expect(config.formats).to eq [["pretty", out], ["html", "file"]]
287
+ end
288
+
289
+ it "accepts same --format options with different --out streams" do
290
+ config.parse!(%w{--format html --out file1 --format html --out file2})
291
+
292
+ expect(config.formats).to eq [["html", "file1"], ["html", "file2"]]
293
+ end
294
+
295
+ it "accepts --color option" do
296
+ expect(Cucumber::Term::ANSIColor).to receive(:coloring=).with(true)
297
+
298
+ config.parse!(['--color'])
299
+ end
300
+
301
+ it "accepts --no-color option" do
302
+ expect(Cucumber::Term::ANSIColor).to receive(:coloring=).with(false)
303
+
304
+ config = Configuration.new(StringIO.new)
305
+ config.parse!(['--no-color'])
306
+ end
307
+
308
+ describe "--backtrace" do
309
+ before do
310
+ Cucumber.use_full_backtrace = false
311
+ end
312
+
313
+ it "shows full backtrace when --backtrace is present" do
314
+ Main.new(['--backtrace'])
315
+ begin
316
+ expect("x").to eq "y"
317
+ rescue RSpec::Expectations::ExpectationNotMetError => e
318
+ expect(e.backtrace[0]).not_to eq "#{__FILE__}:#{__LINE__ - 2}"
319
+ end
320
+ end
321
+
322
+ after do
323
+ Cucumber.use_full_backtrace = false
324
+ end
325
+ end
326
+
327
+ it "accepts multiple --name options" do
328
+ config.parse!(['--name', "User logs in", '--name', "User signs up"])
329
+
330
+ expect(config.options[:name_regexps]).to include(/User logs in/)
331
+ expect(config.options[:name_regexps]).to include(/User signs up/)
332
+ end
333
+
334
+ it "accepts multiple -n options" do
335
+ config.parse!(['-n', "User logs in", '-n', "User signs up"])
336
+
337
+ expect(config.options[:name_regexps]).to include(/User logs in/)
338
+ expect(config.options[:name_regexps]).to include(/User signs up/)
339
+ end
340
+
341
+ it "should allow specifying environment variables on the command line" do
342
+ config.parse!(["foo=bar"])
343
+
344
+ expect(ENV["foo"]).to eq "bar"
345
+ expect(config.paths).not_to include('foo=bar')
346
+ end
347
+
348
+ it "allows specifying environment variables in profiles" do
349
+ given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
350
+ config.parse!(["--profile", "selenium"])
351
+
352
+ expect(ENV["RAILS_ENV"]).to eq "selenium"
353
+ expect(config.paths).not_to include('RAILS_ENV=selenium')
354
+ end
355
+
356
+ describe "#tag_expression" do
357
+ include RSpec::WorkInProgress
358
+
359
+ it "returns an empty expression when no tags are specified" do
360
+ config.parse!([])
361
+
362
+ expect(config.tag_expression).to be_empty
363
+ end
364
+
365
+ it "returns an expression when tags are specified" do
366
+ config.parse!(['--tags','@foo'])
367
+
368
+ expect(config.tag_expression).not_to be_empty
369
+ end
370
+ end
371
+
372
+ describe '#tag_limits' do
373
+ it "returns an empty hash when no limits are specified" do
374
+ config.parse!([])
375
+
376
+ expect(config.tag_limits).to eq({ })
377
+ end
378
+
379
+ it "returns a hash of limits when limits are specified" do
380
+ config.parse!(['--tags','@foo:1'])
381
+
382
+ expect(config.tag_limits).to eq({ "@foo" => 1 })
383
+ end
384
+ end
385
+
386
+ describe "#dry_run?" do
387
+ it "returns true when --dry-run was specified on in the arguments" do
388
+ config.parse!(['--dry-run'])
389
+
390
+ expect(config.dry_run?).to be true
391
+ end
392
+
393
+ it "returns true when --dry-run was specified in yaml file" do
394
+ given_cucumber_yml_defined_as({'default' => '--dry-run'})
395
+ config.parse!([])
396
+
397
+ expect(config.dry_run?).to be true
398
+ end
399
+
400
+ it "returns false by default" do
401
+ config.parse!([])
402
+
403
+ expect(config.dry_run?).to be false
404
+ end
405
+ end
406
+
407
+ describe "#snippet_type" do
408
+ it "returns the snippet type when it was set" do
409
+ config.parse!(["--snippet-type", "classic"])
410
+
411
+ expect(config.snippet_type).to eq :classic
412
+ end
413
+
414
+ it "returns the snippet type when it was set with shorthand option" do
415
+ config.parse!(["-I", "classic"])
416
+
417
+ expect(config.snippet_type).to eq :classic
418
+ end
419
+
420
+ it "returns the default snippet type if it was not set" do
421
+ config.parse!([])
422
+
423
+ expect(config.snippet_type).to eq :regexp
424
+ end
425
+ end
426
+
427
+ describe "#retry_attempts" do
428
+ it "returns the specified number of retries" do
429
+ config.parse!(['--retry=3'])
430
+ expect(config.retry_attempts).to eql 3
431
+ end
432
+ end
433
+ end
434
+ end
435
+ end