jwilger-cucumber 0.3.11.200906161550

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 (411) hide show
  1. data/History.txt +830 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +410 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +76 -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 +30 -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 +16 -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/zh-CN/Rakefile +6 -0
  151. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  152. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  153. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  154. data/examples/i18n/zh-TW/Rakefile +6 -0
  155. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  156. data/examples/i18n/zh-TW/features/division.feature +11 -0
  157. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  159. data/examples/java/README.textile +18 -0
  160. data/examples/java/build.xml +33 -0
  161. data/examples/java/features/hello.feature +11 -0
  162. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  163. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  164. data/examples/java/features/tree.feature +9 -0
  165. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  166. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  167. data/examples/junit/features/pending.feature +5 -0
  168. data/examples/junit/features/step_definitions/steps.rb +11 -0
  169. data/examples/pure_java/README.textile +5 -0
  170. data/examples/selenium/Rakefile +6 -0
  171. data/examples/selenium/features/search.feature +9 -0
  172. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  173. data/examples/selenium/features/support/env.rb +19 -0
  174. data/examples/selenium_webrat/Rakefile +6 -0
  175. data/examples/selenium_webrat/config.ru +0 -0
  176. data/examples/selenium_webrat/features/search.feature +9 -0
  177. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  178. data/examples/selenium_webrat/features/support/env.rb +45 -0
  179. data/examples/self_test/README.textile +6 -0
  180. data/examples/self_test/Rakefile +6 -0
  181. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  182. data/examples/self_test/features/background/background_with_name.feature +7 -0
  183. data/examples/self_test/features/background/failing_background.feature +12 -0
  184. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  185. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  186. data/examples/self_test/features/background/passing_background.feature +10 -0
  187. data/examples/self_test/features/background/pending_background.feature +10 -0
  188. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  189. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  190. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  191. data/examples/self_test/features/failing_expectation.feature +4 -0
  192. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  193. data/examples/self_test/features/multiline_name.feature +27 -0
  194. data/examples/self_test/features/outline_sample.feature +15 -0
  195. data/examples/self_test/features/sample.feature +21 -0
  196. data/examples/self_test/features/search_sample.feature +32 -0
  197. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  198. data/examples/self_test/features/support/env.rb +17 -0
  199. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  200. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  201. data/examples/sinatra/Rakefile +6 -0
  202. data/examples/sinatra/app.rb +14 -0
  203. data/examples/sinatra/features/add.feature +11 -0
  204. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  205. data/examples/sinatra/features/support/env.rb +28 -0
  206. data/examples/sinatra/views/add.erb +5 -0
  207. data/examples/sinatra/views/layout.erb +8 -0
  208. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  209. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  210. data/examples/test_unit/Rakefile +6 -0
  211. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  212. data/examples/test_unit/features/test_unit.feature +9 -0
  213. data/examples/tickets/Rakefile +16 -0
  214. data/examples/tickets/features/172.feature +28 -0
  215. data/examples/tickets/features/177/1.feature +29 -0
  216. data/examples/tickets/features/177/2.feature +21 -0
  217. data/examples/tickets/features/177/3.feature +18 -0
  218. data/examples/tickets/features/180.feature +7 -0
  219. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  220. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  221. data/examples/tickets/features/236.feature +13 -0
  222. data/examples/tickets/features/241.feature +13 -0
  223. data/examples/tickets/features/246.feature +4 -0
  224. data/examples/tickets/features/248.feature +11 -0
  225. data/examples/tickets/features/270/back.feature +14 -0
  226. data/examples/tickets/features/270/back.steps.rb +14 -0
  227. data/examples/tickets/features/272/hooks.feature +26 -0
  228. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  229. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  230. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  231. data/examples/tickets/features/279/wrong.feature_ +11 -0
  232. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  233. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  234. data/examples/tickets/features/306/only_background.feature +4 -0
  235. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  236. data/examples/tickets/features/lib/pantry.rb +20 -0
  237. data/examples/tickets/features/scenario_outline.feature +95 -0
  238. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  239. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  240. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  241. data/examples/tickets/features/step_definitons/tickets_steps.rb +66 -0
  242. data/examples/tickets/features/tickets.feature +28 -0
  243. data/examples/watir/README.textile +16 -0
  244. data/examples/watir/Rakefile +6 -0
  245. data/examples/watir/features/search.feature +12 -0
  246. data/examples/watir/features/step_definitons/search_steps.rb +22 -0
  247. data/examples/watir/features/support/env.rb +32 -0
  248. data/features/after_block_exceptions.feature +102 -0
  249. data/features/after_step_block_exceptions.feature +104 -0
  250. data/features/background.feature +311 -0
  251. data/features/bug_371.feature +32 -0
  252. data/features/cucumber_cli.feature +549 -0
  253. data/features/cucumber_cli_diff_disabled.feature +53 -0
  254. data/features/cucumber_cli_outlines.feature +109 -0
  255. data/features/custom_formatter.feature +11 -0
  256. data/features/drb_server_integration.feature +115 -0
  257. data/features/exclude_files.feature +20 -0
  258. data/features/expand.feature +49 -0
  259. data/features/html_formatter/a.html +185 -0
  260. data/features/html_formatter.feature +7 -0
  261. data/features/junit_formatter.feature +71 -0
  262. data/features/language_from_header.feature +30 -0
  263. data/features/multiline_names.feature +43 -0
  264. data/features/rake_task.feature +150 -0
  265. data/features/report_called_undefined_steps.feature +35 -0
  266. data/features/snippet.feature +22 -0
  267. data/features/step_definitions/cucumber_steps.rb +130 -0
  268. data/features/step_definitions/extra_steps.rb +2 -0
  269. data/features/steps_formatter.feature +25 -0
  270. data/features/support/env.rb +120 -0
  271. data/features/usage.feature +126 -0
  272. data/features/work_in_progress.feature +151 -0
  273. data/gem_tasks/deployment.rake +11 -0
  274. data/gem_tasks/environment.rake +7 -0
  275. data/gem_tasks/features.rake +10 -0
  276. data/gem_tasks/fix_cr_lf.rake +10 -0
  277. data/gem_tasks/flog.rake +4 -0
  278. data/gem_tasks/gemspec.rake +10 -0
  279. data/gem_tasks/rspec.rake +45 -0
  280. data/gem_tasks/sass.rake +4 -0
  281. data/gem_tasks/yard.rake +8 -0
  282. data/lib/autotest/cucumber.rb +6 -0
  283. data/lib/autotest/cucumber_mixin.rb +125 -0
  284. data/lib/autotest/cucumber_rails.rb +6 -0
  285. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  286. data/lib/autotest/cucumber_rspec.rb +6 -0
  287. data/lib/autotest/discover.rb +9 -0
  288. data/lib/cucumber/ast/background.rb +62 -0
  289. data/lib/cucumber/ast/comment.rb +30 -0
  290. data/lib/cucumber/ast/examples.rb +26 -0
  291. data/lib/cucumber/ast/feature.rb +58 -0
  292. data/lib/cucumber/ast/feature_element.rb +57 -0
  293. data/lib/cucumber/ast/features.rb +30 -0
  294. data/lib/cucumber/ast/outline_table.rb +143 -0
  295. data/lib/cucumber/ast/py_string.rb +57 -0
  296. data/lib/cucumber/ast/scenario.rb +83 -0
  297. data/lib/cucumber/ast/scenario_outline.rb +93 -0
  298. data/lib/cucumber/ast/step.rb +112 -0
  299. data/lib/cucumber/ast/step_collection.rb +75 -0
  300. data/lib/cucumber/ast/step_invocation.rb +136 -0
  301. data/lib/cucumber/ast/table.rb +334 -0
  302. data/lib/cucumber/ast/tags.rb +33 -0
  303. data/lib/cucumber/ast/visitor.rb +116 -0
  304. data/lib/cucumber/ast.rb +29 -0
  305. data/lib/cucumber/broadcaster.rb +13 -0
  306. data/lib/cucumber/cli/configuration.rb +427 -0
  307. data/lib/cucumber/cli/drb_client.rb +20 -0
  308. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  309. data/lib/cucumber/cli/main.rb +136 -0
  310. data/lib/cucumber/core_ext/exception.rb +53 -0
  311. data/lib/cucumber/core_ext/instance_exec.rb +67 -0
  312. data/lib/cucumber/core_ext/proc.rb +29 -0
  313. data/lib/cucumber/core_ext/string.rb +48 -0
  314. data/lib/cucumber/feature_file.rb +47 -0
  315. data/lib/cucumber/filter.rb +50 -0
  316. data/lib/cucumber/formatter/ansicolor.rb +110 -0
  317. data/lib/cucumber/formatter/color_io.rb +23 -0
  318. data/lib/cucumber/formatter/console.rb +149 -0
  319. data/lib/cucumber/formatter/cucumber.css +132 -0
  320. data/lib/cucumber/formatter/cucumber.sass +139 -0
  321. data/lib/cucumber/formatter/duration.rb +10 -0
  322. data/lib/cucumber/formatter/html.rb +258 -0
  323. data/lib/cucumber/formatter/junit.rb +75 -0
  324. data/lib/cucumber/formatter/pretty.rb +188 -0
  325. data/lib/cucumber/formatter/profile.rb +77 -0
  326. data/lib/cucumber/formatter/progress.rb +60 -0
  327. data/lib/cucumber/formatter/rerun.rb +44 -0
  328. data/lib/cucumber/formatter/steps.rb +49 -0
  329. data/lib/cucumber/formatter/tag_cloud.rb +28 -0
  330. data/lib/cucumber/formatter/unicode.rb +35 -0
  331. data/lib/cucumber/formatter/usage.rb +85 -0
  332. data/lib/cucumber/formatters/unicode.rb +7 -0
  333. data/lib/cucumber/languages.yml +532 -0
  334. data/lib/cucumber/parser/feature.rb +1787 -0
  335. data/lib/cucumber/parser/feature.tt +324 -0
  336. data/lib/cucumber/parser/i18n/language.rb +80 -0
  337. data/lib/cucumber/parser/i18n.tt +42 -0
  338. data/lib/cucumber/parser/table.rb +414 -0
  339. data/lib/cucumber/parser/table.tt +71 -0
  340. data/lib/cucumber/parser/treetop_ext.rb +52 -0
  341. data/lib/cucumber/parser.rb +6 -0
  342. data/lib/cucumber/platform.rb +23 -0
  343. data/lib/cucumber/rails/rspec.rb +10 -0
  344. data/lib/cucumber/rails/world.rb +99 -0
  345. data/lib/cucumber/rake/task.rb +233 -0
  346. data/lib/cucumber/rspec_neuter.rb +23 -0
  347. data/lib/cucumber/step_definition.rb +122 -0
  348. data/lib/cucumber/step_match.rb +61 -0
  349. data/lib/cucumber/step_mother.rb +362 -0
  350. data/lib/cucumber/version.rb +10 -0
  351. data/lib/cucumber/world.rb +53 -0
  352. data/lib/cucumber.rb +11 -0
  353. data/rails_generators/cucumber/USAGE +11 -0
  354. data/rails_generators/cucumber/cucumber_generator.rb +66 -0
  355. data/rails_generators/cucumber/templates/cucumber +8 -0
  356. data/rails_generators/cucumber/templates/cucumber.rake +20 -0
  357. data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
  358. data/rails_generators/cucumber/templates/env.rb +26 -0
  359. data/rails_generators/cucumber/templates/paths.rb +27 -0
  360. data/rails_generators/cucumber/templates/spork_env.rb +36 -0
  361. data/rails_generators/cucumber/templates/webrat_steps.rb +147 -0
  362. data/rails_generators/feature/USAGE +12 -0
  363. data/rails_generators/feature/feature_generator.rb +40 -0
  364. data/rails_generators/feature/templates/feature.erb +31 -0
  365. data/rails_generators/feature/templates/steps.erb +20 -0
  366. data/spec/cucumber/ast/background_spec.rb +50 -0
  367. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  368. data/spec/cucumber/ast/feature_factory.rb +63 -0
  369. data/spec/cucumber/ast/feature_spec.rb +38 -0
  370. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  371. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  372. data/spec/cucumber/ast/scenario_spec.rb +38 -0
  373. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  374. data/spec/cucumber/ast/step_spec.rb +66 -0
  375. data/spec/cucumber/ast/table_spec.rb +186 -0
  376. data/spec/cucumber/ast/visitor_spec.rb +27 -0
  377. data/spec/cucumber/broadcaster_spec.rb +15 -0
  378. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  379. data/spec/cucumber/cli/drb_client_spec.rb +43 -0
  380. data/spec/cucumber/cli/main_spec.rb +140 -0
  381. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  382. data/spec/cucumber/core_ext/string_spec.rb +42 -0
  383. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  384. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  385. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  386. data/spec/cucumber/formatter/progress_spec.rb +36 -0
  387. data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
  388. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  389. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  390. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  391. data/spec/cucumber/rails/world_spec.rb +11 -0
  392. data/spec/cucumber/sell_cucumbers.feature +19 -0
  393. data/spec/cucumber/step_definition_spec.rb +101 -0
  394. data/spec/cucumber/step_mother_spec.rb +155 -0
  395. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  396. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  397. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  398. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  399. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  400. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  401. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  402. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  403. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  404. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  405. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  406. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  407. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  408. data/spec/cucumber/world/pending_spec.rb +47 -0
  409. data/spec/spec.opts +2 -0
  410. data/spec/spec_helper.rb +13 -0
  411. metadata +506 -0
