kbaum-cucumber 0.4.5.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +18 -0
  3. data/Caliper.yml +5 -0
  4. data/History.txt +1292 -0
  5. data/LICENSE +22 -0
  6. data/README.rdoc +26 -0
  7. data/Rakefile +63 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/cucumber +16 -0
  10. data/cucumber.gemspec +741 -0
  11. data/cucumber.yml +10 -0
  12. data/examples/dos_line_endings/Rakefile +6 -0
  13. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  14. data/examples/i18n/README.textile +18 -0
  15. data/examples/i18n/Rakefile +32 -0
  16. data/examples/i18n/ar/Rakefile +6 -0
  17. data/examples/i18n/ar/features/addition.feature +17 -0
  18. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  19. data/examples/i18n/ar/lib/calculator.rb +11 -0
  20. data/examples/i18n/bg/Rakefile +6 -0
  21. data/examples/i18n/bg/features/addition.feature +12 -0
  22. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  23. data/examples/i18n/bg/features/division.feature +17 -0
  24. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  25. data/examples/i18n/bg/features/support/env.rb +6 -0
  26. data/examples/i18n/bg/features/support/world.rb +8 -0
  27. data/examples/i18n/bg/lib/calculator.rb +24 -0
  28. data/examples/i18n/cat/Rakefile +6 -0
  29. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  30. data/examples/i18n/cat/features/suma.feature +17 -0
  31. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  32. data/examples/i18n/da/Rakefile +6 -0
  33. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  34. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  35. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  36. data/examples/i18n/de/.gitignore +1 -0
  37. data/examples/i18n/de/Rakefile +6 -0
  38. data/examples/i18n/de/features/addition.feature +17 -0
  39. data/examples/i18n/de/features/division.feature +10 -0
  40. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  41. data/examples/i18n/de/lib/calculator.rb +14 -0
  42. data/examples/i18n/en-lol/Rakefile +4 -0
  43. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  44. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  45. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  46. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  47. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  48. data/examples/i18n/en/.gitignore +1 -0
  49. data/examples/i18n/en/Rakefile +6 -0
  50. data/examples/i18n/en/features/addition.feature +17 -0
  51. data/examples/i18n/en/features/division.feature +10 -0
  52. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  53. data/examples/i18n/en/lib/calculator.rb +14 -0
  54. data/examples/i18n/es/Rakefile +6 -0
  55. data/examples/i18n/es/features/adicion.feature +17 -0
  56. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  57. data/examples/i18n/es/lib/calculador.rb +14 -0
  58. data/examples/i18n/et/Rakefile +6 -0
  59. data/examples/i18n/et/features/jagamine.feature +10 -0
  60. data/examples/i18n/et/features/liitmine.feature +17 -0
  61. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  62. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  63. data/examples/i18n/fi/.gitignore +1 -0
  64. data/examples/i18n/fi/Rakefile +6 -0
  65. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  66. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  67. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  68. data/examples/i18n/fi/lib/laskin.rb +14 -0
  69. data/examples/i18n/fr/Rakefile +6 -0
  70. data/examples/i18n/fr/features/addition.feature +18 -0
  71. data/examples/i18n/fr/features/addition2.feature +17 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +38 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/.gitignore +1 -0
  80. data/examples/i18n/hu/Rakefile +6 -0
  81. data/examples/i18n/hu/features/addition.feature +17 -0
  82. data/examples/i18n/hu/features/division.feature +10 -0
  83. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  84. data/examples/i18n/hu/lib/calculator.rb +14 -0
  85. data/examples/i18n/id/.gitignore +1 -0
  86. data/examples/i18n/id/Rakefile +6 -0
  87. data/examples/i18n/id/features/addition.feature +17 -0
  88. data/examples/i18n/id/features/division.feature +10 -0
  89. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  90. data/examples/i18n/id/lib/calculator.rb +14 -0
  91. data/examples/i18n/it/Rakefile +6 -0
  92. data/examples/i18n/it/features/somma.feature +11 -0
  93. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  94. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  95. data/examples/i18n/ja/.gitignore +1 -0
  96. data/examples/i18n/ja/Rakefile +6 -0
  97. data/examples/i18n/ja/features/addition.feature +17 -0
  98. data/examples/i18n/ja/features/division.feature +10 -0
  99. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  100. data/examples/i18n/ja/lib/calculator.rb +14 -0
  101. data/examples/i18n/ko/.gitignore +1 -0
  102. data/examples/i18n/ko/Rakefile +6 -0
  103. data/examples/i18n/ko/features/addition.feature +17 -0
  104. data/examples/i18n/ko/features/division.feature +11 -0
  105. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  106. data/examples/i18n/ko/lib/calculator.rb +14 -0
  107. data/examples/i18n/lt/.gitignore +1 -0
  108. data/examples/i18n/lt/Rakefile +6 -0
  109. data/examples/i18n/lt/features/addition.feature +17 -0
  110. data/examples/i18n/lt/features/division.feature +10 -0
  111. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lt/lib/calculator.rb +14 -0
  113. data/examples/i18n/lv/Rakefile +6 -0
  114. data/examples/i18n/lv/features/addition.feature +17 -0
  115. data/examples/i18n/lv/features/division.feature +10 -0
  116. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  117. data/examples/i18n/lv/lib/calculator.rb +14 -0
  118. data/examples/i18n/no/Rakefile +6 -0
  119. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  120. data/examples/i18n/no/features/summering.feature +19 -0
  121. data/examples/i18n/no/features/support/env.rb +6 -0
  122. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  123. data/examples/i18n/pl/.gitignore +1 -0
  124. data/examples/i18n/pl/Rakefile +6 -0
  125. data/examples/i18n/pl/features/addition.feature +17 -0
  126. data/examples/i18n/pl/features/division.feature +10 -0
  127. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  128. data/examples/i18n/pl/features/support/env.rb +6 -0
  129. data/examples/i18n/pl/lib/calculator.rb +14 -0
  130. data/examples/i18n/pt/Rakefile +6 -0
  131. data/examples/i18n/pt/features/adicao.feature +11 -0
  132. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  133. data/examples/i18n/pt/features/support/env.rb +6 -0
  134. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  135. data/examples/i18n/ro/Rakefile +6 -0
  136. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  137. data/examples/i18n/ro/features/suma.feature +11 -0
  138. data/examples/i18n/ro/lib/calculator.rb +11 -0
  139. data/examples/i18n/ru/Rakefile +6 -0
  140. data/examples/i18n/ru/features/addition.feature +11 -0
  141. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  142. data/examples/i18n/ru/features/division.feature +16 -0
  143. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  144. data/examples/i18n/ru/features/support/env.rb +6 -0
  145. data/examples/i18n/ru/features/support/world.rb +8 -0
  146. data/examples/i18n/ru/lib/calculator.rb +24 -0
  147. data/examples/i18n/se/Rakefile +6 -0
  148. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  149. data/examples/i18n/se/features/summering.feature +18 -0
  150. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  151. data/examples/i18n/sk/.gitignore +1 -0
  152. data/examples/i18n/sk/Rakefile +6 -0
  153. data/examples/i18n/sk/features/addition.feature +17 -0
  154. data/examples/i18n/sk/features/division.feature +10 -0
  155. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  156. data/examples/i18n/sk/lib/calculator.rb +14 -0
  157. data/examples/i18n/sr-latn/Rakefile +6 -0
  158. data/examples/i18n/sr-latn/features/sabiranje.feature +18 -0
  159. data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +24 -0
  160. data/examples/i18n/sr-latn/lib/calculator.rb +12 -0
  161. data/examples/i18n/sr/Rakefile +6 -0
  162. data/examples/i18n/sr/features/sabiranje.feature +18 -0
  163. data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +24 -0
  164. data/examples/i18n/sr/lib/calculator.rb +12 -0
  165. data/examples/i18n/tr/.gitignore +1 -0
  166. data/examples/i18n/tr/Rakefile +6 -0
  167. data/examples/i18n/tr/features/bolme.feature +10 -0
  168. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  169. data/examples/i18n/tr/features/toplama.feature +18 -0
  170. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  171. data/examples/i18n/uz/Rakefile +6 -0
  172. data/examples/i18n/uz/features/addition.feature +10 -0
  173. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  174. data/examples/i18n/uz/features/division.feature +17 -0
  175. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  176. data/examples/i18n/uz/features/support/env.rb +6 -0
  177. data/examples/i18n/uz/features/support/world.rb +8 -0
  178. data/examples/i18n/uz/lib/calculator.rb +24 -0
  179. data/examples/i18n/zh-CN/Rakefile +4 -0
  180. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  181. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  182. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  183. data/examples/i18n/zh-TW/.gitignore +1 -0
  184. data/examples/i18n/zh-TW/Rakefile +4 -0
  185. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  186. data/examples/i18n/zh-TW/features/division.feature +11 -0
  187. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  188. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  189. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  190. data/examples/junit/features/pending.feature +5 -0
  191. data/examples/junit/features/step_definitions/steps.rb +11 -0
  192. data/examples/python/features/fibonacci.feature +19 -0
  193. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  194. data/examples/python/lib/.gitignore +1 -0
  195. data/examples/python/lib/fib.py +7 -0
  196. data/examples/ramaze/README.textile +7 -0
  197. data/examples/ramaze/Rakefile +6 -0
  198. data/examples/ramaze/app.rb +21 -0
  199. data/examples/ramaze/features/add.feature +11 -0
  200. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  201. data/examples/ramaze/features/support/env.rb +32 -0
  202. data/examples/ramaze/layout/default.html.erb +8 -0
  203. data/examples/ramaze/view/index.html.erb +5 -0
  204. data/examples/ruby2python/features/fibonacci.feature +19 -0
  205. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  206. data/examples/ruby2python/features/support/env.rb +21 -0
  207. data/examples/ruby2python/lib/.gitignore +1 -0
  208. data/examples/ruby2python/lib/fib.py +7 -0
  209. data/examples/selenium/Rakefile +6 -0
  210. data/examples/selenium/features/search.feature +9 -0
  211. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  212. data/examples/selenium/features/support/env.rb +19 -0
  213. data/examples/selenium_webrat/Rakefile +6 -0
  214. data/examples/selenium_webrat/config.ru +0 -0
  215. data/examples/selenium_webrat/features/search.feature +9 -0
  216. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  217. data/examples/selenium_webrat/features/support/env.rb +45 -0
  218. data/examples/self_test/.gitignore +1 -0
  219. data/examples/self_test/README.textile +6 -0
  220. data/examples/self_test/Rakefile +6 -0
  221. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  222. data/examples/self_test/features/background/background_with_name.feature +7 -0
  223. data/examples/self_test/features/background/failing_background.feature +12 -0
  224. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  225. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  226. data/examples/self_test/features/background/passing_background.feature +10 -0
  227. data/examples/self_test/features/background/pending_background.feature +10 -0
  228. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  229. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  230. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  231. data/examples/self_test/features/failing_expectation.feature +4 -0
  232. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  233. data/examples/self_test/features/multiline_name.feature +27 -0
  234. data/examples/self_test/features/outline_sample.feature +15 -0
  235. data/examples/self_test/features/sample.feature +21 -0
  236. data/examples/self_test/features/search_sample.feature +32 -0
  237. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  238. data/examples/self_test/features/support/env.rb +18 -0
  239. data/examples/self_test/features/tags_sample.feature +17 -0
  240. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  241. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  242. data/examples/self_test/list-of-features.txt +1 -0
  243. data/examples/sinatra/README.textile +13 -0
  244. data/examples/sinatra/Rakefile +6 -0
  245. data/examples/sinatra/app.rb +14 -0
  246. data/examples/sinatra/features/add.feature +11 -0
  247. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  248. data/examples/sinatra/features/support/env.rb +30 -0
  249. data/examples/sinatra/views/add.erb +5 -0
  250. data/examples/sinatra/views/layout.erb +8 -0
  251. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  252. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  253. data/examples/tcl/README.textile +11 -0
  254. data/examples/tcl/Rakefile +6 -0
  255. data/examples/tcl/features/fibonnacci.feature +17 -0
  256. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  257. data/examples/tcl/features/support/env.rb +6 -0
  258. data/examples/tcl/src/fib.tcl +3 -0
  259. data/examples/test_unit/Rakefile +6 -0
  260. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  261. data/examples/test_unit/features/test_unit.feature +9 -0
  262. data/examples/tickets/Rakefile +20 -0
  263. data/examples/tickets/features.html +138 -0
  264. data/examples/tickets/features/172.feature +28 -0
  265. data/examples/tickets/features/177/1.feature +28 -0
  266. data/examples/tickets/features/177/2.feature +20 -0
  267. data/examples/tickets/features/177/3.feature +18 -0
  268. data/examples/tickets/features/180.feature +7 -0
  269. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  270. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  271. data/examples/tickets/features/236.feature +13 -0
  272. data/examples/tickets/features/241.feature +12 -0
  273. data/examples/tickets/features/246.feature +4 -0
  274. data/examples/tickets/features/248.feature +11 -0
  275. data/examples/tickets/features/270/back.feature +14 -0
  276. data/examples/tickets/features/270/back.steps.rb +14 -0
  277. data/examples/tickets/features/272/hooks.feature +26 -0
  278. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  279. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  280. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  281. data/examples/tickets/features/279/wrong.feature_ +11 -0
  282. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  283. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  284. data/examples/tickets/features/306/only_background.feature +4 -0
  285. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  286. data/examples/tickets/features/lib/pantry.rb +20 -0
  287. data/examples/tickets/features/scenario_outline.feature +95 -0
  288. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  289. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  290. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  291. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  292. data/examples/tickets/features/table_diffing.feature +13 -0
  293. data/examples/tickets/features/tickets.feature +28 -0
  294. data/examples/watir/README.textile +16 -0
  295. data/examples/watir/Rakefile +10 -0
  296. data/examples/watir/features/search.feature +12 -0
  297. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  298. data/examples/watir/features/support/env.rb +32 -0
  299. data/examples/watir/features/support/screenshots.rb +44 -0
  300. data/examples/webrat/features/search.feature +12 -0
  301. data/examples/webrat/features/step_definitions/kvasir_steps.rb +14 -0
  302. data/examples/webrat/features/support/env.rb +17 -0
  303. data/features/announce.feature +122 -0
  304. data/features/background.feature +308 -0
  305. data/features/bug_371.feature +32 -0
  306. data/features/bug_464.feature +16 -0
  307. data/features/bug_475.feature +43 -0
  308. data/features/call_many_steps.feature +124 -0
  309. data/features/cucumber_cli.feature +654 -0
  310. data/features/cucumber_cli_diff_disabled.feature +52 -0
  311. data/features/cucumber_cli_outlines.feature +105 -0
  312. data/features/custom_formatter.feature +47 -0
  313. data/features/default_snippets.feature +42 -0
  314. data/features/drb_server_integration.feature +174 -0
  315. data/features/exception_in_after_block.feature +100 -0
  316. data/features/exception_in_after_step_block.feature +102 -0
  317. data/features/exception_in_before_block.feature +78 -0
  318. data/features/exclude_files.feature +20 -0
  319. data/features/expand.feature +60 -0
  320. data/features/html_formatter.feature +7 -0
  321. data/features/html_formatter/a.html +400 -0
  322. data/features/junit_formatter.feature +88 -0
  323. data/features/language_from_header.feature +30 -0
  324. data/features/language_help.feature +68 -0
  325. data/features/listener_debugger_formatter.feature +41 -0
  326. data/features/multiline_names.feature +43 -0
  327. data/features/negative_tagged_hooks.feature +61 -0
  328. data/features/post_configuration_hook.feature +37 -0
  329. data/features/profiles.feature +112 -0
  330. data/features/rake_task.feature +152 -0
  331. data/features/report_called_undefined_steps.feature +34 -0
  332. data/features/simplest.feature +11 -0
  333. data/features/snippet.feature +22 -0
  334. data/features/step_definitions/cucumber_steps.rb +154 -0
  335. data/features/step_definitions/extra_steps.rb +2 -0
  336. data/features/step_definitions/simplest_steps.rb +3 -0
  337. data/features/step_definitions/wire_steps.rb +14 -0
  338. data/features/support/env.rb +141 -0
  339. data/features/support/env.rb.simplest +7 -0
  340. data/features/support/fake_wire_server.rb +63 -0
  341. data/features/table_diffing.feature +45 -0
  342. data/features/table_mapping.feature +35 -0
  343. data/features/tag_logic.feature +258 -0
  344. data/features/transform.feature +245 -0
  345. data/features/unicode_table.feature +35 -0
  346. data/features/usage_and_stepdefs_formatter.feature +169 -0
  347. data/features/wire_protocol.feature +177 -0
  348. data/features/work_in_progress.feature +156 -0
  349. data/gem_tasks/contributors.rake +13 -0
  350. data/gem_tasks/environment.rake +7 -0
  351. data/gem_tasks/features.rake +18 -0
  352. data/gem_tasks/fix_cr_lf.rake +10 -0
  353. data/gem_tasks/flog.rake +4 -0
  354. data/gem_tasks/rspec.rake +15 -0
  355. data/gem_tasks/sass.rake +4 -0
  356. data/gem_tasks/sdoc.rake +12 -0
  357. data/lib/README.rdoc +12 -0
  358. data/lib/autotest/cucumber.rb +6 -0
  359. data/lib/autotest/cucumber_mixin.rb +131 -0
  360. data/lib/autotest/cucumber_rails.rb +6 -0
  361. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  362. data/lib/autotest/cucumber_rspec.rb +6 -0
  363. data/lib/autotest/discover.rb +9 -0
  364. data/lib/cucumber.rb +15 -0
  365. data/lib/cucumber/ast.rb +30 -0
  366. data/lib/cucumber/ast/background.rb +75 -0
  367. data/lib/cucumber/ast/comment.rb +31 -0
  368. data/lib/cucumber/ast/examples.rb +36 -0
  369. data/lib/cucumber/ast/feature.rb +85 -0
  370. data/lib/cucumber/ast/feature_element.rb +68 -0
  371. data/lib/cucumber/ast/features.rb +40 -0
  372. data/lib/cucumber/ast/outline_table.rb +166 -0
  373. data/lib/cucumber/ast/py_string.rb +59 -0
  374. data/lib/cucumber/ast/scenario.rb +111 -0
  375. data/lib/cucumber/ast/scenario_outline.rb +100 -0
  376. data/lib/cucumber/ast/step.rb +121 -0
  377. data/lib/cucumber/ast/step_collection.rb +76 -0
  378. data/lib/cucumber/ast/step_invocation.rb +190 -0
  379. data/lib/cucumber/ast/table.rb +655 -0
  380. data/lib/cucumber/ast/tags.rb +122 -0
  381. data/lib/cucumber/ast/tree_walker.rb +201 -0
  382. data/lib/cucumber/ast/visitor.rb +11 -0
  383. data/lib/cucumber/broadcaster.rb +13 -0
  384. data/lib/cucumber/cli/configuration.rb +180 -0
  385. data/lib/cucumber/cli/drb_client.rb +32 -0
  386. data/lib/cucumber/cli/language_help_formatter.rb +72 -0
  387. data/lib/cucumber/cli/main.rb +121 -0
  388. data/lib/cucumber/cli/options.rb +404 -0
  389. data/lib/cucumber/cli/profile_loader.rb +82 -0
  390. data/lib/cucumber/constantize.rb +34 -0
  391. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  392. data/lib/cucumber/core_ext/proc.rb +30 -0
  393. data/lib/cucumber/core_ext/string.rb +16 -0
  394. data/lib/cucumber/feature_file.rb +54 -0
  395. data/lib/cucumber/filter.rb +41 -0
  396. data/lib/cucumber/formatter/ansicolor.rb +157 -0
  397. data/lib/cucumber/formatter/color_io.rb +23 -0
  398. data/lib/cucumber/formatter/console.rb +205 -0
  399. data/lib/cucumber/formatter/cucumber.css +248 -0
  400. data/lib/cucumber/formatter/cucumber.sass +241 -0
  401. data/lib/cucumber/formatter/debug.rb +33 -0
  402. data/lib/cucumber/formatter/duration.rb +13 -0
  403. data/lib/cucumber/formatter/html.rb +545 -0
  404. data/lib/cucumber/formatter/io.rb +33 -0
  405. data/lib/cucumber/formatter/junit.rb +149 -0
  406. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  407. data/lib/cucumber/formatter/pdf.rb +234 -0
  408. data/lib/cucumber/formatter/pretty.rb +237 -0
  409. data/lib/cucumber/formatter/progress.rb +75 -0
  410. data/lib/cucumber/formatter/rerun.rb +50 -0
  411. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  412. data/lib/cucumber/formatter/steps.rb +49 -0
  413. data/lib/cucumber/formatter/summary.rb +35 -0
  414. data/lib/cucumber/formatter/tag_cloud.rb +34 -0
  415. data/lib/cucumber/formatter/unicode.rb +35 -0
  416. data/lib/cucumber/formatter/usage.rb +127 -0
  417. data/lib/cucumber/language_support.rb +30 -0
  418. data/lib/cucumber/language_support/language_methods.rb +110 -0
  419. data/lib/cucumber/languages.yml +535 -0
  420. data/lib/cucumber/parser.rb +8 -0
  421. data/lib/cucumber/parser/common.rb +170 -0
  422. data/lib/cucumber/parser/common.tt +21 -0
  423. data/lib/cucumber/parser/feature.rb +1783 -0
  424. data/lib/cucumber/parser/feature.tt +317 -0
  425. data/lib/cucumber/parser/i18n.tt +34 -0
  426. data/lib/cucumber/parser/natural_language.rb +108 -0
  427. data/lib/cucumber/parser/py_string.rb +276 -0
  428. data/lib/cucumber/parser/py_string.tt +45 -0
  429. data/lib/cucumber/parser/table.rb +305 -0
  430. data/lib/cucumber/parser/table.tt +60 -0
  431. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  432. data/lib/cucumber/platform.rb +31 -0
  433. data/lib/cucumber/py_support/py_dsl.py +10 -0
  434. data/lib/cucumber/py_support/py_language.py +10 -0
  435. data/lib/cucumber/py_support/py_language.rb +81 -0
  436. data/lib/cucumber/rake/task.rb +166 -0
  437. data/lib/cucumber/rb_support/rb_dsl.rb +102 -0
  438. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  439. data/lib/cucumber/rb_support/rb_language.rb +179 -0
  440. data/lib/cucumber/rb_support/rb_step_definition.rb +75 -0
  441. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  442. data/lib/cucumber/rb_support/rb_world.rb +81 -0
  443. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  444. data/lib/cucumber/rspec_neuter.rb +23 -0
  445. data/lib/cucumber/step_argument.rb +9 -0
  446. data/lib/cucumber/step_definition_light.rb +20 -0
  447. data/lib/cucumber/step_match.rb +107 -0
  448. data/lib/cucumber/step_mother.rb +350 -0
  449. data/lib/cucumber/webrat/element_locator.rb +93 -0
  450. data/lib/cucumber/webrat/table_locator.rb +1 -0
  451. data/lib/cucumber/wire_support/connection.rb +42 -0
  452. data/lib/cucumber/wire_support/request_handler.rb +19 -0
  453. data/lib/cucumber/wire_support/wire_exception.rb +10 -0
  454. data/lib/cucumber/wire_support/wire_language.rb +52 -0
  455. data/lib/cucumber/wire_support/wire_packet.rb +34 -0
  456. data/lib/cucumber/wire_support/wire_protocol.rb +64 -0
  457. data/lib/cucumber/wire_support/wire_step_definition.rb +21 -0
  458. data/spec/cucumber/ast/background_spec.rb +54 -0
  459. data/spec/cucumber/ast/feature_element_spec.rb +41 -0
  460. data/spec/cucumber/ast/feature_factory.rb +62 -0
  461. data/spec/cucumber/ast/feature_spec.rb +44 -0
  462. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  463. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  464. data/spec/cucumber/ast/scenario_outline_spec.rb +73 -0
  465. data/spec/cucumber/ast/scenario_spec.rb +45 -0
  466. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  467. data/spec/cucumber/ast/step_spec.rb +66 -0
  468. data/spec/cucumber/ast/table_spec.rb +422 -0
  469. data/spec/cucumber/ast/tags_spec.rb +29 -0
  470. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  471. data/spec/cucumber/broadcaster_spec.rb +15 -0
  472. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  473. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  474. data/spec/cucumber/cli/main_spec.rb +172 -0
  475. data/spec/cucumber/cli/options_spec.rb +335 -0
  476. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  477. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  478. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  479. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  480. data/spec/cucumber/formatter/console_spec.rb +20 -0
  481. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  482. data/spec/cucumber/formatter/html_spec.rb +213 -0
  483. data/spec/cucumber/formatter/junit_spec.rb +110 -0
  484. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  485. data/spec/cucumber/formatter/spec_helper.rb +50 -0
  486. data/spec/cucumber/parser/feature_parser_spec.rb +400 -0
  487. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  488. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +132 -0
  489. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  490. data/spec/cucumber/sell_cucumbers.feature +19 -0
  491. data/spec/cucumber/step_match_spec.rb +56 -0
  492. data/spec/cucumber/step_mother_spec.rb +270 -0
  493. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  494. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  495. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  496. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  497. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  498. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  499. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  500. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  501. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  502. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  503. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  504. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  505. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  506. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  507. data/spec/cucumber/wire_support/wire_packet_spec.rb +26 -0
  508. data/spec/cucumber/world/pending_spec.rb +46 -0
  509. data/spec/spec.opts +4 -0
  510. data/spec/spec_helper.rb +18 -0
  511. metadata +813 -0
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe DRbClient do
7
+ before(:each) do
8
+ @args = ['features']
9
+ @error_stream = StringIO.new
10
+ @out_stream = StringIO.new
11
+
12
+ @drb_object = mock('DRbObject', :run => true)
13
+ DRbObject.stub!(:new_with_uri).and_return(@drb_object)
14
+ end
15
+
16
+ it "starts up a druby service" do
17
+ DRb.should_receive(:start_service).with("druby://localhost:0")
18
+ DRbClient.run(@args, @error_stream, @out_stream)
19
+ end
20
+
21
+ it "connects to the DRb server" do
22
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8990")
23
+ DRbClient.run(@args, @error_stream, @out_stream)
24
+ end
25
+
26
+ it "runs the features on the DRb server" do
27
+ @drb_object.should_receive(:run).with(@args, @error_stream, @out_stream)
28
+ DRbClient.run(@args, @error_stream, @out_stream)
29
+ end
30
+
31
+ it "returns raises an error when it can't connect to the server" do
32
+ DRbObject.stub!(:new_with_uri).and_raise(DRb::DRbConnError)
33
+ running { DRbClient.run(@args, @error_stream, @out_stream) }.should raise_error(DRbClientError, "No DRb server is running.")
34
+ end
35
+
36
+ it "returns the result from the DRb server call" do
37
+ @drb_object.should_receive(:run).and_return('foo')
38
+ DRbClient.run(@args, @error_stream, @out_stream).should == 'foo'
39
+ end
40
+
41
+ context "with $CUCUMBER_DRB set" do
42
+ before do
43
+ @original_env = ENV['CUCUMBER_DRB']
44
+ ENV['CUCUMBER_DRB'] = '90000'
45
+ end
46
+ after do
47
+ ENV['CUCUMBER_DRB'] = @original_env
48
+ end
49
+ it "connects to specified DRb server" do
50
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:90000")
51
+ DRbClient.run(@args, @error_stream, @out_stream)
52
+ end
53
+ end
54
+
55
+ context "with provided drb_port" do
56
+ before do
57
+ @args = @args + ['--port', '8000']
58
+ end
59
+ it "connects to specified drb port" do
60
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
61
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
62
+ end
63
+ it "prefers configuration to environment" do
64
+ original = ENV['CUCUMBER_DRB'] = original
65
+ begin
66
+ ENV['CUCUMBER_DRB'] = "4000"
67
+ DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
68
+ DRbClient.run(@args, @error_stream, @out_stream, 8000)
69
+ ensure
70
+ ENV['CUCUMBER_DRB'] = original
71
+ end
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,172 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+ begin
4
+ require 'spec/runner/differs/default' # RSpec >=1.2.4
5
+ rescue ::LoadError
6
+ require 'spec/expectations/differs/default' # RSpec <=1.2.3
7
+ end
8
+
9
+ module Cucumber
10
+ module Cli
11
+ describe Main do
12
+ before(:each) do
13
+ @out = StringIO.new
14
+ @err = StringIO.new
15
+ Kernel.stub!(:exit).and_return(nil)
16
+ File.stub!(:exist?).and_return(false) # When Configuration checks for cucumber.yml
17
+ Dir.stub!(:[]).and_return([]) # to prevent cucumber's features dir to being laoded
18
+ end
19
+
20
+ describe "verbose mode" do
21
+
22
+ before(:each) do
23
+ @empty_feature = Ast::Feature.new(nil, Ast::Comment.new(''), Ast::Tags.new(2, []), "Feature", [])
24
+ end
25
+
26
+ it "should show feature files parsed" do
27
+ @cli = Main.new(%w{--verbose example.feature}, @out)
28
+ @cli.stub!(:require)
29
+
30
+ FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
31
+
32
+ @cli.execute!(StepMother.new)
33
+
34
+ @out.string.should include('example.feature')
35
+ end
36
+
37
+ end
38
+
39
+ describe "diffing" do
40
+
41
+ before :each do
42
+ @configuration = mock('Configuration', :null_object => true, :drb? => false)
43
+ Configuration.should_receive(:new).and_return(@configuration)
44
+
45
+ @step_mother = mock('StepMother', :null_object => true)
46
+
47
+ @cli = Main.new(nil, @out)
48
+ end
49
+
50
+ it "uses Spec Differ::Default when diff is enabled" do
51
+ @configuration.should_receive(:diff_enabled?).and_return(true)
52
+
53
+ ::Spec::Expectations::Differs::Default.should_receive(:new)
54
+
55
+ @cli.execute!(@step_mother)
56
+ end
57
+
58
+ it "does not use Spec Differ::Default when diff is disabled" do
59
+ @configuration.should_receive(:diff_enabled?).and_return(false)
60
+
61
+ ::Spec::Expectations::Differs::Default.should_not_receive(:new)
62
+
63
+ @cli.execute!(@step_mother)
64
+ end
65
+
66
+ end
67
+
68
+ describe "--format with class" do
69
+
70
+ describe "in module" do
71
+
72
+ it "should resolve each module until it gets Formatter class" do
73
+ cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, nil)
74
+ mock_module = mock('module')
75
+ Object.stub!(:const_defined?).and_return(true)
76
+ mock_module.stub!(:const_defined?).and_return(true)
77
+
78
+ f = stub('formatter', :null_object => true)
79
+
80
+ Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
81
+ mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => f))
82
+
83
+ cli.execute!(StepMother.new)
84
+ end
85
+
86
+ end
87
+ end
88
+
89
+ describe "setup step sequence" do
90
+
91
+ it "should load files and execute hooks in order" do
92
+ Configuration.stub!(:new).and_return(configuration = mock('configuration', :null_object => true))
93
+ step_mother = mock('step mother', :null_object => true)
94
+ configuration.stub!(:drb?).and_return false
95
+ cli = Main.new(%w{--verbose example.feature}, @out)
96
+ cli.stub!(:require)
97
+
98
+ configuration.stub!(:support_to_load).and_return(['support'])
99
+ configuration.stub!(:step_defs_to_load).and_return(['step defs'])
100
+
101
+ # Support must be loaded first to ensure post configuration hook can
102
+ # run before anything else.
103
+ step_mother.should_receive(:load_code_files).with(['support']).ordered
104
+ # The post configuration hook/s (if any) need to be run next to enable
105
+ # extensions to do their thing before features are loaded
106
+ step_mother.should_receive(:after_configuration).with(configuration).ordered
107
+ # Feature files must be loaded before step definitions are required.
108
+ # This is because i18n step methods are only aliased when
109
+ # features are loaded. If we swap the order, the requires
110
+ # will fail.
111
+ step_mother.should_receive(:load_plain_text_features).ordered
112
+ step_mother.should_receive(:load_code_files).with(['step defs']).ordered
113
+
114
+ cli.execute!(step_mother)
115
+ end
116
+
117
+ end
118
+
119
+ [ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
120
+
121
+ it "rescues #{exception_klass}, prints the message to the error stream and returns true" do
122
+ Configuration.stub!(:new).and_return(configuration = mock('configuration'))
123
+ configuration.stub!(:parse!).and_raise(exception_klass.new("error message"))
124
+
125
+ main = Main.new('', out = StringIO.new, error = StringIO.new)
126
+ main.execute!(StepMother.new).should be_true
127
+ error.string.should == "error message\n"
128
+ end
129
+ end
130
+
131
+
132
+ context "--drb" do
133
+ before(:each) do
134
+ @configuration = mock('Configuration', :drb? => true, :null_object => true)
135
+ Configuration.stub!(:new).and_return(@configuration)
136
+
137
+ @args = ['features']
138
+
139
+ @cli = Main.new(@args, @out, @err)
140
+ @step_mother = mock('StepMother', :null_object => true)
141
+ end
142
+
143
+ it "delegates the execution to the DRB client passing the args and streams" do
144
+ @configuration.stub :drb_port => 1450
145
+ DRbClient.should_receive(:run).with(@args, @err, @out, 1450).and_return(true)
146
+ @cli.execute!(@step_mother)
147
+ end
148
+
149
+ it "returns the result from the DRbClient" do
150
+ DRbClient.stub!(:run).and_return('foo')
151
+ @cli.execute!(@step_mother).should == 'foo'
152
+ end
153
+
154
+ it "ceases execution if the DrbClient is able to perform the execution" do
155
+ DRbClient.stub!(:run).and_return(true)
156
+ @configuration.should_not_receive(:build_formatter_broadcaster)
157
+ @cli.execute!(@step_mother)
158
+ end
159
+
160
+ context "when the DrbClient is unable to perfrom the execution" do
161
+ before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
162
+
163
+ it "alerts the user that execution will be performed locally" do
164
+ @cli.execute!(@step_mother)
165
+ @err.string.should include("WARNING: error message. Running features locally:")
166
+ end
167
+
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,335 @@
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
+ end
67
+
68
+ context "--port PORT" do
69
+ it "sets the drb_port to the provided option" do
70
+ after_parsing('--port 4500') { options[:drb_port].should == '4500' }
71
+ end
72
+ end
73
+
74
+ context '-f FORMAT or --format FORMAT' do
75
+ it "defaults the output for the formatter to the output stream (STDOUT)" do
76
+ after_parsing('-f pretty') { options[:formats].should == [['pretty', output_stream]] }
77
+ end
78
+ end
79
+
80
+ context '-o [FILE|DIR] or --out [FILE|DIR]' do
81
+ it "defaults the formatter to 'pretty' when not specified earlier" do
82
+ after_parsing('-o file.txt') { options[:formats].should == [['pretty', 'file.txt']] }
83
+ end
84
+ it "sets the output for the formatter defined immediatly before it" do
85
+ after_parsing('-f profile --out file.txt -f pretty -o file2.txt') do
86
+ options[:formats].should == [['profile', 'file.txt'], ['pretty', 'file2.txt']]
87
+ end
88
+ end
89
+ end
90
+
91
+ context '-t TAGS --tags TAGS' do
92
+ it "designates tags prefixed with ~ as tags to be excluded" do
93
+ after_parsing('--tags ~@foo,@bar') { options[:tag_names].should == [{'~@foo' => nil, '@bar' => nil}] }
94
+ end
95
+
96
+ it "stores tags passed with different --tags seperately" do
97
+ after_parsing('--tags @foo --tags @bar') { options[:tag_names].should == [{'@foo' => nil}, {'@bar' => nil}] }
98
+ end
99
+ end
100
+
101
+ context '-n NAME or --name NAME' do
102
+ it "stores the provided names as regular expressions" do
103
+ after_parsing('-n foo --name bar') { options[:name_regexps].should == [/foo/,/bar/] }
104
+ end
105
+ end
106
+
107
+ context '-e PATTERN or --exclude PATTERN' do
108
+ it "stores the provided exclusions as regular expressions" do
109
+ after_parsing('-e foo --exclude bar') { options[:excludes].should == [/foo/,/bar/] }
110
+ end
111
+ end
112
+
113
+ context '-p PROFILE or --profile PROFILE' do
114
+
115
+ it "notifies the user that an individual profile is being used" do
116
+ given_cucumber_yml_defined_as({'foo' => [1,2,3]})
117
+ options.parse!(%w{--profile foo})
118
+ output_stream.string.should =~ /Using the foo profile...\n/
119
+ end
120
+
121
+ it "notifies the user when multiple profiles are being used" do
122
+ given_cucumber_yml_defined_as({'foo' => [1,2,3], 'bar' => ['v'], 'dog' => ['v']})
123
+ options.parse!(%w{--profile foo --profile bar --profile dog})
124
+ output_stream.string.should =~ /Using the foo, bar and dog profiles...\n/
125
+ end
126
+
127
+ it "notifies the user of all profiles being used, even when they are nested" do
128
+ given_cucumber_yml_defined_as('foo' => '-p bar', 'bar' => 'features')
129
+ after_parsing('-p foo') do
130
+ output_stream.string.should =~ /Using the foo and bar profiles.../
131
+ end
132
+ end
133
+
134
+ it "uses the default profile passed in during initialization if none are specified by the user" do
135
+ given_cucumber_yml_defined_as({'default' => '--require some_file'})
136
+
137
+ options = Options.new(output_stream, error_stream, :default_profile => 'default')
138
+ options.parse!(%w{--format progress})
139
+ options[:require].should include('some_file')
140
+ end
141
+
142
+ it "merges all uniq values from both cmd line and the profile" do
143
+ given_cucumber_yml_defined_as('foo' => %w[--verbose])
144
+ options.parse!(%w[--wip --profile foo])
145
+ options[:wip].should be_true
146
+ options[:verbose].should be_true
147
+ end
148
+
149
+ it "gives precendene to the origianl options' paths" do
150
+ given_cucumber_yml_defined_as('foo' => %w[features])
151
+ options.parse!(%w[my.feature -p foo])
152
+ options[:paths].should == %w[my.feature]
153
+ end
154
+
155
+ it "combines the require files of both" do
156
+ given_cucumber_yml_defined_as('bar' => %w[--require features -r dog.rb])
157
+ options.parse!(%w[--require foo.rb -p bar])
158
+ options[:require].should == %w[foo.rb features dog.rb]
159
+ end
160
+
161
+ it "combines the tag names of both" do
162
+ given_cucumber_yml_defined_as('baz' => %w[-t @bar])
163
+ options.parse!(%w[--tags @foo -p baz])
164
+ options[:tag_names].should == [{'@foo' => nil}, {'@bar' => nil}]
165
+ end
166
+
167
+ it "only takes the paths from the original options, and disgregards the profiles" do
168
+ given_cucumber_yml_defined_as('baz' => %w[features])
169
+ options.parse!(%w[my.feature -p baz])
170
+ options[:paths].should == ['my.feature']
171
+ end
172
+
173
+ it "uses the paths from the profile when none are specified originally" do
174
+ given_cucumber_yml_defined_as('baz' => %w[some.feature])
175
+ options.parse!(%w[-p baz])
176
+ options[:paths].should == ['some.feature']
177
+ end
178
+
179
+ it "combines environment variables from the profile but gives precendene to cmd line args" do
180
+ given_cucumber_yml_defined_as('baz' => %w[FOO=bar CHEESE=swiss])
181
+ options.parse!(%w[-p baz CHEESE=cheddar BAR=foo])
182
+ options[:env_vars].should == {'BAR' => 'foo', 'FOO' => 'bar', 'CHEESE' => 'cheddar'}
183
+ end
184
+
185
+ it "disregards STDOUT formatter defined in profile when another is passed in (via cmd line)" do
186
+ given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
187
+ options.parse!(%w{--format progress --profile foo})
188
+ options[:formats].should == [['progress', output_stream]]
189
+ end
190
+
191
+ it "includes any non-STDOUT formatters from the profile" do
192
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html]})
193
+ options.parse!(%w{--format progress --profile html})
194
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
195
+ end
196
+
197
+ it "does not include STDOUT formatters from the profile if there is a STDOUT formatter in command line" do
198
+ given_cucumber_yml_defined_as({'html' => %w[--format html -o features.html --format pretty]})
199
+ options.parse!(%w{--format progress --profile html})
200
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
201
+ end
202
+
203
+ it "includes any STDOUT formatters from the profile if no STDOUT formatter was specified in command line" do
204
+ given_cucumber_yml_defined_as({'html' => %w[--format html]})
205
+ options.parse!(%w{--format rerun -o rerun.txt --profile html})
206
+ options[:formats].should == [['html', output_stream], ['rerun', 'rerun.txt']]
207
+ end
208
+
209
+ it "assumes all of the formatters defined in the profile when none are specified on cmd line" do
210
+ given_cucumber_yml_defined_as({'html' => %w[--format progress --format html -o features.html]})
211
+ options.parse!(%w{--profile html})
212
+ options[:formats].should == [['progress', output_stream], ['html', 'features.html']]
213
+ end
214
+
215
+ it "respects --quiet when defined in the profile" do
216
+ given_cucumber_yml_defined_as('foo' => '-q')
217
+ options.parse!(%w[-p foo])
218
+ options[:snippets].should be_false
219
+ options[:source].should be_false
220
+ end
221
+
222
+ it "uses the language from profile when none is specified on the command line" do
223
+ given_cucumber_yml_defined_as({'foo' => '--language fr'})
224
+ after_parsing('-p foo') {options[:lang].should == 'fr'}
225
+ end
226
+ end
227
+
228
+ context '-P or --no-profile' do
229
+
230
+ it "disables profiles" do
231
+ given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
232
+
233
+ after_parsing("-P --require some_file.rb") do
234
+ options[:require].should == ['some_file.rb']
235
+ end
236
+ end
237
+
238
+ it "notifies the user that the profiles are being disabled" do
239
+ given_cucumber_yml_defined_as({'default' => '-v'})
240
+
241
+ after_parsing("--no-profile --require some_file.rb") do
242
+ output_stream.string.should =~ /Disabling profiles.../
243
+ end
244
+ end
245
+
246
+ end
247
+
248
+ context '-b or --backtrace' do
249
+ it "turns on cucumber's full backtrace" do
250
+ when_parsing("-b") do
251
+ Cucumber.should_receive(:use_full_backtrace=).with(true)
252
+ end
253
+ end
254
+ end
255
+
256
+ context '--version' do
257
+ it "displays Cucumber's version" do
258
+ after_parsing('--version') do
259
+ output_stream.string.should =~ /#{Cucumber::VERSION}/
260
+ end
261
+ end
262
+ it "exits the program" do
263
+ when_parsing('--version') { Kernel.should_receive(:exit) }
264
+ end
265
+ end
266
+
267
+ context 'environment variables (i.e. MODE=webrat)' do
268
+ it "places all of the environment variables into a hash" do
269
+ after_parsing('MODE=webrat FOO=bar') do
270
+ options[:env_vars].should == {'MODE' => 'webrat', 'FOO' => 'bar'}
271
+ end
272
+ end
273
+ end
274
+
275
+ it "assigns any extra arguments as paths to features" do
276
+ after_parsing('-f pretty my_feature.feature my_other_features') do
277
+ options[:paths].should == ['my_feature.feature', 'my_other_features']
278
+ end
279
+ end
280
+
281
+ it "does not mistake environment variables as feature paths" do
282
+ after_parsing('my_feature.feature FOO=bar') do
283
+ options[:paths].should == ['my_feature.feature']
284
+ end
285
+ end
286
+ end
287
+
288
+ describe '#expanded_args_without_drb' do
289
+ it "returns the orginal args in additon to the args from any profiles" do
290
+ given_cucumber_yml_defined_as('foo' => '-v',
291
+ 'bar' => '--wip -p baz',
292
+ 'baz' => '-r some_file.rb')
293
+ options.parse!(%w[features -p foo --profile bar])
294
+
295
+ options.expanded_args_without_drb.should == %w[features -v --wip -r some_file.rb --no-profile]
296
+ end
297
+
298
+ it "removes the --drb flag so that the args can be safely passed to the drb server" do
299
+ given_cucumber_yml_defined_as('default' => 'features -f pretty --drb')
300
+ options.parse!(%w[--profile default])
301
+
302
+ options.expanded_args_without_drb.should == %w[features -f pretty --no-profile]
303
+ end
304
+
305
+ it "contains the environment variables" do
306
+ options.parse!(%w[features FOO=bar])
307
+ options.expanded_args_without_drb.should == %w[features FOO=bar --no-profile]
308
+ end
309
+
310
+ it "ignores the paths from the profiles if one was specified on the command line" do
311
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
312
+ options.parse!(%w[some_feature.feature -p foo])
313
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
314
+ end
315
+
316
+
317
+ it "appends the --no-profile flag so that the DRb server doesn't reload the profiles" do
318
+ given_cucumber_yml_defined_as('foo' => 'features --drb')
319
+ options.parse!(%w[some_feature.feature -p foo])
320
+ options.expanded_args_without_drb.should == %w[some_feature.feature --no-profile]
321
+ end
322
+
323
+ it "does not append --no-profile if already present" do
324
+ options.parse!(%w[some_feature.feature -P])
325
+ options.expanded_args_without_drb.should == %w[some_feature.feature -P]
326
+ end
327
+
328
+
329
+ end
330
+
331
+ end
332
+
333
+ end
334
+ end
335
+