squirrel-cucumber 0.3.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (408) 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-lol/Rakefile +6 -0
  46. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  47. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  48. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  49. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  50. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  51. data/examples/i18n/en/Rakefile +6 -0
  52. data/examples/i18n/en/features/addition.feature +17 -0
  53. data/examples/i18n/en/features/division.feature +10 -0
  54. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  55. data/examples/i18n/en/lib/calculator.rb +14 -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/test_unit/Rakefile +6 -0
  209. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  210. data/examples/test_unit/features/test_unit.feature +9 -0
  211. data/examples/tickets/Rakefile +16 -0
  212. data/examples/tickets/features/172.feature +28 -0
  213. data/examples/tickets/features/177/1.feature +29 -0
  214. data/examples/tickets/features/177/2.feature +21 -0
  215. data/examples/tickets/features/177/3.feature +18 -0
  216. data/examples/tickets/features/180.feature +7 -0
  217. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  218. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  219. data/examples/tickets/features/236.feature +13 -0
  220. data/examples/tickets/features/241.feature +13 -0
  221. data/examples/tickets/features/246.feature +4 -0
  222. data/examples/tickets/features/248.feature +11 -0
  223. data/examples/tickets/features/270/back.feature +14 -0
  224. data/examples/tickets/features/270/back.steps.rb +14 -0
  225. data/examples/tickets/features/272/hooks.feature +26 -0
  226. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  227. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  228. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  229. data/examples/tickets/features/279/wrong.feature_ +11 -0
  230. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  231. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  232. data/examples/tickets/features/306/only_background.feature +4 -0
  233. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  234. data/examples/tickets/features/lib/pantry.rb +20 -0
  235. data/examples/tickets/features/scenario_outline.feature +95 -0
  236. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  237. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  238. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  239. data/examples/tickets/features/step_definitons/tickets_steps.rb +66 -0
  240. data/examples/tickets/features/tickets.feature +28 -0
  241. data/examples/watir/README.textile +16 -0
  242. data/examples/watir/Rakefile +6 -0
  243. data/examples/watir/features/search.feature +12 -0
  244. data/examples/watir/features/step_definitons/search_steps.rb +22 -0
  245. data/examples/watir/features/support/env.rb +32 -0
  246. data/features/after_block_exceptions.feature +102 -0
  247. data/features/after_step_block_exceptions.feature +104 -0
  248. data/features/background.feature +311 -0
  249. data/features/bug_371.feature +32 -0
  250. data/features/cucumber_cli.feature +549 -0
  251. data/features/cucumber_cli_diff_disabled.feature +53 -0
  252. data/features/cucumber_cli_outlines.feature +109 -0
  253. data/features/custom_formatter.feature +11 -0
  254. data/features/drb_server_integration.feature +115 -0
  255. data/features/exclude_files.feature +20 -0
  256. data/features/expand.feature +49 -0
  257. data/features/html_formatter.feature +7 -0
  258. data/features/html_formatter/a.html +185 -0
  259. data/features/junit_formatter.feature +71 -0
  260. data/features/language_from_header.feature +30 -0
  261. data/features/multiline_names.feature +43 -0
  262. data/features/rake_task.feature +150 -0
  263. data/features/report_called_undefined_steps.feature +35 -0
  264. data/features/snippet.feature +22 -0
  265. data/features/step_definitions/cucumber_steps.rb +130 -0
  266. data/features/step_definitions/extra_steps.rb +2 -0
  267. data/features/support/env.rb +120 -0
  268. data/features/usage.feature +126 -0
  269. data/features/work_in_progress.feature +151 -0
  270. data/gem_tasks/deployment.rake +11 -0
  271. data/gem_tasks/environment.rake +7 -0
  272. data/gem_tasks/features.rake +10 -0
  273. data/gem_tasks/fix_cr_lf.rake +10 -0
  274. data/gem_tasks/flog.rake +4 -0
  275. data/gem_tasks/gemspec.rake +10 -0
  276. data/gem_tasks/rspec.rake +45 -0
  277. data/gem_tasks/sass.rake +4 -0
  278. data/gem_tasks/yard.rake +8 -0
  279. data/lib/autotest/cucumber.rb +6 -0
  280. data/lib/autotest/cucumber_mixin.rb +125 -0
  281. data/lib/autotest/cucumber_rails.rb +6 -0
  282. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  283. data/lib/autotest/cucumber_rspec.rb +6 -0
  284. data/lib/autotest/discover.rb +9 -0
  285. data/lib/cucumber.rb +11 -0
  286. data/lib/cucumber/ast.rb +29 -0
  287. data/lib/cucumber/ast/background.rb +62 -0
  288. data/lib/cucumber/ast/comment.rb +30 -0
  289. data/lib/cucumber/ast/examples.rb +26 -0
  290. data/lib/cucumber/ast/feature.rb +58 -0
  291. data/lib/cucumber/ast/feature_element.rb +57 -0
  292. data/lib/cucumber/ast/features.rb +30 -0
  293. data/lib/cucumber/ast/outline_table.rb +143 -0
  294. data/lib/cucumber/ast/py_string.rb +57 -0
  295. data/lib/cucumber/ast/scenario.rb +83 -0
  296. data/lib/cucumber/ast/scenario_outline.rb +93 -0
  297. data/lib/cucumber/ast/step.rb +112 -0
  298. data/lib/cucumber/ast/step_collection.rb +75 -0
  299. data/lib/cucumber/ast/step_invocation.rb +136 -0
  300. data/lib/cucumber/ast/table.rb +334 -0
  301. data/lib/cucumber/ast/tags.rb +33 -0
  302. data/lib/cucumber/ast/visitor.rb +116 -0
  303. data/lib/cucumber/broadcaster.rb +13 -0
  304. data/lib/cucumber/cli/configuration.rb +425 -0
  305. data/lib/cucumber/cli/drb_client.rb +20 -0
  306. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  307. data/lib/cucumber/cli/main.rb +136 -0
  308. data/lib/cucumber/core_ext/exception.rb +53 -0
  309. data/lib/cucumber/core_ext/instance_exec.rb +67 -0
  310. data/lib/cucumber/core_ext/proc.rb +29 -0
  311. data/lib/cucumber/core_ext/string.rb +48 -0
  312. data/lib/cucumber/feature_file.rb +47 -0
  313. data/lib/cucumber/filter.rb +50 -0
  314. data/lib/cucumber/formatter/ansicolor.rb +110 -0
  315. data/lib/cucumber/formatter/color_io.rb +23 -0
  316. data/lib/cucumber/formatter/console.rb +149 -0
  317. data/lib/cucumber/formatter/cucumber.css +132 -0
  318. data/lib/cucumber/formatter/cucumber.sass +139 -0
  319. data/lib/cucumber/formatter/duration.rb +10 -0
  320. data/lib/cucumber/formatter/html.rb +258 -0
  321. data/lib/cucumber/formatter/junit.rb +75 -0
  322. data/lib/cucumber/formatter/pretty.rb +188 -0
  323. data/lib/cucumber/formatter/profile.rb +77 -0
  324. data/lib/cucumber/formatter/progress.rb +60 -0
  325. data/lib/cucumber/formatter/rerun.rb +44 -0
  326. data/lib/cucumber/formatter/tag_cloud.rb +28 -0
  327. data/lib/cucumber/formatter/unicode.rb +35 -0
  328. data/lib/cucumber/formatter/usage.rb +85 -0
  329. data/lib/cucumber/formatters/unicode.rb +7 -0
  330. data/lib/cucumber/languages.yml +532 -0
  331. data/lib/cucumber/parser.rb +6 -0
  332. data/lib/cucumber/parser/feature.rb +1787 -0
  333. data/lib/cucumber/parser/feature.tt +324 -0
  334. data/lib/cucumber/parser/i18n.tt +42 -0
  335. data/lib/cucumber/parser/i18n/language.rb +80 -0
  336. data/lib/cucumber/parser/table.rb +414 -0
  337. data/lib/cucumber/parser/table.tt +71 -0
  338. data/lib/cucumber/parser/treetop_ext.rb +52 -0
  339. data/lib/cucumber/platform.rb +23 -0
  340. data/lib/cucumber/rails/rspec.rb +10 -0
  341. data/lib/cucumber/rails/world.rb +99 -0
  342. data/lib/cucumber/rake/task.rb +233 -0
  343. data/lib/cucumber/rspec_neuter.rb +23 -0
  344. data/lib/cucumber/step_definition.rb +122 -0
  345. data/lib/cucumber/step_match.rb +61 -0
  346. data/lib/cucumber/step_mother.rb +362 -0
  347. data/lib/cucumber/version.rb +10 -0
  348. data/lib/cucumber/webrat/mechanize_world.rb +79 -0
  349. data/lib/cucumber/world.rb +53 -0
  350. data/rails_generators/cucumber/USAGE +11 -0
  351. data/rails_generators/cucumber/cucumber_generator.rb +66 -0
  352. data/rails_generators/cucumber/templates/cucumber +8 -0
  353. data/rails_generators/cucumber/templates/cucumber.rake +20 -0
  354. data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
  355. data/rails_generators/cucumber/templates/env.rb +26 -0
  356. data/rails_generators/cucumber/templates/paths.rb +27 -0
  357. data/rails_generators/cucumber/templates/spork_env.rb +36 -0
  358. data/rails_generators/cucumber/templates/webrat_steps.rb +147 -0
  359. data/rails_generators/feature/USAGE +12 -0
  360. data/rails_generators/feature/feature_generator.rb +40 -0
  361. data/rails_generators/feature/templates/feature.erb +31 -0
  362. data/rails_generators/feature/templates/steps.erb +20 -0
  363. data/spec/cucumber/ast/background_spec.rb +50 -0
  364. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  365. data/spec/cucumber/ast/feature_factory.rb +63 -0
  366. data/spec/cucumber/ast/feature_spec.rb +38 -0
  367. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  368. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  369. data/spec/cucumber/ast/scenario_spec.rb +38 -0
  370. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  371. data/spec/cucumber/ast/step_spec.rb +66 -0
  372. data/spec/cucumber/ast/table_spec.rb +186 -0
  373. data/spec/cucumber/ast/visitor_spec.rb +27 -0
  374. data/spec/cucumber/broadcaster_spec.rb +15 -0
  375. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  376. data/spec/cucumber/cli/drb_client_spec.rb +43 -0
  377. data/spec/cucumber/cli/main_spec.rb +140 -0
  378. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  379. data/spec/cucumber/core_ext/string_spec.rb +42 -0
  380. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  381. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  382. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  383. data/spec/cucumber/formatter/progress_spec.rb +36 -0
  384. data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
  385. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  386. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  387. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  388. data/spec/cucumber/rails/world_spec.rb +11 -0
  389. data/spec/cucumber/sell_cucumbers.feature +19 -0
  390. data/spec/cucumber/step_definition_spec.rb +101 -0
  391. data/spec/cucumber/step_mother_spec.rb +155 -0
  392. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  393. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  394. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  395. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  396. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  397. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  398. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  399. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  400. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  401. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  402. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  403. data/spec/cucumber/treetop_parser/with_comments.feature +10 -0
  404. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  405. data/spec/cucumber/world/pending_spec.rb +47 -0
  406. data/spec/spec.opts +2 -0
  407. data/spec/spec_helper.rb +13 -0
  408. metadata +503 -0
