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,30 @@
1
+ module Cucumber
2
+ module Ast
3
+ class Features
4
+ include Enumerable
5
+
6
+ attr_reader :duration
7
+
8
+ def initialize
9
+ @features = []
10
+ end
11
+
12
+ def each(&proc)
13
+ @features.each(&proc)
14
+ end
15
+
16
+ def add_feature(feature)
17
+ feature.features = self
18
+ @features << feature
19
+ end
20
+
21
+ def accept(visitor)
22
+ start = Time.now
23
+ @features.each do |feature|
24
+ visitor.visit_feature(feature)
25
+ end
26
+ @duration = Time.now - start
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,143 @@
1
+ module Cucumber
2
+ module Ast
3
+ class OutlineTable < Table
4
+ def initialize(raw, scenario_outline)
5
+ super(raw)
6
+ @scenario_outline = scenario_outline
7
+ @cells_class = ExampleRow
8
+ create_step_invocations_for_example_rows!(scenario_outline)
9
+ end
10
+
11
+ def accept(visitor)
12
+ cells_rows.each_with_index do |row, n|
13
+ if(visitor.options[:expand])
14
+ row.accept(visitor)
15
+ else
16
+ visitor.visit_table_row(row)
17
+ end
18
+ end
19
+ nil
20
+ end
21
+
22
+ def accept_hook?(hook)
23
+ @scenario_outline.accept_hook?(hook)
24
+ end
25
+
26
+ def skip_invoke!
27
+ example_rows.each do |cells|
28
+ cells.skip_invoke!
29
+ end
30
+ end
31
+
32
+ def create_step_invocations_for_example_rows!(scenario_outline)
33
+ example_rows.each do |cells|
34
+ cells.create_step_invocations!(scenario_outline)
35
+ end
36
+ end
37
+
38
+ def example_rows
39
+ cells_rows[1..-1]
40
+ end
41
+
42
+ def visit_scenario_name(visitor, row)
43
+ @scenario_outline.visit_scenario_name(visitor, row)
44
+ end
45
+
46
+ class ExampleRow < Cells
47
+
48
+ def create_step_invocations!(scenario_outline)
49
+ @scenario_outline = scenario_outline
50
+ @step_invocations = scenario_outline.step_invocations(self)
51
+ end
52
+
53
+ def skip_invoke!
54
+ @step_invocations.each do |step_invocation|
55
+ step_invocation.skip_invoke!
56
+ end
57
+ end
58
+
59
+ def accept(visitor)
60
+ visitor.options[:expand] ? accept_expand(visitor) : accept_plain(visitor)
61
+ end
62
+
63
+ def accept_plain(visitor)
64
+ if header?
65
+ @cells.each do |cell|
66
+ cell.status = :skipped_param
67
+ visitor.visit_table_cell(cell)
68
+ end
69
+ else
70
+ visitor.step_mother.before_and_after(self) do
71
+ @step_invocations.each do |step_invocation|
72
+ step_invocation.invoke(visitor.step_mother, visitor.options)
73
+ @exception ||= step_invocation.reported_exception
74
+ end
75
+
76
+ @cells.each do |cell|
77
+ visitor.visit_table_cell(cell)
78
+ end
79
+
80
+ visitor.visit_exception(@scenario_exception, :failed) if @scenario_exception
81
+ end
82
+ end
83
+ end
84
+
85
+ def accept_expand(visitor)
86
+ if header?
87
+ else
88
+ visitor.step_mother.before_and_after(self) do
89
+ @table.visit_scenario_name(visitor, self)
90
+ @step_invocations.each do |step_invocation|
91
+ step_invocation.invoke(visitor.step_mother, visitor.options)
92
+ @exception ||= step_invocation.reported_exception
93
+ step_invocation.visit_step_result(visitor)
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ def accept_hook?(hook)
100
+ @table.accept_hook?(hook)
101
+ end
102
+
103
+ def exception
104
+ @exception || @scenario_exception
105
+ end
106
+
107
+ def fail!(exception)
108
+ @scenario_exception = exception
109
+ end
110
+
111
+ # Returns true if one or more steps failed
112
+ def failed?
113
+ @step_invocations.failed? || !!@scenario_exception
114
+ end
115
+
116
+ # Returns true if all steps passed
117
+ def passed?
118
+ !failed?
119
+ end
120
+
121
+ # Returns the status
122
+ def status
123
+ return :failed if @scenario_exception
124
+ @step_invocations.status
125
+ end
126
+
127
+ def backtrace_line
128
+ @scenario_outline.backtrace_line(name, line)
129
+ end
130
+
131
+ def name
132
+ "| #{@cells.collect{|c| c.value }.join(' | ')} |"
133
+ end
134
+
135
+ private
136
+
137
+ def header?
138
+ index == 0
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,57 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Represents an inline argument in a step. Example:
4
+ #
5
+ # Given the message
6
+ # """
7
+ # I like
8
+ # Cucumber sandwich
9
+ # """
10
+ #
11
+ # The text between the pair of <tt>"""</tt> is stored inside a PyString,
12
+ # which is yielded to the StepDefinition block as the last argument.
13
+ #
14
+ # The StepDefinition can then access the String via the #to_s method. In the
15
+ # example above, that would return: <tt>"I like\nCucumber sandwich"</tt>
16
+ #
17
+ # Note how the indentation from the source is stripped away.
18
+ #
19
+ class PyString
20
+
21
+ def self.default_arg_name
22
+ "string"
23
+ end
24
+
25
+ def initialize(start_line, end_line, string, quotes_indent)
26
+ @start_line, @end_line = start_line, end_line
27
+ @string, @quotes_indent = string.gsub(/\\"/, '"'), quotes_indent
28
+ end
29
+
30
+ def to_s
31
+ @string.indent(-@quotes_indent)
32
+ end
33
+
34
+ def accept(visitor)
35
+ visitor.visit_py_string(to_s)
36
+ end
37
+
38
+ def arguments_replaced(arguments) #:nodoc:
39
+ string = @string
40
+ arguments.each do |name, value|
41
+ value ||= ''
42
+ string = string.gsub(name, value)
43
+ end
44
+ PyString.new(@start_line, @end_line, string, @quotes_indent)
45
+ end
46
+
47
+ def has_text?(text)
48
+ @string.index(text)
49
+ end
50
+
51
+ # For testing only
52
+ def to_sexp #:nodoc:
53
+ [:py_string, to_s]
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,83 @@
1
+ require 'cucumber/ast/feature_element'
2
+
3
+ module Cucumber
4
+ module Ast
5
+ class Scenario
6
+ include FeatureElement
7
+
8
+ attr_reader :name, :line
9
+
10
+ def initialize(background, comment, tags, line, keyword, name, steps)
11
+ @background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
12
+ attach_steps(steps)
13
+
14
+ step_invocations = steps.map{|step| step.step_invocation}
15
+ if @background
16
+ @steps = @background.step_collection(step_invocations)
17
+ @background.feature_elements << self
18
+ else
19
+ @steps = StepCollection.new(step_invocations)
20
+ end
21
+ end
22
+
23
+ def accept(visitor)
24
+ visitor.visit_comment(@comment) unless @comment.empty?
25
+ visitor.visit_tags(@tags)
26
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
27
+
28
+ background_failed = @background && @background.failed?
29
+ skip_invoke! if background_failed
30
+ skip_hooks = background_failed || @executed
31
+ visitor.step_mother.before_and_after(self, skip_hooks) do
32
+ visitor.visit_steps(@steps)
33
+ end
34
+ visitor.visit_exception(@exception, :failed) if @exception
35
+ @executed = true
36
+ end
37
+
38
+ # Returns true if one or more steps failed
39
+ def failed?
40
+ @steps.failed? || !!@exception
41
+ end
42
+
43
+ def fail!(exception)
44
+ @exception = exception
45
+ end
46
+
47
+ # Returns true if all steps passed
48
+ def passed?
49
+ !failed?
50
+ end
51
+
52
+ # Returns the first exception (if any)
53
+ def exception
54
+ @exception || @steps.exception
55
+ end
56
+
57
+ # Returns the status
58
+ def status
59
+ return :failed if @exception
60
+ @steps.status
61
+ end
62
+
63
+ def skip_invoke!
64
+ @steps.each{|step_invocation| step_invocation.skip_invoke!}
65
+ @feature.next_feature_element(self) do |next_one|
66
+ next_one.skip_invoke!
67
+ end
68
+ end
69
+
70
+ def to_sexp
71
+ sexp = [:scenario, @line, @keyword, @name]
72
+ comment = @comment.to_sexp
73
+ sexp += [comment] if comment
74
+ tags = @tags.to_sexp
75
+ sexp += tags if tags.any?
76
+ steps = @steps.to_sexp
77
+ sexp += steps if steps.any?
78
+ sexp
79
+ end
80
+
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,93 @@
1
+ module Cucumber
2
+ module Ast
3
+ class ScenarioOutline
4
+ include FeatureElement
5
+
6
+ module ExamplesArray
7
+ def accept(visitor)
8
+ each do |examples|
9
+ visitor.visit_examples(examples)
10
+ end
11
+ end
12
+ end
13
+
14
+ # The +example_sections+ argument must be an Array where each element is another array representing
15
+ # an Examples section. This array has 3 elements:
16
+ #
17
+ # * Examples keyword
18
+ # * Examples section name
19
+ # * Raw matrix
20
+ def initialize(background, comment, tags, line, keyword, name, steps, example_sections)
21
+ @background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
22
+ attach_steps(steps)
23
+ @steps = StepCollection.new(steps)
24
+
25
+ @examples_array = example_sections.map do |example_section|
26
+ examples_line = example_section[0]
27
+ examples_keyword = example_section[1]
28
+ examples_name = example_section[2]
29
+ examples_matrix = example_section[3]
30
+
31
+ examples_table = OutlineTable.new(examples_matrix, self)
32
+ Examples.new(examples_line, examples_keyword, examples_name, examples_table)
33
+ end
34
+ @examples_array.extend(ExamplesArray)
35
+
36
+ @background.feature_elements << self if @background
37
+ end
38
+
39
+ def accept(visitor)
40
+ visitor.visit_comment(@comment) unless @comment.empty?
41
+ visitor.visit_tags(@tags)
42
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
43
+ visitor.visit_steps(@steps)
44
+
45
+ skip_invoke! if @background && @background.failed?
46
+ visitor.visit_examples_array(@examples_array) unless @examples_array.empty?
47
+ end
48
+
49
+ def skip_invoke!
50
+ @examples_array.each{|examples| examples.skip_invoke!}
51
+ @feature.next_feature_element(self) do |next_one|
52
+ next_one.skip_invoke!
53
+ end
54
+ end
55
+
56
+ def step_invocations(cells)
57
+ step_invocations = @steps.step_invocations_from_cells(cells)
58
+ if @background
59
+ @background.step_collection(step_invocations)
60
+ else
61
+ StepCollection.new(step_invocations)
62
+ end
63
+ end
64
+
65
+ def each_example_row(&proc)
66
+ @examples_array.each do |examples|
67
+ examples.each_example_row(&proc)
68
+ end
69
+ end
70
+
71
+ def visit_scenario_name(visitor, row)
72
+ visitor.visit_scenario_name(
73
+ @feature.language.scenario_keyword,
74
+ row.name,
75
+ file_colon_line(row.line),
76
+ source_indent(first_line_length)
77
+ )
78
+ end
79
+
80
+ def to_sexp
81
+ sexp = [:scenario_outline, @keyword, @name]
82
+ comment = @comment.to_sexp
83
+ sexp += [comment] if comment
84
+ tags = @tags.to_sexp
85
+ sexp += tags if tags.any?
86
+ steps = @steps.to_sexp
87
+ sexp += steps if steps.any?
88
+ sexp += @examples_array.map{|e| e.to_sexp}
89
+ sexp
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,112 @@
1
+ require 'cucumber/step_definition'
2
+ require 'cucumber/core_ext/string'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ class Step
7
+ attr_reader :line, :keyword, :name, :multiline_arg
8
+ attr_writer :step_collection, :options
9
+ attr_accessor :feature_element, :exception
10
+
11
+ INDENT = 2
12
+
13
+ def initialize(line, keyword, name, multiline_arg=nil)
14
+ @line, @keyword, @name, @multiline_arg = line, keyword, name, multiline_arg
15
+ end
16
+
17
+ def background?
18
+ false
19
+ end
20
+
21
+ def step_invocation
22
+ StepInvocation.new(self, @name, @multiline_arg, [])
23
+ end
24
+
25
+ def step_invocation_from_cells(cells)
26
+ matched_cells = matched_cells(cells)
27
+
28
+ delimited_arguments = delimit_argument_names(cells.to_hash)
29
+ name = replace_name_arguments(delimited_arguments)
30
+ multiline_arg = @multiline_arg.nil? ? nil : @multiline_arg.arguments_replaced(delimited_arguments)
31
+
32
+ StepInvocation.new(self, name, multiline_arg, matched_cells)
33
+ end
34
+
35
+ def accept(visitor)
36
+ # The only time a Step is visited is when it is in a ScenarioOutline.
37
+ # Otherwise it's always StepInvocation that gets visited instead.
38
+ visit_step_result(visitor, first_match(visitor), @multiline_arg, :skipped, nil, nil)
39
+ end
40
+
41
+ def visit_step_result(visitor, step_match, multiline_arg, status, exception, background)
42
+ visitor.visit_step_result(@keyword, step_match, @multiline_arg, status, exception, source_indent, background)
43
+ end
44
+
45
+ def first_match(visitor)
46
+ # @feature_element is always a ScenarioOutline in this case
47
+ @feature_element.each_example_row do |cells|
48
+ argument_hash = cells.to_hash
49
+ delimited_arguments = delimit_argument_names(argument_hash)
50
+ name = replace_name_arguments(delimited_arguments)
51
+ step_match = visitor.step_mother.step_match(name, @name) rescue nil
52
+ return step_match if step_match
53
+ end
54
+ NoStepMatch.new(self, @name)
55
+ end
56
+
57
+ def to_sexp
58
+ [:step, @line, @keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
59
+ end
60
+
61
+ def source_indent
62
+ @feature_element.source_indent(text_length)
63
+ end
64
+
65
+ def text_length(name=@name)
66
+ @keyword.jlength + name.jlength + INDENT # Add indent as steps get indented more than scenarios
67
+ end
68
+
69
+ def backtrace_line
70
+ @backtrace_line ||= @feature_element.backtrace_line("#{@keyword} #{@name}", @line) unless @feature_element.nil?
71
+ end
72
+
73
+ def file_colon_line
74
+ @file_colon_line ||= @feature_element.file_colon_line(@line) unless @feature_element.nil?
75
+ end
76
+
77
+ def language
78
+ @feature_element.language
79
+ end
80
+
81
+ def dom_id
82
+ @dom_id ||= file_colon_line.gsub(/\//, '_').gsub(/\./, '_').gsub(/:/, '_')
83
+ end
84
+
85
+ private
86
+
87
+ def matched_cells(cells)
88
+ cells.select do |cell|
89
+ delimited = delimited(cell.header_cell.value)
90
+ @name.index(delimited) || (@multiline_arg && @multiline_arg.has_text?(delimited))
91
+ end
92
+ end
93
+
94
+ def delimit_argument_names(argument_hash)
95
+ argument_hash.inject({}) { |h,(name,value)| h[delimited(name)] = value; h }
96
+ end
97
+
98
+ def delimited(s)
99
+ "<#{s}>"
100
+ end
101
+
102
+ def replace_name_arguments(argument_hash)
103
+ name_with_arguments_replaced = @name
104
+ argument_hash.each do |name, value|
105
+ value ||= ''
106
+ name_with_arguments_replaced = name_with_arguments_replaced.gsub(name, value) if value
107
+ end
108
+ name_with_arguments_replaced
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,75 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Holds an Array of Step or StepDefinition
4
+ class StepCollection
5
+ include Enumerable
6
+
7
+ def initialize(steps)
8
+ @steps = steps
9
+ @steps.each{|step| step.step_collection = self}
10
+ end
11
+
12
+ def accept(visitor, &proc)
13
+ @steps.each do |step|
14
+ visitor.visit_step(step) if proc.nil? || proc.call(step)
15
+ end
16
+ end
17
+
18
+ def step_invocations(background = false)
19
+ StepCollection.new(@steps.map{ |step|
20
+ i = step.step_invocation
21
+ i.background = background
22
+ i
23
+ })
24
+ end
25
+
26
+ def step_invocations_from_cells(cells)
27
+ @steps.map{|step| step.step_invocation_from_cells(cells)}
28
+ end
29
+
30
+ # Duplicates this instance and adds +step_invocations+ to the end
31
+ def dup(step_invocations = [])
32
+ StepCollection.new(@steps + step_invocations)
33
+ end
34
+
35
+ def each(&proc)
36
+ @steps.each(&proc)
37
+ end
38
+
39
+ def previous_step(step)
40
+ i = @steps.index(step) || -1
41
+ @steps[i-1]
42
+ end
43
+
44
+ def empty?
45
+ @steps.empty?
46
+ end
47
+
48
+ def max_line_length(feature_element)
49
+ lengths = (@steps + [feature_element]).map{|e| e.text_length}
50
+ lengths.max
51
+ end
52
+
53
+ def exception
54
+ @exception ||= ((failed = @steps.detect {|step| step.exception}) && failed.exception)
55
+ end
56
+
57
+ def failed?
58
+ status == :failed
59
+ end
60
+
61
+ def passed?
62
+ status == :passed
63
+ end
64
+
65
+ def status
66
+ @steps.each{|step_invocation| return step_invocation.status if step_invocation.status != :passed}
67
+ :passed
68
+ end
69
+
70
+ def to_sexp
71
+ @steps.map{|step| step.to_sexp}
72
+ end
73
+ end
74
+ end
75
+ end