cucumber 0.1.10 → 0.2.0

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 (348) hide show
  1. data/History.txt +223 -5
  2. data/License.txt +1 -1
  3. data/Manifest.txt +174 -85
  4. data/README.txt +2 -39
  5. data/Rakefile +1 -2
  6. data/bin/cucumber +2 -2
  7. data/config/hoe.rb +9 -3
  8. data/examples/cs/README.textile +1 -22
  9. data/examples/cs/Rakefile +1 -1
  10. data/examples/cs/compile.bat +1 -0
  11. data/examples/cs/features/addition.feature +16 -0
  12. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  13. data/examples/cs/src/demo/Calculator.cs +20 -0
  14. data/examples/i18n/README.textile +1 -1
  15. data/examples/i18n/Rakefile +20 -4
  16. data/examples/i18n/ar/features/addition.feature +10 -11
  17. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +4 -12
  18. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +4 -2
  19. data/examples/i18n/de/features/addition.feature +10 -11
  20. data/examples/i18n/de/features/division.feature +0 -1
  21. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +5 -11
  22. data/examples/i18n/en/features/addition.feature +10 -11
  23. data/examples/i18n/en/features/division.feature +0 -1
  24. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +5 -12
  25. data/examples/i18n/en-lol/Rakefile +6 -0
  26. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  27. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  28. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  29. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  30. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  31. data/examples/i18n/es/features/adicion.feature +11 -12
  32. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +10 -11
  33. data/examples/i18n/es/lib/calculador.rb +4 -1
  34. data/examples/i18n/et/features/jagamine.feature +9 -0
  35. data/examples/i18n/et/features/liitmine.feature +10 -11
  36. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +7 -9
  37. data/examples/i18n/et/lib/kalkulaator.rb +5 -1
  38. data/examples/i18n/fi/Rakefile +6 -0
  39. data/examples/i18n/fi/features/jakolasku.feature +9 -0
  40. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  41. data/examples/i18n/fi/features/yhteenlasku.feature +16 -0
  42. data/examples/i18n/fi/lib/laskin.rb +14 -0
  43. data/examples/i18n/fr/features/addition.feature +16 -12
  44. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +14 -11
  45. data/examples/i18n/fr/lib/calculatrice.rb +1 -1
  46. data/examples/i18n/id/features/addition.feature +10 -11
  47. data/examples/i18n/id/features/division.feature +0 -1
  48. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +5 -12
  49. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +4 -2
  50. data/examples/i18n/ja/features/addition.feature +10 -11
  51. data/examples/i18n/ja/features/division.feature +2 -3
  52. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +6 -12
  53. data/examples/i18n/ko/Rakefile +6 -0
  54. data/examples/i18n/ko/features/addition.feature +16 -0
  55. data/examples/i18n/ko/features/division.feature +10 -0
  56. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/ko/lib/calculator.rb +14 -0
  58. data/examples/i18n/lt/features/addition.feature +11 -11
  59. data/examples/i18n/lt/features/division.feature +0 -1
  60. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +5 -12
  61. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +4 -9
  62. data/examples/i18n/no/features/summering.feature +1 -0
  63. data/examples/i18n/no/features/support/env.rb +6 -0
  64. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +4 -2
  65. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -2
  66. data/examples/i18n/ru/Rakefile +6 -0
  67. data/examples/i18n/ru/features/addition.feature +10 -0
  68. data/examples/i18n/ru/features/consecutive_calculations.feature +16 -0
  69. data/examples/i18n/ru/features/division.feature +15 -0
  70. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  71. data/examples/i18n/ru/features/support/env.rb +6 -0
  72. data/examples/i18n/ru/features/support/world.rb +7 -0
  73. data/examples/i18n/ru/lib/calculator.rb +24 -0
  74. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +4 -2
  75. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +5 -3
  76. data/examples/i18n/zh-TW/Rakefile +6 -0
  77. data/examples/i18n/zh-TW/features/addition.feature +16 -0
  78. data/examples/i18n/zh-TW/features/division.feature +10 -0
  79. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  80. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  81. data/examples/java/features/step_definitons/hello_steps.rb +1 -1
  82. data/examples/java/features/step_definitons/tree_steps.rb +1 -1
  83. data/examples/jbehave/README.textile +20 -0
  84. data/examples/jbehave/features/support/env.rb +7 -0
  85. data/examples/jbehave/features/trading.feature +28 -0
  86. data/examples/jbehave/pom.xml +53 -0
  87. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  88. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  89. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  90. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  91. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +70 -0
  92. data/examples/selenium/features/search.feature +1 -1
  93. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  94. data/examples/selenium/features/support/env.rb +19 -0
  95. data/examples/selenium_webrat/features/search.feature +9 -0
  96. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  97. data/examples/selenium_webrat/features/support/env.rb +41 -0
  98. data/examples/self_test/README.textile +6 -0
  99. data/examples/self_test/Rakefile +6 -0
  100. data/examples/self_test/features/background/failing_background.feature +11 -0
  101. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  102. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  103. data/examples/self_test/features/background/passing_background.feature +10 -0
  104. data/examples/self_test/features/background/pending_background.feature +10 -0
  105. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  106. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  107. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  108. data/examples/self_test/features/failing_expectation.feature +4 -0
  109. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  110. data/examples/self_test/features/outline_sample.feature +15 -0
  111. data/examples/self_test/features/sample.feature +19 -0
  112. data/examples/self_test/features/step_definitions/sample_steps.rb +64 -0
  113. data/examples/self_test/features/support/env.rb +1 -0
  114. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  115. data/examples/sinatra/Rakefile +6 -0
  116. data/examples/sinatra/app.rb +14 -0
  117. data/examples/sinatra/features/add.feature +11 -0
  118. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  119. data/examples/sinatra/features/support/env.rb +20 -0
  120. data/examples/sinatra/views/add.erb +5 -0
  121. data/examples/sinatra/views/layout.erb +8 -0
  122. data/examples/tickets/Rakefile +13 -8
  123. data/examples/tickets/cucumber.yml +2 -1
  124. data/examples/tickets/features/172.feature +28 -0
  125. data/examples/tickets/features/177/1.feature +29 -0
  126. data/examples/tickets/features/177/2.feature +21 -0
  127. data/examples/tickets/features/177/3.feature +18 -0
  128. data/examples/tickets/features/180.feature +7 -0
  129. data/examples/tickets/features/236.feature +13 -0
  130. data/examples/tickets/features/241.feature +13 -0
  131. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  132. data/examples/tickets/features/lib/pantry.rb +20 -0
  133. data/examples/tickets/features/scenario_outline.feature +95 -0
  134. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  135. data/examples/tickets/features/step_definitons/tickets_steps.rb +46 -5
  136. data/examples/tickets/features/tickets.feature +5 -1
  137. data/examples/watir/README.textile +16 -0
  138. data/examples/watir/features/step_definitons/search_steps.rb +24 -0
  139. data/examples/watir/features/support/env.rb +32 -0
  140. data/features/background.feature +221 -0
  141. data/features/cucumber_cli.feature +389 -0
  142. data/features/cucumber_cli_diff_disabled.feature +45 -0
  143. data/features/cucumber_cli_outlines.feature +81 -0
  144. data/features/custom_formatter.feature +11 -0
  145. data/features/report_called_undefined_steps.feature +34 -0
  146. data/features/step_definitions/cucumber_steps.rb +30 -0
  147. data/features/step_definitions/extra_steps.rb +2 -0
  148. data/features/support/env.rb +8 -0
  149. data/gem_tasks/deployment.rake +0 -23
  150. data/gem_tasks/features.rake +1 -1
  151. data/gem_tasks/fix_cr_lf.rake +1 -1
  152. data/gem_tasks/flog.rake +1 -1
  153. data/gem_tasks/gemspec.rake +4 -0
  154. data/gem_tasks/jar.rake +67 -0
  155. data/gem_tasks/rspec.rake +31 -15
  156. data/gem_tasks/yard.rake +8 -0
  157. data/lib/autotest/cucumber_mixin.rb +41 -25
  158. data/lib/cucumber/ast/background.rb +50 -0
  159. data/lib/cucumber/ast/comment.rb +26 -0
  160. data/lib/cucumber/ast/examples.rb +38 -0
  161. data/lib/cucumber/ast/feature.rb +62 -0
  162. data/lib/cucumber/ast/feature_element.rb +46 -0
  163. data/lib/cucumber/ast/features.rb +20 -0
  164. data/lib/cucumber/ast/outline_table.rb +81 -0
  165. data/lib/cucumber/ast/py_string.rb +58 -0
  166. data/lib/cucumber/ast/scenario.rb +64 -0
  167. data/lib/cucumber/ast/scenario_outline.rb +90 -0
  168. data/lib/cucumber/ast/step.rb +122 -0
  169. data/lib/cucumber/ast/step_collection.rb +66 -0
  170. data/lib/cucumber/ast/step_invocation.rb +110 -0
  171. data/lib/cucumber/ast/table.rb +318 -0
  172. data/lib/cucumber/ast/tags.rb +33 -0
  173. data/lib/cucumber/ast/visitor.rb +125 -0
  174. data/lib/cucumber/ast.rb +29 -0
  175. data/lib/cucumber/broadcaster.rb +2 -9
  176. data/lib/cucumber/cli/configuration.rb +364 -0
  177. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  178. data/lib/cucumber/cli/main.rb +109 -0
  179. data/lib/cucumber/core_ext/exception.rb +53 -0
  180. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  181. data/lib/cucumber/core_ext/proc.rb +29 -65
  182. data/lib/cucumber/core_ext/string.rb +26 -0
  183. data/lib/cucumber/formatter/ansicolor.rb +102 -0
  184. data/lib/cucumber/formatter/color_io.rb +23 -0
  185. data/lib/cucumber/formatter/console.rb +109 -0
  186. data/lib/cucumber/formatter/cucumber.css +55 -0
  187. data/lib/cucumber/formatter/cucumber.sass +49 -0
  188. data/lib/cucumber/formatter/html.rb +133 -0
  189. data/lib/cucumber/formatter/pretty.rb +179 -0
  190. data/lib/cucumber/formatter/profile.rb +77 -0
  191. data/lib/cucumber/formatter/progress.rb +60 -0
  192. data/lib/cucumber/formatter/rerun.rb +35 -0
  193. data/lib/cucumber/formatter/unicode.rb +35 -0
  194. data/lib/cucumber/formatter.rb +1 -0
  195. data/lib/cucumber/formatters/unicode.rb +2 -0
  196. data/lib/cucumber/jbehave.rb +97 -0
  197. data/lib/cucumber/languages.yml +214 -72
  198. data/lib/cucumber/parser/basic.rb +0 -0
  199. data/lib/cucumber/parser/feature.rb +1487 -0
  200. data/lib/cucumber/parser/feature.tt +193 -0
  201. data/lib/cucumber/parser/i18n.tt +31 -0
  202. data/lib/cucumber/parser/table.rb +402 -0
  203. data/lib/cucumber/parser/table.tt +59 -0
  204. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  205. data/lib/cucumber/parser.rb +43 -0
  206. data/lib/cucumber/platform.rb +13 -8
  207. data/lib/cucumber/rails/rspec.rb +6 -10
  208. data/lib/cucumber/rails/world.rb +8 -8
  209. data/lib/cucumber/rake/task.rb +46 -9
  210. data/lib/cucumber/step_definition.rb +103 -0
  211. data/lib/cucumber/step_match.rb +49 -0
  212. data/lib/cucumber/step_mother.rb +184 -65
  213. data/lib/cucumber/version.rb +4 -3
  214. data/lib/cucumber/world.rb +53 -0
  215. data/lib/cucumber.rb +45 -21
  216. data/rails_generators/cucumber/cucumber_generator.rb +23 -3
  217. data/rails_generators/cucumber/templates/cucumber +2 -1
  218. data/rails_generators/cucumber/templates/cucumber.rake +13 -5
  219. data/rails_generators/cucumber/templates/env.rb +11 -2
  220. data/rails_generators/cucumber/templates/paths.rb +19 -0
  221. data/rails_generators/cucumber/templates/webrat_steps.rb +60 -40
  222. data/rails_generators/feature/feature_generator.rb +26 -2
  223. data/rails_generators/feature/templates/feature.erb +15 -12
  224. data/rails_generators/feature/templates/steps.erb +14 -16
  225. data/spec/cucumber/ast/background_spec.rb +49 -0
  226. data/spec/cucumber/ast/feature_factory.rb +63 -0
  227. data/spec/cucumber/ast/feature_spec.rb +37 -0
  228. data/spec/cucumber/ast/py_string_spec.rb +47 -0
  229. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  230. data/spec/cucumber/ast/scenario_spec.rb +65 -0
  231. data/spec/cucumber/ast/step_collection_spec.rb +8 -0
  232. data/spec/cucumber/ast/step_spec.rb +66 -0
  233. data/spec/cucumber/ast/table_spec.rb +149 -0
  234. data/spec/cucumber/ast/tags_spec.rb +19 -0
  235. data/spec/cucumber/broadcaster_spec.rb +6 -18
  236. data/spec/cucumber/cli/configuration_spec.rb +275 -0
  237. data/spec/cucumber/cli/main_spec.rb +203 -0
  238. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  239. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  240. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  241. data/spec/cucumber/formatter/color_io_spec.rb +26 -0
  242. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  243. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  244. data/spec/cucumber/formatter/html/index.html +45 -0
  245. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  246. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  247. data/spec/cucumber/formatters/profile_formatter_spec.rb +22 -16
  248. data/spec/cucumber/parser/feature_parser_spec.rb +282 -0
  249. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  250. data/spec/cucumber/rails/stubs/mini_rails.rb +4 -3
  251. data/spec/cucumber/step_definition_spec.rb +81 -0
  252. data/spec/cucumber/step_mother_spec.rb +50 -51
  253. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  254. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  255. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  256. data/spec/cucumber/treetop_parser/multiple_tables.feature +6 -8
  257. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  258. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  259. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  260. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  261. data/spec/cucumber/world/pending_spec.rb +47 -0
  262. data/spec/spec_helper.rb +4 -3
  263. metadata +192 -95
  264. data/TODO.txt +0 -26
  265. data/examples/calculator_ruby_features/features/addition.rb +0 -23
  266. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  267. data/examples/cs/features/hello.feature +0 -11
  268. data/examples/cs/features/step_definitons/hello_steps.rb +0 -25
  269. data/examples/cs/features/step_definitons/tree_steps.rb +0 -14
  270. data/examples/cs/features/tree.feature +0 -9
  271. data/examples/cs/src/Hello.cs +0 -18
  272. data/examples/i18n/ja/README.txt +0 -5
  273. data/examples/selenium/features/step_definitons/stories_steps.rb +0 -41
  274. data/examples/watir/features/step_definitons/stories_steps.rb +0 -51
  275. data/features/see_features.feature +0 -8
  276. data/features/steps/features_steps.rb +0 -9
  277. data/gem_tasks/treetop.rake +0 -41
  278. data/lib/cucumber/cli.rb +0 -279
  279. data/lib/cucumber/executor.rb +0 -190
  280. data/lib/cucumber/formatters/ansicolor.rb +0 -109
  281. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  282. data/lib/cucumber/formatters/cucumber.css +0 -132
  283. data/lib/cucumber/formatters/cucumber.js +0 -11
  284. data/lib/cucumber/formatters/html_formatter.rb +0 -128
  285. data/lib/cucumber/formatters/jquery.js +0 -32
  286. data/lib/cucumber/formatters/pretty_formatter.rb +0 -234
  287. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  288. data/lib/cucumber/formatters/progress_formatter.rb +0 -58
  289. data/lib/cucumber/formatters.rb +0 -1
  290. data/lib/cucumber/model/table.rb +0 -28
  291. data/lib/cucumber/model.rb +0 -1
  292. data/lib/cucumber/step_methods.rb +0 -49
  293. data/lib/cucumber/tree/feature.rb +0 -63
  294. data/lib/cucumber/tree/features.rb +0 -21
  295. data/lib/cucumber/tree/given_scenario.rb +0 -13
  296. data/lib/cucumber/tree/scenario.rb +0 -174
  297. data/lib/cucumber/tree/step.rb +0 -134
  298. data/lib/cucumber/tree/table.rb +0 -26
  299. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  300. data/lib/cucumber/tree.rb +0 -18
  301. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -206
  302. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1591
  303. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1591
  304. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1591
  305. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1591
  306. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1591
  307. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1591
  308. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1591
  309. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1591
  310. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1591
  311. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1591
  312. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1591
  313. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1591
  314. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1591
  315. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1591
  316. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1591
  317. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -34
  318. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1591
  319. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1591
  320. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1591
  321. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1591
  322. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1591
  323. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1591
  324. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1591
  325. data/script/console +0 -10
  326. data/script/console.cmd +0 -1
  327. data/script/destroy +0 -14
  328. data/script/destroy.cmd +0 -1
  329. data/script/generate +0 -14
  330. data/script/generate.cmd +0 -1
  331. data/script/txt2html +0 -74
  332. data/script/txt2html.cmd +0 -1
  333. data/setup.rb +0 -1585
  334. data/spec/cucumber/cli_spec.rb +0 -274
  335. data/spec/cucumber/executor_spec.rb +0 -298
  336. data/spec/cucumber/formatters/ansicolor_spec.rb +0 -35
  337. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  338. data/spec/cucumber/formatters/features.html +0 -269
  339. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -74
  340. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -204
  341. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -65
  342. data/spec/cucumber/model/table_spec.rb +0 -20
  343. data/spec/cucumber/tree/feature_spec.rb +0 -43
  344. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  345. data/spec/cucumber/tree/scenario_spec.rb +0 -76
  346. data/spec/cucumber/tree/step_spec.rb +0 -50
  347. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -98
  348. /data/examples/{calculator_ruby_features → selenium_webrat}/Rakefile +0 -0
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/core_ext/string'
5
+
6
+ module Cucumber
7
+ module Ast
8
+ describe Step do
9
+ it "should replace arguments in name" do
10
+ step = Step.new(1, 'Given', 'a <color> cucumber')
11
+
12
+ invocation_table = Table.new([
13
+ %w{color taste},
14
+ %w{green juicy}
15
+ ])
16
+ cells = invocation_table.cells_rows[1]
17
+ step_invocation = step.step_invocation_from_cells(cells)
18
+
19
+ step_invocation.name.should == 'a green cucumber'
20
+ end
21
+
22
+ it "should use empty string for the replacement of arguments in name when replace value is nil" do
23
+ step = Step.new(1, 'Given', 'a <color>cucumber')
24
+
25
+ invocation_table = Table.new([
26
+ ['color'],
27
+ [nil]
28
+ ])
29
+ cells = invocation_table.cells_rows[1]
30
+ step_invocation = step.step_invocation_from_cells(cells)
31
+
32
+ step_invocation.name.should == 'a cucumber'
33
+ end
34
+
35
+ it "should replace arguments in table arg" do
36
+ arg_table = Table.new([%w{taste_<taste> color_<color>}])
37
+
38
+ step = Step.new(1, 'Given', 'a <color> cucumber', arg_table)
39
+
40
+ invocation_table = Table.new([
41
+ %w{color taste},
42
+ %w{green juicy}
43
+ ])
44
+ cells = invocation_table.cells_rows[1]
45
+ step_invocation = step.step_invocation_from_cells(cells)
46
+
47
+ step_invocation.instance_variable_get('@multiline_arg').raw.should == [%w{taste_juicy color_green}]
48
+ end
49
+
50
+ it "should replace arguments in py string arg" do
51
+ py_string = PyString.new(1, 2, 'taste_<taste> color_<color>', 0)
52
+
53
+ step = Step.new(1, 'Given', 'a <color> cucumber', py_string)
54
+
55
+ invocation_table = Table.new([
56
+ %w{color taste},
57
+ %w{green juicy}
58
+ ])
59
+ cells = invocation_table.cells_rows[1]
60
+ step_invocation = step.step_invocation_from_cells(cells)
61
+
62
+ step_invocation.instance_variable_get('@multiline_arg').to_s.should == 'taste_juicy color_green'
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,149 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/ast/table'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ describe Table do
7
+ before do
8
+ @table = Table.new([
9
+ %w{one four seven},
10
+ %w{4444 55555 666666}
11
+ ])
12
+ def @table.cells_rows; super; end
13
+ def @table.columns; super; end
14
+ end
15
+
16
+ it "should have rows" do
17
+ @table.cells_rows[0].map{|cell| cell.value}.should == %w{one four seven}
18
+ end
19
+
20
+ it "should have columns" do
21
+ @table.columns[1].map{|cell| cell.value}.should == %w{four 55555}
22
+ end
23
+
24
+ it "should have same cell objects in rows and columns" do
25
+ # 666666
26
+ @table.cells_rows[1].__send__(:[], 2).should equal(@table.columns[2].__send__(:[], 1))
27
+ end
28
+
29
+ it "should know about max width of a row" do
30
+ @table.columns[1].__send__(:width).should == 5
31
+ end
32
+
33
+ it "should be convertible to an array of hashes" do
34
+ @table.hashes.should == [
35
+ {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
36
+ ]
37
+ end
38
+
39
+ it "should accept symbols as keys for the hashes" do
40
+ @table.hashes.first[:one].should == '4444'
41
+ end
42
+
43
+ it "should allow map'ing columns" do
44
+ @table.map_column!('one') { |v| v.to_i }
45
+ @table.hashes.first['one'].should == 4444
46
+ end
47
+
48
+ it "should pass silently if a mapped column does not exist in non-strict mode" do
49
+ lambda {
50
+ @table.map_column!('two', false) { |v| v.to_i }
51
+ }.should_not raise_error
52
+ end
53
+
54
+ it "should fail if a mapped column does not exist in strict mode" do
55
+ lambda {
56
+ @table.map_column!('two', true) { |v| v.to_i }
57
+ }.should raise_error('The column named "two" does not exist')
58
+ end
59
+
60
+ describe ".transpose" do
61
+ before(:each) do
62
+ @table = Table.new([
63
+ %w{one 1111},
64
+ %w{two 22222}
65
+ ])
66
+ end
67
+
68
+ it "should be convertible in to an array where each row is a hash" do
69
+ @table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
70
+ end
71
+ end
72
+
73
+ it "should allow renaming columns" do
74
+ table2 = @table.map_headers('one' => :three)
75
+ table2.hashes.first[:three].should == '4444'
76
+ end
77
+
78
+ it "should copy column mappings when mapping headers" do
79
+ @table.map_column!('one') { |v| v.to_i }
80
+ table2 = @table.map_headers('one' => 'three')
81
+ table2.hashes.first['three'].should == 4444
82
+ end
83
+
84
+ describe "replacing arguments" do
85
+
86
+ before(:each) do
87
+ @table = table = Table.new([
88
+ %w{qty book},
89
+ %w{<qty> <book>}
90
+ ])
91
+ end
92
+
93
+ it "should return a new table with arguments replaced with values" do
94
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => 'Unbearable lightness of being', '<qty>' => '5'})
95
+
96
+ table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
97
+ table_with_replaced_args.hashes[0]['qty'].should == '5'
98
+ end
99
+
100
+ it "should replace nil values with nil" do
101
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => nil})
102
+
103
+ table_with_replaced_args.hashes[0]['book'].should == nil
104
+ end
105
+
106
+ it "should preserve values which don't match a placeholder when replacing with nil" do
107
+ table = Table.new([
108
+ %w{book},
109
+ %w{cat}
110
+ ])
111
+ table_with_replaced_args = table.arguments_replaced({'<book>' => nil})
112
+
113
+ table_with_replaced_args.hashes[0]['book'].should == 'cat'
114
+ end
115
+
116
+ it "should not change the original table" do
117
+ @table.arguments_replaced({'<book>' => 'Unbearable lightness of being'})
118
+
119
+ @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
120
+ end
121
+
122
+ it "should not raise an error when there are nil values in the table" do
123
+ table = Table.new([
124
+ ['book', 'qty'],
125
+ ['<book>', nil],
126
+ ])
127
+ lambda{
128
+ table.arguments_replaced({'<book>' => nil, '<qty>' => '5'})
129
+ }.should_not raise_error
130
+ end
131
+
132
+ end
133
+
134
+ it "should convert to sexp" do
135
+ @table.to_sexp.should ==
136
+ [:table,
137
+ [:row,
138
+ [:cell, "one"],
139
+ [:cell, "four"],
140
+ [:cell, "seven"]
141
+ ],
142
+ [:row,
143
+ [:cell, "4444"],
144
+ [:cell, "55555"],
145
+ [:cell, "666666"]]]
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Cucumber
4
+ module Ast
5
+ describe Tags do
6
+ before do
7
+ @tags = Tags.new(-1, %w{one two three})
8
+ end
9
+
10
+ it "should be among other tags" do
11
+ @tags.should have_tags(%w{one})
12
+ end
13
+
14
+ it "should not be among other tags with irrelevent tag" do
15
+ @tags.should_not have_tags(%w{bacon})
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,26 +2,14 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  module Cucumber
4
4
  describe Broadcaster do