@@ -0,0 +1,139 @@
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 = #FFC0CB
8
+ !failed_dark = #FF0000
9
+ !failed_text = #8B0000
10
+
11
+ !passed = #98FB98
12
+ !passed_dark = #00FF00
13
+ !passed_text = #001111
14
+
15
+ !skipped = #E0FFFF
16
+ !skipped_dark = #00FFFF
17
+ !skipped_text = #001111
18
+
19
+ !pending = #FFFF00
20
+ !pending_dark = #FF8000
21
+ !pending_text = #2A1B0A
22
+
23
+ !undefined = #FFFF00
24
+ !undefined_dark = #FF8000
25
+ !undefined_text = #2A1B0A
26
+
27
+ .cucumber
28
+ :font-family "Lucida Grande", Helvetica, sans-serif
29
+ :font-size 0.7em
30
+ :background white
31
+ :padding 1em
32
+
33
+ h1, h2, h3, h4, ol, li, pre, p
34
+ :font-size 1em
35
+ :padding 0px
36
+ :margin 0px
37
+
38
+ div.feature
39
+ :border 1px solid
40
+ :padding 2px
41
+ :margin 4px
42
+
43
+ div.background, div.scenario, p
44
+ :padding 0em 0em 0em 1em
45
+ div.examples
46
+ :padding 0em 0em 0em 1em
47
+
48
+ .stats
49
+ :margin 2em
50
+
51
+ .summary
52
+ ul.features
53
+ li
54
+ :display inline
55
+
56
+ .backtrace
57
+ :margin-top 0
58
+ :margin-bottom 0
59
+ :margin-left 1em
60
+
61
+ a
62
+ :text-decoration none
63
+ :color inherit
64
+
65
+ &:hover
66
+ :text-decoration underline
67
+ &:visited
68
+ :font-weight normal
69
+
70
+ div.examples
71
+ :border 1px solid
72
+ :padding 2px
73
+ :margin 4px
74
+
75
+ table
76
+ :border-collapse collapse
77
+
78
+ td, th
79
+ :font-size 0.7em
80
+ :border 1px solid #AAAAAA
81
+ td.failed
82
+ :background #FFC0CB
83
+ :color #8B0000
84
+ td.passed
85
+ :background #98FB98
86
+ :color= !passed_text
87
+ td.skipped
88
+ :background= !skipped
89
+ :color= !skipped_text
90
+ td.pending
91
+ :background #FFFFE0
92
+ :color #111100
93
+ td.undefined
94
+ :background #FFFFE0
95
+ :color #111100
96
+
97
+ ol
98
+ :list-style none
99
+
100
+ li
101
+ :margin 0em 0em 0em 1em
102
+ :padding 0em 0em 0em 0.2em
103
+ span.param
104
+ :font-weight bold
105
+ li.failed
106
+ :border-left= !step_left !failed_dark
107
+ :border-bottom= !step_bottom !failed_dark
108
+ :background= !failed
109
+ :color= !failed_text
110
+ span.param
111
+ :background !failed_dark
112
+ li.passed
113
+ :border-left= !step_left !passed_dark
114
+ :border-bottom= !step_bottom !passed_dark
115
+ :background= !passed
116
+ :color= !passed_text
117
+ span.param
118
+ :background= !passed_dark
119
+ li.skipped
120
+ :border-left= !step_left !skipped_dark
121
+ :border-bottom= !step_bottom !skipped_dark
122
+ :background= !skipped
123
+ :color= !skipped_text
124
+ span.param
125
+ :background= !skipped_dark
126
+ li.pending
127
+ :border-left= !step_left !pending_dark
128
+ :border-bottom= !step_bottom !pending_dark
129
+ :background= !pending
130
+ :color= !pending_text
131
+ span.param
132
+ :background= !pending_dark
133
+ li.undefined
134
+ :border-left= !step_left !undefined_dark
135
+ :border-bottom= !step_bottom !undefined_dark
136
+ :background= !undefined
137
+ :color= !undefined_text
138
+ span.param
139
+ :background= !undefined_dark
@@ -0,0 +1,10 @@
1
+ module Cucumber
2
+ module Formatter
3
+ module Duration
4
+ def format_duration(seconds)
5
+ m, s = seconds.divmod(60)
6
+ "#{m}m#{'%.3f' % s}s"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,258 @@
1
+ require 'erb'
2
+ begin
3
+ require 'builder'
4
+ rescue LoadError
5
+ gem 'builder'
6
+ require 'builder'
7
+ end
8
+ require 'cucumber/formatter/duration'
9
+
10
+ module Cucumber
11
+ module Formatter
12
+ class Html < Ast::Visitor
13
+ include ERB::Util # for the #h method
14
+ include Duration
15
+
16
+ def initialize(step_mother, io, options)
17
+ super(step_mother)
18
+ @options = options
19
+ @builder = create_builder(io)
20
+ end
21
+
22
+ def create_builder(io)
23
+ Builder::XmlMarkup.new(:target => io, :indent => 0)
24
+ end
25
+
26
+ def visit_features(features)
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
+ @builder.html(:xmlns => 'http://www.w3.org/1999/xhtml') do
36
+ @builder.head do
37
+ @builder.meta(:content => 'text/html;charset=utf-8')
38
+ @builder.title 'Cucumber'
39
+ inline_css
40
+ end
41
+ @builder.body do
42
+ @builder.div(:class => 'cucumber') do
43
+ super
44
+ @builder.div(format_duration(features.duration), :class => 'duration')
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def visit_comment(comment)
51
+ @builder.pre(:class => 'comment') do
52
+ super
53
+ end
54
+ end
55
+
56
+ def visit_comment_line(comment_line)
57
+ @builder.text!(comment_line)
58
+ @builder.br
59
+ end
60
+
61
+ def visit_feature(feature)
62
+ @exceptions = []
63
+ @builder.div(:class => 'feature') do
64
+ super
65
+ end
66
+ end
67
+
68
+ def visit_tag_name(tag_name)
69
+ @builder.span("@#{tag_name}", :class => 'tag')
70
+ end
71
+
72
+ def visit_feature_name(name)
73
+ lines = name.split(/\r?\n/)
74
+ @builder.h2 do |h2|
75
+ @builder.span(lines[0], :class => 'val')
76
+ end
77
+ @builder.p(:class => 'narrative') do
78
+ lines[1..-1].each do |line|
79
+ @builder.text!(line.strip)
80
+ @builder.br
81
+ end
82
+ end
83
+ end
84
+
85
+ def visit_background(background)
86
+ @builder.div(:class => 'background') do
87
+ @in_background = true
88
+ super
89
+ @in_background = nil
90
+ end
91
+ end
92
+
93
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
94
+ @listing_background = true
95
+ @builder.h3 do |h3|
96
+ @builder.span(keyword, :class => 'keyword')
97
+ @builder.text!(' ')
98
+ @builder.span(name, :class => 'val')
99
+ end
100
+ end
101
+
102
+ def visit_feature_element(feature_element)
103
+ css_class = {
104
+ Ast::Scenario => 'scenario',
105
+ Ast::ScenarioOutline => 'scenario outline'
106
+ }[feature_element.class]
107
+ @builder.div(:class => css_class) do
108
+ super
109
+ end
110
+ @open_step_list = true
111
+ end
112
+
113
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
114
+ @listing_background = false
115
+ @builder.h3 do
116
+ @builder.span(keyword, :class => 'keyword')
117
+ @builder.text!(' ')
118
+ @builder.span(name, :class => 'val')
119
+ end
120
+ end
121
+
122
+ def visit_outline_table(outline_table)
123
+ @outline_row = 0
124
+ @builder.table do
125
+ super(outline_table)
126
+ end
127
+ @outline_row = nil
128
+ end
129
+
130
+ def visit_examples(examples)
131
+ @builder.div(:class => 'examples') do
132
+ super(examples)
133
+ end
134
+ end
135
+
136
+ def visit_examples_name(keyword, name)
137
+ @builder.h4 do
138
+ @builder.span(keyword, :class => 'keyword')
139
+ @builder.text!(' ')
140
+ @builder.span(name, :class => 'val')
141
+ end
142
+ end
143
+
144
+ def visit_steps(steps)
145
+ @builder.ol do
146
+ super
147
+ end
148
+ end
149
+
150
+ def visit_step(step)
151
+ @step_id = step.dom_id
152
+ super
153
+ end
154
+
155
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
156
+ if exception
157
+ return if @exceptions.index(exception)
158
+ @exceptions << exception
159
+ end
160
+ return if status != :failed && @in_background ^ background
161
+ @status = status
162
+ @builder.li(:id => @step_id, :class => "step #{status}") do
163
+ super(keyword, step_match, multiline_arg, status, exception, source_indent, background)
164
+ end
165
+ end
166
+
167
+ def visit_step_name(keyword, step_match, status, source_indent, background)
168
+ @step_matches ||= []
169
+ background_in_scenario = background && !@listing_background
170
+ @skip_step = @step_matches.index(step_match) || background_in_scenario
171
+ @step_matches << step_match
172
+
173
+ unless @skip_step
174
+ build_step(keyword, step_match, status)
175
+ end
176
+ end
177
+
178
+ def visit_exception(exception, status)
179
+ @builder.pre(format_exception(exception), :class => status)
180
+ end
181
+
182
+ def visit_multiline_arg(multiline_arg)
183
+ return if @skip_step
184
+ if Ast::Table === multiline_arg
185
+ @builder.table do
186
+ super
187
+ end
188
+ else
189
+ super
190
+ end
191
+ end
192
+
193
+ def visit_py_string(string)
194
+ @builder.pre(:class => 'val') do |pre|
195
+ @builder.text!(' ' + string)
196
+ end
197
+ end
198
+
199
+ def visit_table_row(table_row)
200
+ @row_id = table_row.dom_id
201
+ @col_index = 0
202
+ @builder.tr(:id => @row_id) do
203
+ super
204
+ end
205
+ if table_row.exception
206
+ @builder.tr do
207
+ @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
208
+ @builder.pre do |pre|
209
+ pre << format_exception(table_row.exception)
210
+ end
211
+ end
212
+ end
213
+ end
214
+ @outline_row += 1 if @outline_row
215
+ end
216
+
217
+ def visit_table_cell_value(value, width, status)
218
+ cell_type = @outline_row == 0 ? :th : :td
219
+ attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'val'}
220
+ attributes[:class] += " #{status}" if status
221
+ build_cell(cell_type, value, attributes)
222
+ @col_index += 1
223
+ end
224
+
225
+ def announce(announcement)
226
+ @builder.pre(announcement, :class => 'announcement')
227
+ end
228
+
229
+ protected
230
+
231
+ def build_step(keyword, step_match, status)
232
+ step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
233
+ @builder.div do |div|
234
+ @builder.span(keyword, :class => 'keyword')
235
+ @builder.text!(' ')
236
+ @builder.span(:class => 'step val') do |name|
237
+ name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
238
+ end
239
+ end
240
+ end
241
+
242
+ def build_cell(cell_type, value, attributes)
243
+ @builder.__send__(cell_type, value, attributes)
244
+ end
245
+
246
+ def inline_css
247
+ @builder.style(:type => 'text/css') do
248
+ @builder.text!(File.read(File.dirname(__FILE__) + '/cucumber.css'))
249
+ end
250
+ end
251
+
252
+ def format_exception(exception)
253
+ (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
254
+ end
255
+
256
+ end
257
+ end
258
+ end
@@ -0,0 +1,75 @@
1
+ begin
2
+ require 'builder'
3
+ rescue LoadError
4
+ gem 'builder'
5
+ require 'builder'
6
+ end
7
+
8
+ module Cucumber
9
+ module Formatter
10
+ class Junit < Cucumber::Ast::Visitor
11
+
12
+ def initialize(step_mother, io, options)
13
+ super(step_mother)
14
+ raise "You *must* specify --out DIR for the junit formatter" unless String === io && File.directory?(io)
15
+ @reportdir = io
16
+ @options = options
17
+ end
18
+
19
+ def visit_feature(feature)
20
+ @failures = @errors = @tests = 0
21
+ @builder = Builder::XmlMarkup.new( :indent => 2 )
22
+ super
23
+
24
+ @testsuite = Builder::XmlMarkup.new( :indent => 2 )
25
+ @testsuite.instruct!
26
+ @testsuite.testsuite(
27
+ :failures => @failures,
28
+ :errors => @errors,
29
+ :tests => @tests,
30
+ :name => @feature_name ) do
31
+ @testsuite << @builder.target!
32
+ end
33
+
34
+ basename = File.basename(feature.file)[0...-File.extname(feature.file).length]
35
+ feature_filename = File.join(@reportdir, "TEST-#{basename}.xml")
36
+ File.open(feature_filename, 'w') { |file| file.write(@testsuite.target!) }
37
+ end
38
+
39
+ def visit_feature_name(name)
40
+ lines = name.split(/\r?\n/)
41
+ @feature_name = lines[0].sub(/Feature\:/, '').strip
42
+ end
43
+
44
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
45
+ @scenario = name
46
+ end
47
+
48
+ def visit_steps(steps)
49
+ @steps_failed = false
50
+ super
51
+ @failures += 1 if @steps_failed
52
+ @tests += 1
53
+ end
54
+
55
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
56
+ step_name = keyword + " " + step_match.format_args(lambda{|param| "*#{param}*"})
57
+ @builder.testcase(:classname => "#{@feature_name}.#{@scenario}", :name => step_name) do
58
+ if status != :passed
59
+ @builder.failure(:message => step_name) do
60
+ @builder.text!(format_exception(exception)) if exception
61
+ end
62
+ @steps_failed = true
63
+ end
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def format_exception(exception)
70
+ (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,188 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # This formatter prints features to plain text - exactly how they were parsed,
7
+ # just prettier. That means with proper indentation and alignment of table columns.
8
+ #
9
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
10
+ #
11
+ class Pretty < Ast::Visitor
12
+ include FileUtils
13
+ include Console
14
+ attr_writer :indent
15
+
16
+ def initialize(step_mother, io, options, delim='|')
17
+ super(step_mother)
18
+ @io = io
19
+ @options = options
20
+ @delim = delim
21
+ @exceptions = []
22
+ @indent = 0
23
+ end
24
+
25
+ def visit_features(features)
26
+ super
27
+ print_summary(features) unless @options[:autoformat]
28
+ end
29
+
30
+ def visit_feature(feature)
31
+ @exceptions = []
32
+ @indent = 0
33
+ if @options[:autoformat]
34
+ file = File.join(@options[:autoformat], feature.file)
35
+ dir = File.dirname(file)
36
+ mkdir_p(dir) unless File.directory?(dir)
37
+ File.open(file, Cucumber.file_mode('w')) do |io|
38
+ @io = io
39
+ super
40
+ end
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def visit_comment(comment)
47
+ comment.accept(self)
48
+ end
49
+
50
+ def visit_comment_line(comment_line)
51
+ @io.puts(comment_line.indent(@indent))
52
+ @io.flush
53
+ end
54
+
55
+ def visit_tags(tags)
56
+ tags.accept(self)
57
+ if @indent == 1
58
+ @io.puts
59
+ @io.flush
60
+ end
61
+ end
62
+
63
+ def visit_tag_name(tag_name)
64
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
65
+ @io.print(tag)
66
+ @io.flush
67
+ @indent = 1
68
+ end
69
+
70
+ def visit_feature_name(name)
71
+ @io.puts(name)
72
+ @io.puts
73
+ @io.flush
74
+ end
75
+
76
+ def visit_feature_element(feature_element)
77
+ @indent = 2
78
+ @scenario_indent = 2
79
+ super
80
+ @io.puts
81
+ @io.flush
82
+ end
83
+
84
+ def visit_background(background)
85
+ @indent = 2
86
+ @scenario_indent = 2
87
+ @in_background = true
88
+ super
89
+ @in_background = nil
90
+ @io.puts
91
+ @io.flush
92
+ end
93
+
94
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
95
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
96
+ end
97
+
98
+ def visit_examples_name(keyword, name)
99
+ names = name.empty? ? [name] : name.split("\n")
100
+ @io.puts("\n #{keyword} #{names[0]}")
101
+ names[1..-1].each {|s| @io.puts " #{s}" }
102
+ @io.flush
103
+ @indent = 6
104
+ @scenario_indent = 6
105
+ end
106
+
107
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
108
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
109
+ end
110
+
111
+ def visit_feature_element_name(keyword, name, file_colon_line, source_indent)
112
+ @io.puts if @scenario_indent == 6
113
+ names = name.empty? ? [name] : name.split("\n")
114
+ line = "#{keyword} #{names[0]}".indent(@scenario_indent)
115
+ @io.print(line)
116
+ if @options[:source]
117
+ line_comment = " # #{file_colon_line}".indent(source_indent)
118
+ @io.print(format_string(line_comment, :comment))
119
+ end
120
+ @io.puts
121
+ names[1..-1].each {|s| @io.puts " #{s}"}
122
+ @io.flush
123
+ end
124
+
125
+ def visit_step(step)
126
+ @indent = 6
127
+ super
128
+ end
129
+
130
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
131
+ if exception
132
+ return if @exceptions.index(exception)
133
+ @exceptions << exception
134
+ end
135
+ return if status != :failed && @in_background ^ background
136
+ @status = status
137
+ super
138
+ end
139
+
140
+ def visit_step_name(keyword, step_match, status, source_indent, background)
141
+ source_indent = nil unless @options[:source]
142
+ formatted_step_name = format_step(keyword, step_match, status, source_indent)
143
+ @io.puts(formatted_step_name.indent(@scenario_indent + 2))
144
+ end
145
+
146
+ def visit_multiline_arg(multiline_arg)
147
+ return if @options[:no_multiline]
148
+ super
149
+ end
150
+
151
+ def visit_exception(exception, status)
152
+ print_exception(exception, status, @indent)
153
+ @io.flush
154
+ end
155
+
156
+ def visit_table_row(table_row)
157
+ @io.print @delim.indent(@indent)
158
+ super
159
+ @io.puts
160
+ if table_row.exception && !@exceptions.index(table_row.exception)
161
+ print_exception(table_row.exception, :failed, @indent)
162
+ end
163
+ end
164
+
165
+ def visit_py_string(string)
166
+ s = %{"""\n#{string}\n"""}.indent(@indent)
167
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
168
+ @io.puts(format_string(s, @status))
169
+ @io.flush
170
+ end
171
+
172
+ def visit_table_cell_value(value, width, status)
173
+ status ||= @status || :passed
174
+ @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + ::Term::ANSIColor.reset(" #{@delim}"))
175
+ @io.flush
176
+ end
177
+
178
+ private
179
+
180
+ def print_summary(features)
181
+ print_stats(features)
182
+ print_snippets(@options)
183
+ print_passing_wip(@options)
184
+ end
185
+
186
+ end
187
+ end
188
+ end