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,233 @@
1
+ require 'cucumber/platform'
2
+
3
+ module Cucumber
4
+ module Rake
5
+ # Defines a Rake task for running features.
6
+ #
7
+ # The simplest use of it goes something like:
8
+ #
9
+ # Cucumber::Rake::Task.new
10
+ #
11
+ # This will create a task named 'features' described as 'Run Features with
12
+ # Cucumber'. It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
13
+ #
14
+ # To further configure the task, you can pass a block:
15
+ #
16
+ # Cucumber::Rake::Task.new do |t|
17
+ # t.cucumber_opts = %w{--format progress}
18
+ # end
19
+ #
20
+ # This task can also be configured to be run with RCov:
21
+ #
22
+ # Cucumber::Rake::Task.new do |t|
23
+ # t.rcov = true
24
+ # end
25
+ #
26
+ # See the attributes for additional configuration possibilities.
27
+ class Task
28
+ class InProcessCucumberRunner #:nodoc:
29
+ attr_reader :args
30
+
31
+ def initialize(libs, cucumber_opts, feature_files)
32
+ raise "libs must be an Array when running in-process" unless Array === libs
33
+ libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
34
+ @args = (
35
+ cucumber_opts +
36
+ feature_files
37
+ ).flatten.compact
38
+ end
39
+
40
+ def run
41
+ require 'cucumber/cli/main'
42
+ failure = Cucumber::Cli::Main.execute(args)
43
+ raise "Cucumber failed" if failure
44
+ end
45
+ end
46
+
47
+ class ForkedCucumberRunner #:nodoc:
48
+ attr_reader :args
49
+
50
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
51
+ @args = (
52
+ ['-I'] + load_path(libs) +
53
+ quoted_binary(cucumber_bin) +
54
+ cucumber_opts +
55
+ feature_files
56
+ ).flatten
57
+ end
58
+
59
+ def load_path(libs)
60
+ ['"%s"' % libs.join(File::PATH_SEPARATOR)]
61
+ end
62
+
63
+ def quoted_binary(cucumber_bin)
64
+ ['"%s"' % cucumber_bin]
65
+ end
66
+
67
+ def run
68
+ ruby(args.join(" ")) # ruby(*args) is broken on Windows
69
+ end
70
+ end
71
+
72
+ class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
73
+ def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
74
+ @args = (
75
+ ['-I'] + load_path(libs) +
76
+ ['-S', 'rcov'] + rcov_opts +
77
+ quoted_binary(cucumber_bin) +
78
+ ['--'] +
79
+ cucumber_opts +
80
+ feature_files
81
+ ).flatten
82
+ end
83
+ end
84
+
85
+ LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
86
+
87
+ # TODO: remove depreated accessors for 0.4.0
88
+ def self.deprecate_accessor(attribute) # :nodoc:
89
+ attr_reader attribute
90
+ class_eval <<-EOF, __FILE__, __LINE__ + 1
91
+ def #{attribute}=(value)
92
+ @#{attribute} = value
93
+ warn("\nWARNING: Cucumber::Rake::Task##{attribute} is deprecated and will be removed in 0.4.0. Please use profiles for complex settings: http://wiki.github.com/aslakhellesoy/cucumber/using-rake#profiles\n")
94
+ end
95
+ EOF
96
+ end
97
+
98
+ # Directories to add to the Ruby $LOAD_PATH
99
+ attr_accessor :libs
100
+
101
+ # Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
102
+ attr_accessor :binary
103
+
104
+ # Array of paths to specific step definition files to use
105
+ deprecate_accessor :step_list
106
+
107
+ # File pattern for finding step definitions. Defaults to
108
+ # 'features/**/*.rb'.
109
+ deprecate_accessor :step_pattern
110
+
111
+ # Array of paths to specific features to run.
112
+ deprecate_accessor :feature_list
113
+
114
+ # File pattern for finding features to run. Defaults to
115
+ # 'features/**/*.feature'. Can be overridden by the FEATURE environment variable.
116
+ deprecate_accessor :feature_pattern
117
+
118
+ # Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
119
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
120
+ attr_accessor :cucumber_opts
121
+ def cucumber_opts=(opts) #:nodoc:
122
+ @cucumber_opts = String === opts ? opts.split(' ') : opts
123
+ end
124
+
125
+ # Run cucumber with RCov? Defaults to false. If you set this to
126
+ # true, +fork+ is implicit.
127
+ attr_accessor :rcov
128
+
129
+ # Extra options to pass to rcov.
130
+ # It's recommended to pass an Array, but if it's a String it will be #split by ' '.
131
+ attr_accessor :rcov_opts
132
+ def rcov_opts=(opts) #:nodoc:
133
+ @rcov_opts = String === opts ? opts.split(' ') : opts
134
+ end
135
+
136
+ # Whether or not to fork a new ruby interpreter. Defaults to true.
137
+ attr_accessor :fork
138
+
139
+ # Define what profile to be used. When used with cucumber_opts it is simply appended to it. Will be ignored when CUCUMBER_OPTS is used.
140
+ attr_accessor :profile
141
+ def profile=(profile) #:nodoc:
142
+ @profile = profile
143
+ unless feature_list
144
+ # TODO: remove once we completely remove these from the rake task.
145
+ @step_list = []
146
+ @feature_list = [] # Don't use accessor to avoid deprecation warning.
147
+ end
148
+ end
149
+
150
+ # Define Cucumber Rake task
151
+ def initialize(task_name = "features", desc = "Run Features with Cucumber")
152
+ @task_name, @desc = task_name, desc
153
+ @fork = true
154
+ @libs = ['lib']
155
+ @rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
156
+
157
+ yield self if block_given?
158
+
159
+ @feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
160
+ @step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
161
+
162
+ @binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
163
+ @libs.insert(0, LIB) if binary == Cucumber::BINARY
164
+
165
+ define_task
166
+ end
167
+
168
+ def define_task # :nodoc:
169
+ desc @desc
170
+ task @task_name do
171
+ runner.run
172
+ end
173
+ end
174
+
175
+ def runner(task_args = nil) # :nodoc:
176
+ cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
177
+ if(@rcov)
178
+ RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args), rcov_opts)
179
+ elsif(@fork)
180
+ ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args))
181
+ else
182
+ InProcessCucumberRunner.new(libs, cucumber_opts, feature_files(task_args))
183
+ end
184
+ end
185
+
186
+ def cucumber_opts_with_profile # :nodoc:
187
+ @profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
188
+ end
189
+
190
+ def feature_files(task_args = nil) # :nodoc:
191
+ if ENV['FEATURE']
192
+ FileList[ ENV['FEATURE'] ]
193
+ else
194
+ result = []
195
+ result += feature_list.to_a if feature_list
196
+ result += FileList[feature_pattern].to_a if feature_pattern
197
+ FileList[result]
198
+ end
199
+ end
200
+
201
+ def step_files(task_args = nil) # :nodoc:
202
+ if ENV['STEPS']
203
+ FileList[ ENV['STEPS'] ]
204
+ else
205
+ result = []
206
+ result += Array(step_list) if step_list
207
+ result += Array(FileList[step_pattern]) if step_pattern
208
+ FileList[result]
209
+ end
210
+ end
211
+ end
212
+
213
+ class FeatureTask < Task
214
+
215
+ def initialize(task_name = "feature", desc = "Run a specified feature with Cucumber. #{task_name}[feature_name]")
216
+ super(task_name, desc)
217
+ end
218
+
219
+ def define_task # :nodoc:
220
+ desc @desc
221
+ task @task_name, :feature_name do |t, args|
222
+ runner(args).run
223
+ end
224
+ end
225
+
226
+ def feature_files(task_arguments) # :nodoc:
227
+ FileList[File.join("features", "**", "#{task_arguments[:feature_name]}.feature")]
228
+ end
229
+
230
+ end
231
+
232
+ end
233
+ end
@@ -0,0 +1,23 @@
1
+ require 'optparse'
2
+
3
+ module Spec
4
+ module Runner
5
+ # Neuters RSpec's option parser.
6
+ # (RSpec's option parser tries to parse ARGV, which
7
+ # will fail when running cucumber)
8
+ class OptionParser < ::OptionParser
9
+ NEUTERED_RSPEC = Object.new
10
+ def NEUTERED_RSPEC.method_missing(m, *args); self; end
11
+
12
+ def self.method_added(m)
13
+ unless @__neutering_rspec
14
+ @__neutering_rspec = true
15
+ define_method(m) do |*a|
16
+ NEUTERED_RSPEC
17
+ end
18
+ @__neutering_rspec = false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,122 @@
1
+ require 'cucumber/step_match'
2
+ require 'cucumber/core_ext/string'
3
+ require 'cucumber/core_ext/proc'
4
+
5
+ module Cucumber
6
+ module StepDefinitionMethods
7
+ def step_match(name_to_match, name_to_report)
8
+ if(match = name_to_match.match(regexp))
9
+ StepMatch.new(self, name_to_match, name_to_report, match.captures)
10
+ else
11
+ nil
12
+ end
13
+ end
14
+
15
+ # Formats the matched arguments of the associated Step. This method
16
+ # is usually called from visitors, which render output.
17
+ #
18
+ # The +format+ can either be a String or a Proc.
19
+ #
20
+ # If it is a String it should be a format string according to
21
+ # <tt>Kernel#sprinf</tt>, for example:
22
+ #
23
+ # '<span class="param">%s</span></tt>'
24
+ #
25
+ # If it is a Proc, it should take one argument and return the formatted
26
+ # argument, for example:
27
+ #
28
+ # lambda { |param| "[#{param}]" }
29
+ #
30
+ def format_args(step_name, format)
31
+ step_name.gzub(regexp, format)
32
+ end
33
+
34
+ def match(step_name)
35
+ case step_name
36
+ when String then regexp.match(step_name)
37
+ when Regexp then regexp == step_name
38
+ end
39
+ end
40
+
41
+ def backtrace_line
42
+ "#{file_colon_line}:in `#{regexp.inspect}'"
43
+ end
44
+
45
+ def text_length
46
+ regexp.inspect.jlength
47
+ end
48
+ end
49
+
50
+ # A Step Definition holds a Regexp and a Proc, and is created
51
+ # by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
52
+ # in the <tt>step_definitions</tt> ruby files - for example:
53
+ #
54
+ # Given /I have (\d+) cucumbers in my belly/ do
55
+ # # some code here
56
+ # end
57
+ #
58
+ class StepDefinition
59
+ PARAM_PATTERN = /"([^\"]*)"/
60
+ ESCAPED_PARAM_PATTERN = '"([^\\"]*)"'
61
+
62
+ def self.snippet_text(step_keyword, step_name, multiline_arg_class = nil)
63
+ escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
64
+ escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
65
+
66
+ n = 0
67
+ block_args = escaped.scan(ESCAPED_PARAM_PATTERN).map do |a|
68
+ n += 1
69
+ "arg#{n}"
70
+ end
71
+ block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
72
+ block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
73
+ multiline_class_comment = ""
74
+ if(multiline_arg_class == Ast::Table)
75
+ multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
76
+ end
77
+
78
+ "#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending\nend"
79
+ end
80
+
81
+ class MissingProc < StandardError
82
+ def message
83
+ "Step definitions must always have a proc"
84
+ end
85
+ end
86
+
87
+ include StepDefinitionMethods
88
+
89
+ attr_reader :regexp, :proc
90
+
91
+ def initialize(pattern, &proc)
92
+ raise MissingProc if proc.nil?
93
+ if String === pattern
94
+ p = pattern.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
95
+ pattern = Regexp.new("^#{p}$")
96
+ end
97
+ @regexp, @proc = pattern, proc
98
+ end
99
+
100
+ def regexp
101
+ @regexp
102
+ end
103
+
104
+ def invoke(world, args)
105
+ args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
106
+ begin
107
+ world.cucumber_instance_exec(true, regexp.inspect, *args, &@proc)
108
+ rescue Cucumber::ArityMismatchError => e
109
+ e.backtrace.unshift(self.backtrace_line)
110
+ raise e
111
+ end
112
+ end
113
+
114
+ def file_colon_line
115
+ @proc.file_colon_line
116
+ end
117
+
118
+ def file
119
+ @file ||= file_colon_line.split(':')[0]
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,61 @@
1
+ module Cucumber
2
+ class StepMatch
3
+ attr_reader :step_definition, :args
4
+
5
+ def initialize(step_definition, step_name, formatted_step_name, args)
6
+ @step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
7
+ end
8
+
9
+ def name
10
+ @formatted_step_name
11
+ end
12
+
13
+ def invoke(world, multiline_arg)
14
+ all_args = @args.dup
15
+ all_args << multiline_arg if multiline_arg
16
+ @step_definition.invoke(world, all_args)
17
+ end
18
+
19
+ def format_args(format = lambda{|a| a})
20
+ @formatted_step_name || @step_definition.format_args(@step_name, format)
21
+ end
22
+
23
+ def file_colon_line
24
+ @step_definition.file_colon_line
25
+ end
26
+
27
+ def backtrace_line
28
+ @step_definition.backtrace_line
29
+ end
30
+
31
+ def text_length
32
+ @step_definition.text_length
33
+ end
34
+ end
35
+
36
+ class NoStepMatch
37
+ attr_reader :step_definition
38
+
39
+ def initialize(step, name)
40
+ @step = step
41
+ @name = name
42
+ end
43
+
44
+ def format_args(format)
45
+ @name
46
+ end
47
+
48
+ def file_colon_line
49
+ raise "No file:line for #{@step}" unless @step.file_colon_line
50
+ @step.file_colon_line
51
+ end
52
+
53
+ def backtrace_line
54
+ @step.backtrace_line
55
+ end
56
+
57
+ def text_length
58
+ @step.text_length
59
+ end
60
+ end
61
+ end