@@ -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
@@ -0,0 +1,362 @@
1
+ require 'cucumber/step_definition'
2
+ require 'cucumber/world'
3
+ require 'cucumber/core_ext/instance_exec'
4
+
5
+ module Cucumber
6
+ class Undefined < StandardError
7
+ attr_reader :step_name
8
+
9
+ def initialize(step_name)
10
+ super %{Undefined step: "#{step_name}"}
11
+ @step_name = step_name
12
+ end
13
+
14
+ def nested!
15
+ @nested = true
16
+ end
17
+
18
+ def nested?
19
+ @nested
20
+ end
21
+ end
22
+
23
+ # Raised when a StepDefinition's block invokes World#pending
24
+ class Pending < StandardError
25
+ end
26
+
27
+ # Raised when a step matches 2 or more StepDefinition
28
+ class Ambiguous < StandardError
29
+ def initialize(step_name, step_definitions, used_guess)
30
+ message = "Ambiguous match of \"#{step_name}\":\n\n"
31
+ message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
32
+ message << "\n\n"
33
+ message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
34
+ super(message)
35
+ end
36
+ end
37
+
38
+ # Raised when 2 or more StepDefinition have the same Regexp
39
+ class Redundant < StandardError
40
+ def initialize(step_def_1, step_def_2)
41
+ message = "Multiple step definitions have the same Regexp:\n\n"
42
+ message << step_def_1.backtrace_line << "\n"
43
+ message << step_def_2.backtrace_line << "\n\n"
44
+ super(message)
45
+ end
46
+ end
47
+
48
+ class NilWorld < StandardError
49
+ def initialize
50
+ super("World procs should never return nil")
51
+ end
52
+ end
53
+
54
+ class MultipleWorld < StandardError
55
+ def initialize(first_proc, second_proc)
56
+ message = "You can only pass a proc to #World once, but it's happening\n"
57
+ message << "in 2 places:\n\n"
58
+ message << first_proc.backtrace_line('World') << "\n"
59
+ message << second_proc.backtrace_line('World') << "\n\n"
60
+ message << "Use Ruby modules instead to extend your worlds. See the Cucumber::StepMother#World RDoc\n"
61
+ message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
62
+ super(message)
63
+ end
64
+ end
65
+
66
+ # This is the main interface for registering step definitions, which is done
67
+ # from <tt>*_steps.rb</tt> files. This module is included right at the top-level
68
+ # so #register_step_definition (and more interestingly - its aliases) are
69
+ # available from the top-level.
70
+ module StepMother
71
+ class Hook
72
+ def initialize(tag_names, proc)
73
+ @tag_names = tag_names.map{|tag| Ast::Tags.strip_prefix(tag)}
74
+ @proc = proc
75
+ end
76
+
77
+ def matches_tag_names?(tag_names)
78
+ @tag_names.empty? || (@tag_names & tag_names).any?
79
+ end
80
+
81
+ def execute_in(world, scenario, location, exception_fails_scenario = true)
82
+ begin
83
+ world.cucumber_instance_exec(false, location, scenario, &@proc)
84
+ rescue Exception => exception
85
+ if exception_fails_scenario
86
+ scenario.fail!(exception)
87
+ else
88
+ raise
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ class << self
95
+ def alias_adverb(adverb)
96
+ adverb = adverb.gsub(/\s/, '')
97
+ alias_method adverb, :register_step_definition
98
+ end
99
+ end
100
+
101
+ attr_writer :snippet_generator, :options, :visitor
102
+
103
+ def options
104
+ @options ||= {}
105
+ end
106
+
107
+ def step_visited(step)
108
+ steps << step unless steps.index(step)
109
+ end
110
+
111
+ def steps(status = nil)
112
+ @steps ||= []
113
+ if(status)
114
+ @steps.select{|step| step.status == status}
115
+ else
116
+ @steps
117
+ end
118
+ end
119
+
120
+ def scenarios(status = nil)
121
+ @scenarios ||= []
122
+ if(status)
123
+ @scenarios.select{|scenario| scenario.status == status}
124
+ else
125
+ @scenarios
126
+ end
127
+ end
128
+
129
+ # Registers a new StepDefinition. This method is aliased
130
+ # to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>.
131
+ #
132
+ # See Cucumber#alias_steps for details on how to
133
+ # create your own aliases.
134
+ #
135
+ # The +&proc+ gets executed in the context of a <tt>world</tt>
136
+ # object, which is defined by #World. A new <tt>world</tt>
137
+ # object is created for each scenario and is shared across
138
+ # step definitions within that scenario.
139
+ def register_step_definition(regexp, &proc)
140
+ step_definition = StepDefinition.new(regexp, &proc)
141
+ step_definitions.each do |already|
142
+ raise Redundant.new(already, step_definition) if already.match(regexp)
143
+ end
144
+ step_definitions << step_definition
145
+ step_definition
146
+ end
147
+
148
+ # Registers a Before proc. You can call this method as many times as you
149
+ # want (typically from ruby scripts under <tt>support</tt>).
150
+ def Before(*tag_names, &proc)
151
+ register_hook(:before, tag_names, proc)
152
+ end
153
+
154
+ def After(*tag_names, &proc)
155
+ register_hook(:after, tag_names, proc)
156
+ end
157
+
158
+ def AfterStep(*tag_names, &proc)
159
+ register_hook(:after_step, tag_names, proc)
160
+ end
161
+
162
+ def register_hook(phase, tags, proc)
163
+ hook = Hook.new(tags, proc)
164
+ hooks[phase] << hook
165
+ hook
166
+ end
167
+
168
+ def hooks
169
+ @hooks ||= Hash.new {|hash, phase| hash[phase] = []}
170
+ end
171
+
172
+ def hooks_for(phase, scenario)
173
+ hooks[phase].select{|hook| scenario.accept_hook?(hook)}
174
+ end
175
+
176
+ # Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
177
+ # The +proc+ will be executed once before each scenario to create an
178
+ # Object that the scenario's steps will run within. Any +world_modules+
179
+ # will be mixed into this Object (via Object#extend).
180
+ #
181
+ # This method is typically called from one or more Ruby scripts under
182
+ # <tt>features/support</tt>. You can call this method as many times as you
183
+ # like (to register more modules), but if you try to register more than
184
+ # one Proc you will get an error.
185
+ #
186
+ # Cucumber will not yield anything to the +proc+ (like it used to do before v0.3).
187
+ #
188
+ # In earlier versions of Cucumber (before 0.3) you could not register
189
+ # any +world_modules+. Instead you would register several Proc objects (by
190
+ # calling the method several times). The result of each +proc+ would be yielded
191
+ # to the next +proc+. Example:
192
+ #
193
+ # World do |world| # NOT SUPPORTED FROM 0.3
194
+ # MyClass.new
195
+ # end
196
+ #
197
+ # World do |world| # NOT SUPPORTED FROM 0.3
198
+ # world.extend(MyModule)
199
+ # end
200
+ #
201
+ # From Cucumber 0.3 the recommended way to do this is:
202
+ #
203
+ # World do
204
+ # MyClass.new
205
+ # end
206
+ #
207
+ # World(MyModule)
208
+ #
209
+ def World(*world_modules, &proc)
210
+ if(proc)
211
+ raise MultipleWorld.new(@world_proc, proc) if @world_proc
212
+ @world_proc = proc
213
+ end
214
+ @world_modules ||= []
215
+ @world_modules += world_modules
216
+ end
217
+
218
+ def current_world
219
+ @current_world
220
+ end
221
+
222
+ def step_match(step_name, formatted_step_name=nil)
223
+ matches = step_definitions.map { |d| d.step_match(step_name, formatted_step_name) }.compact
224
+ raise Undefined.new(step_name) if matches.empty?
225
+ matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
226
+ raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
227
+ matches[0]
228
+ end
229
+
230
+ def best_matches(step_name, step_matches)
231
+ max_arg_length = step_matches.map {|step_match| step_match.args.length }.max
232
+ top_groups = step_matches.select {|step_match| step_match.args.length == max_arg_length }
233
+
234
+ if top_groups.length > 1
235
+ shortest_capture_length = top_groups.map {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } }.min
236
+ top_groups.select {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } == shortest_capture_length }
237
+ else
238
+ top_groups
239
+ end
240
+ end
241
+
242
+ def clear!
243
+ step_definitions.clear
244
+ hooks.clear
245
+ steps.clear
246
+ scenarios.clear
247
+ end
248
+
249
+ def step_definitions
250
+ @step_definitions ||= []
251
+ end
252
+
253
+ def snippet_text(step_keyword, step_name, multiline_arg_class)
254
+ @snippet_generator.snippet_text(step_keyword, step_name, multiline_arg_class)
255
+ end
256
+
257
+ def before_and_after(scenario, skip_hooks=false)
258
+ before(scenario) unless skip_hooks
259
+ @current_scenario = scenario
260
+ yield scenario
261
+ @current_scenario = nil
262
+ after(scenario) unless skip_hooks
263
+ scenario_visited(scenario)
264
+ end
265
+
266
+ def before(scenario)
267
+ unless current_world
268
+ new_world!
269
+ execute_before(scenario)
270
+ end
271
+ end
272
+
273
+ def after(scenario)
274
+ execute_after(scenario)
275
+ nil_world!
276
+ end
277
+
278
+ def after_step
279
+ execute_after_step(@current_scenario)
280
+ end
281
+
282
+ private
283
+
284
+ def max_step_definition_length
285
+ @max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
286
+ end
287
+
288
+ # Creates a new world instance
289
+ def new_world!
290
+ return if options[:dry_run]
291
+ create_world!
292
+ extend_world
293
+ connect_world
294
+ @current_world
295
+ end
296
+
297
+ def create_world!
298
+ if(@world_proc)
299
+ @current_world = @world_proc.call
300
+ check_nil(@current_world, @world_proc)
301
+ else
302
+ @current_world = Object.new
303
+ end
304
+ end
305
+
306
+ def extend_world
307
+ @current_world.extend(World)
308
+ @current_world.extend(::Spec::Matchers) if defined?(::Spec::Matchers)
309
+ (@world_modules || []).each do |mod|
310
+ @current_world.extend(mod)
311
+ end
312
+ end
313
+
314
+ def connect_world
315
+ @current_world.__cucumber_step_mother = self
316
+ @current_world.__cucumber_visitor = @visitor
317
+ end
318
+
319
+ def check_nil(o, proc)
320
+ if o.nil?
321
+ begin
322
+ raise NilWorld.new
323
+ rescue NilWorld => e
324
+ e.backtrace.clear
325
+ e.backtrace.push(proc.backtrace_line("World"))
326
+ raise e
327
+ end
328
+ else
329
+ o
330
+ end
331
+ end
332
+
333
+ def nil_world!
334
+ @current_world = nil
335
+ end
336
+
337
+ def execute_before(scenario)
338
+ return if options[:dry_run]
339
+ hooks_for(:before, scenario).each do |hook|
340
+ hook.execute_in(@current_world, scenario, 'Before')
341
+ end
342
+ end
343
+
344
+ def execute_after(scenario)
345
+ return if options[:dry_run]
346
+ hooks_for(:after, scenario).each do |hook|
347
+ hook.execute_in(@current_world, scenario, 'After')
348
+ end
349
+ end
350
+
351
+ def execute_after_step(scenario)
352
+ return if options[:dry_run]
353
+ hooks_for(:after_step, scenario).each do |hook|
354
+ hook.execute_in(@current_world, scenario, 'AfterStep', false)
355
+ end
356
+ end
357
+
358
+ def scenario_visited(scenario)
359
+ scenarios << scenario unless scenarios.index(scenario)
360
+ end
361
+ end
362
+ end