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,136 @@
1
+ module Cucumber
2
+ module Ast
3
+ class StepInvocation
4
+ attr_writer :step_collection, :background
5
+ attr_reader :name, :matched_cells, :status, :reported_exception
6
+ attr_accessor :exception
7
+
8
+ def initialize(step, name, multiline_arg, matched_cells)
9
+ @step, @name, @multiline_arg, @matched_cells = step, name, multiline_arg, matched_cells
10
+ status!(:skipped)
11
+ end
12
+
13
+ def background?
14
+ @background
15
+ end
16
+
17
+ def skip_invoke!
18
+ @skip_invoke = true
19
+ end
20
+
21
+ def accept(visitor)
22
+ invoke(visitor.step_mother, visitor.options)
23
+ visit_step_result(visitor)
24
+ end
25
+
26
+ def visit_step_result(visitor)
27
+ visitor.visit_step_result(keyword, @step_match, @multiline_arg, @status, @reported_exception, source_indent, @background)
28
+ end
29
+
30
+ def invoke(step_mother, options)
31
+ find_step_match!(step_mother)
32
+ unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
33
+ @skip_invoke = true
34
+ begin
35
+ step_mother.current_world.__cucumber_current_step = self if step_mother.current_world # Nil in Pure Java
36
+ @step_match.invoke(step_mother.current_world, @multiline_arg)
37
+ step_mother.after_step
38
+ status!(:passed)
39
+ rescue Pending => e
40
+ failed(options, e, false)
41
+ status!(:pending)
42
+ rescue Undefined => e
43
+ failed(options, e, false)
44
+ status!(:undefined)
45
+ rescue Exception => e
46
+ failed(options, e, false)
47
+ status!(:failed)
48
+ end
49
+ end
50
+ end
51
+
52
+ def find_step_match!(step_mother)
53
+ return if @step_match
54
+ begin
55
+ @step_match = step_mother.step_match(@name)
56
+ rescue Undefined => e
57
+ failed(step_mother.options, e, true)
58
+ status!(:undefined)
59
+ @step_match = NoStepMatch.new(@step, @name)
60
+ rescue Ambiguous => e
61
+ failed(step_mother.options, e, false)
62
+ status!(:failed)
63
+ @step_match = NoStepMatch.new(@step, @name)
64
+ end
65
+ step_mother.step_visited(self)
66
+ end
67
+
68
+ def failed(options, e, clear_backtrace)
69
+ e.set_backtrace([]) if clear_backtrace
70
+ e.backtrace << @step.backtrace_line unless @step.backtrace_line.nil?
71
+ @exception = e
72
+ if(options[:strict] || !(Undefined === e) || e.nested?)
73
+ @reported_exception = e
74
+ else
75
+ @reported_exception = nil
76
+ end
77
+ end
78
+
79
+ def status!(status)
80
+ @status = status
81
+ @matched_cells.each do |cell|
82
+ cell.status = status
83
+ end
84
+ end
85
+
86
+ def previous
87
+ @step_collection.previous_step(self)
88
+ end
89
+
90
+ def actual_keyword
91
+ repeat_keywords = [language.but_keywords, language.and_keywords].flatten
92
+ if repeat_keywords.index(@step.keyword) && previous
93
+ previous.actual_keyword
94
+ else
95
+ keyword
96
+ end
97
+ end
98
+
99
+ def source_indent
100
+ @step.feature_element.source_indent(text_length)
101
+ end
102
+
103
+ def text_length
104
+ @step.text_length(@name)
105
+ end
106
+
107
+ def keyword
108
+ @step.keyword
109
+ end
110
+
111
+ def multiline_arg
112
+ @step.multiline_arg
113
+ end
114
+
115
+ def file_colon_line
116
+ @step.file_colon_line
117
+ end
118
+
119
+ def dom_id
120
+ @step.dom_id
121
+ end
122
+
123
+ def backtrace_line
124
+ @step.backtrace_line
125
+ end
126
+
127
+ def language
128
+ @step.language
129
+ end
130
+
131
+ def to_sexp
132
+ [:step_invocation, @step.line, @step.keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,334 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Holds the data of a table parsed from a feature file:
4
+ #
5
+ # | a | b |
6
+ # | c | d |
7
+ #
8
+ # This gets parsed into a Table holding the values <tt>[['a', 'b'], ['c', 'd']]</tt>
9
+ #
10
+ class Table
11
+ NULL_CONVERSIONS = Hash.new(lambda{ |cell_value| cell_value }).freeze
12
+
13
+ attr_accessor :file
14
+
15
+ def self.default_arg_name
16
+ "table"
17
+ end
18
+
19
+ def initialize(raw, conversions = NULL_CONVERSIONS.dup)
20
+ # Verify that it's square
21
+ raw.transpose
22
+ @raw = raw
23
+ @cells_class = Cells
24
+ @cell_class = Cell
25
+ @conversion_procs = conversions
26
+ end
27
+
28
+ # Creates a copy of this table, inheriting the column mappings.
29
+ def dup
30
+ self.class.new(@raw.dup, @conversion_procs.dup)
31
+ end
32
+
33
+ # Returns a new, transposed table. Example:
34
+ #
35
+ # | a | 7 | 4 |
36
+ # | b | 9 | 2 |
37
+ #
38
+ # Gets converted into the following:
39
+ #
40
+ # | a | b |
41
+ # | 7 | 9 |
42
+ # | 4 | 2 |
43
+ #
44
+ def transpose
45
+ self.class.new(@raw.transpose, @conversion_procs.dup)
46
+ end
47
+
48
+ # Converts this table into an Array of Hash where the keys of each
49
+ # Hash are the headers in the table. For example, a Table built from
50
+ # the following plain text:
51
+ #
52
+ # | a | b | sum |
53
+ # | 2 | 3 | 5 |
54
+ # | 7 | 9 | 16 |
55
+ #
56
+ # Gets converted into the following:
57
+ #
58
+ # [{'a' => '2', 'b' => '3', 'sum' => '5'}, {'a' => '7', 'b' => '9', 'sum' => '16'}]
59
+ #
60
+ # Use #map_column! to specify how values in a column are converted.
61
+ #
62
+ def hashes
63
+ @hashes ||= cells_rows[1..-1].map do |row|
64
+ row.to_hash
65
+ end.freeze
66
+ end
67
+
68
+ # Converts this table into a Hash where the first column is
69
+ # used as keys and the second column is used as values
70
+ #
71
+ # | a | 2 |
72
+ # | b | 3 |
73
+ #
74
+ # Gets converted into the following:
75
+ #
76
+ # {'a' => '2', 'b' => '3'}
77
+ #
78
+ # The table must be exactly two columns wide
79
+ #
80
+ def rows_hash
81
+ verify_table_width(2)
82
+ @rows_hash = self.transpose.hashes[0]
83
+ end
84
+
85
+ # Gets the raw data of this table. For example, a Table built from
86
+ # the following plain text:
87
+ #
88
+ # | a | b |
89
+ # | c | d |
90
+ #
91
+ # Get converted into the following:
92
+ #
93
+ # [['a', 'b], ['c', 'd']]
94
+ #
95
+ def raw
96
+ @raw
97
+ end
98
+
99
+ # Same as #raw, but skips the first (header) row
100
+ def rows
101
+ @raw[1..-1]
102
+ end
103
+
104
+ def each_cells_row(&proc)
105
+ cells_rows.each(&proc)
106
+ end
107
+
108
+ def accept(visitor)
109
+ cells_rows.each do |row|
110
+ visitor.visit_table_row(row)
111
+ end
112
+ nil
113
+ end
114
+
115
+ # For testing only
116
+ def to_sexp #:nodoc:
117
+ [:table, *cells_rows.map{|row| row.to_sexp}]
118
+ end
119
+
120
+ # Returns a new Table where the headers are redefined. This makes it
121
+ # possible to use prettier header names in the features. Example:
122
+ #
123
+ # | Phone Number | Address |
124
+ # | 123456 | xyz |
125
+ # | 345678 | abc |
126
+ #
127
+ # A StepDefinition receiving this table can then map the columns:
128
+ #
129
+ # mapped_table = table.map_columns('Phone Number' => :phone, 'Address' => :address)
130
+ # hashes = mapped_table.hashes
131
+ # # => [{:phone => '123456', :address => 'xyz'}, {:phone => '345678', :address => 'abc'}]
132
+ #
133
+ def map_headers(mappings)
134
+ table = self.dup
135
+ table.map_headers!(mappings)
136
+ table
137
+ end
138
+
139
+ # Change how #hashes converts column values. The +column_name+ argument identifies the column
140
+ # and +conversion_proc+ performs the conversion for each cell in that column. If +strict+ is
141
+ # true, an error will be raised if the column named +column_name+ is not found. If +strict+
142
+ # is false, no error will be raised. Example:
143
+ #
144
+ # Given /^an expense report for (.*) with the following posts:$/ do |table|
145
+ # posts_table.map_column!('amount') { |a| a.to_i }
146
+ # posts_table.hashes.each do |post|
147
+ # # post['amount'] is a Fixnum, rather than a String
148
+ # end
149
+ # end
150
+ #
151
+ def map_column!(column_name, strict=true, &conversion_proc)
152
+ verify_column(column_name) if strict
153
+ @conversion_procs[column_name] = conversion_proc
154
+ end
155
+
156
+ def to_hash(cells) #:nodoc:
157
+ hash = Hash.new do |hash, key|
158
+ hash[key.to_s] if key.is_a?(Symbol)
159
+ end
160
+ @raw[0].each_with_index do |column_name, column_index|
161
+ value = @conversion_procs[column_name].call(cells.value(column_index))
162
+ hash[column_name] = value
163
+ end
164
+ hash
165
+ end
166
+
167
+ def index(cells) #:nodoc:
168
+ cells_rows.index(cells)
169
+ end
170
+
171
+ def verify_column(column_name)
172
+ raise %{The column named "#{column_name}" does not exist} unless @raw[0].include?(column_name)
173
+ end
174
+
175
+ def verify_table_width(width)
176
+ raise %{The table must have exactly #{width} columns} unless @raw[0].size == width
177
+ end
178
+
179
+ def arguments_replaced(arguments) #:nodoc:
180
+ raw_with_replaced_args = raw.map do |row|
181
+ row.map do |cell|
182
+ cell_with_replaced_args = cell
183
+ arguments.each do |name, value|
184
+ if cell_with_replaced_args && cell_with_replaced_args.include?(name)
185
+ cell_with_replaced_args = value ? cell_with_replaced_args.gsub(name, value) : nil
186
+ end
187
+ end
188
+ cell_with_replaced_args
189
+ end
190
+ end
191
+ Table.new(raw_with_replaced_args)
192
+ end
193
+
194
+ def has_text?(text)
195
+ raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
196
+ end
197
+
198
+ def cells_rows
199
+ @rows ||= cell_matrix.map do |cell_row|
200
+ @cells_class.new(self, cell_row)
201
+ end.freeze
202
+ end
203
+
204
+ def headers
205
+ @raw.first
206
+ end
207
+
208
+ def header_cell(col)
209
+ cells_rows[0][col]
210
+ end
211
+
212
+ protected
213
+
214
+ def map_headers!(mappings)
215
+ headers = @raw[0]
216
+ mappings.each_pair do |pre, post|
217
+ headers[headers.index(pre)] = post
218
+ if @conversion_procs.has_key?(pre)
219
+ @conversion_procs[post] = @conversion_procs.delete(pre)
220
+ end
221
+ end
222
+ end
223
+
224
+ private
225
+
226
+ def col_width(col)
227
+ columns[col].__send__(:width)
228
+ end
229
+
230
+ def columns
231
+ @columns ||= cell_matrix.transpose.map do |cell_row|
232
+ @cells_class.new(self, cell_row)
233
+ end.freeze
234
+ end
235
+
236
+ def cell_matrix
237
+ row = -1
238
+ @cell_matrix ||= @raw.map do |raw_row|
239
+ line = raw_row.line rescue -1
240
+ row += 1
241
+ col = -1
242
+ raw_row.map do |raw_cell|
243
+ col += 1
244
+ @cell_class.new(raw_cell, self, row, col, line)
245
+ end
246
+ end.freeze
247
+ end
248
+
249
+ # Represents a row of cells or columns of cells
250
+ class Cells
251
+ include Enumerable
252
+ attr_reader :exception
253
+
254
+ def initialize(table, cells)
255
+ @table, @cells = table, cells
256
+ end
257
+
258
+ def accept(visitor)
259
+ each do |cell|
260
+ visitor.visit_table_cell(cell)
261
+ end
262
+ nil
263
+ end
264
+
265
+ # For testing only
266
+ def to_sexp #:nodoc:
267
+ [:row, line, *@cells.map{|cell| cell.to_sexp}]
268
+ end
269
+
270
+ def to_hash #:nodoc:
271
+ @to_hash ||= @table.to_hash(self).freeze
272
+ end
273
+
274
+ def value(n) #:nodoc:
275
+ self[n].value
276
+ end
277
+
278
+ def [](n)
279
+ @cells[n]
280
+ end
281
+
282
+ def line
283
+ @cells[0].line
284
+ end
285
+
286
+ def dom_id
287
+ "row_#{line}"
288
+ end
289
+
290
+ private
291
+
292
+ def index
293
+ @table.index(self)
294
+ end
295
+
296
+ def width
297
+ map{|cell| cell.value ? cell.value.to_s.jlength : 0}.max
298
+ end
299
+
300
+ def each(&proc)
301
+ @cells.each(&proc)
302
+ end
303
+ end
304
+
305
+ class Cell
306
+ attr_reader :value, :line
307
+ attr_writer :status
308
+
309
+ def initialize(value, table, row, col, line)
310
+ @value, @table, @row, @col, @line = value, table, row, col, line
311
+ end
312
+
313
+ def accept(visitor)
314
+ visitor.visit_table_cell_value(@value, col_width, @status)
315
+ end
316
+
317
+ def header_cell
318
+ @table.header_cell(@col)
319
+ end
320
+
321
+ # For testing only
322
+ def to_sexp #:nodoc:
323
+ [:cell, @value]
324
+ end
325
+
326
+ private
327
+
328
+ def col_width
329
+ @col_width ||= @table.__send__(:col_width, @col).freeze
330
+ end
331
+ end
332
+ end
333
+ end
334
+ end
@@ -0,0 +1,33 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Holds the names of tags parsed from a feature file:
4
+ #
5
+ # @invoice @release_2
6
+ #
7
+ # This gets stored internally as <tt>["invoice", "release_2"]</tt>
8
+ #
9
+ class Tags
10
+ def self.strip_prefix(tag_name)
11
+ tag_name =~ /^@(.*)/ ? $1 : tag_name
12
+ end
13
+
14
+ def initialize(line, tag_names)
15
+ @line, @tag_names = line, tag_names
16
+ end
17
+
18
+ def accept(visitor)
19
+ @tag_names.each do |tag_name|
20
+ visitor.visit_tag_name(tag_name)
21
+ end
22
+ end
23
+
24
+ def accept_hook?(hook)
25
+ hook.matches_tag_names?(@tag_names)
26
+ end
27
+
28
+ def to_sexp
29
+ @tag_names.map{|tag_name| [:tag, tag_name]}
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,116 @@
1
+ module Cucumber
2
+ module Ast
3
+ # A dumb visitor that implements the whole Visitor API and just walks the tree.
4
+ class Visitor
5
+ attr_accessor :options
6
+ attr_reader :step_mother
7
+
8
+ def initialize(step_mother)
9
+ @options = {}
10
+ @step_mother = step_mother
11
+ end
12
+
13
+ def matches_scenario_names?(node)
14
+ scenario_name_regexps = options[:name_regexps] || []
15
+ scenario_name_regexps.empty? || node.matches_scenario_names?(scenario_name_regexps)
16
+ end
17
+
18
+ def visit_features(features)
19
+ features.accept(self)
20
+ end
21
+
22
+ def visit_feature(feature)
23
+ feature.accept(self)
24
+ end
25
+
26
+ def visit_comment(comment)
27
+ comment.accept(self)
28
+ end
29
+
30
+ def visit_comment_line(comment_line)
31
+ end
32
+
33
+ def visit_tags(tags)
34
+ tags.accept(self)
35
+ end
36
+
37
+ def visit_tag_name(tag_name)
38
+ end
39
+
40
+ def visit_feature_name(name)
41
+ end
42
+
43
+ # +feature_element+ is either Scenario or ScenarioOutline
44
+ def visit_feature_element(feature_element)
45
+ feature_element.accept(self)
46
+ end
47
+
48
+ def visit_background(background)
49
+ background.accept(self)
50
+ end
51
+
52
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
53
+ end
54
+
55
+ def visit_examples_array(examples_array)
56
+ examples_array.accept(self)
57
+ end
58
+
59
+ def visit_examples(examples)
60
+ examples.accept(self)
61
+ end
62
+
63
+ def visit_examples_name(keyword, name)
64
+ end
65
+
66
+ def visit_outline_table(outline_table)
67
+ outline_table.accept(self)
68
+ end
69
+
70
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
71
+ end
72
+
73
+ def visit_steps(steps)
74
+ steps.accept(self)
75
+ end
76
+
77
+ def visit_step(step)
78
+ step.accept(self)
79
+ end
80
+
81
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
82
+ visit_step_name(keyword, step_match, status, source_indent, background)
83
+ visit_multiline_arg(multiline_arg) if multiline_arg
84
+ visit_exception(exception, status) if exception
85
+ end
86
+
87
+ def visit_step_name(keyword, step_match, status, source_indent, background) #:nodoc:
88
+ end
89
+
90
+ def visit_multiline_arg(multiline_arg) #:nodoc:
91
+ multiline_arg.accept(self)
92
+ end
93
+
94
+ def visit_exception(exception, status) #:nodoc:
95
+ end
96
+
97
+ def visit_py_string(string)
98
+ end
99
+
100
+ def visit_table_row(table_row)
101
+ table_row.accept(self)
102
+ end
103
+
104
+ def visit_table_cell(table_cell)
105
+ table_cell.accept(self)
106
+ end
107
+
108
+ def visit_table_cell_value(value, width, status)
109
+ end
110
+
111
+ def announce(announcement)
112
+ end
113
+
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,29 @@
1
+ require 'cucumber/ast/comment'
2
+ require 'cucumber/ast/tags'
3
+ require 'cucumber/ast/features'
4
+ require 'cucumber/ast/feature'
5
+ require 'cucumber/ast/background'
6
+ require 'cucumber/ast/scenario'
7
+ require 'cucumber/ast/scenario_outline'
8
+ require 'cucumber/ast/step_invocation'
9
+ require 'cucumber/ast/step_collection'
10
+ require 'cucumber/ast/step'
11
+ require 'cucumber/ast/table'
12
+ require 'cucumber/ast/py_string'
13
+ require 'cucumber/ast/outline_table'
14
+ require 'cucumber/ast/examples'
15
+ require 'cucumber/ast/visitor'
16
+
17
+ module Cucumber
18
+ # Classes in this module represent the Abstract Syntax Tree (AST)
19
+ # that gets built when feature files are parsed.
20
+ #
21
+ # AST classes don't expose any internal data directly. This is
22
+ # in order to encourage a less coupled design in the classes
23
+ # that operate on the AST. The only public method is #accept.
24
+ #
25
+ # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
26
+ # for an example.
27
+ module Ast
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ module Cucumber
2
+ class Broadcaster
3
+ def initialize(receivers = [])
4
+ @receivers = receivers
5
+ end
6
+
7
+ def method_missing(method_name, *args)
8
+ @receivers.map do |receiver|
9
+ receiver.__send__(method_name, *args)
10
+ end
11
+ end
12
+ end
13
+ end