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,66 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/core_ext/string'
5
+
6
+ module Cucumber
7
+ module Ast
8
+ describe Step do
9
+ it "should replace arguments in name" do
10
+ step = Step.new(1, 'Given', 'a <color> cucumber')
11
+
12
+ invocation_table = Table.new([
13
+ %w{color taste},
14
+ %w{green juicy}
15
+ ])
16
+ cells = invocation_table.cells_rows[1]
17
+ step_invocation = step.step_invocation_from_cells(cells)
18
+
19
+ step_invocation.name.should == 'a green cucumber'
20
+ end
21
+
22
+ it "should use empty string for the replacement of arguments in name when replace value is nil" do
23
+ step = Step.new(1, 'Given', 'a <color>cucumber')
24
+
25
+ invocation_table = Table.new([
26
+ ['color'],
27
+ [nil]
28
+ ])
29
+ cells = invocation_table.cells_rows[1]
30
+ step_invocation = step.step_invocation_from_cells(cells)
31
+
32
+ step_invocation.name.should == 'a cucumber'
33
+ end
34
+
35
+ it "should replace arguments in table arg" do
36
+ arg_table = Table.new([%w{taste_<taste> color_<color>}])
37
+
38
+ step = Step.new(1, 'Given', 'a <color> cucumber', arg_table)
39
+
40
+ invocation_table = Table.new([
41
+ %w{color taste},
42
+ %w{green juicy}
43
+ ])
44
+ cells = invocation_table.cells_rows[1]
45
+ step_invocation = step.step_invocation_from_cells(cells)
46
+
47
+ step_invocation.instance_variable_get('@multiline_arg').raw.should == [%w{taste_juicy color_green}]
48
+ end
49
+
50
+ it "should replace arguments in py string arg" do
51
+ py_string = PyString.new(1, 2, 'taste_<taste> color_<color>', 0)
52
+
53
+ step = Step.new(1, 'Given', 'a <color> cucumber', py_string)
54
+
55
+ invocation_table = Table.new([
56
+ %w{color taste},
57
+ %w{green juicy}
58
+ ])
59
+ cells = invocation_table.cells_rows[1]
60
+ step_invocation = step.step_invocation_from_cells(cells)
61
+
62
+ step_invocation.instance_variable_get('@multiline_arg').to_s.should == 'taste_juicy color_green'
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,186 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/ast/table'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ describe Table do
7
+ before do
8
+ @table = Table.new([
9
+ %w{one four seven},
10
+ %w{4444 55555 666666}
11
+ ])
12
+ def @table.cells_rows; super; end
13
+ def @table.columns; super; end
14
+ end
15
+
16
+ it "should have rows" do
17
+ @table.cells_rows[0].map{|cell| cell.value}.should == %w{one four seven}
18
+ end
19
+
20
+ it "should have columns" do
21
+ @table.columns[1].map{|cell| cell.value}.should == %w{four 55555}
22
+ end
23
+
24
+ it "should have headers" do
25
+ @table.headers.should == %w{one four seven}
26
+ end
27
+
28
+ it "should have same cell objects in rows and columns" do
29
+ # 666666
30
+ @table.cells_rows[1].__send__(:[], 2).should equal(@table.columns[2].__send__(:[], 1))
31
+ end
32
+
33
+ it "should know about max width of a row" do
34
+ @table.columns[1].__send__(:width).should == 5
35
+ end
36
+
37
+ it "should be convertible to an array of hashes" do
38
+ @table.hashes.should == [
39
+ {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
40
+ ]
41
+ end
42
+
43
+ it "should accept symbols as keys for the hashes" do
44
+ @table.hashes.first[:one].should == '4444'
45
+ end
46
+
47
+ it "should allow map'ing columns" do
48
+ @table.map_column!('one') { |v| v.to_i }
49
+ @table.hashes.first['one'].should == 4444
50
+ end
51
+
52
+ it "should pass silently if a mapped column does not exist in non-strict mode" do
53
+ lambda {
54
+ @table.map_column!('two', false) { |v| v.to_i }
55
+ }.should_not raise_error
56
+ end
57
+
58
+ it "should fail if a mapped column does not exist in strict mode" do
59
+ lambda {
60
+ @table.map_column!('two', true) { |v| v.to_i }
61
+ }.should raise_error('The column named "two" does not exist')
62
+ end
63
+
64
+ describe "#transpose" do
65
+ before(:each) do
66
+ @table = Table.new([
67
+ %w{one 1111},
68
+ %w{two 22222}
69
+ ])
70
+ end
71
+
72
+ it "should be convertible in to an array where each row is a hash" do
73
+ @table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
74
+ end
75
+ end
76
+
77
+ describe "#rows_hash" do
78
+
79
+ it "should return a hash of the rows" do
80
+ table = Table.new([
81
+ %w{one 1111},
82
+ %w{two 22222}
83
+ ])
84
+ table.rows_hash.should == {'one' => '1111', 'two' => '22222'}
85
+ end
86
+
87
+ it "should fail if the table doesn't have two columns" do
88
+ faulty_table = Table.new([
89
+ %w{one 1111 abc},
90
+ %w{two 22222 def}
91
+ ])
92
+ lambda {
93
+ faulty_table.rows_hash
94
+ }.should raise_error('The table must have exactly 2 columns')
95
+ end
96
+ end
97
+
98
+ it "should allow renaming columns" do
99
+ table2 = @table.map_headers('one' => :three)
100
+ table2.hashes.first[:three].should == '4444'
101
+ end
102
+
103
+ it "should copy column mappings when mapping headers" do
104
+ @table.map_column!('one') { |v| v.to_i }
105
+ table2 = @table.map_headers('one' => 'three')
106
+ table2.hashes.first['three'].should == 4444
107
+ end
108
+
109
+ describe "replacing arguments" do
110
+
111
+ before(:each) do
112
+ @table = Table.new([
113
+ %w{qty book},
114
+ %w{<qty> <book>}
115
+ ])
116
+ end
117
+
118
+ it "should return a new table with arguments replaced with values" do
119
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => 'Unbearable lightness of being', '<qty>' => '5'})
120
+
121
+ table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
122
+ table_with_replaced_args.hashes[0]['qty'].should == '5'
123
+ end
124
+
125
+ it "should recognise when entire cell is delimited" do
126
+ @table.should have_text('<book>')
127
+ end
128
+
129
+ it "should recognise when just a subset of a cell is delimited" do
130
+ table = Table.new([
131
+ %w{qty book},
132
+ [nil, "This is <who>'s book"]
133
+ ])
134
+ table.should have_text('<who>')
135
+ end
136
+
137
+ it "should replace nil values with nil" do
138
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => nil})
139
+
140
+ table_with_replaced_args.hashes[0]['book'].should == nil
141
+ end
142
+
143
+ it "should preserve values which don't match a placeholder when replacing with nil" do
144
+ table = Table.new([
145
+ %w{book},
146
+ %w{cat}
147
+ ])
148
+ table_with_replaced_args = table.arguments_replaced({'<book>' => nil})
149
+
150
+ table_with_replaced_args.hashes[0]['book'].should == 'cat'
151
+ end
152
+
153
+ it "should not change the original table" do
154
+ @table.arguments_replaced({'<book>' => 'Unbearable lightness of being'})
155
+
156
+ @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
157
+ end
158
+
159
+ it "should not raise an error when there are nil values in the table" do
160
+ table = Table.new([
161
+ ['book', 'qty'],
162
+ ['<book>', nil],
163
+ ])
164
+ lambda{
165
+ table.arguments_replaced({'<book>' => nil, '<qty>' => '5'})
166
+ }.should_not raise_error
167
+ end
168
+
169
+ end
170
+
171
+ it "should convert to sexp" do
172
+ @table.to_sexp.should ==
173
+ [:table,
174
+ [:row, -1,
175
+ [:cell, "one"],
176
+ [:cell, "four"],
177
+ [:cell, "seven"]
178
+ ],
179
+ [:row, -1,
180
+ [:cell, "4444"],
181
+ [:cell, "55555"],
182
+ [:cell, "666666"]]]
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+
5
+ module Cucumber
6
+ module Ast
7
+ describe Visitor do
8
+
9
+ it "should support checking scenario name matches regexps" do
10
+ visitor = Visitor.new(mock("step mother"))
11
+ scenario = Scenario.new(background=nil,
12
+ comment=Comment.new(""),
13
+ tags=Tags.new(0, []),
14
+ line=99,
15
+ keyword="",
16
+ name="test name",
17
+ steps=[])
18
+
19
+ visitor.options = {:name_regexps => [/name/]}
20
+
21
+ visitor.matches_scenario_names?(scenario).should be_true
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module Cucumber
4
+ describe Broadcaster do
5
+ before do
6
+ @receiver = mock('receiver')
7
+ @broadcaster = Broadcaster.new([@receiver])
8
+ end
9
+
10
+ it "should broadcast methods to registered objects" do
11
+ @receiver.should_receive(:konbanwa).with('good evening')
12
+ @broadcaster.konbanwa('good evening')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,396 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Configuration 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
+ def given_the_following_files(*files)
15
+ File.stub!(:directory?).and_return(true)
16
+ Dir.stub!(:[]).and_return(files)
17
+ end
18
+
19
+ before(:each) do
20
+ Kernel.stub!(:exit).and_return(nil)
21
+ end
22
+
23
+ it "should require files in support paths first" do
24
+ given_the_following_files("/features/step_definitions/foo.rb","/features/support/bar.rb")
25
+
26
+ config = Configuration.new(StringIO.new)
27
+ config.parse!(%w{--require /features})
28
+
29
+ config.files_to_require.should == [
30
+ "/features/support/bar.rb",
31
+ "/features/step_definitions/foo.rb"
32
+ ]
33
+ end
34
+
35
+ it "should require env.rb files first" do
36
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
37
+
38
+ config = Configuration.new(StringIO.new)
39
+ config.parse!(%w{--require /features})
40
+
41
+ config.files_to_require.should == [
42
+ "/features/support/env.rb",
43
+ "/features/support/a_file.rb"
44
+ ]
45
+ end
46
+
47
+ it "should not require env.rb files when --dry-run" do
48
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
49
+
50
+ config = Configuration.new(StringIO.new)
51
+ config.parse!(%w{--require /features --dry-run})
52
+
53
+ config.files_to_require.should == [
54
+ "/features/support/a_file.rb"
55
+ ]
56
+ end
57
+
58
+ describe "--exclude" do
59
+
60
+ it "excludes a ruby file from requiring when the name matches exactly" do
61
+ given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
62
+
63
+ config = Configuration.new(StringIO.new)
64
+ config.parse!(%w{--require /features --exclude a_file.rb})
65
+
66
+ config.files_to_require.should == [
67
+ "/features/support/env.rb"
68
+ ]
69
+ end
70
+
71
+ it "excludes all ruby files that match the provided patterns from requiring" do
72
+ given_the_following_files("/features/support/foof.rb","/features/support/bar.rb",
73
+ "/features/support/food.rb","/features/blah.rb",
74
+ "/features/support/fooz.rb")
75
+
76
+ config = Configuration.new(StringIO.new)
77
+ config.parse!(%w{--require /features --exclude foo[df] --exclude blah})
78
+
79
+ config.files_to_require.should == [
80
+ "/features/support/bar.rb",
81
+ "/features/support/fooz.rb"
82
+ ]
83
+ end
84
+ end
85
+
86
+ describe '#drb?' do
87
+ it "indicates whether the --drb flag was passed in or not" do
88
+ config = Configuration.new(StringIO.new)
89
+
90
+ config.parse!(%w{features})
91
+ config.drb?.should == false
92
+
93
+
94
+ config.parse!(%w{features --drb})
95
+ config.drb?.should == true
96
+ end
97
+ end
98
+
99
+ context '--drb' do
100
+ it "removes the --drb flag from the args" do
101
+ config = Configuration.new(StringIO.new)
102
+
103
+ args = %w{features --drb}
104
+ config.parse!(args)
105
+ args.should == %w{features}
106
+ end
107
+
108
+ it "keeps all other flags intact" do
109
+ config = Configuration.new(StringIO.new)
110
+
111
+ args = %w{features --drb --format profile}
112
+ config.parse!(args)
113
+ args.should == %w{features --format profile}
114
+ end
115
+
116
+ end
117
+
118
+ context '--drb in a profile' do
119
+ it "removes the --drb flag from the args" do
120
+ given_cucumber_yml_defined_as({'server' => '--drb features'})
121
+ config = Configuration.new(StringIO.new)
122
+
123
+ args = %w{--profile server}
124
+ config.parse!(args)
125
+ args.should == %w{features}
126
+ end
127
+
128
+ it "keeps all other flags intact from all profiles involved" do
129
+ given_cucumber_yml_defined_as({'server' => '--drb features --profile nested',
130
+ 'nested' => '--verbose'})
131
+
132
+ config = Configuration.new(StringIO.new)
133
+
134
+ args = %w{--profile server --format profile}
135
+ config.parse!(args)
136
+ args.should == %w{features --verbose --format profile}
137
+ end
138
+
139
+ end
140
+
141
+ context '--drb in the default profile and no arguments specified' do
142
+ it "expands the profile's arguments into the args excpet for --drb" do
143
+ given_cucumber_yml_defined_as({'default' => '--drb features --format pretty'})
144
+ config = Configuration.new(StringIO.new)
145
+ args = []
146
+ config.parse!(args)
147
+ args.should == %w{features --format pretty}
148
+ end
149
+ end
150
+
151
+ it "should expand args from YAML file" do
152
+ given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
153
+
154
+ config = Configuration.new
155
+ config.parse!(%w{--format progress --profile bongo})
156
+ config.options[:formats].should == [['progress', STDOUT]]
157
+ config.options[:require].should == ['from/yml']
158
+ end
159
+
160
+ it "should expand args from YAML file's default if there are no args" do
161
+ given_cucumber_yml_defined_as({'default' => '--require from/yml'})
162
+
163
+ config = Configuration.new
164
+ config.parse!([])
165
+ config.options[:require].should == ['from/yml']
166
+ end
167
+
168
+ it "should provide a helpful error message when a specified profile does not exists in YAML file" do
169
+ given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
170
+
171
+ config = Configuration.new(StringIO.new, error = StringIO.new)
172
+ expected_message = <<-END_OF_MESSAGE
173
+ Could not find profile: 'i_do_not_exist'
174
+
175
+ Defined profiles in cucumber.yml:
176
+ * default
177
+ * html_report
178
+ END_OF_MESSAGE
179
+
180
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_message)
181
+ end
182
+
183
+ it "should allow array as profile" do
184
+ given_cucumber_yml_defined_as({'foo' => [1,2,3]})
185
+
186
+ config = Configuration.new(StringIO.new, error = StringIO.new)
187
+ config.parse!(%w{--profile foo})
188
+ config.paths.should == [1,2,3]
189
+ end
190
+
191
+ it "should provide a helpful error message when a specified profile exists but is nil or blank" do
192
+ [nil, ' '].each do |bad_input|
193
+ given_cucumber_yml_defined_as({'foo' => bad_input})
194
+
195
+ config = Configuration.new(StringIO.new, error = StringIO.new)
196
+ expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
197
+ lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
198
+ end
199
+ end
200
+
201
+ it "should provide a helpful error message when no YAML file exists and a profile is specified" do
202
+ File.should_receive(:exist?).with('cucumber.yml').and_return(false)
203
+
204
+ config = Configuration.new(StringIO.new, error = StringIO.new)
205
+ expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
206
+ lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
207
+ end
208
+
209
+ it "should provide a helpful error message when cucumber.yml is blank or malformed" do
210
+ expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
211
+
212
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
213
+ given_cucumber_yml_defined_as(bad_input)
214
+
215
+ config = Configuration.new(StringIO.new, error = StringIO.new)
216
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
217
+ end
218
+ end
219
+
220
+ it "should procide a helpful error message when the YAML can not be parsed" do
221
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
222
+
223
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
224
+ YAML.should_receive(:load).and_raise ArgumentError
225
+
226
+ config = Configuration.new(StringIO.new, error = StringIO.new)
227
+ lambda{config.parse!([])}.should raise_error(expected_error_message)
228
+ end
229
+
230
+ it "should accept --dry-run option" do
231
+ config = Configuration.new(StringIO.new)
232
+ config.parse!(%w{--dry-run})
233
+ config.options[:dry_run].should be_true
234
+ end
235
+
236
+ it "should accept --no-source option" do
237
+ config = Configuration.new
238
+ config.parse!(%w{--no-source})
239
+
240
+ config.options[:source].should be_false
241
+ end
242
+
243
+ it "should accept --no-snippets option" do
244
+ config = Configuration.new
245
+ config.parse!(%w{--no-snippets})
246
+
247
+ config.options[:snippets].should be_false
248
+ end
249
+
250
+ it "should set snippets and source to false with --quiet option" do
251
+ config = Configuration.new
252
+ config.parse!(%w{--quiet})
253
+
254
+ config.options[:snippets].should be_nil
255
+ config.options[:source].should be_nil
256
+ end
257
+
258
+ it "should accept --verbose option" do
259
+ config = Configuration.new
260
+ config.parse!(%w{--verbose})
261
+
262
+ config.options[:verbose].should be_true
263
+ end
264
+
265
+ it "should accept --out option" do
266
+ config = Configuration.new(StringIO.new)
267
+ config.parse!(%w{--out jalla.txt})
268
+ config.options[:formats].should == [['pretty', 'jalla.txt']]
269
+ end
270
+
271
+ it "should accept multiple --out options" do
272
+ config = Configuration.new(StringIO.new)
273
+ config.parse!(%w{--format progress --out file1 --out file2})
274
+ config.options[:formats].should == [['progress', 'file2']]
275
+ end
276
+
277
+ it "should accept multiple --format options and put the STDOUT one first so progress is seen" do
278
+ io = StringIO.new
279
+ config = Configuration.new(io)
280
+ config.parse!(%w{--format pretty --out pretty.txt --format progress})
281
+ config.options[:formats].should == [['progress', io], ['pretty', 'pretty.txt']]
282
+ end
283
+
284
+ it "should not accept multiple --format options when both use implicit STDOUT" do
285
+ io = StringIO.new
286
+ config = Configuration.new(io)
287
+ lambda do
288
+ config.parse!(%w{--format pretty --format progress})
289
+ end.should raise_error("All but one formatter must use --out, only one can print to STDOUT")
290
+ end
291
+
292
+ it "should associate --out to previous --format" do
293
+ config = Configuration.new(StringIO.new)
294
+ config.parse!(%w{--format progress --out file1 --format profile --out file2})
295
+ config.options[:formats].should == [["progress", "file1"], ["profile" ,"file2"]]
296
+ end
297
+
298
+ it "should accept --color option" do
299
+ Term::ANSIColor.should_receive(:coloring=).with(true)
300
+ config = Configuration.new(StringIO.new)
301
+ config.parse!(['--color'])
302
+ end
303
+
304
+ it "should accept --no-color option" do
305
+ Term::ANSIColor.should_receive(:coloring=).with(false)
306
+ config = Configuration.new(StringIO.new)
307
+ config.parse!(['--no-color'])
308
+ end
309
+
310
+ it "should parse tags" do
311
+ config = Configuration.new(nil)
312
+ includes, excludes = config.parse_tags("one,~two,@three,~@four")
313
+ includes.should == ['one', 'three']
314
+ excludes.should == ['two', 'four']
315
+ end
316
+
317
+ describe "--backtrace" do
318
+ before do
319
+ Exception.cucumber_full_backtrace = false
320
+ end
321
+
322
+ it "should show full backtrace when --backtrace is present" do
323
+ config = Main.new(['--backtrace'])
324
+ begin
325
+ "x".should == "y"
326
+ rescue => e
327
+ e.backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
328
+ end
329
+ end
330
+
331
+ after do
332
+ Exception.cucumber_full_backtrace = false
333
+ end
334
+ end
335
+
336
+ describe "diff output" do
337
+
338
+ it "is enabled by default" do
339
+ config = Configuration.new
340
+ config.diff_enabled?.should be_true
341
+ end
342
+
343
+ it "is disabled when the --no-diff option is supplied" do
344
+ config = Configuration.new
345
+ config.parse!(%w{--no-diff})
346
+
347
+ config.diff_enabled?.should be_false
348
+ end
349
+
350
+ end
351
+
352
+ it "should accept multiple --name options" do
353
+ config = Configuration.new
354
+ config.parse!(['--name', "User logs in", '--name', "User signs up"])
355
+
356
+ config.options[:name_regexps].should include(/User logs in/)
357
+ config.options[:name_regexps].should include(/User signs up/)
358
+ end
359
+
360
+ it "should accept multiple -n options" do
361
+ config = Configuration.new
362
+ config.parse!(['-n', "User logs in", '-n', "User signs up"])
363
+
364
+ config.options[:name_regexps].should include(/User logs in/)
365
+ config.options[:name_regexps].should include(/User signs up/)
366
+ end
367
+
368
+ it "should search for all features in the specified directory" do
369
+ File.stub!(:directory?).and_return(true)
370
+ Dir.should_receive(:[]).with("feature_directory/**/*.feature").
371
+ any_number_of_times.and_return(["cucumber.feature"])
372
+
373
+ config = Configuration.new(StringIO)
374
+ config.parse!(%w{feature_directory/})
375
+
376
+ config.feature_files.should == ["cucumber.feature"]
377
+ end
378
+
379
+ it "should allow specifying environment variables on the command line" do
380
+ config = Configuration.new
381
+ config.parse!(["foo=bar"])
382
+ ENV["foo"].should == "bar"
383
+ config.feature_files.should == []
384
+ end
385
+
386
+ it "should allow specifying environment variables in profiles" do
387
+ given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
388
+ config = Configuration.new
389
+ config.parse!(["--profile", "selenium"])
390
+ ENV["RAILS_ENV"].should == "selenium"
391
+ config.feature_files.should == []
392
+ end
393
+
394
+ end
395
+ end
396
+ end