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,188 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # This formatter prints features to plain text - exactly how they were parsed,
7
+ # just prettier. That means with proper indentation and alignment of table columns.
8
+ #
9
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
10
+ #
11
+ class Pretty < Ast::Visitor
12
+ include FileUtils
13
+ include Console
14
+ attr_writer :indent
15
+
16
+ def initialize(step_mother, io, options, delim='|')
17
+ super(step_mother)
18
+ @io = io
19
+ @options = options
20
+ @delim = delim
21
+ @exceptions = []
22
+ @indent = 0
23
+ end
24
+
25
+ def visit_features(features)
26
+ super
27
+ print_summary(features) unless @options[:autoformat]
28
+ end
29
+
30
+ def visit_feature(feature)
31
+ @exceptions = []
32
+ @indent = 0
33
+ if @options[:autoformat]
34
+ file = File.join(@options[:autoformat], feature.file)
35
+ dir = File.dirname(file)
36
+ mkdir_p(dir) unless File.directory?(dir)
37
+ File.open(file, Cucumber.file_mode('w')) do |io|
38
+ @io = io
39
+ super
40
+ end
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def visit_comment(comment)
47
+ comment.accept(self)
48
+ end
49
+
50
+ def visit_comment_line(comment_line)
51
+ @io.puts(comment_line.indent(@indent))
52
+ @io.flush
53
+ end
54
+
55
+ def visit_tags(tags)
56
+ tags.accept(self)
57
+ if @indent == 1
58
+ @io.puts
59
+ @io.flush
60
+ end
61
+ end
62
+
63
+ def visit_tag_name(tag_name)
64
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
65
+ @io.print(tag)
66
+ @io.flush
67
+ @indent = 1
68
+ end
69
+
70
+ def visit_feature_name(name)
71
+ @io.puts(name)
72
+ @io.puts
73
+ @io.flush
74
+ end
75
+
76
+ def visit_feature_element(feature_element)
77
+ @indent = 2
78
+ @scenario_indent = 2
79
+ super
80
+ @io.puts
81
+ @io.flush
82
+ end
83
+
84
+ def visit_background(background)
85
+ @indent = 2
86
+ @scenario_indent = 2
87
+ @in_background = true
88
+ super
89
+ @in_background = nil
90
+ @io.puts
91
+ @io.flush
92
+ end
93
+
94
+ def visit_background_name(keyword, name, file_colon_line, source_indent)
95
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
96
+ end
97
+
98
+ def visit_examples_name(keyword, name)
99
+ names = name.empty? ? [name] : name.split("\n")
100
+ @io.puts("\n #{keyword} #{names[0]}")
101
+ names[1..-1].each {|s| @io.puts " #{s}" }
102
+ @io.flush
103
+ @indent = 6
104
+ @scenario_indent = 6
105
+ end
106
+
107
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
108
+ visit_feature_element_name(keyword, name, file_colon_line, source_indent)
109
+ end
110
+
111
+ def visit_feature_element_name(keyword, name, file_colon_line, source_indent)
112
+ @io.puts if @scenario_indent == 6
113
+ names = name.empty? ? [name] : name.split("\n")
114
+ line = "#{keyword} #{names[0]}".indent(@scenario_indent)
115
+ @io.print(line)
116
+ if @options[:source]
117
+ line_comment = " # #{file_colon_line}".indent(source_indent)
118
+ @io.print(format_string(line_comment, :comment))
119
+ end
120
+ @io.puts
121
+ names[1..-1].each {|s| @io.puts " #{s}"}
122
+ @io.flush
123
+ end
124
+
125
+ def visit_step(step)
126
+ @indent = 6
127
+ super
128
+ end
129
+
130
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
131
+ if exception
132
+ return if @exceptions.index(exception)
133
+ @exceptions << exception
134
+ end
135
+ return if status != :failed && @in_background ^ background
136
+ @status = status
137
+ super
138
+ end
139
+
140
+ def visit_step_name(keyword, step_match, status, source_indent, background)
141
+ source_indent = nil unless @options[:source]
142
+ formatted_step_name = format_step(keyword, step_match, status, source_indent)
143
+ @io.puts(formatted_step_name.indent(@scenario_indent + 2))
144
+ end
145
+
146
+ def visit_multiline_arg(multiline_arg)
147
+ return if @options[:no_multiline]
148
+ super
149
+ end
150
+
151
+ def visit_exception(exception, status)
152
+ print_exception(exception, status, @indent)
153
+ @io.flush
154
+ end
155
+
156
+ def visit_table_row(table_row)
157
+ @io.print @delim.indent(@indent)
158
+ super
159
+ @io.puts
160
+ if table_row.exception && !@exceptions.index(table_row.exception)
161
+ print_exception(table_row.exception, :failed, @indent)
162
+ end
163
+ end
164
+
165
+ def visit_py_string(string)
166
+ s = %{"""\n#{string}\n"""}.indent(@indent)
167
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
168
+ @io.puts(format_string(s, @status))
169
+ @io.flush
170
+ end
171
+
172
+ def visit_table_cell_value(value, width, status)
173
+ status ||= @status || :passed
174
+ @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + ::Term::ANSIColor.reset(" #{@delim}"))
175
+ @io.flush
176
+ end
177
+
178
+ private
179
+
180
+ def print_summary(features)
181
+ print_stats(features)
182
+ print_snippets(@options)
183
+ print_passing_wip(@options)
184
+ end
185
+
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,77 @@
1
+ require 'cucumber/formatter/progress'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Profile < Progress
6
+ NUMBER_OF_STEP_DEFINITONS_TO_SHOW = 10
7
+ NUMBER_OF_STEP_INVOCATIONS_TO_SHOW = 5
8
+
9
+ def initialize(step_mother, io, options)
10
+ super
11
+ @step_definition_durations = Hash.new { |h,step_definition| h[step_definition] = [] }
12
+ end
13
+
14
+ def visit_step(step)
15
+ @step_duration = Time.now
16
+ @step = step
17
+ super
18
+ end
19
+
20
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
21
+ duration = Time.now - @step_duration
22
+ super
23
+
24
+ if step_match.step_definition
25
+ description = format_step(keyword, step_match, status, nil)
26
+ @step_definition_durations[step_match.step_definition] << [duration, description, @step.file_colon_line]
27
+ end
28
+ end
29
+
30
+ def print_summary(features)
31
+ super
32
+ @io.puts "\n\nTop #{NUMBER_OF_STEP_DEFINITONS_TO_SHOW} average slowest steps with #{NUMBER_OF_STEP_INVOCATIONS_TO_SHOW} slowest matches:\n"
33
+
34
+ mean_durations = map_to_mean_durations(@step_definition_durations)
35
+ mean_durations = mean_durations.sort_by do |duration_description_location, step_definition, mean_duration|
36
+ mean_duration
37
+ end.reverse
38
+
39
+ mean_durations[0...NUMBER_OF_STEP_DEFINITONS_TO_SHOW].each do |duration_description_location, step_definition, mean_duration|
40
+ print_step_definition(step_definition, mean_duration)
41
+ duration_description_location = duration_description_location.sort_by do |duration, description, location|
42
+ duration
43
+ end.reverse
44
+ print_step_definitions(duration_description_location, step_definition)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def map_to_mean_durations(step_definition_durations)
51
+ mean_durations = []
52
+ step_definition_durations.each do |step_definition, duration_description_location|
53
+ total_duration = duration_description_location.inject(0) { |sum, step_details| step_details[0] + sum }
54
+ mean_duration = total_duration / duration_description_location.length
55
+
56
+ mean_durations << [duration_description_location, step_definition, mean_duration]
57
+ end
58
+ mean_durations
59
+ end
60
+
61
+ def print_step_definition(step_definition, mean_duration)
62
+ duration = sprintf("%.7f", mean_duration)
63
+ @io.puts format_string("#{duration} #{step_definition.backtrace_line}", :failed)
64
+ end
65
+
66
+ def print_step_definitions(duration_description_location, step_definition)
67
+ max_length = duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].map{|_, d, _| d.jlength}.max
68
+ duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].each do |duration, description, location|
69
+ @io.print format_string(" #{sprintf("%.7f", duration)}", :pending)
70
+ @io.print " #{description}"
71
+ @io.print format_string(" # #{location}".indent(max_length - description.jlength), :comment)
72
+ @io.puts
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,60 @@
1
+ require 'cucumber/formatter/console'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Progress < Ast::Visitor
6
+ include Console
7
+
8
+ def initialize(step_mother, io, options)
9
+ super(step_mother)
10
+ @io = io
11
+ @options = options
12
+ end
13
+
14
+ def visit_features(features)
15
+ super
16
+ @io.puts
17
+ @io.puts
18
+ print_summary(features)
19
+ end
20
+
21
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
22
+ progress(status)
23
+ @status = status
24
+ end
25
+
26
+ def visit_table_cell_value(value, width, status)
27
+ status ||= @status
28
+ progress(status) unless table_header_cell?(status)
29
+ end
30
+
31
+ private
32
+
33
+ def print_summary(features)
34
+ print_steps(:pending)
35
+ print_steps(:failed)
36
+ print_stats(features)
37
+ print_snippets(@options)
38
+ print_passing_wip(@options)
39
+ end
40
+
41
+ CHARS = {
42
+ :passed => '.',
43
+ :failed => 'F',
44
+ :undefined => 'U',
45
+ :pending => 'P',
46
+ :skipped => '-'
47
+ }
48
+
49
+ def progress(status)
50
+ char = CHARS[status]
51
+ @io.print(format_string(char, status))
52
+ @io.flush
53
+ end
54
+
55
+ def table_header_cell?(status)
56
+ status == :skipped_param
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,44 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # This formatter keeps track of all failing features and print out their location.
4
+ # Example:
5
+ #
6
+ # features/foo.feature:34 features/bar.feature:11:76:81
7
+ #
8
+ # This formatter is used by AutoTest - it will use the output to decide what
9
+ # to run the next time, simply passing the output string on the command line.
10
+ #
11
+ class Rerun < Ast::Visitor
12
+ def initialize(step_mother, io, options)
13
+ super(step_mother)
14
+ @io = io
15
+ @options = options
16
+ @file_names = []
17
+ @file_colon_lines = Hash.new{|h,k| h[k] = []}
18
+ end
19
+
20
+ def visit_features(features)
21
+ super
22
+ files = @file_names.uniq.map do |file|
23
+ lines = @file_colon_lines[file]
24
+ "#{file}:#{lines.join(':')}"
25
+ end
26
+ @io.puts files.join(' ')
27
+ end
28
+
29
+ def visit_feature_element(feature_element)
30
+ @rerun = false
31
+ super
32
+ if @rerun
33
+ file, line = *feature_element.file_colon_line.split(':')
34
+ @file_colon_lines[file] << line
35
+ @file_names << file
36
+ end
37
+ end
38
+
39
+ def visit_step_name(keyword, step_match, status, source_indent, background)
40
+ @rerun = true if [:failed].index(status)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,28 @@
1
+ module Cucumber
2
+ module Formatter
3
+ # Custom formatter that prints a tag cloud
4
+ class TagCloud < Cucumber::Ast::Visitor
5
+ def initialize(step_mother, io, options)
6
+ super(step_mother)
7
+ @io = io
8
+ @options = options
9
+ @counts = Hash.new{|h,k| h[k] = 0}
10
+ end
11
+
12
+ def visit_features(features)
13
+ super
14
+ print_summary(features)
15
+ end
16
+
17
+ def visit_tag_name(tag_name)
18
+ @counts[tag_name] += 1
19
+ end
20
+
21
+ def print_summary(features)
22
+ matrix = @counts.to_a.sort{|paira, pairb| paira[0] <=> pairb[0]}.transpose
23
+ table = Cucumber::Ast::Table.new(matrix)
24
+ Cucumber::Formatter::Pretty.new(@step_mother, @io, {}).visit_multiline_arg(table)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # Require this file if you need Unicode support.
2
+ require 'cucumber/platform'
3
+ require 'cucumber/formatter/ansicolor'
4
+
5
+ $KCODE='u' unless Cucumber::RUBY_1_9
6
+
7
+ if Cucumber::WINDOWS_MRI && `chcp` =~ /(\d+)/
8
+ codepage = $1.to_i
9
+ codepages = (1251..1252)
10
+
11
+ if codepages.include?(codepage)
12
+ Cucumber::CODEPAGE = "cp#{codepage}"
13
+
14
+ require 'iconv'
15
+ module Kernel
16
+ alias cucumber_print print
17
+ def print(*a)
18
+ begin
19
+ cucumber_print(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
20
+ rescue Iconv::IllegalSequence
21
+ cucumber_print(*a)
22
+ end
23
+ end
24
+
25
+ alias cucumber_puts puts
26
+ def puts(*a)
27
+ begin
28
+ cucumber_puts(*Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a))
29
+ rescue Iconv::IllegalSequence
30
+ cucumber_puts(*a)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,85 @@
1
+ require 'cucumber/formatter/progress'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Usage < Ast::Visitor
6
+ include Console
7
+
8
+ def initialize(step_mother, io, options)
9
+ super(step_mother)
10
+ @io = io
11
+ @options = options
12
+ @step_definitions = Hash.new { |h,step_definition| h[step_definition] = [] }
13
+ @all_step_definitions = step_mother.step_definitions.dup
14
+ @locations = []
15
+ end
16
+
17
+ def visit_features(features)
18
+ super
19
+ print_summary(features)
20
+ end
21
+
22
+ def visit_step(step)
23
+ @step = step
24
+ super
25
+ end
26
+
27
+ def visit_step_name(keyword, step_match, status, source_indent, background)
28
+ if step_match.step_definition
29
+ location = @step.file_colon_line
30
+ return if @locations.index(location)
31
+ @locations << location
32
+
33
+ description = format_step(keyword, step_match, status, nil)
34
+ length = (keyword + step_match.format_args).jlength
35
+ @step_definitions[step_match.step_definition] << [step_match, description, length, location]
36
+ @all_step_definitions.delete(step_match.step_definition)
37
+ end
38
+ end
39
+
40
+ def print_summary(features)
41
+ sorted_defs = @step_definitions.keys.sort_by{|step_definition| step_definition.backtrace_line}
42
+
43
+ sorted_defs.each do |step_definition|
44
+ step_matches_and_descriptions = @step_definitions[step_definition].sort_by do |step_match_and_description|
45
+ step_match = step_match_and_description[0]
46
+ step_match.step_definition.regexp.inspect
47
+ end
48
+
49
+ step_matches = step_matches_and_descriptions.map{|step_match_and_description| step_match_and_description[0]}
50
+
51
+ lengths = step_matches_and_descriptions.map do |step_match_and_description|
52
+ step_match_and_description[2]
53
+ end
54
+ lengths << step_definition.text_length
55
+ max_length = lengths.max
56
+
57
+ @io.print step_definition.regexp.inspect
58
+ @io.puts format_string(" # #{step_definition.file_colon_line}".indent(max_length - step_definition.text_length), :comment)
59
+ da = step_matches_and_descriptions.map do |step_match_and_description|
60
+ step_match = step_match_and_description[0]
61
+ description = step_match_and_description[1]
62
+ length = step_match_and_description[2]
63
+ file_colon_line = step_match_and_description[3]
64
+ " #{description}" + format_string(" # #{file_colon_line}".indent(max_length - length), :comment)
65
+ end
66
+ da.sort.each{|d| puts d}
67
+ end
68
+
69
+ print_unused_step_definitions
70
+ end
71
+
72
+ def print_unused_step_definitions
73
+ if @all_step_definitions.any?
74
+ max_length = @all_step_definitions.map{|step_definition| step_definition.text_length}.max
75
+
76
+ @io.puts format_string("(::) UNUSED (::)", :failed)
77
+ @all_step_definitions.each do |step_definition|
78
+ @io.print format_string(step_definition.regexp.inspect, :failed)
79
+ @io.puts format_string(" # #{step_definition.file_colon_line}".indent(max_length - step_definition.text_length), :comment)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end