5
+ before do
6
+ @receiver = mock('receiver')
7
+ @broadcaster = Broadcaster.new([@receiver])
8
+ end
5
9
 
6
10
  it "should broadcast methods to registered objects" do
7
- broadcaster = Broadcaster.new
8
- mock_receiver = mock('receiver')
9
-
10
- mock_receiver.should_receive(:konbanwa).with('good evening')
11
- broadcaster.register(mock_receiver)
12
-
13
- broadcaster.konbanwa('good evening')
11
+ @receiver.should_receive(:konbanwa).with('good evening')
12
+ @broadcaster.konbanwa('good evening')
14
13
  end
15
-
16
- it "should not call methods on registered objects if they dont support the method" do
17
- broadcaster = Broadcaster.new
18
- mock_receiver = mock('receiver', :respond_to? => false)
19
-
20
- mock_receiver.should_not_receive(:konbanwa)
21
- broadcaster.register(mock_receiver)
22
-
23
- broadcaster.konbanwa()
24
- end
25
-
26
14
  end
27
15
  end
@@ -0,0 +1,275 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'yaml'
3
+
4
+ module Cucumber
5
+ module Cli
6
+ describe Configuration do
7
+
8
+ def given_cucumber_yml_defined_as(hash_or_string)
9
+ File.stub!(:exist?).and_return(true)
10
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
11
+ IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
12
+ end
13
+
14
+ before(:each) do
15
+ Kernel.stub!(:exit).and_return(nil)
16
+ end
17
+
18
+ it "should require files in support paths first" do
19
+ File.stub!(:directory?).and_return(true)
20
+ Dir.stub!(:[]).and_return(["/features/step_definitions/foo.rb","/features/support/bar.rb"])
21
+
22
+ config = Configuration.new(StringIO.new)
23
+ config.parse!(%w{--require /features})
24
+
25
+ config.files_to_require.should == [
26
+ "/features/support/bar.rb",
27
+ "/features/step_definitions/foo.rb"
28
+ ]
29
+ end
30
+
31
+ it "should require env.rb files first" do
32
+ File.stub!(:directory?).and_return(true)
33
+ Dir.stub!(:[]).and_return(["/features/support/a_file.rb","/features/support/env.rb"])
34
+
35
+ config = Configuration.new(StringIO.new)
36
+ config.parse!(%w{--require /features})
37
+
38
+ config.files_to_require.should == [
39
+ "/features/support/env.rb",
40
+ "/features/support/a_file.rb"
41
+ ]
42
+ end
43
+
44
+ it "should expand args from YAML file" do
45
+ given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
46
+
47
+ config = Configuration.new
48
+ config.parse!(%w{--format progress --profile bongo})
49
+ config.options[:formats].should == {'progress' => STDOUT}
50
+ config.options[:require].should == ['from/yml']
51
+ end
52
+
53
+ it "should expand args from YAML file's default if there are no args" do
54
+ given_cucumber_yml_defined_as({'default' => '--require from/yml'})
55
+
56
+ config = Configuration.new
57
+ config.parse!([])
58
+ config.options[:require].should == ['from/yml']
59
+ end
60
+
61
+ it "should provide a helpful error message when a specified profile does not exists in YAML file" do
62
+ given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
63
+
64
+ config = Configuration.new(StringIO.new, error = StringIO.new)
65
+ config.parse!(%w{--profile i_do_not_exist})
66
+
67
+ expected_message = <<-END_OF_MESSAGE
68
+ Could not find profile: 'i_do_not_exist'
69
+
70
+ Defined profiles in cucumber.yml:
71
+ * default
72
+ * html_report
73
+ END_OF_MESSAGE
74
+
75
+ error.string.should == expected_message
76
+ end
77
+
78
+ it "should provide a helpful error message when a specified profile is not a String" do
79
+ given_cucumber_yml_defined_as({'foo' => [1,2,3]})
80
+
81
+ config = Configuration.new(StringIO.new, error = StringIO.new)
82
+ config.parse!(%w{--profile foo})
83
+
84
+ error.string.should == "Profiles must be defined as a String. The 'foo' profile was [1, 2, 3] (Array).\n"
85
+ end
86
+
87
+ it "should provide a helpful error message when a specified profile exists but is nil or blank" do
88
+ [nil, ' '].each do |bad_input|
89
+ given_cucumber_yml_defined_as({'foo' => bad_input})
90
+
91
+ config = Configuration.new(StringIO.new, error = StringIO.new)
92
+ config.parse!(%w{--profile foo})
93
+
94
+ error.string.should match(/The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./)
95
+ end
96
+ end
97
+
98
+ it "should provide a helpful error message when no YAML file exists and a profile is specified" do
99
+ File.should_receive(:exist?).with('cucumber.yml').and_return(false)
100
+
101
+ config = Configuration.new(StringIO.new, error = StringIO.new)
102
+ config.parse!(%w{--profile i_do_not_exist})
103
+
104
+ error.string.should match(/cucumber.yml was not found. Please refer to cucumber's documentaion on defining profiles in cucumber.yml./)
105
+ end
106
+
107
+ it "should provide a helpful error message when cucumber.yml is blank or malformed" do
108
+ expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentaion on correct profile usage./
109
+
110
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
111
+ given_cucumber_yml_defined_as(bad_input)
112
+
113
+ config = Configuration.new(StringIO.new, error = StringIO.new)
114
+ config.parse!([])
115
+
116
+ error.string.should match(expected_error_message)
117
+ end
118
+ end
119
+
120
+ it "should procide a helpful error message when the YAML can not be parsed" do
121
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentaion on correct profile usage./
122
+
123
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
124
+ YAML.should_receive(:load).and_raise Exception
125
+
126
+ config = Configuration.new(StringIO.new, error = StringIO.new)
127
+ config.parse!([])
128
+
129
+ error.string.should match(expected_error_message)
130
+ end
131
+
132
+ it "should accept --dry-run option" do
133
+ config = Configuration.new(StringIO.new)
134
+ config.parse!(%w{--dry-run})
135
+ config.options[:dry_run].should be_true
136
+ end
137
+
138
+ it "should accept --no-source option" do
139
+ config = Configuration.new
140
+ config.parse!(%w{--no-source})
141
+
142
+ config.options[:source].should be_false
143
+ end
144
+
145
+ it "should accept --no-snippets option" do
146
+ config = Configuration.new
147
+ config.parse!(%w{--no-snippets})
148
+
149
+ config.options[:snippets].should be_false
150
+ end
151
+
152
+ it "should set snippets and source to false with --quiet option" do
153
+ config = Configuration.new
154
+ config.parse!(%w{--quiet})
155
+
156
+ config.options[:snippets].should be_nil
157
+ config.options[:source].should be_nil
158
+ end
159
+
160
+ it "should accept --verbose option" do
161
+ config = Configuration.new
162
+ config.parse!(%w{--verbose})
163
+
164
+ config.options[:verbose].should be_true
165
+ end
166
+
167
+ it "should accept --out option" do
168
+ config = Configuration.new(StringIO.new)
169
+ config.parse!(%w{--out jalla.txt})
170
+ config.options[:formats]['pretty'].should == 'jalla.txt'
171
+ end
172
+
173
+ it "should accept multiple --out options" do
174
+ config = Configuration.new(StringIO.new)
175
+ config.parse!(%w{--format progress --out file1 --out file2})
176
+ config.options[:formats].should == {'progress' => 'file2'}
177
+ end
178
+
179
+ it "should accept multiple --format options" do
180
+ config = Configuration.new(StringIO.new)
181
+ config.parse!(%w{--format pretty --format progress})
182
+ config.options[:formats].should have_key('pretty')
183
+ config.options[:formats].should have_key('progress')
184
+ end
185
+
186
+ it "should associate --out to previous --format" do
187
+ config = Configuration.new(StringIO.new)
188
+ config.parse!(%w{--format progress --out file1 --format profile --out file2})
189
+ config.options[:formats].should == {"profile"=>"file2", "progress"=>"file1"}
190
+ end
191
+
192
+ it "should accept --color option" do
193
+ Term::ANSIColor.should_receive(:coloring=).with(true)
194
+ config = Configuration.new(StringIO.new)
195
+ config.parse!(['--color'])
196
+ end
197
+
198
+ it "should accept --no-color option" do
199
+ Term::ANSIColor.should_receive(:coloring=).with(false)
200
+ config = Configuration.new(StringIO.new)
201
+ config.parse!(['--no-color'])
202
+ end
203
+
204
+ it "should parse tags" do
205
+ config = Configuration.new(nil)
206
+ includes, excludes = config.parse_tags("one,~two,@three,~@four")
207
+ includes.should == ['one', 'three']
208
+ excludes.should == ['two', 'four']
209
+ end
210
+
211
+ describe "--backtrace" do
212
+ before do
213
+ Exception.cucumber_full_backtrace = false
214
+ end
215
+
216
+ it "should show full backtrace when --backtrace is present" do
217
+ config = Main.new(['--backtrace'])
218
+ begin
219
+ "x".should == "y"
220
+ rescue => e
221
+ e.backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
222
+ end
223
+ end
224
+
225
+ xit "should strip gems when --backtrace is absent" do
226
+ config = Main.new(['--'])
227
+ begin
228
+ "x".should == "y"
229
+ rescue => e
230
+ e.backtrace[0].should == "#{__FILE__}:#{__LINE__ - 2}"
231
+ end
232
+ end
233
+
234
+ after do
235
+ Exception.cucumber_full_backtrace = false
236
+ end
237
+ end
238
+
239
+ describe "diff output" do
240
+
241
+ it "is enabled by default" do
242
+ config = Configuration.new
243
+ config.diff_enabled?.should be_true
244
+ end
245
+
246
+ it "is disabled when the --no-diff option is supplied" do
247
+ config = Configuration.new
248
+ config.parse!(%w{--no-diff})
249
+
250
+ config.diff_enabled?.should be_false
251
+ end
252
+
253
+ end
254
+
255
+ it "should accept multiple --scenario options" do
256
+ config = Configuration.new
257
+ config.parse!(['--scenario', "User logs in", '--scenario', "User signs up"])
258
+
259
+ config.options[:scenario_names].should include("User logs in")
260
+ config.options[:scenario_names].should include("User signs up")
261
+ end
262
+
263
+ it "should search for all features in the specified directory" do
264
+ File.stub!(:directory?).and_return(true)
265
+ Dir.should_receive(:[]).with("feature_directory/**/*.feature").any_number_of_times.and_return(["cucumber.feature"])
266
+
267
+ config = Configuration.new(StringIO)
268
+ config.parse!(%w{feature_directory/})
269
+
270
+ config.feature_files.should == ["cucumber.feature"]
271
+ end
272
+
273
+ end
274
+ end
275
+ end