square-cucumber 0.3.12.2

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 (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 +82 -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 +504 -0
@@ -0,0 +1,112 @@
1
+ require 'cucumber/step_definition'
2
+ require 'cucumber/core_ext/string'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ class Step
7
+ attr_reader :line, :keyword, :name, :multiline_arg
8
+ attr_writer :step_collection, :options
9
+ attr_accessor :feature_element, :exception
10
+
11
+ INDENT = 2
12
+
13
+ def initialize(line, keyword, name, multiline_arg=nil)
14
+ @line, @keyword, @name, @multiline_arg = line, keyword, name, multiline_arg
15
+ end
16
+
17
+ def background?
18
+ false
19
+ end
20
+
21
+ def step_invocation
22
+ StepInvocation.new(self, @name, @multiline_arg, [])
23
+ end
24
+
25
+ def step_invocation_from_cells(cells)
26
+ matched_cells = matched_cells(cells)
27
+
28
+ delimited_arguments = delimit_argument_names(cells.to_hash)
29
+ name = replace_name_arguments(delimited_arguments)
30
+ multiline_arg = @multiline_arg.nil? ? nil : @multiline_arg.arguments_replaced(delimited_arguments)
31
+
32
+ StepInvocation.new(self, name, multiline_arg, matched_cells)
33
+ end
34
+
35
+ def accept(visitor)
36
+ # The only time a Step is visited is when it is in a ScenarioOutline.
37
+ # Otherwise it's always StepInvocation that gets visited instead.
38
+ visit_step_result(visitor, first_match(visitor), @multiline_arg, :skipped, nil, nil)
39
+ end
40
+
41
+ def visit_step_result(visitor, step_match, multiline_arg, status, exception, background)
42
+ visitor.visit_step_result(@keyword, step_match, @multiline_arg, status, exception, source_indent, background)
43
+ end
44
+
45
+ def first_match(visitor)
46
+ # @feature_element is always a ScenarioOutline in this case
47
+ @feature_element.each_example_row do |cells|
48
+ argument_hash = cells.to_hash
49
+ delimited_arguments = delimit_argument_names(argument_hash)
50
+ name = replace_name_arguments(delimited_arguments)
51
+ step_match = visitor.step_mother.step_match(name, @name) rescue nil
52
+ return step_match if step_match
53
+ end
54
+ NoStepMatch.new(self, @name)
55
+ end
56
+
57
+ def to_sexp
58
+ [:step, @line, @keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
59
+ end
60
+
61
+ def source_indent
62
+ @feature_element.source_indent(text_length)
63
+ end
64
+
65
+ def text_length(name=@name)
66
+ @keyword.jlength + name.jlength + INDENT # Add indent as steps get indented more than scenarios
67
+ end
68
+
69
+ def backtrace_line
70
+ @backtrace_line ||= @feature_element.backtrace_line("#{@keyword} #{@name}", @line) unless @feature_element.nil?
71
+ end
72
+
73
+ def file_colon_line
74
+ @file_colon_line ||= @feature_element.file_colon_line(@line) unless @feature_element.nil?
75
+ end
76
+
77
+ def language
78
+ @feature_element.language
79
+ end
80
+
81
+ def dom_id
82
+ @dom_id ||= file_colon_line.gsub(/\//, '_').gsub(/\./, '_').gsub(/:/, '_')
83
+ end
84
+
85
+ private
86
+
87
+ def matched_cells(cells)
88
+ cells.select do |cell|
89
+ delimited = delimited(cell.header_cell.value)
90
+ @name.index(delimited) || (@multiline_arg && @multiline_arg.has_text?(delimited))
91
+ end
92
+ end
93
+
94
+ def delimit_argument_names(argument_hash)
95
+ argument_hash.inject({}) { |h,(name,value)| h[delimited(name)] = value; h }
96
+ end
97
+
98
+ def delimited(s)
99
+ "<#{s}>"
100
+ end
101
+
102
+ def replace_name_arguments(argument_hash)
103
+ name_with_arguments_replaced = @name
104
+ argument_hash.each do |name, value|
105
+ value ||= ''
106
+ name_with_arguments_replaced = name_with_arguments_replaced.gsub(name, value) if value
107
+ end
108
+ name_with_arguments_replaced
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,75 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Holds an Array of Step or StepDefinition
4
+ class StepCollection
5
+ include Enumerable
6
+
7
+ def initialize(steps)
8
+ @steps = steps
9
+ @steps.each{|step| step.step_collection = self}
10
+ end
11
+
12
+ def accept(visitor, &proc)
13
+ @steps.each do |step|
14
+ visitor.visit_step(step) if proc.nil? || proc.call(step)
15
+ end
16
+ end
17
+
18
+ def step_invocations(background = false)
19
+ StepCollection.new(@steps.map{ |step|
20
+ i = step.step_invocation
21
+ i.background = background
22
+ i
23
+ })
24
+ end
25
+
26
+ def step_invocations_from_cells(cells)
27
+ @steps.map{|step| step.step_invocation_from_cells(cells)}
28
+ end
29
+
30
+ # Duplicates this instance and adds +step_invocations+ to the end
31
+ def dup(step_invocations = [])
32
+ StepCollection.new(@steps + step_invocations)
33
+ end
34
+
35
+ def each(&proc)
36
+ @steps.each(&proc)
37
+ end
38
+
39
+ def previous_step(step)
40
+ i = @steps.index(step) || -1
41
+ @steps[i-1]
42
+ end
43
+
44
+ def empty?
45
+ @steps.empty?
46
+ end
47
+
48
+ def max_line_length(feature_element)
49
+ lengths = (@steps + [feature_element]).map{|e| e.text_length}
50
+ lengths.max
51
+ end
52
+
53
+ def exception
54
+ @exception ||= ((failed = @steps.detect {|step| step.exception}) && failed.exception)
55
+ end
56
+
57
+ def failed?
58
+ status == :failed
59
+ end
60
+
61
+ def passed?
62
+ status == :passed
63
+ end
64
+
65
+ def status
66
+ @steps.each{|step_invocation| return step_invocation.status if step_invocation.status != :passed}
67
+ :passed
68
+ end
69
+
70
+ def to_sexp
71
+ @steps.map{|step| step.to_sexp}
72
+ end
73
+ end
74
+ end
75
+ end
@@ -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