kbaum-cucumber 0.4.5.pre

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 (511) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +18 -0
  3. data/Caliper.yml +5 -0
  4. data/History.txt +1292 -0
  5. data/LICENSE +22 -0
  6. data/README.rdoc +26 -0
  7. data/Rakefile +63 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/cucumber +16 -0
  10. data/cucumber.gemspec +741 -0
  11. data/cucumber.yml +10 -0
  12. data/examples/dos_line_endings/Rakefile +6 -0
  13. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  14. data/examples/i18n/README.textile +18 -0
  15. data/examples/i18n/Rakefile +32 -0
  16. data/examples/i18n/ar/Rakefile +6 -0
  17. data/examples/i18n/ar/features/addition.feature +17 -0
  18. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  19. data/examples/i18n/ar/lib/calculator.rb +11 -0
  20. data/examples/i18n/bg/Rakefile +6 -0
  21. data/examples/i18n/bg/features/addition.feature +12 -0
  22. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  23. data/examples/i18n/bg/features/division.feature +17 -0
  24. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  25. data/examples/i18n/bg/features/support/env.rb +6 -0
  26. data/examples/i18n/bg/features/support/world.rb +8 -0
  27. data/examples/i18n/bg/lib/calculator.rb +24 -0
  28. data/examples/i18n/cat/Rakefile +6 -0
  29. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  30. data/examples/i18n/cat/features/suma.feature +17 -0
  31. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  32. data/examples/i18n/da/Rakefile +6 -0
  33. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  34. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  35. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  36. data/examples/i18n/de/.gitignore +1 -0
  37. data/examples/i18n/de/Rakefile +6 -0
  38. data/examples/i18n/de/features/addition.feature +17 -0
  39. data/examples/i18n/de/features/division.feature +10 -0
  40. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  41. data/examples/i18n/de/lib/calculator.rb +14 -0
  42. data/examples/i18n/en-lol/Rakefile +4 -0
  43. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  44. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  45. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  46. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  47. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  48. data/examples/i18n/en/.gitignore +1 -0
  49. data/examples/i18n/en/Rakefile +6 -0
  50. data/examples/i18n/en/features/addition.feature +17 -0
  51. data/examples/i18n/en/features/division.feature +10 -0
  52. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  53. data/examples/i18n/en/lib/calculator.rb +14 -0
  54. data/examples/i18n/es/Rakefile +6 -0
  55. data/examples/i18n/es/features/adicion.feature +17 -0
  56. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  57. data/examples/i18n/es/lib/calculador.rb +14 -0
  58. data/examples/i18n/et/Rakefile +6 -0
  59. data/examples/i18n/et/features/jagamine.feature +10 -0
  60. data/examples/i18n/et/features/liitmine.feature +17 -0
  61. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  62. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  63. data/examples/i18n/fi/.gitignore +1 -0
  64. data/examples/i18n/fi/Rakefile +6 -0
  65. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  66. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  67. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  68. data/examples/i18n/fi/lib/laskin.rb +14 -0
  69. data/examples/i18n/fr/Rakefile +6 -0
  70. data/examples/i18n/fr/features/addition.feature +18 -0
  71. data/examples/i18n/fr/features/addition2.feature +17 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +38 -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/.gitignore +1 -0
  80. data/examples/i18n/hu/Rakefile +6 -0
  81. data/examples/i18n/hu/features/addition.feature +17 -0
  82. data/examples/i18n/hu/features/division.feature +10 -0
  83. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  84. data/examples/i18n/hu/lib/calculator.rb +14 -0
  85. data/examples/i18n/id/.gitignore +1 -0
  86. data/examples/i18n/id/Rakefile +6 -0
  87. data/examples/i18n/id/features/addition.feature +17 -0
  88. data/examples/i18n/id/features/division.feature +10 -0
  89. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  90. data/examples/i18n/id/lib/calculator.rb +14 -0
  91. data/examples/i18n/it/Rakefile +6 -0
  92. data/examples/i18n/it/features/somma.feature +11 -0
  93. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  94. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  95. data/examples/i18n/ja/.gitignore +1 -0
  96. data/examples/i18n/ja/Rakefile +6 -0
  97. data/examples/i18n/ja/features/addition.feature +17 -0
  98. data/examples/i18n/ja/features/division.feature +10 -0
  99. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  100. data/examples/i18n/ja/lib/calculator.rb +14 -0
  101. data/examples/i18n/ko/.gitignore +1 -0
  102. data/examples/i18n/ko/Rakefile +6 -0
  103. data/examples/i18n/ko/features/addition.feature +17 -0
  104. data/examples/i18n/ko/features/division.feature +11 -0
  105. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  106. data/examples/i18n/ko/lib/calculator.rb +14 -0
  107. data/examples/i18n/lt/.gitignore +1 -0
  108. data/examples/i18n/lt/Rakefile +6 -0
  109. data/examples/i18n/lt/features/addition.feature +17 -0
  110. data/examples/i18n/lt/features/division.feature +10 -0
  111. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lt/lib/calculator.rb +14 -0
  113. data/examples/i18n/lv/Rakefile +6 -0
  114. data/examples/i18n/lv/features/addition.feature +17 -0
  115. data/examples/i18n/lv/features/division.feature +10 -0
  116. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  117. data/examples/i18n/lv/lib/calculator.rb +14 -0
  118. data/examples/i18n/no/Rakefile +6 -0
  119. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  120. data/examples/i18n/no/features/summering.feature +19 -0
  121. data/examples/i18n/no/features/support/env.rb +6 -0
  122. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  123. data/examples/i18n/pl/.gitignore +1 -0
  124. data/examples/i18n/pl/Rakefile +6 -0
  125. data/examples/i18n/pl/features/addition.feature +17 -0
  126. data/examples/i18n/pl/features/division.feature +10 -0
  127. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  128. data/examples/i18n/pl/features/support/env.rb +6 -0
  129. data/examples/i18n/pl/lib/calculator.rb +14 -0
  130. data/examples/i18n/pt/Rakefile +6 -0
  131. data/examples/i18n/pt/features/adicao.feature +11 -0
  132. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  133. data/examples/i18n/pt/features/support/env.rb +6 -0
  134. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  135. data/examples/i18n/ro/Rakefile +6 -0
  136. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  137. data/examples/i18n/ro/features/suma.feature +11 -0
  138. data/examples/i18n/ro/lib/calculator.rb +11 -0
  139. data/examples/i18n/ru/Rakefile +6 -0
  140. data/examples/i18n/ru/features/addition.feature +11 -0
  141. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  142. data/examples/i18n/ru/features/division.feature +16 -0
  143. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  144. data/examples/i18n/ru/features/support/env.rb +6 -0
  145. data/examples/i18n/ru/features/support/world.rb +8 -0
  146. data/examples/i18n/ru/lib/calculator.rb +24 -0
  147. data/examples/i18n/se/Rakefile +6 -0
  148. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  149. data/examples/i18n/se/features/summering.feature +18 -0
  150. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  151. data/examples/i18n/sk/.gitignore +1 -0
  152. data/examples/i18n/sk/Rakefile +6 -0
  153. data/examples/i18n/sk/features/addition.feature +17 -0
  154. data/examples/i18n/sk/features/division.feature +10 -0
  155. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  156. data/examples/i18n/sk/lib/calculator.rb +14 -0
  157. data/examples/i18n/sr-latn/Rakefile +6 -0
  158. data/examples/i18n/sr-latn/features/sabiranje.feature +18 -0
  159. data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +24 -0
  160. data/examples/i18n/sr-latn/lib/calculator.rb +12 -0
  161. data/examples/i18n/sr/Rakefile +6 -0
  162. data/examples/i18n/sr/features/sabiranje.feature +18 -0
  163. data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +24 -0
  164. data/examples/i18n/sr/lib/calculator.rb +12 -0
  165. data/examples/i18n/tr/.gitignore +1 -0
  166. data/examples/i18n/tr/Rakefile +6 -0
  167. data/examples/i18n/tr/features/bolme.feature +10 -0
  168. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  169. data/examples/i18n/tr/features/toplama.feature +18 -0
  170. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  171. data/examples/i18n/uz/Rakefile +6 -0
  172. data/examples/i18n/uz/features/addition.feature +10 -0
  173. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  174. data/examples/i18n/uz/features/division.feature +17 -0
  175. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  176. data/examples/i18n/uz/features/support/env.rb +6 -0
  177. data/examples/i18n/uz/features/support/world.rb +8 -0
  178. data/examples/i18n/uz/lib/calculator.rb +24 -0
  179. data/examples/i18n/zh-CN/Rakefile +4 -0
  180. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  181. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  182. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  183. data/examples/i18n/zh-TW/.gitignore +1 -0
  184. data/examples/i18n/zh-TW/Rakefile +4 -0
  185. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  186. data/examples/i18n/zh-TW/features/division.feature +11 -0
  187. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  188. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  189. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  190. data/examples/junit/features/pending.feature +5 -0
  191. data/examples/junit/features/step_definitions/steps.rb +11 -0
  192. data/examples/python/features/fibonacci.feature +19 -0
  193. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  194. data/examples/python/lib/.gitignore +1 -0
  195. data/examples/python/lib/fib.py +7 -0
  196. data/examples/ramaze/README.textile +7 -0
  197. data/examples/ramaze/Rakefile +6 -0
  198. data/examples/ramaze/app.rb +21 -0
  199. data/examples/ramaze/features/add.feature +11 -0
  200. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  201. data/examples/ramaze/features/support/env.rb +32 -0
  202. data/examples/ramaze/layout/default.html.erb +8 -0
  203. data/examples/ramaze/view/index.html.erb +5 -0
  204. data/examples/ruby2python/features/fibonacci.feature +19 -0
  205. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  206. data/examples/ruby2python/features/support/env.rb +21 -0
  207. data/examples/ruby2python/lib/.gitignore +1 -0
  208. data/examples/ruby2python/lib/fib.py +7 -0
  209. data/examples/selenium/Rakefile +6 -0
  210. data/examples/selenium/features/search.feature +9 -0
  211. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  212. data/examples/selenium/features/support/env.rb +19 -0
  213. data/examples/selenium_webrat/Rakefile +6 -0
  214. data/examples/selenium_webrat/config.ru +0 -0
  215. data/examples/selenium_webrat/features/search.feature +9 -0
  216. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  217. data/examples/selenium_webrat/features/support/env.rb +45 -0
  218. data/examples/self_test/.gitignore +1 -0
  219. data/examples/self_test/README.textile +6 -0
  220. data/examples/self_test/Rakefile +6 -0
  221. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  222. data/examples/self_test/features/background/background_with_name.feature +7 -0
  223. data/examples/self_test/features/background/failing_background.feature +12 -0
  224. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  225. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  226. data/examples/self_test/features/background/passing_background.feature +10 -0
  227. data/examples/self_test/features/background/pending_background.feature +10 -0
  228. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  229. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  230. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  231. data/examples/self_test/features/failing_expectation.feature +4 -0
  232. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  233. data/examples/self_test/features/multiline_name.feature +27 -0
  234. data/examples/self_test/features/outline_sample.feature +15 -0
  235. data/examples/self_test/features/sample.feature +21 -0
  236. data/examples/self_test/features/search_sample.feature +32 -0
  237. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  238. data/examples/self_test/features/support/env.rb +18 -0
  239. data/examples/self_test/features/tags_sample.feature +17 -0
  240. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  241. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  242. data/examples/self_test/list-of-features.txt +1 -0
  243. data/examples/sinatra/README.textile +13 -0
  244. data/examples/sinatra/Rakefile +6 -0
  245. data/examples/sinatra/app.rb +14 -0
  246. data/examples/sinatra/features/add.feature +11 -0
  247. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  248. data/examples/sinatra/features/support/env.rb +30 -0
  249. data/examples/sinatra/views/add.erb +5 -0
  250. data/examples/sinatra/views/layout.erb +8 -0
  251. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  252. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  253. data/examples/tcl/README.textile +11 -0
  254. data/examples/tcl/Rakefile +6 -0
  255. data/examples/tcl/features/fibonnacci.feature +17 -0
  256. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  257. data/examples/tcl/features/support/env.rb +6 -0
  258. data/examples/tcl/src/fib.tcl +3 -0
  259. data/examples/test_unit/Rakefile +6 -0
  260. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  261. data/examples/test_unit/features/test_unit.feature +9 -0
  262. data/examples/tickets/Rakefile +20 -0
  263. data/examples/tickets/features.html +138 -0
  264. data/examples/tickets/features/172.feature +28 -0
  265. data/examples/tickets/features/177/1.feature +28 -0
  266. data/examples/tickets/features/177/2.feature +20 -0
  267. data/examples/tickets/features/177/3.feature +18 -0
  268. data/examples/tickets/features/180.feature +7 -0
  269. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  270. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  271. data/examples/tickets/features/236.feature +13 -0
  272. data/examples/tickets/features/241.feature +12 -0
  273. data/examples/tickets/features/246.feature +4 -0
  274. data/examples/tickets/features/248.feature +11 -0
  275. data/examples/tickets/features/270/back.feature +14 -0
  276. data/examples/tickets/features/270/back.steps.rb +14 -0
  277. data/examples/tickets/features/272/hooks.feature +26 -0
  278. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  279. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  280. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  281. data/examples/tickets/features/279/wrong.feature_ +11 -0
  282. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  283. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  284. data/examples/tickets/features/306/only_background.feature +4 -0
  285. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  286. data/examples/tickets/features/lib/pantry.rb +20 -0
  287. data/examples/tickets/features/scenario_outline.feature +95 -0
  288. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  289. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  290. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  291. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  292. data/examples/tickets/features/table_diffing.feature +13 -0
  293. data/examples/tickets/features/tickets.feature +28 -0
  294. data/examples/watir/README.textile +16 -0
  295. data/examples/watir/Rakefile +10 -0
  296. data/examples/watir/features/search.feature +12 -0
  297. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  298. data/examples/watir/features/support/env.rb +32 -0
  299. data/examples/watir/features/support/screenshots.rb +44 -0
  300. data/examples/webrat/features/search.feature +12 -0
  301. data/examples/webrat/features/step_definitions/kvasir_steps.rb +14 -0
  302. data/examples/webrat/features/support/env.rb +17 -0
  303. data/features/announce.feature +122 -0
  304. data/features/background.feature +308 -0
  305. data/features/bug_371.feature +32 -0
  306. data/features/bug_464.feature +16 -0
  307. data/features/bug_475.feature +43 -0
  308. data/features/call_many_steps.feature +124 -0
  309. data/features/cucumber_cli.feature +654 -0
  310. data/features/cucumber_cli_diff_disabled.feature +52 -0
  311. data/features/cucumber_cli_outlines.feature +105 -0
  312. data/features/custom_formatter.feature +47 -0
  313. data/features/default_snippets.feature +42 -0
  314. data/features/drb_server_integration.feature +174 -0
  315. data/features/exception_in_after_block.feature +100 -0
  316. data/features/exception_in_after_step_block.feature +102 -0
  317. data/features/exception_in_before_block.feature +78 -0
  318. data/features/exclude_files.feature +20 -0
  319. data/features/expand.feature +60 -0
  320. data/features/html_formatter.feature +7 -0
  321. data/features/html_formatter/a.html +400 -0
  322. data/features/junit_formatter.feature +88 -0
  323. data/features/language_from_header.feature +30 -0
  324. data/features/language_help.feature +68 -0
  325. data/features/listener_debugger_formatter.feature +41 -0
  326. data/features/multiline_names.feature +43 -0
  327. data/features/negative_tagged_hooks.feature +61 -0
  328. data/features/post_configuration_hook.feature +37 -0
  329. data/features/profiles.feature +112 -0
  330. data/features/rake_task.feature +152 -0
  331. data/features/report_called_undefined_steps.feature +34 -0
  332. data/features/simplest.feature +11 -0
  333. data/features/snippet.feature +22 -0
  334. data/features/step_definitions/cucumber_steps.rb +154 -0
  335. data/features/step_definitions/extra_steps.rb +2 -0
  336. data/features/step_definitions/simplest_steps.rb +3 -0
  337. data/features/step_definitions/wire_steps.rb +14 -0
  338. data/features/support/env.rb +141 -0
  339. data/features/support/env.rb.simplest +7 -0
  340. data/features/support/fake_wire_server.rb +63 -0
  341. data/features/table_diffing.feature +45 -0
  342. data/features/table_mapping.feature +35 -0
  343. data/features/tag_logic.feature +258 -0
  344. data/features/transform.feature +245 -0
  345. data/features/unicode_table.feature +35 -0
  346. data/features/usage_and_stepdefs_formatter.feature +169 -0
  347. data/features/wire_protocol.feature +177 -0
  348. data/features/work_in_progress.feature +156 -0
  349. data/gem_tasks/contributors.rake +13 -0
  350. data/gem_tasks/environment.rake +7 -0
  351. data/gem_tasks/features.rake +18 -0
  352. data/gem_tasks/fix_cr_lf.rake +10 -0
  353. data/gem_tasks/flog.rake +4 -0
  354. data/gem_tasks/rspec.rake +15 -0
  355. data/gem_tasks/sass.rake +4 -0
  356. data/gem_tasks/sdoc.rake +12 -0
  357. data/lib/README.rdoc +12 -0
  358. data/lib/autotest/cucumber.rb +6 -0
  359. data/lib/autotest/cucumber_mixin.rb +131 -0
  360. data/lib/autotest/cucumber_rails.rb +6 -0
  361. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  362. data/lib/autotest/cucumber_rspec.rb +6 -0
  363. data/lib/autotest/discover.rb +9 -0
  364. data/lib/cucumber.rb +15 -0
  365. data/lib/cucumber/ast.rb +30 -0
  366. data/lib/cucumber/ast/background.rb +75 -0
  367. data/lib/cucumber/ast/comment.rb +31 -0
  368. data/lib/cucumber/ast/examples.rb +36 -0
  369. data/lib/cucumber/ast/feature.rb +85 -0
  370. data/lib/cucumber/ast/feature_element.rb +68 -0
  371. data/lib/cucumber/ast/features.rb +40 -0
  372. data/lib/cucumber/ast/outline_table.rb +166 -0
  373. data/lib/cucumber/ast/py_string.rb +59 -0
  374. data/lib/cucumber/ast/scenario.rb +111 -0
  375. data/lib/cucumber/ast/scenario_outline.rb +100 -0
  376. data/lib/cucumber/ast/step.rb +121 -0
  377. data/lib/cucumber/ast/step_collection.rb +76 -0
  378. data/lib/cucumber/ast/step_invocation.rb +190 -0
  379. data/lib/cucumber/ast/table.rb +655 -0
  380. data/lib/cucumber/ast/tags.rb +122 -0
  381. data/lib/cucumber/ast/tree_walker.rb +201 -0
  382. data/lib/cucumber/ast/visitor.rb +11 -0
  383. data/lib/cucumber/broadcaster.rb +13 -0
  384. data/lib/cucumber/cli/configuration.rb +180 -0
  385. data/lib/cucumber/cli/drb_client.rb +32 -0
  386. data/lib/cucumber/cli/language_help_formatter.rb +72 -0
  387. data/lib/cucumber/cli/main.rb +121 -0
  388. data/lib/cucumber/cli/options.rb +404 -0
  389. data/lib/cucumber/cli/profile_loader.rb +82 -0
  390. data/lib/cucumber/constantize.rb +34 -0
  391. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  392. data/lib/cucumber/core_ext/proc.rb +30 -0
  393. data/lib/cucumber/core_ext/string.rb +16 -0
  394. data/lib/cucumber/feature_file.rb +54 -0
  395. data/lib/cucumber/filter.rb +41 -0
  396. data/lib/cucumber/formatter/ansicolor.rb +157 -0
  397. data/lib/cucumber/formatter/color_io.rb +23 -0
  398. data/lib/cucumber/formatter/console.rb +205 -0
  399. data/lib/cucumber/formatter/cucumber.css +248 -0
  400. data/lib/cucumber/formatter/cucumber.sass +241 -0
  401. data/lib/cucumber/formatter/debug.rb +33 -0
  402. data/lib/cucumber/formatter/duration.rb +13 -0
  403. data/lib/cucumber/formatter/html.rb +545 -0
  404. data/lib/cucumber/formatter/io.rb +33 -0
  405. data/lib/cucumber/formatter/junit.rb +149 -0
  406. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  407. data/lib/cucumber/formatter/pdf.rb +234 -0
  408. data/lib/cucumber/formatter/pretty.rb +237 -0
  409. data/lib/cucumber/formatter/progress.rb +75 -0
  410. data/lib/cucumber/formatter/rerun.rb +50 -0
  411. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  412. data/lib/cucumber/formatter/steps.rb +49 -0
  413. data/lib/cucumber/formatter/summary.rb +35 -0
  414. data/lib/cucumber/formatter/tag_cloud.rb +34 -0
  415. data/lib/cucumber/formatter/unicode.rb +35 -0
  416. data/lib/cucumber/formatter/usage.rb +127 -0
  417. data/lib/cucumber/language_support.rb +30 -0
  418. data/lib/cucumber/language_support/language_methods.rb +110 -0
  419. data/lib/cucumber/languages.yml +535 -0
  420. data/lib/cucumber/parser.rb +8 -0
  421. data/lib/cucumber/parser/common.rb +170 -0
  422. data/lib/cucumber/parser/common.tt +21 -0
  423. data/lib/cucumber/parser/feature.rb +1783 -0
  424. data/lib/cucumber/parser/feature.tt +317 -0
  425. data/lib/cucumber/parser/i18n.tt +34 -0
  426. data/lib/cucumber/parser/natural_language.rb +108 -0
  427. data/lib/cucumber/parser/py_string.rb +276 -0
  428. data/lib/cucumber/parser/py_string.tt +45 -0
  429. data/lib/cucumber/parser/table.rb +305 -0
  430. data/lib/cucumber/parser/table.tt +60 -0
  431. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  432. data/lib/cucumber/platform.rb +31 -0
  433. data/lib/cucumber/py_support/py_dsl.py +10 -0
  434. data/lib/cucumber/py_support/py_language.py +10 -0
  435. data/lib/cucumber/py_support/py_language.rb +81 -0
  436. data/lib/cucumber/rake/task.rb +166 -0
  437. data/lib/cucumber/rb_support/rb_dsl.rb +102 -0
  438. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  439. data/lib/cucumber/rb_support/rb_language.rb +179 -0
  440. data/lib/cucumber/rb_support/rb_step_definition.rb +75 -0
  441. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  442. data/lib/cucumber/rb_support/rb_world.rb +81 -0
  443. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  444. data/lib/cucumber/rspec_neuter.rb +23 -0
  445. data/lib/cucumber/step_argument.rb +9 -0
  446. data/lib/cucumber/step_definition_light.rb +20 -0
  447. data/lib/cucumber/step_match.rb +107 -0
  448. data/lib/cucumber/step_mother.rb +350 -0
  449. data/lib/cucumber/webrat/element_locator.rb +93 -0
  450. data/lib/cucumber/webrat/table_locator.rb +1 -0
  451. data/lib/cucumber/wire_support/connection.rb +42 -0
  452. data/lib/cucumber/wire_support/request_handler.rb +19 -0
  453. data/lib/cucumber/wire_support/wire_exception.rb +10 -0
  454. data/lib/cucumber/wire_support/wire_language.rb +52 -0
  455. data/lib/cucumber/wire_support/wire_packet.rb +34 -0
  456. data/lib/cucumber/wire_support/wire_protocol.rb +64 -0
  457. data/lib/cucumber/wire_support/wire_step_definition.rb +21 -0
  458. data/spec/cucumber/ast/background_spec.rb +54 -0
  459. data/spec/cucumber/ast/feature_element_spec.rb +41 -0
  460. data/spec/cucumber/ast/feature_factory.rb +62 -0
  461. data/spec/cucumber/ast/feature_spec.rb +44 -0
  462. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  463. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  464. data/spec/cucumber/ast/scenario_outline_spec.rb +73 -0
  465. data/spec/cucumber/ast/scenario_spec.rb +45 -0
  466. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  467. data/spec/cucumber/ast/step_spec.rb +66 -0
  468. data/spec/cucumber/ast/table_spec.rb +422 -0
  469. data/spec/cucumber/ast/tags_spec.rb +29 -0
  470. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  471. data/spec/cucumber/broadcaster_spec.rb +15 -0
  472. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  473. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  474. data/spec/cucumber/cli/main_spec.rb +172 -0
  475. data/spec/cucumber/cli/options_spec.rb +335 -0
  476. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  477. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  478. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  479. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  480. data/spec/cucumber/formatter/console_spec.rb +20 -0
  481. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  482. data/spec/cucumber/formatter/html_spec.rb +213 -0
  483. data/spec/cucumber/formatter/junit_spec.rb +110 -0
  484. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  485. data/spec/cucumber/formatter/spec_helper.rb +50 -0
  486. data/spec/cucumber/parser/feature_parser_spec.rb +400 -0
  487. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  488. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +132 -0
  489. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  490. data/spec/cucumber/sell_cucumbers.feature +19 -0
  491. data/spec/cucumber/step_match_spec.rb +56 -0
  492. data/spec/cucumber/step_mother_spec.rb +270 -0
  493. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  494. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  495. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  496. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  497. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  498. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  499. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  500. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  501. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  502. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  503. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  504. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  505. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  506. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  507. data/spec/cucumber/wire_support/wire_packet_spec.rb +26 -0
  508. data/spec/cucumber/world/pending_spec.rb +46 -0
  509. data/spec/spec.opts +4 -0
  510. data/spec/spec_helper.rb +18 -0
  511. metadata +813 -0
