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,64 @@
1
+ require 'spec_helper'
2
+ require 'cucumber/formatter/spec_helper'
3
+ require 'cucumber/formatter/debug'
4
+ require 'cucumber/cli/options'
5
+
6
+ module Cucumber
7
+ module Formatter
8
+ describe Debug do
9
+ extend SpecHelperDsl
10
+ include SpecHelper
11
+
12
+ before(:each) do
13
+ Cucumber::Term::ANSIColor.coloring = false
14
+ @out = StringIO.new
15
+ @formatter = Debug.new(runtime, @out, {})
16
+ end
17
+
18
+ describe "given a single feature" do
19
+ before(:each) { run_defined_feature }
20
+
21
+ describe "with a scenario" do
22
+ define_feature <<-FEATURE
23
+ Feature: Banana party
24
+
25
+ Scenario: Monkey eats banana
26
+ Given there are bananas
27
+ FEATURE
28
+
29
+ it "outputs the events as expected" do
30
+ expect(@out.string).to eq(<<EXPECTED)
31
+ before_test_case
32
+ before_features
33
+ before_feature
34
+ before_tags
35
+ after_tags
36
+ feature_name
37
+ before_test_step
38
+ after_test_step
39
+ before_test_step
40
+ before_feature_element
41
+ before_tags
42
+ after_tags
43
+ scenario_name
44
+ before_steps
45
+ before_step
46
+ before_step_result
47
+ step_name
48
+ after_step_result
49
+ after_step
50
+ after_test_step
51
+ after_steps
52
+ after_feature_element
53
+ after_test_case
54
+ after_feature
55
+ after_features
56
+ done
57
+ EXPECTED
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'cucumber/formatter/duration'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe Duration do
7
+ include Duration
8
+
9
+ it "formats ms" do
10
+ expect(format_duration(0.002103)).to eq '0m0.002s'
11
+ end
12
+
13
+ it "formats m" do
14
+ expect(format_duration(61.002503)).to eq'1m1.003s'
15
+ end
16
+
17
+ it "formats h" do
18
+ expect(format_duration(3661.002503)).to eq '61m1.003s'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,88 @@
1
+ require 'cucumber/configuration'
2
+ require 'cucumber/runtime'
3
+ require 'cucumber/formatter/spec_helper'
4
+ require 'cucumber/formatter/event_bus_report'
5
+
6
+ module Cucumber
7
+ module Formatter
8
+ describe EventBusReport do
9
+ extend SpecHelperDsl
10
+ include SpecHelper
11
+
12
+ context "With no options" do
13
+ let(:config) { Cucumber::Configuration.new }
14
+
15
+ before(:each) do
16
+ @formatter = EventBusReport.new(config)
17
+ end
18
+
19
+ describe "given a single feature" do
20
+
21
+ describe "a scenario with a single passing step" do
22
+ define_feature <<-FEATURE
23
+ Feature:
24
+ Scenario: Test Scenario
25
+ Given passing
26
+ FEATURE
27
+
28
+ define_steps do
29
+ Given(/pass/) {}
30
+ end
31
+
32
+ it "emits a BeforeTestCase event" do
33
+ received_event = nil
34
+ config.on_event Cucumber::Events::BeforeTestCase do |event|
35
+ received_event = event
36
+ end
37
+ run_defined_feature
38
+ expect(received_event.test_case.name).to eq "Test Scenario"
39
+ end
40
+
41
+ it "emits a BeforeTestStep event" do
42
+ received_event = nil
43
+ config.on_event Cucumber::Events::BeforeTestStep do |event|
44
+ received_event = event
45
+ end
46
+ run_defined_feature
47
+ expect(received_event.test_case.name).to eq "Test Scenario"
48
+ expect(received_event.test_step.name).to eq "passing"
49
+ end
50
+
51
+ it "emits an AfterTestStep event with a passed result" do
52
+ received_event = nil
53
+ config.on_event Cucumber::Events::AfterTestStep do |event|
54
+ received_event = event
55
+ end
56
+ run_defined_feature
57
+ expect(received_event.test_case.name).to eq "Test Scenario"
58
+ expect(received_event.test_step.name).to eq "passing"
59
+ expect(received_event.result).to be_passed
60
+ end
61
+
62
+ it "emits an AfterTestCase event with a passed result" do
63
+ received_event = nil
64
+ config.on_event Cucumber::Events::AfterTestCase do |event|
65
+ received_event = event
66
+ end
67
+ run_defined_feature
68
+ expect(received_event.test_case.name).to eq "Test Scenario"
69
+ expect(received_event.result).to be_passed
70
+ end
71
+
72
+ it "emits a Done event when the test run is finished" do
73
+ received_event = nil
74
+ config.on_event Cucumber::Events::FinishedTesting do |event|
75
+ received_event = event
76
+ end
77
+ run_defined_feature
78
+ expect(received_event).not_to be_nil
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+
88
+
@@ -0,0 +1,88 @@
1
+ require 'cucumber/formatter/fail_fast'
2
+ require 'cucumber/core'
3
+ require 'cucumber/core/gherkin/writer'
4
+ require 'cucumber/core/test/result'
5
+ require 'cucumber/core/filter'
6
+ require 'cucumber/core/ast'
7
+ require 'cucumber'
8
+ require 'support/standard_step_actions'
9
+
10
+ module Cucumber::Formatter
11
+ describe FailFast do
12
+ include Cucumber::Core
13
+ include Cucumber::Core::Gherkin::Writer
14
+
15
+ let(:configuration) { Cucumber::Configuration.new }
16
+ before { FailFast.new(configuration) }
17
+ let(:report) { EventBusReport.new(configuration) }
18
+
19
+ context 'failing scenario' do
20
+ before(:each) do
21
+ @gherkin = gherkin('foo.feature') do
22
+ feature do
23
+ scenario do
24
+ step 'failing'
25
+ end
26
+
27
+ scenario do
28
+ step 'failing'
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ after(:each) do
35
+ Cucumber.wants_to_quit = false
36
+ end
37
+
38
+ it 'sets Cucumber.wants_to_quit' do
39
+ execute([@gherkin], report, [StandardStepActions.new])
40
+ expect(Cucumber.wants_to_quit).to be true
41
+ end
42
+ end
43
+
44
+ context 'passing scenario' do
45
+ before(:each) do
46
+ @gherkin = gherkin('foo.feature') do
47
+ feature do
48
+ scenario do
49
+ step 'passing'
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ it 'doesn\'t set Cucumber.wants_to_quit' do
56
+ execute([@gherkin], report, [StandardStepActions.new])
57
+ expect(Cucumber.wants_to_quit).to be_falsey
58
+ end
59
+ end
60
+
61
+ context 'undefined scenario' do
62
+ before(:each) do
63
+ @gherkin = gherkin('foo.feature') do
64
+ feature do
65
+ scenario do
66
+ step 'undefined'
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ it 'doesn\'t set Cucumber.wants_to_quit' do
73
+ execute([@gherkin], report, [StandardStepActions.new])
74
+ expect(Cucumber.wants_to_quit).to be_falsey
75
+ end
76
+
77
+ context 'in strict mode' do
78
+ let(:configuration) { Cucumber::Configuration.new strict: true }
79
+
80
+ it 'sets Cucumber.wants_to_quit' do
81
+ execute([@gherkin], report, [StandardStepActions.new])
82
+ expect(Cucumber.wants_to_quit).to be_truthy
83
+ end
84
+ end
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,538 @@
1
+ require 'spec_helper'
2
+ require 'cucumber/formatter/spec_helper'
3
+ require 'cucumber/formatter/html'
4
+ require 'nokogiri'
5
+ require 'cucumber/rb_support/rb_language'
6
+ require 'rspec/mocks'
7
+
8
+ module Cucumber
9
+ module Formatter
10
+ describe Html do
11
+ extend SpecHelperDsl
12
+ include SpecHelper
13
+
14
+ RSpec::Matchers.define :have_css_node do |css, regexp|
15
+ match do |doc|
16
+ nodes = doc.css(css)
17
+ nodes.detect{ |node| node.text =~ regexp }
18
+ end
19
+ end
20
+
21
+ before(:each) do
22
+ @out = StringIO.new
23
+ @formatter = Html.new(runtime, @out, {})
24
+ end
25
+
26
+ it "does not raise an error when visiting a blank feature name" do
27
+ expect(-> {
28
+ @formatter.feature_name("Feature", "")
29
+ }).not_to raise_error
30
+ end
31
+
32
+ describe "when writing the report to a file" do
33
+ before(:each) do
34
+ allow(@out).to receive(:respond_to?).with(:path, false).and_return(true)
35
+ expect(@out).to receive(:respond_to?).with(:path).and_return(true)
36
+ expect(@out).to receive(:path).and_return('out/file.html')
37
+ run_defined_feature
38
+ @doc = Nokogiri.HTML(@out.string)
39
+ end
40
+
41
+ describe "with a step that embeds a snapshot" do
42
+ define_steps do
43
+ Given(/snap/) {
44
+ RSpec::Mocks.allow_message(File, :file?) { true }
45
+ embed('out/snapshot.jpeg', 'image/jpeg')
46
+ }
47
+ end
48
+
49
+ define_feature(<<-FEATURE)
50
+ Feature:
51
+ Scenario:
52
+ Given snap
53
+ FEATURE
54
+
55
+ it "converts the snapshot path to a relative path" do
56
+ expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "snapshot.jpeg"
57
+ end
58
+ end
59
+ end
60
+
61
+ describe "given a single feature" do
62
+ before(:each) do
63
+ run_defined_feature
64
+ @doc = Nokogiri.HTML(@out.string)
65
+ end
66
+
67
+ describe "basic feature" do
68
+ define_feature <<-FEATURE
69
+ Feature: Bananas
70
+ In order to find my inner monkey
71
+ As a human
72
+ I must eat bananas
73
+ FEATURE
74
+
75
+ it "should output a main container div" do
76
+ expect(@out.string).to match(/\<div class="cucumber"\>/)
77
+ end
78
+ end
79
+
80
+ describe "with a comment" do
81
+ define_feature <<-FEATURE
82
+ # Healthy
83
+ Feature: Foo
84
+ Scenario:
85
+ Given passing
86
+ FEATURE
87
+
88
+ it { expect(@out.string).to match(/^\<!DOCTYPE/) }
89
+ it { expect(@out.string).to match(/\<\/html\>$/) }
90
+
91
+ it "nests the comment within the feature" do
92
+ expect(@doc).to have_css_node('.feature .comment', /Healthy/)
93
+ end
94
+
95
+ it "properly closes the comment" do
96
+ expect(@out.string).to match(%r{<pre class="comment"># Healthy<br/></pre>})
97
+ end
98
+ end
99
+
100
+ describe "with a comment at scenario level" do
101
+ define_feature <<-FEATURE
102
+ Feature: Foo
103
+ # Healthy Scenario
104
+ Scenario:
105
+ Given passing
106
+ FEATURE
107
+
108
+ it { expect(@doc).to have_css_node('.scenario .comment', /Healthy Scenario/) }
109
+ end
110
+
111
+ describe "with a tag" do
112
+ define_feature <<-FEATURE
113
+ @foo
114
+ Feature: can't have standalone tag :)
115
+ Scenario:
116
+ Given passing
117
+ FEATURE
118
+
119
+ it { expect(@doc).to have_css_node('.feature .tag', /foo/) }
120
+ end
121
+
122
+ describe "with a narrative" do
123
+ define_feature <<-FEATURE
124
+ Feature: Bananas
125
+ In order to find my inner monkey
126
+ As a human
127
+ I must eat bananas
128
+
129
+ Scenario:
130
+ Given passing
131
+ FEATURE
132
+
133
+ it { expect(@doc).to have_css_node('.feature h2', /Bananas/) }
134
+ it { expect(@doc).to have_css_node('.feature .narrative', /must eat bananas/) }
135
+ end
136
+
137
+ describe "with a background" do
138
+ define_feature <<-FEATURE
139
+ Feature: Bananas
140
+
141
+ Background:
142
+ Given there are bananas
143
+
144
+ Scenario:
145
+ When the monkey eats a banana
146
+ FEATURE
147
+
148
+ it { expect(@doc).to have_css_node('.feature .background', /there are bananas/) }
149
+ end
150
+
151
+ describe "with a scenario" do
152
+ define_feature <<-FEATURE
153
+ Feature: Banana party
154
+
155
+ Scenario: Monkey eats banana
156
+ Given there are bananas
157
+ FEATURE
158
+
159
+ it { expect(@doc).to have_css_node('.feature h3', /Monkey eats banana/) }
160
+ it { expect(@doc).to have_css_node('.feature .scenario .step', /there are bananas/) }
161
+ end
162
+
163
+ describe "with a scenario outline" do
164
+ define_feature <<-FEATURE
165
+ Feature: Fud Pyramid
166
+
167
+ Scenario Outline: Monkey eats a balanced diet
168
+ Given there are <Things>
169
+
170
+ Examples: Fruit
171
+ | Things |
172
+ | apples |
173
+ | bananas |
174
+ Examples: Vegetables
175
+ | Things |
176
+ | broccoli |
177
+ | carrots |
178
+ FEATURE
179
+
180
+ it { expect(@doc).to have_css_node('.feature .scenario.outline h4', /Fruit/) }
181
+ it { expect(@doc).to have_css_node('.feature .scenario.outline h4', /Vegetables/) }
182
+ it { expect(@doc.css('.feature .scenario.outline h4').length).to eq 2}
183
+ it { expect(@doc).to have_css_node('.feature .scenario.outline table', //) }
184
+ it { expect(@doc).to have_css_node('.feature .scenario.outline table td', /carrots/) }
185
+ end
186
+
187
+ describe "with a step with a py string" do
188
+ define_feature <<-FEATURE
189
+ Feature: Traveling circus
190
+
191
+ Scenario: Monkey goes to town
192
+ Given there is a monkey called:
193
+ """
194
+ foo
195
+ """
196
+ FEATURE
197
+
198
+ it { expect(@doc).to have_css_node('.feature .scenario .val', /foo/) }
199
+ end
200
+
201
+ describe "with a multiline step arg" do
202
+ define_steps do
203
+ Given(/there are monkeys:/) { |table| }
204
+ end
205
+ define_feature <<-FEATURE
206
+ Feature: Traveling circus
207
+
208
+ Scenario: Monkey goes to town
209
+ Given there are monkeys:
210
+ | name |
211
+ | foo |
212
+ | bar |
213
+ FEATURE
214
+
215
+ it { expect(@doc).to have_css_node('.feature .scenario table td', /foo/) }
216
+ it { expect(@out.string.include?('makeYellow(\'scenario_1\')')).to be false }
217
+ end
218
+
219
+ describe "with a table in the background and the scenario" do
220
+ define_feature <<-FEATURE
221
+ Feature: accountant monkey
222
+
223
+ Background:
224
+ Given table:
225
+ | a | b |
226
+ | c | d |
227
+ Scenario:
228
+ Given another table:
229
+ | e | f |
230
+ | g | h |
231
+ FEATURE
232
+
233
+ it { expect(@doc.css('td').length).to eq 8 }
234
+ end
235
+
236
+ describe "with a py string in the background and the scenario" do
237
+ define_feature <<-FEATURE
238
+ Feature: py strings
239
+
240
+ Background:
241
+ Given stuff:
242
+ """
243
+ foo
244
+ """
245
+ Scenario:
246
+ Given more stuff:
247
+ """
248
+ bar
249
+ """
250
+ FEATURE
251
+
252
+ it { expect(@doc.css('.feature .background pre.val').length).to eq 1 }
253
+ it { expect(@doc.css('.feature .scenario pre.val').length).to eq 1 }
254
+ end
255
+
256
+ describe "with a step that fails in the scenario" do
257
+ define_steps do
258
+ Given(/boo/) { raise StandardError, 'eek'.freeze }
259
+ end
260
+
261
+ define_feature(<<-FEATURE)
262
+ Feature: Animal Cruelty
263
+
264
+ Scenario: Monkey gets a fright
265
+ Given boo
266
+ FEATURE
267
+
268
+ it { expect(@doc).to have_css_node('.feature .scenario .step.failed .message', /eek/) }
269
+ it { expect(@doc).to have_css_node('.feature .scenario .step.failed .message', /StandardError/) }
270
+ end
271
+
272
+ describe "with a step that fails in the background" do
273
+ define_steps do
274
+ Given(/boo/) { raise 'eek' }
275
+ end
276
+
277
+ define_feature(<<-FEATURE)
278
+ Feature: shouting
279
+ Background:
280
+ Given boo
281
+ Scenario:
282
+ Given yay
283
+ FEATURE
284
+
285
+ it { expect(@doc).to have_css_node('.feature .background .step.failed', /eek/) }
286
+ it { expect(@out.string).not_to include('makeRed(\'scenario_0\')') }
287
+ it { expect(@out.string).to include('makeRed(\'background_0\')') }
288
+ it { expect(@doc).not_to have_css_node('.feature .scenario .step.failed', //) }
289
+ it { expect(@doc).to have_css_node('.feature .scenario .step.undefined', /yay/) }
290
+ it { expect(@doc).to have_css_node('.feature .background .backtrace', //) }
291
+ it { expect(@doc).not_to have_css_node('.feature .scenario .backtrace', //) }
292
+ end
293
+
294
+ context "with a before hook that fails" do
295
+ describe "in a scenario" do
296
+ define_steps do
297
+ Before { raise 'eek' }
298
+ Given(/yay/) {}
299
+ end
300
+
301
+ define_feature(<<-FEATURE)
302
+ Feature: shouting
303
+ Scenario:
304
+ Given yay
305
+ FEATURE
306
+
307
+ it { expect(@out.string).to include('makeRed(\'scenario_1\')') }
308
+ it { expect(@doc).not_to have_css_node('.feature .scenario .step.failed', //) }
309
+ it { expect(@doc).to have_css_node('.feature .scenario .step.skipped', /yay/) }
310
+ end
311
+
312
+ describe "in a scenario outline" do
313
+ define_steps do
314
+ Before { raise 'eek' }
315
+ Given(/yay/) {}
316
+ end
317
+
318
+ define_feature(<<-FEATURE)
319
+ Feature: shouting
320
+ Scenario Outline:
321
+ Given <step>
322
+ Examples:
323
+ | step |
324
+ | yay |
325
+ FEATURE
326
+
327
+ it { expect(@out.string).to include('makeRed(\'scenario_1\')') }
328
+ it { expect(@doc).not_to have_css_node('.feature .scenario .step.failed', //) }
329
+ it { expect(@doc).to have_css_node('.feature .scenario .step.skipped', /yay/) }
330
+ end
331
+
332
+ end
333
+
334
+ describe "with a step that embeds a snapshot" do
335
+ define_steps do
336
+ Given(/snap/) {
337
+ RSpec::Mocks.allow_message(File, :file?) { true }
338
+ embed('snapshot.jpeg', 'image/jpeg')
339
+ }
340
+ end
341
+
342
+ define_feature(<<-FEATURE)
343
+ Feature:
344
+ Scenario:
345
+ Given snap
346
+ FEATURE
347
+
348
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "snapshot.jpeg" }
349
+ end
350
+
351
+ describe "with a step that embeds a text" do
352
+ define_steps do
353
+ Given(/log/) { embed('log.txt', 'text/plain') }
354
+ end
355
+
356
+ define_feature(<<-FEATURE)
357
+ Feature:
358
+ Scenario:
359
+ Given log
360
+ FEATURE
361
+
362
+ it { expect(@doc.at('a#text_0')['href'].to_s).to eq "log.txt" }
363
+ end
364
+
365
+ describe "with a step that embeds a snapshot content manually" do
366
+ define_steps do
367
+ Given(/snap/) { embed('data:image/png;base64,YWJj', 'image/png') }
368
+ end
369
+
370
+ define_feature(<<-FEATURE)
371
+ Feature:
372
+ Scenario:
373
+ Given snap
374
+ FEATURE
375
+
376
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
377
+ end
378
+
379
+ describe "with a step that embeds a snapshot content" do
380
+ define_steps do
381
+ Given(/snap/) { embed('YWJj', 'image/png;base64') }
382
+ end
383
+
384
+ define_feature(<<-FEATURE)
385
+ Feature:
386
+ Scenario:
387
+ Given snap
388
+ FEATURE
389
+
390
+ it { expect(@doc.css('.embed img').first.attributes['src'].to_s).to eq "data:image/png;base64,YWJj" }
391
+ end
392
+
393
+ describe "with an undefined Given step then an undefined And step" do
394
+ define_feature(<<-FEATURE)
395
+ Feature:
396
+ Scenario:
397
+ Given some undefined step
398
+ And another undefined step
399
+ FEATURE
400
+
401
+ it { expect(@doc.css('pre').map { |pre| /^(Given|And)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
402
+ end
403
+
404
+ describe "with an undefined When step then an undefined And step" do
405
+ define_feature(<<-FEATURE)
406
+ Feature:
407
+ Scenario:
408
+ Given some undefined step
409
+ When a different undefined step
410
+ And another undefined step
411
+ FEATURE
412
+
413
+ it { expect(@doc.css('pre').map { |pre| /^(Given|When|And)/.match(pre.text)[1] }).to eq ["Given", "When", "When"] }
414
+ end
415
+
416
+ describe "with an passing Then step and an undefined And step" do
417
+ define_feature <<-FEATURE
418
+ Feature:
419
+ Scenario:
420
+ Given this step passes
421
+ Then this step passes
422
+ And this step is undefined
423
+ FEATURE
424
+
425
+ define_steps do
426
+ Given(/^this step passes$/) {}
427
+ end
428
+
429
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then)/.match(pre.text)[1] }).to eq ["Then"] }
430
+ end
431
+
432
+ describe "with a output from hooks" do
433
+ describe "in a scenario" do
434
+ define_feature <<-FEATURE
435
+ Feature:
436
+ Scenario:
437
+ Given this step passes
438
+ FEATURE
439
+
440
+ define_steps do
441
+ Before do
442
+ puts "Before hook"
443
+ end
444
+ AfterStep do
445
+ puts "AfterStep hook"
446
+ end
447
+ After do
448
+ puts "After hook"
449
+ end
450
+ Given(/^this step passes$/) {}
451
+ end
452
+
453
+ it 'should have ccs nodes ".step.message" for all the hooks' do
454
+ expect(@doc.css('.step.message').length).to eq 3
455
+ expect(@doc.css('.step.message')[0].text).to eq "Before hook"
456
+ expect(@doc.css('.step.message')[1].text).to eq "AfterStep hook"
457
+ expect(@doc.css('.step.message')[2].text).to eq "After hook"
458
+ end
459
+ end
460
+
461
+ describe "in a scenario outline" do
462
+ define_feature <<-FEATURE
463
+ Feature:
464
+ Scenario Outline:
465
+ Given this step <status>
466
+ Examples:
467
+ | status |
468
+ | passes |
469
+ FEATURE
470
+
471
+ define_steps do
472
+ Before do
473
+ puts "Before hook"
474
+ end
475
+ AfterStep do
476
+ puts "AfterStep hook"
477
+ end
478
+ After do
479
+ puts "After hook"
480
+ end
481
+ Given(/^this step passes$/) {}
482
+ end
483
+
484
+ it { expect(@doc).to have_css_node('.message', /Before hook, AfterStep hook, After hook/) }
485
+ end
486
+ end
487
+ end
488
+ context "in --expand mode" do
489
+ let(:options) { { expand: true } }
490
+ before(:each) do
491
+ @out = StringIO.new
492
+ @formatter = Html.new(runtime, @out, {:expand => true})
493
+ run_defined_feature
494
+ @doc = Nokogiri.HTML(@out.string)
495
+ end
496
+ describe "with undefined * steps in a Scenario Outline" do
497
+ define_feature <<-FEATURE
498
+ Feature:
499
+ Scenario Outline:
500
+ * this step is <status>
501
+ Then this step passes
502
+ Examples:
503
+ | status |
504
+ | undefined |
505
+ | undefined |
506
+ FEATURE
507
+
508
+ define_steps do
509
+ Given(/^this step passes$/) {}
510
+ end
511
+
512
+ it { expect(@doc.css('pre').map { |pre| /^(Given|Then|When)/.match(pre.text)[1] }).to eq ["Given", "Given"] }
513
+ end
514
+
515
+ describe "with a scenario outline and a before hook that fails" do
516
+ define_steps do
517
+ Before { raise 'eek' }
518
+ Given(/yay/) {}
519
+ end
520
+
521
+ define_feature(<<-FEATURE)
522
+ Feature: shouting
523
+ Scenario Outline:
524
+ Given <step>
525
+ Examples:
526
+ | step |
527
+ | yay |
528
+ FEATURE
529
+
530
+ it { expect(@out.string).to include('makeRed(\'scenario_1\')') }
531
+ it { expect(@out.string).to include('makeRed(\'scenario_1_1\')') }
532
+ it { expect(@doc).not_to have_css_node('.feature .scenario .step.failed', //) }
533
+ it { expect(@doc).to have_css_node('.feature .scenario .step.skipped', /yay/) }
534
+ end
535
+ end
536
+ end
537
+ end
538
+ end