dwaite-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1067 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter/a.html +183 -0
  279. data/features/html_formatter.feature +7 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,217 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+ require 'prawn'
4
+ require "prawn/layout"
5
+ require "prawn/format"
6
+
7
+ module Cucumber
8
+ module Formatter
9
+
10
+ BLACK = '000000'
11
+ GREY = '999999'
12
+
13
+ class Pdf < Ast::Visitor
14
+ include FileUtils
15
+ include Console
16
+ attr_writer :indent
17
+
18
+ def initialize(step_mother, io, options)
19
+ super(step_mother)
20
+ raise "You *must* specify --out FILE for the pdf formatter" unless File === io
21
+
22
+ if(options[:dry_run])
23
+ @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK}
24
+ else
25
+ @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202'}
26
+ end
27
+
28
+ @pdf = Prawn::Document.new
29
+ @scrap = Prawn::Document.new
30
+ @doc = @scrap
31
+ @io = io
32
+ @options = options
33
+ @exceptions = []
34
+ @indent = 0
35
+ @buffer = []
36
+ puts "writing to #{io.path}"
37
+ begin
38
+ @pdf.image open("features/support/logo.png"), :position => :center, :width => 500
39
+ rescue
40
+ end
41
+ @pdf.text "\n\n\nCucumber features", :align => :center, :size => 32
42
+ @pdf.text "Generated: #{Time.now.strftime("%Y-%m-%d %H:%M")}", :size => 10, :at => [0, 24]
43
+ @pdf.text "Command: <code>cucumber #{ARGV.join(" ")}</code>", :size => 10, :at => [0,10]
44
+ unless options[:dry_run]
45
+ @pdf.bounding_box [450,100] , :width => 100 do
46
+ @pdf.text 'Legend', :size => 10
47
+ @status_colors.each do |k,v|
48
+ @pdf.fill_color v
49
+ @pdf.text k.to_s, :size => 10
50
+ @pdf.fill_color BLACK
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ def keep_with(&block)
57
+ @buffer << block
58
+ end
59
+
60
+ def render(doc)
61
+ @doc = doc
62
+ @buffer.each do |proc|
63
+ proc.call
64
+ end
65
+ end
66
+
67
+ # This method does a 'test' rendering on a blank page, to see the rendered height of the buffer
68
+ # if that too high for the space left on the age in the real document, we do a page break.
69
+ # This obviously doesn't work if a scenario is longer than a whole page (God forbid)
70
+ def flush
71
+ @scrap.start_new_page
72
+ oldy = @scrap.y
73
+ render @scrap
74
+ height = (oldy - @scrap.y) + 36 # whops magic number
75
+ if ((@pdf.y - height) < @pdf.bounds.bottom)
76
+ @pdf.start_new_page
77
+ end
78
+ render @pdf
79
+ @pdf.move_down(20)
80
+ @buffer = []
81
+ end
82
+
83
+ # regular visitor entries
84
+ def visit_features(features)
85
+ super
86
+ @pdf.render_file(@io.path)
87
+ puts "\ndone"
88
+ end
89
+
90
+ def visit_feature_name(name)
91
+ @pdf.start_new_page
92
+ name["Feature:"] = "" if name["Feature:"]
93
+ names = name.split("\n")
94
+ @pdf.fill_color GREY
95
+ @pdf.text('Feature', :align => :center)
96
+ @pdf.fill_color BLACK
97
+ names.each_with_index do |nameline, i|
98
+ case i
99
+ when 0
100
+ @pdf.text(nameline.strip, :size => 30, :align => :center )
101
+ @pdf.text("\n")
102
+ else
103
+ @pdf.text(nameline.strip, :size => 12)
104
+ end
105
+ end
106
+ @pdf.move_down(30)
107
+ end
108
+
109
+ def visit_feature_element(feature_element)
110
+ record_tag_occurrences(feature_element, @options)
111
+ super
112
+ flush
113
+ end
114
+
115
+ def visit_feature(feature)
116
+ super
117
+ flush
118
+ end
119
+
120
+ def visit_feature_element_name(keyword, name)
121
+ names = name.empty? ? [name] : name.split("\n")
122
+ print "."
123
+ STDOUT.flush
124
+
125
+ keep_with do
126
+ @doc.move_down(20)
127
+ @doc.fill_color GREY
128
+ @doc.text("#{keyword}", :size => 8)
129
+ @doc.fill_color BLACK
130
+ @doc.text("#{names[0]}", :size => 16)
131
+ names[1..-1].each { |s| @doc.text(s, :size => 12) }
132
+ @doc.text("\n")
133
+ end
134
+ end
135
+
136
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
137
+ if exception
138
+ return if @exceptions.index(exception)
139
+ @exceptions << exception
140
+ end
141
+ return if status != :failed && @in_background ^ background
142
+ @status = status
143
+ super
144
+ end
145
+
146
+ def colorize(text, status)
147
+ keep_with do
148
+ @doc.fill_color(@status_colors[status] || BLACK)
149
+ @doc.text(text)
150
+ @doc.fill_color(BLACK)
151
+ end
152
+ end
153
+
154
+ def visit_step_name(keyword, step_match, status, source_indent, background)
155
+ line = "<b>#{keyword}</b> #{step_match.format_args("%s").gsub('<', '&lt;').gsub('>', '&gt;')}"
156
+ colorize(line, status)
157
+ end
158
+
159
+ def visit_background(background)
160
+ @in_background = true
161
+ super
162
+ @in_background = nil
163
+ end
164
+
165
+ def visit_multiline_arg(table)
166
+ if(table.kind_of? Cucumber::Ast::Table)
167
+ keep_with do
168
+ @doc.table(table.rows << table.headers , :position => :center, :row_colors => ['ffffff', 'f0f0f0'])
169
+ end
170
+ end
171
+ super
172
+ end
173
+
174
+ #using row_color hack to highlight each row correctly
175
+ def visit_outline_table(table)
176
+ row_colors = table.example_rows.map { |r| @status_colors[r.status] unless r.status == :skipped}
177
+ keep_with do
178
+ @doc.table(table.rows, :headers => table.headers, :position => :center, :row_colors => row_colors)
179
+ end
180
+ end
181
+
182
+ def visit_py_string(string)
183
+ s = %{"""\n#{string}\n"""}.indent(10)
184
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}
185
+ s.each do |line|
186
+ line.gsub!('<', '&lt;')
187
+ line.gsub!('>', '&gt;')
188
+ keep_with { @doc.text line, :size => 8 }
189
+ end
190
+ end
191
+
192
+ def visit_comment(comment)
193
+ comment.accept(self)
194
+ end
195
+
196
+ def visit_comment_line(comment_line)
197
+ end
198
+
199
+ def visit_tag_name(tag_name)
200
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
201
+ # TODO should we render tags at all? skipped for now. difficult to place due to page breaks
202
+ end
203
+
204
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
205
+ visit_feature_element_name(keyword, name)
206
+ end
207
+
208
+ def visit_examples_name(keyword, name)
209
+ visit_feature_element_name(keyword, name)
210
+ end
211
+
212
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
213
+ visit_feature_element_name(keyword, name)
214
+ end
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,222 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # The formatter used for <tt>--format pretty</tt> (the default formatter).
7
+ #
8
+ # This formatter prints features to plain text - exactly how they were parsed,
9
+ # just prettier. That means with proper indentation and alignment of table columns.
10
+ #
11
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
12
+ #
13
+ class Pretty < Ast::Visitor
14
+ include FileUtils
15
+ include Console
16
+ attr_writer :indent
17
+
18
+ def initialize(step_mother, io, options)
19
+ super(step_mother)
20
+ @io = io
21
+ @options = options
22
+ @exceptions = []
23
+ @indent = 0
24
+ @prefixes = options[:prefixes] || {}
25
+ end
26
+
27
+ def visit_features(features)
28
+ super
29
+ print_summary(features) unless @options[:autoformat]
30
+ end
31
+
32
+ def visit_feature(feature)
33
+ @exceptions = []
34
+ @indent = 0
35
+ if @options[:autoformat]
36
+ file = File.join(@options[:autoformat], feature.file)
37
+ dir = File.dirname(file)
38
+ mkdir_p(dir) unless File.directory?(dir)
39
+ File.open(file, Cucumber.file_mode('w')) do |io|
40
+ @io = io
41
+ super
42
+ end
43
+ else
44
+ super
45
+ end
46
+ end
47
+
48
+ def visit_comment(comment)
49
+ comment.accept(self)
50
+ end
51
+
52
+ def visit_comment_line(comment_line)
53
+ @io.puts(comment_line.indent(@indent))
54
+ @io.flush
55
+ end
56
+
57
+ def visit_tags(tags)
58
+ tags.accept(self)
59
+ if @indent == 1
60
+ @io.puts
61
+ @io.flush
62
+ end
63
+ end
64
+
65
+ def visit_tag_name(tag_name)
66
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
67
+ @io.print(tag)
68
+ @io.flush
69
+ @indent = 1
70
+ end
71
+
72
+ def visit_feature_name(name)
73
+ @io.puts(name)
74
+ @io.puts
75
+ @io.flush
76
+ end
77
+
78
+ def visit_feature_element(feature_element)
79
+ record_tag_occurrences(feature_element, @options)
80
+ @indent = 2
81
+ @scenario_indent = 2
82
+ super
83
+ @io.puts
84
+ @io.flush
85
+ end
86
+
87
+ def visit_background(background)
88
+ @indent = 2
89
+ @scenario_indent = 2
90
+ @in_background = true
91
+ super
92
+ @in_background = nil
93
+ @io.puts
94
+ @io.flush
95
+ end
96
+
97
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
98
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
99
+ end
100
+
101
+ def visit_examples_array(examples_array)
102
+ @indent = 4
103
+ @io.puts
104
+ examples_array[0..-2].each { |ea| super(ea) }
105
+ @last_example = true
106
+ super(examples_array.last)
107
+ @last_example = nil
108
+ end
109
+
110
+ def visit_examples_name(keyword, name)
111
+ names = name.strip.empty? ? [name.strip] : name.split("\n")
112
+ @io.puts(" #{keyword} #{names[0]}")
113
+ names[1..-1].each {|s| @io.puts " #{s}" } unless names.empty?
114
+ @io.flush
115
+ @indent = 6
116
+ @scenario_indent = 6
117
+ end
118
+
119
+ def visit_outline_table(outline_table)
120
+ super
121
+ @indent = 4
122
+ @io.puts unless @last_example
123
+ end
124
+
125
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
126
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
127
+ end
128
+
129
+ def visit_feature_element_name(keyword, name, file_colon_line, source_indent)
130
+ @io.puts if @scenario_indent == 6
131
+ names = name.empty? ? [name] : name.split("\n")
132
+ line = "#{keyword} #{names[0]}".indent(@scenario_indent)
133
+ @io.print(line)
134
+ if @options[:source]
135
+ line_comment = " # #{file_colon_line}".indent(source_indent)
136
+ @io.print(format_string(line_comment, :comment))
137
+ end
138
+ @io.puts
139
+ names[1..-1].each {|s| @io.puts " #{s}"}
140
+ @io.flush
141
+ end
142
+
143
+ def visit_step(step)
144
+ @indent = 6
145
+ super
146
+ end
147
+
148
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
149
+ if exception
150
+ return if @exceptions.index(exception)
151
+ @exceptions << exception
152
+ end
153
+ return if status != :failed && @in_background ^ background
154
+ @status = status
155
+ super
156
+ end
157
+
158
+ def visit_step_name(keyword, step_match, status, source_indent, background)
159
+ source_indent = nil unless @options[:source]
160
+ formatted_step_name = format_step(keyword, step_match, status, source_indent)
161
+ @io.puts(formatted_step_name.indent(@scenario_indent + 2))
162
+ end
163
+
164
+ def visit_multiline_arg(multiline_arg)
165
+ return if @options[:no_multiline]
166
+ @table = multiline_arg
167
+ super
168
+ end
169
+
170
+ def visit_exception(exception, status)
171
+ print_exception(exception, status, @indent)
172
+ @io.flush
173
+ end
174
+
175
+ def visit_table_row(table_row)
176
+ @col_index = 0
177
+ @io.print ' |'.indent(@indent-2)
178
+ super
179
+ @io.puts
180
+ if table_row.exception && !@exceptions.index(table_row.exception)
181
+ print_exception(table_row.exception, :failed, @indent)
182
+ end
183
+ end
184
+
185
+ def visit_py_string(string)
186
+ s = %{"""\n#{string}\n"""}.indent(@indent)
187
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
188
+ @io.puts(format_string(s, @status))
189
+ @io.flush
190
+ end
191
+
192
+ def visit_table_cell(cell)
193
+ super
194
+ @col_index += 1
195
+ end
196
+
197
+ def visit_table_cell_value(value, status)
198
+ status ||= @status || :passed
199
+ width = @table.col_width(@col_index)
200
+ cell_text = value.to_s || ''
201
+ padded = cell_text + (' ' * (width - cell_text.jlength))
202
+ prefix = cell_prefix(status)
203
+ @io.print(' ' + format_string("#{prefix}#{padded}", status) + ::Term::ANSIColor.reset(" |"))
204
+ @io.flush
205
+ end
206
+
207
+ private
208
+
209
+ def cell_prefix(status)
210
+ @prefixes[status]
211
+ end
212
+
213
+ def print_summary(features)
214
+ print_stats(features)
215
+ print_snippets(@options)
216
+ print_passing_wip(@options)
217
+ print_tag_limit_warnings(@options)
218
+ end
219
+
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,78 @@
1
+ require 'cucumber/formatter/progress'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ # The formatter used for <tt>--format profile</tt>
6
+ class Profile < Progress
7
+ NUMBER_OF_STEP_DEFINITONS_TO_SHOW = 10
8
+ NUMBER_OF_STEP_INVOCATIONS_TO_SHOW = 5
9
+
10
+ def initialize(step_mother, io, options)
11
+ super
12
+ @step_definition_durations = Hash.new { |h,step_definition| h[step_definition] = [] }
13
+ end
14
+
15
+ def visit_step(step)
16
+ @step_duration = Time.now
17
+ @step = step
18
+ super
19
+ end
20
+
21
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
22
+ duration = Time.now - @step_duration
23
+ super
24
+
25
+ if step_match.step_definition
26
+ description = format_step(keyword, step_match, status, nil)
27
+ @step_definition_durations[step_match.step_definition] << [duration, description, @step.file_colon_line]
28
+ end
29
+ end
30
+
31
+ def print_summary(features)
32
+ super
33
+ @io.puts "\n\nTop #{NUMBER_OF_STEP_DEFINITONS_TO_SHOW} average slowest steps with #{NUMBER_OF_STEP_INVOCATIONS_TO_SHOW} slowest matches:\n"
34
+
35
+ mean_durations = map_to_mean_durations(@step_definition_durations)
36
+ mean_durations = mean_durations.sort_by do |duration_description_location, step_definition, mean_duration|
37
+ mean_duration
38
+ end.reverse
39
+
40
+ mean_durations[0...NUMBER_OF_STEP_DEFINITONS_TO_SHOW].each do |duration_description_location, step_definition, mean_duration|
41
+ print_step_definition(step_definition, mean_duration)
42
+ duration_description_location = duration_description_location.sort_by do |duration, description, location|
43
+ duration
44
+ end.reverse
45
+ print_step_definitions(duration_description_location, step_definition)
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def map_to_mean_durations(step_definition_durations)
52
+ mean_durations = []
53
+ step_definition_durations.each do |step_definition, duration_description_location|
54
+ total_duration = duration_description_location.inject(0) { |sum, step_details| step_details[0] + sum }
55
+ mean_duration = total_duration / duration_description_location.length
56
+
57
+ mean_durations << [duration_description_location, step_definition, mean_duration]
58
+ end
59
+ mean_durations
60
+ end
61
+
62
+ def print_step_definition(step_definition, mean_duration)
63
+ duration = sprintf("%.7f", mean_duration)
64
+ @io.puts format_string("#{duration} #{step_definition.backtrace_line}", :failed)
65
+ end
66
+
67
+ def print_step_definitions(duration_description_location, step_definition)
68
+ max_length = duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].map{|_, d, _| d.jlength}.max
69
+ duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].each do |duration, description, location|
70
+ @io.print format_string(" #{sprintf("%.7f", duration)}", :pending)
71
+ @io.print " #{description}"
72
+ @io.print format_string(" # #{location}".indent(max_length - description.jlength), :comment)
73
+ @io.puts
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,67 @@
1
+ require 'cucumber/formatter/console'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ # The formatter used for <tt>--format progress</tt>
6
+ class Progress < Ast::Visitor
7
+ include Console
8
+
9
+ def initialize(step_mother, io, options)
10
+ super(step_mother)
11
+ @io = io
12
+ @options = options
13
+ end
14
+
15
+ def visit_features(features)
16
+ super
17
+ @io.puts
18
+ @io.puts
19
+ print_summary(features)
20
+ end
21
+
22
+ def visit_feature_element(feature_element)
23
+ record_tag_occurrences(feature_element, @options)
24
+ super
25
+ end
26
+
27
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
28
+ progress(status)
29
+ @status = status
30
+ end
31
+
32
+ def visit_table_cell_value(value, status)
33
+ status ||= @status
34
+ progress(status) unless table_header_cell?(status)
35
+ end
36
+
37
+ private
38
+
39
+ def print_summary(features)
40
+ print_steps(:pending)
41
+ print_steps(:failed)
42
+ print_stats(features)
43
+ print_snippets(@options)
44
+ print_passing_wip(@options)
45
+ print_tag_limit_warnings(@options)
46
+ end
47
+
48
+ CHARS = {
49
+ :passed => '.',
50
+ :failed => 'F',
51
+ :undefined => 'U',
52
+ :pending => 'P',
53
+ :skipped => '-'
54
+ }
55
+
56
+ def progress(status)
57
+ char = CHARS[status]
58
+ @io.print(format_string(char, status))
59
+ @io.flush
60
+ end
61
+
62
+ def table_header_cell?(status)
63
+ status == :skipped_param
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,46 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # The formatter used for <tt>--format rerun</tt>
4
+ #
5
+ # This formatter keeps track of all failing features and print out their location.
6
+ # Example:
7
+ #
8
+ # features/foo.feature:34 features/bar.feature:11:76:81
9
+ #
10
+ # This formatter is used by AutoTest - it will use the output to decide what
11
+ # to run the next time, simply passing the output string on the command line.
12
+ #
13
+ class Rerun < Ast::Visitor
14
+ def initialize(step_mother, io, options)
15
+ super(step_mother)
16
+ @io = io
17
+ @options = options
18
+ @file_names = []
19
+ @file_colon_lines = Hash.new{|h,k| h[k] = []}
20
+ end
21
+
22
+ def visit_features(features)
23
+ super
24
+ files = @file_names.uniq.map do |file|
25
+ lines = @file_colon_lines[file]
26
+ "#{file}:#{lines.join(':')}"
27
+ end
28
+ @io.puts files.join(' ')
29
+ end
30
+
31
+ def visit_feature_element(feature_element)
32
+ @rerun = false
33
+ super
34
+ if @rerun
35
+ file, line = *feature_element.file_colon_line.split(':')
36
+ @file_colon_lines[file] << line
37
+ @file_names << file
38
+ end
39
+ end
40
+
41
+ def visit_step_name(keyword, step_match, status, source_indent, background)
42
+ @rerun = true if [:failed].index(status)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,50 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # The formatter used for <tt>--format steps</tt>
4
+ class Steps < Ast::Visitor
5
+
6
+ def initialize(step_mother, io, options)
7
+ super(step_mother)
8
+ @io = io
9
+ @options = options
10
+ @step_definition_files = collect_steps(step_mother)
11
+ end
12
+
13
+ def visit_features(features)
14
+ print_summary
15
+ end
16
+
17
+ private
18
+
19
+ def print_summary
20
+ count = 0
21
+ @step_definition_files.keys.sort.each do |step_definition_file|
22
+ @io.puts step_definition_file
23
+
24
+ sources = @step_definition_files[step_definition_file]
25
+ source_indent = source_indent(sources)
26
+ sources.sort.each do |file_colon_line, regexp|
27
+ @io.print "#{regexp}".indent(2)
28
+ @io.print " # #{file_colon_line}".indent(source_indent - regexp.size)
29
+ @io.puts
30
+ end
31
+ @io.puts
32
+ count += sources.size
33
+ end
34
+ @io.puts "#{count} step definition(s) in #{@step_definition_files.size} source file(s)."
35
+ end
36
+
37
+ def collect_steps(step_mother)
38
+ step_mother.step_definitions.inject({}) do |step_definitions, step_definition|
39
+ step_definitions[step_definition.file] ||= []
40
+ step_definitions[step_definition.file] << [ step_definition.file_colon_line, step_definition.regexp.inspect ]
41
+ step_definitions
42
+ end
43
+ end
44
+
45
+ def source_indent(sources)
46
+ sources.map { |file_colon_line, regexp| regexp.size }.max + 1
47
+ end
48
+ end
49
+ end
50
+ end