engineyard-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1073 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -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 +32 -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 +17 -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/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter.feature +7 -0
  279. data/features/html_formatter/a.html +183 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber.rb +10 -0
  315. data/lib/cucumber/ast.rb +29 -0
  316. data/lib/cucumber/ast/background.rb +63 -0
  317. data/lib/cucumber/ast/comment.rb +31 -0
  318. data/lib/cucumber/ast/examples.rb +32 -0
  319. data/lib/cucumber/ast/feature.rb +81 -0
  320. data/lib/cucumber/ast/feature_element.rb +61 -0
  321. data/lib/cucumber/ast/features.rb +40 -0
  322. data/lib/cucumber/ast/outline_table.rb +146 -0
  323. data/lib/cucumber/ast/py_string.rb +57 -0
  324. data/lib/cucumber/ast/scenario.rb +108 -0
  325. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  326. data/lib/cucumber/ast/step.rb +116 -0
  327. data/lib/cucumber/ast/step_collection.rb +76 -0
  328. data/lib/cucumber/ast/step_invocation.rb +166 -0
  329. data/lib/cucumber/ast/table.rb +626 -0
  330. data/lib/cucumber/ast/tags.rb +44 -0
  331. data/lib/cucumber/ast/visitor.rb +115 -0
  332. data/lib/cucumber/broadcaster.rb +13 -0
  333. data/lib/cucumber/cli/configuration.rb +190 -0
  334. data/lib/cucumber/cli/drb_client.rb +26 -0
  335. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  336. data/lib/cucumber/cli/main.rb +116 -0
  337. data/lib/cucumber/cli/options.rb +394 -0
  338. data/lib/cucumber/cli/profile_loader.rb +70 -0
  339. data/lib/cucumber/constantize.rb +28 -0
  340. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  341. data/lib/cucumber/core_ext/proc.rb +29 -0
  342. data/lib/cucumber/core_ext/string.rb +48 -0
  343. data/lib/cucumber/feature_file.rb +54 -0
  344. data/lib/cucumber/filter.rb +52 -0
  345. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  346. data/lib/cucumber/formatter/color_io.rb +23 -0
  347. data/lib/cucumber/formatter/console.rb +185 -0
  348. data/lib/cucumber/formatter/cucumber.css +132 -0
  349. data/lib/cucumber/formatter/cucumber.sass +139 -0
  350. data/lib/cucumber/formatter/duration.rb +13 -0
  351. data/lib/cucumber/formatter/html.rb +261 -0
  352. data/lib/cucumber/formatter/junit.rb +121 -0
  353. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  354. data/lib/cucumber/formatter/pdf.rb +217 -0
  355. data/lib/cucumber/formatter/pretty.rb +222 -0
  356. data/lib/cucumber/formatter/profile.rb +78 -0
  357. data/lib/cucumber/formatter/progress.rb +67 -0
  358. data/lib/cucumber/formatter/rerun.rb +46 -0
  359. data/lib/cucumber/formatter/steps.rb +50 -0
  360. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  361. data/lib/cucumber/formatter/unicode.rb +35 -0
  362. data/lib/cucumber/formatter/usage.rb +86 -0
  363. data/lib/cucumber/formatters/unicode.rb +7 -0
  364. data/lib/cucumber/language_support.rb +30 -0
  365. data/lib/cucumber/language_support/language_methods.rb +75 -0
  366. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  367. data/lib/cucumber/languages.yml +561 -0
  368. data/lib/cucumber/parser.rb +6 -0
  369. data/lib/cucumber/parser/feature.rb +1838 -0
  370. data/lib/cucumber/parser/feature.tt +351 -0
  371. data/lib/cucumber/parser/i18n.tt +42 -0
  372. data/lib/cucumber/parser/natural_language.rb +72 -0
  373. data/lib/cucumber/parser/table.rb +417 -0
  374. data/lib/cucumber/parser/table.tt +71 -0
  375. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  376. data/lib/cucumber/platform.rb +27 -0
  377. data/lib/cucumber/py_support/py_dsl.py +8 -0
  378. data/lib/cucumber/py_support/py_language.py +2 -0
  379. data/lib/cucumber/py_support/py_language.rb +68 -0
  380. data/lib/cucumber/rails/rspec.rb +10 -0
  381. data/lib/cucumber/rails/world.rb +100 -0
  382. data/lib/cucumber/rake/task.rb +241 -0
  383. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  384. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  385. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  386. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  387. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  388. data/lib/cucumber/rspec_neuter.rb +23 -0
  389. data/lib/cucumber/step_match.rb +61 -0
  390. data/lib/cucumber/step_mother.rb +307 -0
  391. data/lib/cucumber/version.rb +10 -0
  392. data/lib/cucumber/webrat/element_locator.rb +87 -0
  393. data/lib/cucumber/webrat/table_locator.rb +1 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -0
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'treetop'
3
+ require 'cucumber/parser'
4
+
5
+ module Cucumber
6
+ module Parser
7
+ describe 'Tables' do
8
+ before do
9
+ @parser = NaturalLanguage.get(StepMother.new, 'en').parser
10
+ end
11
+
12
+ after do
13
+ NaturalLanguage.instance_variable_set(:@languages, nil)
14
+ end
15
+
16
+ def parse(text)
17
+ @parser.__send__(:prepare_to_parse, text)
18
+ @parser.root = :table
19
+ table = @parser._nt_table
20
+ table.raw
21
+ end
22
+
23
+ it "should parse a 1x2 table with newline" do
24
+ parse(" | 1 | 2 | \n").should == [%w{1 2}]
25
+ end
26
+
27
+ it "should parse a 1x2 table without newline" do
28
+ parse("| 1 | 2 |").should == [%w{1 2}]
29
+ end
30
+
31
+ it "should parse a 1x2 table without spaces" do
32
+ parse("|1|2|").should == [%w{1 2}]
33
+ end
34
+
35
+ it "should parse a 2x2 table" do
36
+ parse("| 1 | 2 |\n| 3 | 4 |\n").should == [%w{1 2}, %w{3 4}]
37
+ end
38
+
39
+ it "should parse a 2x2 table with several newlines" do
40
+ parse("| 1 | 2 |\n| 3 | 4 |\n\n\n").should == [%w{1 2}, %w{3 4}]
41
+ end
42
+
43
+ it "should parse a 2x2 table with empty cells" do
44
+ parse("| 1 | |\n|| 4 |\n").should == [['1', nil], [nil, '4']]
45
+ end
46
+
47
+ it "should not parse a 2x2 table that isn't closed" do
48
+ parse("| 1 | |\n|| 4 ").should_not == [['1', nil], [nil, '4']]
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ # Define some stubs to fake Rails...
2
+ module ActiveRecord
3
+ class Base
4
+ end
5
+ end
6
+
7
+ module ActionController
8
+ class Dispatcher
9
+ end
10
+
11
+ class Base
12
+ end
13
+
14
+ class IntegrationTest
15
+ def self.use_transactional_fixtures=(x)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ # This file is loaded by rails/world.rb
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ $:.unshift(File.dirname(__FILE__) + '/stubs')
3
+
4
+ describe "Rails world" do
5
+
6
+ it "should run without Test::Unit.run defined" do
7
+ require "mini_rails"
8
+
9
+ step_mother = Cucumber::StepMother.new
10
+ step_mother.load_natural_language('en')
11
+ rb = step_mother.load_programming_language('rb')
12
+
13
+ require "cucumber/rails/world"
14
+ end
15
+
16
+ end
@@ -0,0 +1,123 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ require 'cucumber/ast'
4
+ require 'cucumber/step_mother'
5
+ require 'cucumber/rb_support/rb_language'
6
+
7
+ module Cucumber
8
+ module RbSupport
9
+ describe RbStepDefinition do
10
+ before do
11
+ @step_mother = StepMother.new
12
+ @step_mother.load_natural_language('en')
13
+ @rb = @step_mother.load_programming_language('rb')
14
+ @dsl = Object.new
15
+ @dsl.extend RbSupport::RbDsl
16
+ @step_mother.before(nil)
17
+
18
+ $inside = nil
19
+ end
20
+
21
+ def register
22
+ @step_mother.register_step_definitions(@rb.step_definitions)
23
+ end
24
+
25
+ it "should allow calling of other steps" do
26
+ @dsl.Given /Outside/ do
27
+ Given "Inside"
28
+ end
29
+ @dsl.Given /Inside/ do
30
+ $inside = true
31
+ end
32
+ register
33
+
34
+ @step_mother.step_match("Outside").invoke(nil)
35
+ $inside.should == true
36
+ end
37
+
38
+ it "should allow calling of other steps with inline arg" do
39
+ @dsl.Given /Outside/ do
40
+ Given "Inside", Ast::Table.new([['inside']])
41
+ end
42
+ @dsl.Given /Inside/ do |table|
43
+ $inside = table.raw[0][0]
44
+ end
45
+ register
46
+
47
+ @step_mother.step_match("Outside").invoke(nil)
48
+ $inside.should == 'inside'
49
+ end
50
+
51
+ it "should raise Undefined when inside step is not defined" do
52
+ @dsl.Given /Outside/ do
53
+ Given 'Inside'
54
+ end
55
+ register
56
+
57
+ lambda do
58
+ @step_mother.step_match('Outside').invoke(nil)
59
+ end.should raise_error(Undefined, 'Undefined step: "Inside"')
60
+ end
61
+
62
+ it "should allow forced pending" do
63
+ @dsl.Given /Outside/ do
64
+ pending("Do me!")
65
+ end
66
+ register
67
+
68
+ lambda do
69
+ @step_mother.step_match("Outside").invoke(nil)
70
+ end.should raise_error(Pending, "Do me!")
71
+ end
72
+
73
+ it "should allow announce" do
74
+ v = mock('visitor')
75
+ v.should_receive(:announce).with('wasup')
76
+ @step_mother.visitor = v
77
+ @dsl.Given /Loud/ do
78
+ announce 'wasup'
79
+ end
80
+ register
81
+
82
+ @step_mother.step_match("Loud").invoke(nil)
83
+ end
84
+
85
+ def unindented(s)
86
+ s.split("\n")[1..-2].join("\n").indent(-10)
87
+ end
88
+
89
+ it "should recognise quotes in name and make according regexp" do
90
+ @rb.snippet_text('Given', 'A "first" arg').should == unindented(%{
91
+ Given /^A "([^\\"]*)" arg$/ do |arg1|
92
+ pending
93
+ end
94
+ })
95
+ end
96
+
97
+ it "should recognise several quoted words in name and make according regexp and args" do
98
+ @rb.snippet_text('Given', 'A "first" and "second" arg').should == unindented(%{
99
+ Given /^A "([^\\"]*)" and "([^\\"]*)" arg$/ do |arg1, arg2|
100
+ pending
101
+ end
102
+ })
103
+ end
104
+
105
+ it "should not use quote group when there are no quotes" do
106
+ @rb.snippet_text('Given', 'A first arg').should == unindented(%{
107
+ Given /^A first arg$/ do
108
+ pending
109
+ end
110
+ })
111
+ end
112
+
113
+ it "should be helpful with tables" do
114
+ @rb.snippet_text('Given', 'A "first" arg', Cucumber::Ast::Table).should == unindented(%{
115
+ Given /^A "([^\\"]*)" arg$/ do |arg1, table|
116
+ # table is a Cucumber::Ast::Table
117
+ pending
118
+ end
119
+ })
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Sell cucumbers
2
+ As a cucumber farmer
3
+ I want to sell cucumbers
4
+ So that I buy meat
5
+
6
+ Scenario: Sell a dozen
7
+ Given there are 5 cucumbers
8
+ When I sell 12 cucumbers
9
+ Then I should owe 7 cucumbers
10
+
11
+ Scenario: Sell twenty
12
+ Given there are 5 cucumbers
13
+ When I sell 20 cucumbers
14
+ Then I should owe 15 cucumbers
15
+
16
+ Scenario: Sell fifty
17
+ Given there are 5 cucumbers
18
+ When I sell 50 cucumbers
19
+ Then I should owe 45 cucumbers
@@ -0,0 +1,282 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require 'cucumber'
4
+ require 'cucumber/rb_support/rb_language'
5
+
6
+ module Cucumber
7
+ describe StepMother do
8
+ before do
9
+ @dsl = Object.new
10
+ @dsl.extend(RbSupport::RbDsl)
11
+
12
+ @step_mother = StepMother.new
13
+ @step_mother.load_natural_language('en')
14
+ @rb = @step_mother.load_programming_language('rb')
15
+
16
+ @visitor = mock('Visitor')
17
+ end
18
+
19
+ def register
20
+ @step_mother.register_step_definitions(@rb.step_definitions)
21
+ end
22
+
23
+ it "should format step names" do
24
+ @dsl.Given(/it (.*) in (.*)/) do |what, month|
25
+ end
26
+ @dsl.Given(/nope something else/) do |what, month|
27
+ end
28
+ register
29
+
30
+ format = @step_mother.step_match("it snows in april").format_args("[%s]")
31
+ format.should == "it [snows] in [april]"
32
+ end
33
+
34
+ it "should raise Ambiguous error with guess hint when multiple step definitions match" do
35
+ @dsl.Given(/Three (.*) mice/) {|disability|}
36
+ @dsl.Given(/Three blind (.*)/) {|animal|}
37
+ register
38
+
39
+ lambda do
40
+ @step_mother.step_match("Three blind mice")
41
+ end.should raise_error(Ambiguous, %{Ambiguous match of "Three blind mice":
42
+
43
+ spec/cucumber/step_mother_spec.rb:35:in `/Three (.*) mice/'
44
+ spec/cucumber/step_mother_spec.rb:36:in `/Three blind (.*)/'
45
+
46
+ You can run again with --guess to make Cucumber be more smart about it
47
+ })
48
+ end
49
+
50
+ it "should not show --guess hint when --guess is used" do
51
+ @step_mother.options = {:guess => true}
52
+
53
+ @dsl.Given(/Three (.*) mice/) {|disability|}
54
+ @dsl.Given(/Three cute (.*)/) {|animal|}
55
+ register
56
+
57
+ lambda do
58
+ @step_mother.step_match("Three cute mice")
59
+ end.should raise_error(Ambiguous, %{Ambiguous match of "Three cute mice":
60
+
61
+ spec/cucumber/step_mother_spec.rb:53:in `/Three (.*) mice/'
62
+ spec/cucumber/step_mother_spec.rb:54:in `/Three cute (.*)/'
63
+
64
+ })
65
+ end
66
+
67
+ it "should not raise Ambiguous error when multiple step definitions match, but --guess is enabled" do
68
+ @step_mother.options = {:guess => true}
69
+ @dsl.Given(/Three (.*) mice/) {|disability|}
70
+ @dsl.Given(/Three (.*)/) {|animal|}
71
+ register
72
+
73
+ lambda do
74
+ @step_mother.step_match("Three blind mice")
75
+ end.should_not raise_error
76
+ end
77
+
78
+ it "should pick right step definition when --guess is enabled and equal number of capture groups" do
79
+ @step_mother.options = {:guess => true}
80
+ right = @dsl.Given(/Three (.*) mice/) {|disability|}
81
+ wrong = @dsl.Given(/Three (.*)/) {|animal|}
82
+ register
83
+
84
+ @step_mother.step_match("Three blind mice").step_definition.should == right
85
+ end
86
+
87
+ it "should pick right step definition when --guess is enabled and unequal number of capture groups" do
88
+ @step_mother.options = {:guess => true}
89
+ right = @dsl.Given(/Three (.*) mice ran (.*)/) {|disability|}
90
+ wrong = @dsl.Given(/Three (.*)/) {|animal|}
91
+ register
92
+
93
+ @step_mother.step_match("Three blind mice ran far").step_definition.should == right
94
+ end
95
+
96
+ it "should pick most specific step definition when --guess is enabled and unequal number of capture groups" do
97
+ @step_mother.options = {:guess => true}
98
+ general = @dsl.Given(/Three (.*) mice ran (.*)/) {|disability|}
99
+ specific = @dsl.Given(/Three blind mice ran far/) {}
100
+ more_specific = @dsl.Given(/^Three blind mice ran far$/) {}
101
+ register
102
+
103
+ @step_mother.step_match("Three blind mice ran far").step_definition.should == more_specific
104
+ end
105
+
106
+ it "should raise Undefined error when no step definitions match" do
107
+ lambda do
108
+ @step_mother.step_match("Three blind mice")
109
+ end.should raise_error(Undefined)
110
+ end
111
+
112
+ it "should raise Redundant error when same regexp is registered twice" do
113
+ @dsl.Given(/Three (.*) mice/) {|disability|}
114
+ lambda do
115
+ @dsl.Given(/Three (.*) mice/) {|disability|}
116
+ register
117
+ end.should raise_error(Redundant)
118
+ end
119
+
120
+ # http://railsforum.com/viewtopic.php?pid=93881
121
+ it "should not raise Redundant unless it's really redundant" do
122
+ @dsl.Given(/^(.*) (.*) user named '(.*)'$/) {|a,b,c|}
123
+ @dsl.Given(/^there is no (.*) user named '(.*)'$/) {|a,b|}
124
+ register
125
+ end
126
+
127
+ it "should raise an error if the world is nil" do
128
+ @dsl.World do
129
+ end
130
+
131
+ begin
132
+ @step_mother.before_and_after(nil) {}
133
+ raise "Should fail"
134
+ rescue RbSupport::NilWorld => e
135
+ e.message.should == "World procs should never return nil"
136
+ e.backtrace.should == ["spec/cucumber/step_mother_spec.rb:128:in `World'"]
137
+ end
138
+ end
139
+
140
+ module ModuleOne
141
+ end
142
+
143
+ module ModuleTwo
144
+ end
145
+
146
+ class ClassOne
147
+ end
148
+
149
+ it "should implicitly extend world with modules" do
150
+ @dsl.World(ModuleOne, ModuleTwo)
151
+ @step_mother.before(nil)
152
+ class << @rb.current_world
153
+ included_modules.index(ModuleOne).should_not == nil
154
+ included_modules.index(ModuleTwo).should_not == nil
155
+ end
156
+ @rb.current_world.class.should == Object
157
+ end
158
+
159
+ it "should raise error when we try to register more than one World proc" do
160
+ @dsl.World { Hash.new }
161
+ lambda do
162
+ @dsl.World { Array.new }
163
+ end.should raise_error(RbSupport::MultipleWorld, %{You can only pass a proc to #World once, but it's happening
164
+ in 2 places:
165
+
166
+ spec/cucumber/step_mother_spec.rb:160:in `World'
167
+ spec/cucumber/step_mother_spec.rb:162:in `World'
168
+
169
+ Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc
170
+ or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.
171
+
172
+ })
173
+ end
174
+
175
+ it "should find before hooks" do
176
+ fish = @dsl.Before('@fish'){}
177
+ meat = @dsl.Before('@meat'){}
178
+ register
179
+
180
+ scenario = mock('Scenario')
181
+ scenario.should_receive(:accept_hook?).with(fish).and_return(true)
182
+ scenario.should_receive(:accept_hook?).with(meat).and_return(false)
183
+
184
+ @rb.hooks_for(:before, scenario).should == [fish]
185
+ end
186
+ end
187
+
188
+ describe StepMother, "step argument transformations" do
189
+ after(:each) do
190
+ # generally transforms are global, but state should be
191
+ # cleared when testing them here at the unit level
192
+ class StepMother; @@transforms = [] end
193
+ end
194
+
195
+ describe "without capture groups" do
196
+ it "complains when registering with a with no transform block" do
197
+ lambda do
198
+ StepMother.register_transform('^abc$')
199
+ end.should raise_error(Cucumber::ArityMismatchError)
200
+ end
201
+
202
+ it "complains when registering with a zero-arg transform block" do
203
+ lambda do
204
+ StepMother.register_transform('^abc$') {42}
205
+ end.should raise_error(Cucumber::ArityMismatchError)
206
+ end
207
+
208
+ it "complains when registering with a splat-arg transform block" do
209
+ lambda do
210
+ StepMother.register_transform('^abc$') {|*splat| 42 }
211
+ end.should raise_error(Cucumber::ArityMismatchError)
212
+ end
213
+
214
+ it "complains when transforming with an arity mismatch" do
215
+ lambda do
216
+ StepMother.register_transform('^abc$') {|one, two| 42 }
217
+ StepMother.transform_arguments(['abc'])
218
+ end.should raise_error(Cucumber::ArityMismatchError)
219
+ end
220
+
221
+ it "allows registering a regexp pattern that yields the step_arg matched" do
222
+ StepMother.register_transform(/^ab*c$/) {|arg| 42}
223
+ StepMother.transform_arguments(['ab']).should == ['ab']
224
+ StepMother.transform_arguments(['ac']).should == [42]
225
+ StepMother.transform_arguments(['abc']).should == [42]
226
+ StepMother.transform_arguments(['abbc']).should == [42]
227
+ end
228
+ end
229
+
230
+ describe "with capture groups" do
231
+ it "complains when registering with a with no transform block" do
232
+ lambda do
233
+ StepMother.register_transform('^a(.)c$')
234
+ end.should raise_error(Cucumber::ArityMismatchError)
235
+ end
236
+
237
+ it "complains when registering with a zero-arg transform block" do
238
+ lambda do
239
+ StepMother.register_transform('^a(.)c$') { 42 }
240
+ end.should raise_error(Cucumber::ArityMismatchError)
241
+ end
242
+
243
+ it "complains when registering with a splat-arg transform block" do
244
+ lambda do
245
+ StepMother.register_transform('^a(.)c$') {|*splat| 42 }
246
+ end.should raise_error(Cucumber::ArityMismatchError)
247
+ end
248
+
249
+ it "complains when transforming with an arity mismatch" do
250
+ lambda do
251
+ StepMother.register_transform('^a(.)c$') {|one, two| 42 }
252
+ StepMother.transform_arguments(['abc'])
253
+ end.should raise_error(Cucumber::ArityMismatchError)
254
+ end
255
+
256
+ it "allows registering a regexp pattern that yields capture groups" do
257
+ StepMother.register_transform(/^shape: (.+), color: (.+)$/) do |shape, color|
258
+ {shape.to_sym => color.to_sym}
259
+ end
260
+ StepMother.transform_arguments(['shape: circle, color: blue']).should == [{:circle => :blue}]
261
+ StepMother.transform_arguments(['shape: square, color: red']).should == [{:square => :red}]
262
+ StepMother.transform_arguments(['not shape: square, not color: red']).should == ['not shape: square, not color: red']
263
+ end
264
+ end
265
+
266
+ it "allows registering a string pattern" do
267
+ StepMother.register_transform('^ab*c$') {|arg| 42}
268
+ StepMother.transform_arguments(['ab']).should == ['ab']
269
+ StepMother.transform_arguments(['ac']).should == [42]
270
+ StepMother.transform_arguments(['abc']).should == [42]
271
+ StepMother.transform_arguments(['abbc']).should == [42]
272
+ end
273
+
274
+ it "gives match priority to transforms defined last" do
275
+ StepMother.register_transform(/^transform_me$/) {|arg| :foo }
276
+ StepMother.register_transform(/^transform_me$/) {|arg| :bar }
277
+ StepMother.register_transform(/^transform_me$/) {|arg| :baz }
278
+ StepMother.transform_arguments(['transform_me']).should == [:baz]
279
+ end
280
+ end
281
+
282
+ end