dwaite-cucumber 0.3.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. data/History.txt +1067 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter/a.html +183 -0
  279. data/features/html_formatter.feature +7 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,331 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Options do
7
+
8
+ def given_cucumber_yml_defined_as(hash_or_string)
9
+ File.stub!(:exist?).and_return(true)
10
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
11
+ IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
12
+ end
13
+
14
+ before(:each) do
15
+ File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
16
+ Kernel.stub!(:exit).and_return(nil)
17
+ end
18
+
19
+ def output_stream
20
+ @output_stream ||= StringIO.new
21
+ end
22
+
23
+ def error_stream
24
+ @error_stream ||= StringIO.new
25
+ end
26
+
27
+ def options
28
+ @options ||= Options.new(output_stream, error_stream)
29
+ end
30
+
31
+ def prepare_args(args)
32
+ args.is_a?(Array) ? args : args.split(' ')
33
+ end
34
+
35
+ describe 'parsing' do
36
+
37
+ def when_parsing(args)
38
+ yield
39
+ options.parse!(prepare_args(args))
40
+ end
41
+
42
+ def after_parsing(args)
43
+ options.parse!(prepare_args(args))
44
+ yield
45
+ end
46
+
47
+ context '-r or --require' do
48
+ it "collects all specified files into an array" do
49
+ after_parsing('--require some_file.rb -r another_file.rb') do
50
+ options[:require].should == ['some_file.rb', 'another_file.rb']
51
+ end
52
+ end
53
+ end
54
+
55
+ context '-l LANG or --language LANG' do
56
+ context "with LANG specified as 'help'" do
57
+ it "lists all known langues" do
58
+ when_parsing '-l help' do
59
+ LanguageHelpFormatter.should_receive(:list_languages).with(output_stream)
60
+ end
61
+ end
62
+ it "exits the program" do
63
+ when_parsing('--language help') { Kernel.should_receive(:exit) }
64
+ end
65
+ end
66
+ it "sets the langauge" do
67
+ after_parsing('-l en') { options[:lang].should == 'en' }
68
+ end
69
+ end
70
+
71
+ context "--port PORT" do
72
+ it "sets the drb_port to the provided option" do
73
+ after_parsing('--port 4500') { options[:drb_port].should == '4500' }
74
+ end
75
+ end
76
+
77
+ context '-f FORMAT or --format FORMAT' do
78
+ it "defaults the output for the formatter to the output stream (STDOUT)" do
79
+ after_parsing('-f pretty') { options[:formats].should == [['pretty', output_stream]] }
80
+ end
81
+ end
82
+
83
+ context '-o [FILE|DIR] or --out [FILE|DIR]' do
84
+ it "defaults the formatter to 'pretty' when not specified earlier" do
85
+ after_parsing('-o file.txt') { options[:formats].should == [['pretty', 'file.txt']] }
86
+ end
87
+ it "sets the output for the formatter defined immediatly before it" do
88
+ after_parsing('-f profile --out file.txt -f pretty -o file2.txt') do
89
+ options[:formats].should == [['profile', 'file.txt'], ['pretty', 'file2.txt']]
90
+ end
91
+ end
92
+ end
93
+
94
+ context '-t TAGS --tags TAGS' do
95
+ it "removes the @ prefix" do
96
+ after_parsing('-t @foo,bar') { options[:include_tags].should == {'foo' => nil, 'bar' => nil} }
97
+ end
98
+ it "designates tags prefixed with ~ as tags to be excluded" do
99
+ after_parsing('--tags ~@foo,bar') { options[:exclude_tags].should == {'foo' => nil} }
100
+ end
101
+ end
102
+
103
+ context '-n NAME or --name NAME' do
104
+ it "stores the provided names as regular expressions" do
105
+ after_parsing('-n foo --name bar') { options[:name_regexps].should == [/foo/,/bar/] }
106
+ end
107
+ end
108
+
109
+ context '-e PATTERN or --exclude PATTERN' do
110
+ it "stores the provided exclusions as regular expressions" do
111
+ after_parsing('-e foo --exclude bar') { options[:excludes].should == [/foo/,/bar/] }
112
+ end
113
+ end
114
+
115
+ context '-p PROFILE or --profile PROFILE' do
116
+
117
+ it "notifies the user that an individual profile is being used" do
118
+ given_cucumber_yml_defined_as({'foo' => [1,2,3]})
119
+ options.parse!(%w{--profile foo})
120
+ output_stream.string.should =~ /Using the foo profile...\n/
121
+ end
122
+
123
+ it "notifies the user when multiple profiles are being used" do
124
+ given_cucumber_yml_defined_as({'foo' => [1,2,3], 'bar' => ['v'], 'dog' => ['v']})
125
+ options.parse!(%w{--profile foo --profile bar --profile dog})
126
+ output_stream.string.should =~ /Using the foo, bar and dog profiles...\n/
127
+ end
128
+
129
+ it "notifies the user of all profiles being used, even when they are nested" do
130
+ given_cucumber_yml_defined_as('foo' => '-p bar', 'bar' => 'features')
131
+ after_parsing('-p foo') do
132
+ output_stream.string.should =~ /Using the foo and bar profiles.../
133
+ end
134
+ end
135
+
136
+ it "uses the default profile passed in during initialization if none are specified by the user" do
137
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
138
+
139
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
140
+ options.parse!(%w{--format progress})
141
+ options[:require].should include('some_file')
142
+ end
143
+
144
+ it "merges all uniq values from both cmd line and the profile" do
145
+ given_cucumber_yml_defined_as('foo' => %w[--verbose])
146
+ options.parse!(%w[--wip --profile foo])
147
+ options[:wip].should be_true
148
+ options[:verbose].should be_true
149
+ end
150
+
151
+ it "gives precendene to the origianl options' paths" do
152
+ given_cucumber_yml_defined_as('foo' => %w[features])
153
+ options.parse!(%w[my.feature -p foo])
154
+ options[:paths].should == %w[my.feature]
155
+ end
156
+
157
+ it "combines the require files of both" do
158
+ given_cucumber_yml_defined_as('bar' => %w[--require features -r dog.rb])
159
+ options.parse!(%w[--require foo.rb -p bar])
160
+ options[:require].should == %w[foo.rb features dog.rb]
161
+ end
162
+
163
+ it "combines the include_tags of both" do
164
+ given_cucumber_yml_defined_as('baz' => %w[-t bar])
165
+ options.parse!(%w[--tags foo -p baz])
166
+ options[:include_tags].should == {'foo' => nil, 'bar' => nil}
167
+ end
168
+
169
+ it "combines the exclude_tags of both" do
170
+ given_cucumber_yml_defined_as('baz' => %w[-t ~bar])
171
+ options.parse!(%w[--tags ~foo -p baz])
172
+ options[:exclude_tags].should == {'foo' => nil, 'bar' => nil}
173
+ end
174
+
175
+ it "only takes the paths from the original options, and disgregards the profiles" do
176
+ given_cucumber_yml_defined_as('baz' => %w[features])
177
+ options.parse!(%w[my.feature -p baz])
178
+ options[:paths].should == ['my.feature']
179
+ end
180
+
181
+ it "uses the paths from the profile when none are specified originally" do
182
+ given_cucumber_yml_defined_as('baz' => %w[some.feature])
183
+ options.parse!(%w[-p baz])
184
+ options[:paths].should == ['some.feature']
185
+ end
186
+
187
+ it "combines environment variables from the profile but gives precendene to cmd line args" do
188
+ given_cucumber_yml_defined_as('baz' => %w[FOO=bar CHEESE=swiss])
189
+ options.parse!(%w[-p baz CHEESE=cheddar BAR=foo])
190
+ options[:env_vars].should == {'BAR' => 'foo', 'FOO' => 'bar', 'CHEESE' => 'cheddar'}
191
+ end
192
+
193
+ it "disregards STDOUT formatter defined in profile when another is passed in (via cmd line)" do
194
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
195
+ options.parse!(%w{--format progress --profile foo})
196
+ options[:formats].should == [['progress', output_stream]]
197
+ end
198
+
199
+ it "includes any non-STDOUT formatters from the profile" do
200
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html]})
201
+ options.parse!(%w{--format progress --profile html})
202
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
203
+ end
204
+
205
+ it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
206
+ given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
207
+ options.parse!(%w{--profile html})
208
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
209
+ end
210
+
211
+ it "respects --quiet when defined in the profile" do
212
+ given_cucumber_yml_defined_as('foo' => '-q')
213
+ options.parse!(%w[-p foo])
214
+ options[:snippets].should be_false
215
+ options[:source].should be_false
216
+ end
217
+
218
+ it "uses the language from profile when none is specified on the command line" do
219
+ given_cucumber_yml_defined_as({'foo' => '--language fr'})
220
+ after_parsing('-p foo') {options[:lang].should == 'fr'}
221
+ end
222
+ end
223
+
224
+ context '-P or --no-profile' do
225
+
226
+ it "disables profiles" do
227
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
228
+
229
+ after_parsing("-P --require some_file.rb") do
230
+ options[:require].should == ['some_file.rb']
231
+ end
232
+ end
233
+
234
+ it "notifies the user that the profiles are being disabled" do
235
+ given_cucumber_yml_defined_as({'default' => '-v'})
236
+
237
+ after_parsing("--no-profile --require some_file.rb") do
238
+ output_stream.string.should =~ /Disabling profiles.../
239
+ end
240
+ end
241
+
242
+ end
243
+
244
+ context '-b or --backtrace' do
245
+ it "turns on cucumber's full backtrace" do
246
+ when_parsing("-b") do
247
+ Cucumber.should_receive(:use_full_backtrace=).with(true)
248
+ end
249
+ end
250
+ end
251
+
252
+ context '--version' do
253
+ it "displays Cucumber's version" do
254
+ after_parsing('--version') do
255
+ output_stream.string.should =~ /#{VERSION::STRING}/
256
+ end
257
+ end
258
+ it "exits the program" do
259
+ when_parsing('--version') { Kernel.should_receive(:exit) }
260
+ end
261
+ end
262
+
263
+ context 'environment variables (i.e. MODE=webrat)' do
264
+ it "places all of the environment variables into a hash" do
265
+ after_parsing('MODE=webrat FOO=bar') do
266
+ options[:env_vars].should == {'MODE' => 'webrat', 'FOO' => 'bar'}
267
+ end
268
+ end
269
+ end
270
+
271
+ it "assigns any extra arguments as paths to features" do
272
+ after_parsing('-f pretty my_feature.feature my_other_features') do
273
+ options[:paths].should == ['my_feature.feature', 'my_other_features']
274
+ end
275
+ end
276
+
277
+ it "does not mistake environment variables as feature paths" do
278
+ after_parsing('my_feature.feature FOO=bar') do
279
+ options[:paths].should == ['my_feature.feature']
280
+ end
281
+ end
282
+ end
283
+
284
+ describe '#expanded_args_without_drb' do
285
+ it "returns the orginal args in additon to the args from any profiles" do
286
+ given_cucumber_yml_defined_as('foo' => '-v',
287
+ 'bar' => '--wip -p baz',
288
+ 'baz' => '-r some_file.rb')
289
+ options.parse!(%w[features -p foo --profile bar])
290
+
291
+ options.expanded_args_without_drb.should == %w[features -v --wip -r some_file.rb --no-profile]
292
+ end
293
+
294
+ it "removes the --drb flag so that the args can be safely passed to the drb server" do
295
+ given_cucumber_yml_defined_as('default' => 'features -f pretty --drb')
296
+ options.parse!(%w[--profile default])
297
+
298
+ options.expanded_args_without_drb.should == %w[features -f pretty --no-profile]
299
+ end
300
+
301
+ it "contains the environment variables" do
302
+ options.parse!(%w[features FOO=bar])
303
+ options.expanded_args_without_drb.should == %w[features FOO=bar --no-profile]
304
+ end
305
+
306
+ it "ignores the paths from the profiles if one was specified on the command line" do
307
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
308
+ options.parse!(%w[some_feature.feature -p foo])
309
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
310
+ end
311
+
312
+
313
+ it "appends the --no-profile flag so that the DRb server doesn't reload the profiles" do
314
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
315
+ options.parse!(%w[some_feature.feature -p foo])
316
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
317
+ end
318
+
319
+ it "does not append --no-profile if already present" do
320
+ options.parse!(%w[some_feature.feature -P])
321
+ options.expanded_args_without_drb.should == %w[some_feature.feature -P]
322
+ end
323
+
324
+
325
+ end
326
+
327
+ end
328
+
329
+ end
330
+ end
331
+
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe ProfileLoader do
7
+ it "should have all of its specs migrated from configuration_spec"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/core_ext/proc'
3
+
4
+ describe Proc do
5
+ it "should remove extraneous path info for file" do
6
+ proc = lambda {|a,b|}
7
+ proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:6/
8
+ end
9
+
10
+ it "should raise ArityMismatchError for too many args (expecting 0)" do
11
+ lambda {
12
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do
13
+ end
14
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
15
+ end
16
+
17
+ it "should raise ArityMismatchError for too many args (expecting 1)" do
18
+ lambda {
19
+ Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
20
+ end
21
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
22
+ end
23
+
24
+ it "should raise ArityMismatchError for too few args (expecting 1)" do
25
+ lambda {
26
+ Object.new.cucumber_instance_exec(true, 'foo') do |a|
27
+ end
28
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
29
+ end
30
+
31
+ it "should raise ArityMismatchError for too few args (expecting 2)" do
32
+ lambda {
33
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
34
+ end
35
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
36
+ end
37
+
38
+ if Cucumber::RUBY_1_9
39
+ it "should allow varargs (expecting 0+)" do
40
+ lambda {
41
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
42
+ end
43
+ }.should_not raise_error(Cucumber::ArityMismatchError)
44
+ end
45
+ else
46
+ # Ruby 1.8
47
+ it "should not allow varargs 0+ because Ruby 1.8 reports same arity as with no args, so we can't really tell the difference." do
48
+ lambda {
49
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
50
+ end
51
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
52
+ end
53
+ end
54
+
55
+ it "should allow varargs (expecting 1+)" do
56
+ lambda {
57
+ Object.new.cucumber_instance_exec(true, 'foo', 1) do |arg,*args|
58
+ end
59
+ }.should_not raise_error(Cucumber::ArityMismatchError)
60
+ end
61
+
62
+ it "should raise ArityMismatchError for too few required args when using varargs (expecting 1+)" do
63
+ lambda {
64
+ Object.new.cucumber_instance_exec(true, nil) do |arg,*args|
65
+ end
66
+ }.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1+ arguments, but the Regexp matched 0 arguments.")
67
+ end
68
+ end
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + '/../../../lib/cucumber/core_ext/string'
3
+
4
+ describe String, "#gzub" do
5
+ it "should format groups with format string" do
6
+ "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
7
+ "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
8
+ end
9
+
10
+ it "should format groups with format string when there are dupes" do
11
+ "I bob 1 bo this bobs".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
12
+ "I <span>bob</span> <span>1</span> <span>bo</span> this <span>bobs</span>"
13
+ end
14
+
15
+ it "should format groups with block" do
16
+ f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
17
+ "<span>#{m}</span>"
18
+ end
19
+ f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
20
+ end
21
+
22
+ it "should format groups with proc object" do
23
+ proc = lambda do |m|
24
+ "<span>#{m}</span>"
25
+ end
26
+ f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, proc)
27
+ f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
28
+ end
29
+
30
+ it "should format groups with block with not all placeholders having a value" do
31
+ f = "another member named Bob joins the group".gzub(/(a|another) (user|member) named ([^ ]+)( who is not logged in)?/) do |m|
32
+ "<span>#{m}</span>"
33
+ end
34
+ f.should == "<span>another</span> <span>member</span> named <span>Bob</span> joins the group"
35
+ end
36
+
37
+ it "should format match groups in a textile table row" do
38
+ f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
39
+ "<span>#{m}</span>"
40
+ end
41
+ f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/ansicolor'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe ANSIColor do
7
+ include ANSIColor
8
+
9
+ it "should wrap passed_param with bold green and reset to green" do
10
+ passed_param("foo").should == "\e[32m\e[1mfoo\e[0m\e[0m\e[32m"
11
+ end
12
+
13
+ it "should wrap passed in green" do
14
+ passed("foo").should == "\e[32mfoo\e[0m"
15
+ end
16
+
17
+ it "should not reset passed if there are no arguments" do
18
+ passed.should == "\e[32m"
19
+ end
20
+
21
+ it "should wrap comments in grey" do
22
+ comment("foo").should == "\e[90mfoo\e[0m"
23
+ end
24
+
25
+ it "should not generate ansi codes when colors are disabled" do
26
+ ::Term::ANSIColor.coloring = false
27
+ passed("foo").should == "foo"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/color_io'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe ColorIO do
7
+ describe "<<" do
8
+ it "should convert to a print using kernel" do
9
+ color_io = ColorIO.new
10
+
11
+ Kernel.should_receive(:print).with("monkeys")
12
+
13
+ color_io << "monkeys"
14
+ end
15
+
16
+ it "should allow chained <<" do
17
+ color_io = ColorIO.new
18
+
19
+ Kernel.should_receive(:print).with("monkeys")
20
+ Kernel.should_receive(:print).with(" are tasty")
21
+
22
+ color_io << "monkeys" << " are tasty"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/duration'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe Duration do
7
+ include Duration
8
+
9
+ it "should format ms" do
10
+ format_duration(0.002103).should == '0m0.002s'
11
+ end
12
+
13
+ it "should format m" do
14
+ format_duration(61.002503).should == '1m1.003s'
15
+ end
16
+
17
+ it "should format h" do
18
+ format_duration(3661.002503).should == '61m1.003s'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/html'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe Html do
7
+ before(:each) do
8
+ @out = StringIO.new
9
+ @html = Html.new(mock("step mother"), @out, {})
10
+ end
11
+
12
+ it "should not raise an error when visiting a blank feature name" do
13
+ lambda { @html.visit_feature_name("") }.should_not raise_error
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/progress'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ describe Progress do
7
+
8
+ before(:each) do
9
+ Term::ANSIColor.coloring = false
10
+ @out = StringIO.new
11
+ @progress = Progress.new(mock("step mother"), @out, {})
12
+ end
13
+
14
+ describe "visiting a table cell value without a status" do
15
+ it "should take the status from the last run step" do
16
+ @progress.visit_step_result('', '', nil, :failed, nil, 10, nil)
17
+ @progress.visit_table_cell_value('value', nil)
18
+
19
+ @out.string.should == "FF"
20
+ end
21
+ end
22
+
23
+ describe "visiting a table cell which is a table header" do
24
+ it "should not output anything" do
25
+ @progress.visit_table_cell_value('value', :skipped_param)
26
+
27
+ @out.string.should == ""
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end