@@ -0,0 +1,241 @@
1
+ /* cucumber.css is generated from cucumber.sass */
2
+ /* Regenerate with rake sass */
3
+
4
+ !step_left = 5px "solid"
5
+ !step_bottom = 1px "solid"
6
+
7
+ !failed = #FFFBD3
8
+ !failed_border = #C20000
9
+ !failed_text = #C20000
10
+
11
+ !passed = #DBFFB4
12
+ !passed_border = #65C400
13
+ !passed_text = #3D7700
14
+
15
+ !skipped = #E0FFFF
16
+ !skipped_border = #00FFFF
17
+ !skipped_text = #001111
18
+
19
+ !pending = #FCFB98
20
+ !pending_border = #FAF834
21
+ !pending_text = #131313
22
+
23
+ !undefined = #FCFB98
24
+ !undefined_border = #FAF834
25
+ !undefined_text = #131313
26
+
27
+ body
28
+ :font-size 0px
29
+ :color #FFFFFF
30
+ :margin 0px
31
+ :padding 0px
32
+
33
+ .cucumber,td,th
34
+ :font normal 11px "Lucida Grande", Helvetica, sans-serif
35
+ :background white
36
+ :color #000000
37
+
38
+ #cucumber-header
39
+ :background #65C400
40
+ :color #FFFFFF
41
+ :height 5em
42
+
43
+ .scenario
44
+ h3
45
+ :font-size 11px
46
+ :padding 3px
47
+ :margin 0
48
+ :background #65C400
49
+ :color #FFFFFF
50
+ :font-weight bold
51
+
52
+ h1
53
+ :margin 0px 10px 0px 10px
54
+ :padding 10px
55
+ :font-family "Lucida Grande", Helvetica, sans-serif
56
+ :font-size 1.8em
57
+ :position absolute
58
+
59
+ h4
60
+ :margin-bottom 2px
61
+
62
+ div.feature
63
+ :padding 2px
64
+ :margin 0px 10px 5px 10px
65
+
66
+ div.examples
67
+ :padding 0em 0em 0em 1em
68
+
69
+ .stats
70
+ :margin 2em
71
+
72
+ .summary
73
+ ul.features
74
+ li
75
+ :display inline
76
+
77
+ .tag
78
+ :font-weight bold
79
+ :color #246AC1
80
+
81
+ .backtrace
82
+ :margin-top 0
83
+ :margin-bottom 0
84
+ :margin-left 1em
85
+ :color #000000
86
+
87
+ a
88
+ :text-decoration none
89
+ :color #BE5C00
90
+
91
+ &:hover
92
+ :text-decoration underline
93
+ &:visited
94
+ :font-weight normal
95
+
96
+ div.examples
97
+ :margin 5px 0px 5px 15px
98
+ :color #000000
99
+
100
+ .outline
101
+ table
102
+ :margin 0px 0px 5px 10px
103
+
104
+ table
105
+ :border-collapse collapse
106
+ td
107
+ :padding 3px 3px 3px 5px
108
+ td.failed, td.passed, td.skipped, td.pending, td.undefined
109
+ :padding-left 18px
110
+ :padding-right 10px
111
+ td.failed
112
+ :border-left= !step_left !failed_border
113
+ :border-bottom= !step_bottom !failed_border
114
+ :background= !failed
115
+ :color= !failed_text
116
+ td.passed
117
+ :border-left= !step_left !passed_border
118
+ :border-bottom= !step_bottom !passed_border
119
+ :background= !passed
120
+ :color= !passed_text
121
+ td.skipped
122
+ :border-left= !step_left !skipped_border
123
+ :border-bottom= !step_bottom !skipped_border
124
+ :background= !skipped
125
+ :color= !skipped_text
126
+ td.pending
127
+ :border-left= !step_left !pending_border
128
+ :border-bottom= !step_bottom !pending_border
129
+ :background= !pending
130
+ :color= !pending_text
131
+ td.undefined
132
+ :border-left= !step_left !undefined_border
133
+ :border-bottom= !step_bottom !undefined_border
134
+ :background= !undefined
135
+ :color= !undefined_text
136
+
137
+ ol
138
+ :list-style none
139
+ :margin 0px
140
+ :padding 0px
141
+
142
+ li.step
143
+ :padding 3px 3px 3px 18px
144
+ :margin 5px 0px 5px 5px
145
+ li
146
+ :margin 0em 0em 0em 1em
147
+ :padding 0em 0em 0em 0.2em
148
+ span.param
149
+ :font-weight bold
150
+ li.failed
151
+ :border-left= !step_left !failed_border
152
+ :border-bottom= !step_bottom !failed_border
153
+ :background= !failed
154
+ :color= !failed_text
155
+ li.passed
156
+ :border-left= !step_left !passed_border
157
+ :border-bottom= !step_bottom !passed_border
158
+ :background= !passed
159
+ :color= !passed_text
160
+ li.skipped
161
+ :border-left= !step_left !skipped_border
162
+ :border-bottom= !step_bottom !skipped_border
163
+ :background= !skipped
164
+ :color= !skipped_text
165
+ li.pending
166
+ :border-left= !step_left !pending_border
167
+ :border-bottom= !step_bottom !pending_border
168
+ :background= !pending
169
+ :color= !pending_text
170
+ li.undefined
171
+ :border-left= !step_left !undefined_border
172
+ :border-bottom= !step_bottom !undefined_border
173
+ :background= !undefined
174
+ :color= !undefined_text
175
+
176
+ #summary
177
+ :margin 0px
178
+ :padding 5px 10px
179
+ :text-align right
180
+ :top 0px
181
+ :right 0px
182
+ :float right
183
+
184
+ p
185
+ :margin 0 0 0 2px
186
+
187
+ #totals
188
+ :font-size 1.2em
189
+
190
+ .ruby
191
+ :font-size 12px
192
+ :font-family monospace
193
+ :color white
194
+ :background black
195
+ :padding 0.1em 0 0.2em 0
196
+
197
+ .keyword
198
+ :color #FF6600
199
+ .constant
200
+ :color #339999
201
+ .attribute
202
+ :color white
203
+ .global
204
+ :color white
205
+ .module
206
+ :color white
207
+ .class
208
+ :color white
209
+ .string
210
+ :color #66FF00
211
+ .ident
212
+ :color white
213
+ .method
214
+ :color #FFCC00
215
+ .number
216
+ :color white
217
+ .char
218
+ :color white
219
+ .comment
220
+ :color #9933CC
221
+ .symbol
222
+ :color white
223
+ .regex
224
+ :color #44B4CC
225
+ .punct
226
+ :color white
227
+ .escape
228
+ :color white
229
+ .interp
230
+ :color white
231
+ .expr
232
+ :color white
233
+
234
+ .offending
235
+ :background #333333
236
+ .linenum
237
+ :width 75px
238
+ :padding 0.1em 1em 0.2em 0
239
+ :color #000000
240
+ :background #FFFBD3
241
+
@@ -0,0 +1,33 @@
1
+ require 'cucumber/formatter/progress'
2
+ require 'cucumber/step_definition_light'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ class Debug
7
+ def initialize(step_mother, io, options)
8
+ @io = io
9
+ @indent = 0
10
+ end
11
+
12
+ def respond_to?(*args)
13
+ true
14
+ end
15
+
16
+ def method_missing(name, *args)
17
+ @indent -= 2 if name.to_s =~ /^after/
18
+ print(name)
19
+ @indent += 2 if name.to_s =~ /^before/
20
+ end
21
+
22
+ private
23
+
24
+ def print(text)
25
+ @io.puts "#{indent}#{text}"
26
+ end
27
+
28
+ def indent
29
+ (' ' * @indent)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ module Cucumber
2
+ module Formatter
3
+ module Duration
4
+ # Helper method for formatters that need to
5
+ # format a duration in seconds to the UNIX
6
+ # <tt>time</tt> format.
7
+ def format_duration(seconds)
8
+ m, s = seconds.divmod(60)
9
+ "#{m}m#{'%.3f' % s}s"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,545 @@
1
+ require 'cucumber/formatter/ordered_xml_markup'
2
+ require 'cucumber/formatter/duration'
3
+ require 'cucumber/formatter/io'
4
+
5
+ module Cucumber
6
+ module Formatter
7
+ class Html
8
+ include ERB::Util # for the #h method
9
+ include Duration
10
+ include Io
11
+
12
+ def initialize(step_mother, path_or_io, options)
13
+ @io = ensure_io(path_or_io, "html")
14
+ @step_mother = step_mother
15
+ @options = options
16
+ @buffer = {}
17
+ @builder = create_builder(@io)
18
+ @feature_number = 0
19
+ @scenario_number = 0
20
+ @step_number = 0
21
+ @header_red = nil
22
+ end
23
+
24
+ def before_features(features)
25
+ @step_count = get_step_count(features)
26
+
27
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
28
+ @builder.declare!(
29
+ :DOCTYPE,
30
+ :html,
31
+ :PUBLIC,
32
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
33
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
34
+ )
35
+
36
+ @builder << '<html xmlns ="http://www.w3.org/1999/xhtml">'
37
+ @builder.head do
38
+ @builder.meta(:content => 'text/html;charset=utf-8')
39
+ @builder.title 'Cucumber'
40
+ inline_css
41
+ inline_js
42
+ end
43
+ @builder << '<body>'
44
+ @builder << "<!-- Step count #{@step_count}-->"
45
+ @builder << '<div class="cucumber">'
46
+ @builder.div(:id => 'cucumber-header') do
47
+ @builder.div(:id => 'label') do
48
+ @builder.h1('Cucumber Features')
49
+ end
50
+ @builder.div(:id => 'summary') do
51
+ @builder.p('',:id => 'totals')
52
+ @builder.p('',:id => 'duration')
53
+ end
54
+ end
55
+ end
56
+
57
+ def after_features(features)
58
+ print_stats(features)
59
+ @builder << '</div>'
60
+ @builder << '</body>'
61
+ @builder << '</html>'
62
+ end
63
+
64
+ def before_feature(feature)
65
+ @exceptions = []
66
+ @builder << '<div class="feature">'
67
+ end
68
+
69
+ def after_feature(feature)
70
+ @builder << '</div>'
71
+ end
72
+
73
+ def before_comment(comment)
74
+ @builder << '<pre class="comment">'
75
+ end
76
+
77
+ def after_comment(comment)
78
+ @builder << '</pre>'
79
+ end
80
+
81
+ def comment_line(comment_line)
82
+ @builder.text!(comment_line)
83
+ @builder.br
84
+ end
85
+
86
+ def after_tags(tags)
87
+ @tag_spacer = nil
88
+ end
89
+
90
+ def tag_name(tag_name)
91
+ @builder.text!(@tag_spacer) if @tag_spacer
92
+ @tag_spacer = ' '
93
+ @builder.span(tag_name, :class => 'tag')
94
+ end
95
+
96
+ def feature_name(name)
97
+ lines = name.split(/\r?\n/)
98
+ return if lines.empty?
99
+ @builder.h2 do |h2|
100
+ @builder.span(lines[0], :class => 'val')
101
+ end
102
+ @builder.p(:class => 'narrative') do
103
+ lines[1..-1].each do |line|
104
+ @builder.text!(line.strip)
105
+ @builder.br
106
+ end
107
+ end
108
+ end
109
+
110
+ def before_background(background)
111
+ @in_background = true
112
+ @builder << '<div class="background">'
113
+ end
114
+
115
+ def after_background(background)
116
+ @in_background = nil
117
+ @builder << '</div>'
118
+ end
119
+
120
+ def background_name(keyword, name, file_colon_line, source_indent)
121
+ @listing_background = true
122
+ @builder.h3 do |h3|
123
+ @builder.span(keyword, :class => 'keyword')
124
+ @builder.text!(' ')
125
+ @builder.span(name, :class => 'val')
126
+ end
127
+ end
128
+
129
+ def before_feature_element(feature_element)
130
+ @scenario_number+=1
131
+ @scenario_red = false
132
+ css_class = {
133
+ Ast::Scenario => 'scenario',
134
+ Ast::ScenarioOutline => 'scenario outline'
135
+ }[feature_element.class]
136
+ @builder << "<div class='#{css_class}'>"
137
+ end
138
+
139
+ def after_feature_element(feature_element)
140
+ @builder << '</div>'
141
+ @open_step_list = true
142
+ end
143
+
144
+ def scenario_name(keyword, name, file_colon_line, source_indent)
145
+ @listing_background = false
146
+ @builder.h3(:id => "scenario_#{@scenario_number}") do
147
+ @builder.span(keyword, :class => 'keyword')
148
+ @builder.text!(' ')
149
+ @builder.span(name, :class => 'val')
150
+ end
151
+ end
152
+
153
+ def before_outline_table(outline_table)
154
+ @outline_row = 0
155
+ @builder << '<table>'
156
+ end
157
+
158
+ def after_outline_table(outline_table)
159
+ @builder << '</table>'
160
+ @outline_row = nil
161
+ end
162
+
163
+ def before_examples(examples)
164
+ @builder << '<div class="examples">'
165
+ end
166
+
167
+ def after_examples(examples)
168
+ @builder << '</div>'
169
+ end
170
+
171
+ def examples_name(keyword, name)
172
+ @builder.h4 do
173
+ @builder.span(keyword, :class => 'keyword')
174
+ @builder.text!(' ')
175
+ @builder.span(name, :class => 'val')
176
+ end
177
+ end
178
+
179
+ def before_steps(steps)
180
+ @builder << '<ol>'
181
+ end
182
+
183
+ def after_steps(steps)
184
+ @builder << '</ol>'
185
+ end
186
+
187
+ def before_step(step)
188
+ @step_id = step.dom_id
189
+ @step_number += 1
190
+ @step = step
191
+ end
192
+
193
+ def after_step(step)
194
+ move_progress
195
+ end
196
+
197
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
198
+ @step_match = step_match
199
+ @hide_this_step = false
200
+ if exception
201
+ if @exceptions.include?(exception)
202
+ @hide_this_step = true
203
+ return
204
+ end
205
+ @exceptions << exception
206
+ end
207
+ if status != :failed && @in_background ^ background
208
+ @hide_this_step = true
209
+ return
210
+ end
211
+ @status = status
212
+ return if @hide_this_step
213
+ set_scenario_color(status)
214
+ @builder << "<li id='#{@step_id}' class='step #{status}'>"
215
+ end
216
+
217
+ def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
218
+ return if @hide_this_step
219
+ # print snippet for undefined steps
220
+ if status == :undefined
221
+ step_multiline_class = @step.multiline_arg ? @step.multiline_arg.class : nil
222
+ @builder.pre do |pre|
223
+ pre << @step_mother.snippet_text(keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
224
+ end
225
+ end
226
+ @builder << '</li>'
227
+ end
228
+
229
+ def step_name(keyword, step_match, status, source_indent, background)
230
+ @step_matches ||= []
231
+ background_in_scenario = background && !@listing_background
232
+ @skip_step = @step_matches.index(step_match) || background_in_scenario
233
+ @step_matches << step_match
234
+
235
+ unless @skip_step
236
+ build_step(keyword, step_match, status)
237
+ end
238
+ end
239
+
240
+ def exception(exception, status)
241
+ build_exception_detail(exception)
242
+ end
243
+
244
+ def extra_failure_content(file_colon_line)
245
+ @snippet_extractor ||= SnippetExtractor.new
246
+ "<pre class=\"ruby\"><code>#{@snippet_extractor.snippet(file_colon_line)}</code></pre>"
247
+ end
248
+
249
+ def before_multiline_arg(multiline_arg)
250
+ return if @hide_this_step || @skip_step
251
+ if Ast::Table === multiline_arg
252
+ @builder << '<table>'
253
+ end
254
+ end
255
+
256
+ def after_multiline_arg(multiline_arg)
257
+ return if @hide_this_step || @skip_step
258
+ if Ast::Table === multiline_arg
259
+ @builder << '</table>'
260
+ end
261
+ end
262
+
263
+ def py_string(string)
264
+ return if @hide_this_step
265
+ @builder.pre(:class => 'val') do |pre|
266
+ @builder << string.gsub("\n", '&#x000A;')
267
+ end
268
+ end
269
+
270
+
271
+ def before_table_row(table_row)
272
+ @row_id = table_row.dom_id
273
+ @col_index = 0
274
+ return if @hide_this_step
275
+ @builder << "<tr class='step' id='#{@row_id}'>"
276
+ end
277
+
278
+ def after_table_row(table_row)
279
+ return if @hide_this_step
280
+ @builder << '</tr>'
281
+ if table_row.exception
282
+ @builder.tr do
283
+ @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
284
+ @builder.pre do |pre|
285
+ pre << format_exception(table_row.exception)
286
+ end
287
+ end
288
+ end
289
+ end
290
+ if @outline_row
291
+ @outline_row += 1
292
+ end
293
+ @step_number += 1
294
+ move_progress
295
+ end
296
+
297
+ def table_cell_value(value, status)
298
+ return if @hide_this_step
299
+
300
+ @cell_type = @outline_row == 0 ? :th : :td
301
+ attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'step'}
302
+ attributes[:class] += " #{status}" if status
303
+ build_cell(@cell_type, value, attributes)
304
+ set_scenario_color(status)
305
+ @col_index += 1
306
+ end
307
+
308
+ def announce(announcement)
309
+ @builder.pre(announcement, :class => 'announcement')
310
+ end
311
+
312
+ protected
313
+
314
+ def build_exception_detail(exception)
315
+ backtrace = Array.new
316
+ @builder.div(:class => 'message') do
317
+ message = exception.message
318
+ if message.include?('Exception caught')
319
+ matches = message.match(/Showing <i>(.+)<\/i>(?:.+)#(\d+)/)
320
+ backtrace += ["#{RAILS_ROOT}/#{matches[1]}:#{matches[2]}"]
321
+ message = message.match(/<code>([^(\/)]+)<\//m)[1]
322
+ end
323
+ @builder << "<pre>#{message}</pre>"
324
+ end
325
+ @builder.div(:class => 'backtrace') do
326
+ @builder.pre do
327
+ # backtrace += (exception.backtrace.size == 1 || exception.backtrace[0].include?('(eval):')) ? ["#{RAILS_ROOT}/#{@step_match.file_colon_line}"] + exception.backtrace : exception.backtrace
328
+ backtrace = exception.backtrace
329
+ backtrace.delete_if { |x| x =~ /\/gems\/(cucumber|rspec)/ }
330
+ @builder << backtrace_line(backtrace.join("\n"))
331
+ end
332
+ end
333
+ extra = extra_failure_content(backtrace)
334
+ @builder << extra unless extra == ""
335
+ end
336
+
337
+ def set_scenario_color(status)
338
+ if status == :undefined
339
+ @builder.script do
340
+ @builder.text!("makeYellow('cucumber-header');") unless @header_red
341
+ @builder.text!("makeYellow('scenario_#{@scenario_number}');") unless @scenario_red
342
+ end
343
+ end
344
+ if status == :failed
345
+ @builder.script do
346
+ @builder.text!("makeRed('cucumber-header');") unless @header_red
347
+ @header_red = true
348
+ @builder.text!("makeRed('scenario_#{@scenario_number}');") unless @scenario_red
349
+ @scenario_red = true
350
+ end
351
+ end
352
+ end
353
+
354
+ def get_step_count(features)
355
+ count = 0
356
+ features = features.instance_variable_get("@features")
357
+ features.each do |feature|
358
+ #get background steps
359
+ if feature.instance_variable_get("@background")
360
+ background = feature.instance_variable_get("@background").instance_variable_get("@steps").instance_variable_get("@steps")
361
+ count += background.size
362
+ end
363
+ #get scenarios
364
+ feature.instance_variable_get("@feature_elements").each do |scenario|
365
+ #get steps
366
+ steps = scenario.instance_variable_get("@steps").instance_variable_get("@steps")
367
+ count += steps.size
368
+
369
+ #get example table
370
+ examples = scenario.instance_variable_get("@examples_array")
371
+ unless examples.nil?
372
+ examples.each do |example|
373
+ example_matrix = example.instance_variable_get("@outline_table").instance_variable_get("@cell_matrix")
374
+ count += example_matrix.size
375
+ end
376
+ end
377
+
378
+ #get multiline step tables
379
+ steps.each do |step|
380
+ multi_arg = step.instance_variable_get("@multiline_arg")
381
+ next if multi_arg.nil?
382
+ matrix = multi_arg.instance_variable_get("@cell_matrix")
383
+ count += matrix.size unless matrix.nil?
384
+ end
385
+ end
386
+ end
387
+ return count
388
+ end
389
+
390
+ def build_step(keyword, step_match, status)
391
+ step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
392
+ @builder.div do |div|
393
+ @builder.span(keyword, :class => 'keyword')
394
+ @builder.text!(' ')
395
+ @builder.span(:class => 'step val') do |name|
396
+ name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
397
+ end
398
+ end
399
+ end
400
+
401
+ def build_cell(cell_type, value, attributes)
402
+ @builder.__send__(cell_type, attributes) do
403
+ @builder.div do
404
+ @builder.span(value,:class => 'step param')
405
+ end
406
+ end
407
+ end
408
+
409
+ def inline_css
410
+ @builder.style(:type => 'text/css') do
411
+ @builder << File.read(File.dirname(__FILE__) + '/cucumber.css')
412
+ end
413
+ end
414
+
415
+ def inline_js
416
+ @builder.script(:type => 'text/javascript') do
417
+ @builder << inline_js_content
418
+ end
419
+ end
420
+
421
+ def inline_js_content
422
+ <<-EOF
423
+ function moveProgressBar(percentDone) {
424
+ document.getElementById("cucumber-header").style.width = percentDone +"%";
425
+ }
426
+ function makeRed(element_id) {
427
+ document.getElementById(element_id).style.background = '#C40D0D';
428
+ document.getElementById(element_id).style.color = '#FFFFFF';
429
+ }
430
+
431
+ function makeYellow(element_id) {
432
+ document.getElementById(element_id).style.background = '#FAF834';
433
+ document.getElementById(element_id).style.color = '#000000';
434
+ }
435
+ EOF
436
+ end
437
+
438
+ def move_progress
439
+ @builder << " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
440
+ end
441
+
442
+ def percent_done
443
+ result = 100.0
444
+ if @step_count != 0
445
+ result = ((@step_number).to_f / @step_count.to_f * 1000).to_i / 10.0
446
+ end
447
+ result
448
+ end
449
+
450
+ def format_exception(exception)
451
+ (["#{exception.message}"] + exception.backtrace).join("\n")
452
+ end
453
+
454
+ def backtrace_line(line)
455
+ line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*)/) do
456
+ if ENV['TM_PROJECT_DIRECTORY']
457
+ "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
458
+ else
459
+ line
460
+ end
461
+ end
462
+ end
463
+
464
+ def print_stats(features)
465
+ @builder << "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{format_duration(features.duration)} seconds</strong>\";</script>"
466
+ @builder << "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{print_stat_string(features)}\";</script>"
467
+ end
468
+
469
+ def print_stat_string(features)
470
+ string = String.new
471
+ string << dump_count(@step_mother.scenarios.length, "scenario")
472
+ scenario_count = print_status_counts{|status| @step_mother.scenarios(status)}
473
+ string << scenario_count if scenario_count
474
+ string << "<br />"
475
+ string << dump_count(@step_mother.steps.length, "step")
476
+ step_count = print_status_counts{|status| @step_mother.steps(status)}
477
+ string << step_count if step_count
478
+ end
479
+
480
+ def print_status_counts
481
+ counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
482
+ elements = yield status
483
+ elements.any? ? "#{elements.length} #{status.to_s}" : nil
484
+ end.compact
485
+ return " (#{counts.join(', ')})" if counts.any?
486
+ end
487
+
488
+ def dump_count(count, what, state=nil)
489
+ [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
490
+ end
491
+
492
+ def create_builder(io)
493
+ OrderedXmlMarkup.new(:target => io, :indent => 0)
494
+ end
495
+ end
496
+ end
497
+ end
498
+
499
+
500
+ class SnippetExtractor #:nodoc:
501
+ class NullConverter; def convert(code, pre); code; end; end #:nodoc:
502
+ begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
503
+
504
+ def snippet(error)
505
+ raw_code, line = snippet_for(error[0])
506
+ highlighted = @@converter.convert(raw_code, false)
507
+ highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
508
+ post_process(highlighted, line)
509
+ end
510
+
511
+ def snippet_for(error_line)
512
+ if error_line =~ /(.*):(\d+)/
513
+ file = $1
514
+ line = $2.to_i
515
+ [lines_around(file, line), line]
516
+ else
517
+ return snippet_for()
518
+ ["# Couldn't get snippet for #{error_line}", 1]
519
+ end
520
+ end
521
+
522
+ def lines_around(file, line)
523
+ if File.file?(file)
524
+ lines = File.open(file).read.split("\n")
525
+ min = [0, line-3].max
526
+ max = [line+1, lines.length-1].min
527
+ selected_lines = []
528
+ selected_lines.join("\n")
529
+ lines[min..max].join("\n")
530
+ else
531
+ "# Couldn't get snippet for #{file}"
532
+ end
533
+ end
534
+
535
+ def post_process(highlighted, offending_line)
536
+ new_lines = []
537
+ highlighted.split("\n").each_with_index do |line, i|
538
+ new_line = "<span class=\"linenum\">#{offending_line+i-2}</span>#{line}"
539
+ new_line = "<span class=\"offending\">#{new_line}</span>" if i == 2
540
+ new_lines << new_line
541
+ end
542
+ new_lines.join("\n")
543
+ end
544
+
545
+ end