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
@@ -1,41 +0,0 @@
1
- require 'spec'
2
- require 'selenium'
3
-
4
- class GoogleSearch
5
- def initialize(browser)
6
- @browser = browser
7
- end
8
-
9
- def goto
10
- @browser.open 'http://www.google.com/'
11
- end
12
-
13
- def search(text)
14
- @browser.type('q',text)
15
- @browser.click 'btnG'
16
- @browser.wait_for_page_to_load
17
- end
18
- end
19
-
20
- Before do
21
- @browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)
22
- @browser.start
23
- end
24
-
25
- After do
26
- @browser.stop
27
- end
28
-
29
- Given 'I am on the Google search page' do
30
- @page = GoogleSearch.new(@browser)
31
- @page.goto
32
- end
33
-
34
- When /I search for "(.*)"/ do |query|
35
- @page.search(query)
36
- end
37
-
38
- Then /I should see a link to "(.*)":(.*)/ do |text, expected_url|
39
- observed_url = @browser.get_attribute("link=#{text}@href")
40
- observed_url.should == expected_url
41
- end
@@ -1,51 +0,0 @@
1
- require 'spec'
2
-
3
- case PLATFORM
4
- when /darwin/
5
- require 'safariwatir'
6
- Browser = Watir::Safari
7
- when /win32|mingw/
8
- require 'watir'
9
- Browser = Watir::IE
10
- when /java/
11
- require 'celerity'
12
- Browser = Celerity::Browser
13
- else
14
- raise "This platform is not supported (#{PLATFORM})"
15
- end
16
-
17
- Before do
18
- @b = Browser.new
19
- end
20
-
21
- After do
22
- @b.close
23
- end
24
-
25
- class GoogleSearch
26
- def initialize(b)
27
- @b = b
28
- end
29
-
30
- def goto
31
- @b.goto 'http://www.google.com/'
32
- end
33
-
34
- def search(text)
35
- @b.text_field(:name, 'q').set(text)
36
- @b.button(:name, 'btnG').click
37
- end
38
- end
39
-
40
- Given 'I am on the Google search page' do
41
- @page = GoogleSearch.new(@b)
42
- @page.goto
43
- end
44
-
45
- When /I search for "(.*)"/ do |query|
46
- @page.search(query)
47
- end
48
-
49
- Then /I should see a link to "(.*)":(.*)/ do |text, url|
50
- @b.link(:url, url).text.should == text
51
- end
@@ -1,8 +0,0 @@
1
- Feature: See features
2
- In order to make Cucumber features more accessible
3
- I should be able to see the existing features in a system
4
-
5
- Scenario: See features as HTML
6
- Given the feature server is running
7
- When I visit "/features"
8
- Then I should see a link to "See features"
@@ -1,9 +0,0 @@
1
- Given /the feature server is running/ do
2
- raise "TODO"
3
- end
4
-
5
- When /I visit "(.*)"/ do |resource|
6
- end
7
-
8
- Then /I should see a link to "(.*)"/ do |text|
9
- end
@@ -1,41 +0,0 @@
1
- class FeatureCompiler
2
- def initialize
3
- require 'yaml'
4
- require 'erb'
5
-
6
- @tt = PLATFORM =~ /mswin|mingw/ ? 'tt.bat' : 'tt'
7
-
8
- @template = ERB.new(IO.read(File.dirname(__FILE__) + '/../lib/cucumber/treetop_parser/feature.treetop.erb'))
9
- @langs = YAML.load_file(File.dirname(__FILE__) + '/../lib/cucumber/languages.yml')
10
- end
11
-
12
- def compile_all
13
- @langs.keys.each do |lang|
14
- compile(lang)
15
- end
16
- end
17
-
18
- def compile(lang)
19
- words = @langs['en'].merge(@langs[lang]) # Use English words if languages.yml is missing a word
20
- grammar_file = File.dirname(__FILE__) + "/../lib/cucumber/treetop_parser/feature_#{lang}.treetop"
21
- ruby_file = File.dirname(__FILE__) + "/../lib/cucumber/treetop_parser/feature_#{lang}.rb"
22
- grammar = @template.result(binding)
23
- File.open(grammar_file, "wb") do |io|
24
- io.write(grammar)
25
- end
26
- sh "#{@tt} #{grammar_file}"
27
- FileUtils.rm(grammar_file)
28
- end
29
- end
30
-
31
- namespace :treetop do
32
- desc 'Compile the grammar for all languages in languages.yml'
33
- task :compile do
34
- FeatureCompiler.new.compile_all
35
- end
36
-
37
- desc 'Compile the English grammar'
38
- task :compile_en do
39
- FeatureCompiler.new.compile('en')
40
- end
41
- end
data/lib/cucumber/cli.rb DELETED
@@ -1,279 +0,0 @@
1
- require 'optparse'
2
- require 'cucumber'
3
-
4
- module Cucumber
5
- class CLI
6
- class << self
7
- attr_writer :step_mother, :executor, :features
8
-
9
- def execute
10
- @execute_called = true
11
- parse(ARGV).execute!(@step_mother, @executor, @features)
12
- end
13
-
14
- def execute_called?
15
- @execute_called
16
- end
17
-
18
- def parse(args)
19
- cli = new
20
- cli.parse_options!(args)
21
- cli
22
- end
23
- end
24
-
25
- attr_reader :options, :paths
26
- FORMATS = %w{pretty profile progress html autotest}
27
- DEFAULT_FORMAT = 'pretty'
28
-
29
- def initialize(out_stream = STDOUT, error_stream = STDERR)
30
- @out_stream = out_stream
31
- @error_stream = error_stream
32
- @paths = []
33
- @options = {
34
- :require => nil,
35
- :lang => 'en',
36
- :dry_run => false,
37
- :source => true,
38
- :snippets => true,
39
- :formats => {},
40
- :excludes => [],
41
- :scenario_names => nil
42
- }
43
- @active_format = DEFAULT_FORMAT
44
- end
45
-
46
- def parse_options!(args)
47
- return parse_args_from_profile('default') if args.empty?
48
- args.extend(OptionParser::Arguable)
49
-
50
- args.options do |opts|
51
- opts.banner = "Usage: cucumber [options] FILES|DIRS"
52
- opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR", "Require files before executing the features.",
53
- "If this option is not specified, all *.rb files that",
54
- "are siblings or below the features will be autorequired",
55
- "This option can be specified multiple times.") do |v|
56
- @options[:require] ||= []
57
- @options[:require] << v
58
- end
59
- opts.on("-s SCENARIO", "--scenario SCENARIO", "Only execute the scenario with the given name.",
60
- "If this option is given more than once, run all",
61
- "the specified scenarios.") do |v|
62
- @options[:scenario_names] ||= []
63
- @options[:scenario_names] << v
64
- end
65
- opts.on("-a LANG", "--language LANG", "Specify language for features (Default: #{@options[:lang]})",
66
- "Available languages: #{Cucumber.languages.join(", ")}",
67
- "Look at #{Cucumber::LANGUAGE_FILE} for keywords") do |v|
68
- @options[:lang] = v
69
- end
70
- opts.on("-f FORMAT", "--format FORMAT", "How to format features (Default: #{DEFAULT_FORMAT})",
71
- "Available formats: #{FORMATS.join(", ")}",
72
- "This option can be specified multiple times.") do |v|
73
- unless FORMATS.index(v)
74
- @error_stream.puts "Invalid format: #{v}\n"
75
- @error_stream.puts opts.help
76
- exit 1
77
- end
78
- @options[:formats][v] ||= []
79
- @options[:formats][v] << @out_stream
80
- @active_format = v
81
- end
82
- opts.on("-o", "--out FILE", "Write output to a file instead of @out_stream.",
83
- "This option can be specified multiple times, and applies to the previously",
84
- "specified --format.") do |v|
85
- @options[:formats][@active_format] ||= []
86
- if @options[:formats][@active_format].last == @out_stream
87
- @options[:formats][@active_format][-1] = File.open(v, 'w')
88
- else
89
- @options[:formats][@active_format] << File.open(v, 'w')
90
- end
91
- end
92
- opts.on("-c", "--[no-]color", "Use ANSI color in the output, if formatters use it. If",
93
- "these options are given multiple times, the last one is",
94
- "used. If neither --color or --no-color is given cucumber",
95
- "decides based on your platform and the output destination") do |v|
96
- @options[:color] = v
97
- end
98
- opts.on("-e", "--exclude PATTERN", "Don't run features matching a pattern") do |v|
99
- @options[:excludes] << v
100
- end
101
- opts.on("-p", "--profile PROFILE", "Pull commandline arguments from cucumber.yml.") do |v|
102
- parse_args_from_profile(v)
103
- end
104
- opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.") do
105
- @options[:dry_run] = true
106
- end
107
- opts.on("-n", "--no-source", "Don't show the file and line of the step definition with the steps.") do
108
- @options[:source] = false
109
- end
110
- opts.on("-i", "--no-snippets", "Don't show the snippets for pending steps") do
111
- @options[:snippets] = false
112
- end
113
- opts.on("-q", "--quiet", "Don't show any development aid information") do
114
- @options[:snippets] = false
115
- @options[:source] = false
116
- end
117
- opts.on_tail("--version", "Show version") do
118
- puts VERSION::STRING
119
- exit
120
- end
121
- opts.on_tail("--help", "You're looking at it") do
122
- puts opts.help
123
- exit
124
- end
125
- end.parse!
126
-
127
- if @options[:formats].empty?
128
- @options[:formats][DEFAULT_FORMAT] = [@out_stream]
129
- end
130
-
131
- # Whatever is left after option parsing is the FILE arguments
132
- args = extract_and_store_line_numbers(args)
133
- @paths += args
134
- end
135
-
136
- def parse_args_from_profile(profile)
137
- unless File.exist?('cucumber.yml')
138
- return exit_with_error("cucumber.yml was not found. Please define your '#{profile}' and other profiles in cucumber.yml.\n"+
139
- "Type 'cucumber --help' for usage.\n")
140
- end
141
-
142
- require 'yaml'
143
- cucumber_yml = YAML::load(IO.read('cucumber.yml'))
144
- args_from_yml = cucumber_yml[profile]
145
- if args_from_yml.nil?
146
- exit_with_error <<-END_OF_ERROR
147
- Could not find profile: '#{profile}'
148
-
149
- Defined profiles in cucumber.yml:
150
- * #{cucumber_yml.keys.join("\n * ")}
151
- END_OF_ERROR
152
- elsif !args_from_yml.is_a?(String)
153
- exit_with_error "Profiles must be defined as a String. The '#{profile}' profile was #{args_from_yml.inspect} (#{args_from_yml.class}).\n"
154
- else
155
- parse_options!(args_from_yml.split(' '))
156
- end
157
- end
158
-
159
- def execute!(step_mother, executor, features)
160
- Term::ANSIColor.coloring = @options[:color] unless @options[:color].nil?
161
- Cucumber.load_language(@options[:lang])
162
- executor.formatters = build_formatter_broadcaster(step_mother)
163
- require_files
164
- load_plain_text_features(features)
165
- executor.lines_for_features = @options[:lines_for_features]
166
- executor.scenario_names = @options[:scenario_names] if @options[:scenario_names]
167
- executor.visit_features(features)
168
- exit 1 if executor.failed
169
- end
170
-
171
- private
172
-
173
- def extract_and_store_line_numbers(file_arguments)
174
- @options[:lines_for_features] = Hash.new{|k,v| k[v] = []}
175
- file_arguments.map do |arg|
176
- _, file, lines = */^([\w\W]*?):([\d:]+)$/.match(arg)
177
- unless file.nil?
178
- @options[:lines_for_features][file] += lines.split(':').map { |line| line.to_i }
179
- arg = file
180
- end
181
- arg
182
- end
183
- end
184
-
185
- # Requires files - typically step files and ruby feature files.
186
- def require_files
187
- ARGV.clear # Shut up RSpec
188
- require "cucumber/treetop_parser/feature_#{@options[:lang]}"
189
- require "cucumber/treetop_parser/feature_parser"
190
-
191
- requires = @options[:require] || feature_dirs
192
- libs = requires.map do |path|
193
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
194
- File.directory?(path) ? Dir["#{path}/**/*.rb"] : path
195
- end.flatten.uniq
196
- libs.each do |lib|
197
- begin
198
- require lib
199
- rescue LoadError => e
200
- e.message << "\nFailed to load #{lib}"
201
- raise e
202
- end
203
- end
204
- end
205
-
206
- def feature_files
207
- potential_feature_files = @paths.map do |path|
208
- path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
209
- path = path.chomp('/')
210
- File.directory?(path) ? Dir["#{path}/**/*.feature"] : path
211
- end.flatten.uniq
212
-
213
- @options[:excludes].each do |exclude|
214
- potential_feature_files.reject! do |path|
215
- path =~ /#{Regexp.escape(exclude)}/
216
- end
217
- end
218
-
219
- potential_feature_files
220
- end
221
-
222
- def feature_dirs
223
- feature_files.map{|f| File.directory?(f) ? f : File.dirname(f)}.uniq
224
- end
225
-
226
- def load_plain_text_features(features)
227
- parser = TreetopParser::FeatureParser.new
228
-
229
- feature_files.each do |f|
230
- features << parser.parse_feature(f)
231
- end
232
- end
233
-
234
- def build_formatter_broadcaster(step_mother)
235
- formatter_broadcaster = Broadcaster.new
236
- @options[:formats].each do |format, output_list|
237
- output_broadcaster = build_output_broadcaster(output_list)
238
- case format
239
- when 'pretty'
240
- formatter_broadcaster.register(Formatters::PrettyFormatter.new(output_broadcaster, step_mother, @options))
241
- when 'progress'
242
- formatter_broadcaster.register(Formatters::ProgressFormatter.new(output_broadcaster))
243
- when 'profile'
244
- formatter_broadcaster.register(Formatters::ProfileFormatter.new(output_broadcaster, step_mother))
245
- when 'html'
246
- formatter_broadcaster.register(Formatters::HtmlFormatter.new(output_broadcaster, step_mother))
247
- when 'autotest'
248
- formatter_broadcaster.register(Formatters::AutotestFormatter.new(output_broadcaster))
249
- else
250
- raise "Unknown formatter: #{@options[:format]}"
251
- end
252
- end
253
- formatter_broadcaster
254
- end
255
-
256
- def build_output_broadcaster(output_list)
257
- output_broadcaster = Broadcaster.new
258
- output_list.each do |output|
259
- output_broadcaster.register(output)
260
- end
261
- output_broadcaster
262
- end
263
-
264
- private
265
-
266
- def exit_with_error(error_message)
267
- @error_stream << error_message
268
- Kernel.exit 1
269
- end
270
-
271
- end
272
- end
273
-
274
- extend Cucumber::StepMethods
275
- Cucumber::CLI.step_mother = step_mother
276
- Cucumber::CLI.executor = executor
277
-
278
- extend Cucumber::Tree
279
- Cucumber::CLI.features = features
@@ -1,190 +0,0 @@
1
- require 'cucumber/core_ext/proc'
2
-
3
- module Cucumber
4
- class Executor
5
- attr_reader :failed
6
- attr_accessor :formatters
7
- attr_writer :scenario_names, :lines_for_features
8
-
9
- def initialize(step_mother)
10
- @world_procs = []
11
- @before_scenario_procs = []
12
- @after_scenario_procs = []
13
- @after_step_procs = []
14
- @step_mother = step_mother
15
-
16
- @executed_scenarios = {}
17
- @regular_scenario_cache = {}
18
- end
19
-
20
- def register_world_proc(&proc)
21
- @world_procs << proc
22
- end
23
-
24
- def register_before_scenario_proc(&proc)
25
- proc.extend(CoreExt::CallIn)
26
- @before_scenario_procs << proc
27
- end
28
-
29
- def register_after_scenario_proc(&proc)
30
- proc.extend(CoreExt::CallIn)
31
- @after_scenario_procs << proc
32
- end
33
-
34
- def register_after_step_proc(&proc)
35
- proc.extend(CoreExt::CallIn)
36
- @after_step_procs << proc
37
- end
38
-
39
- def visit_features(features)
40
- formatters.visit_features(features)
41
- features.accept(self)
42
- formatters.dump
43
- end
44
-
45
- def visit_feature(feature)
46
- @feature_file = feature.file
47
-
48
- if accept_feature?(feature)
49
- formatters.feature_executing(feature)
50
- feature.accept(self)
51
- @executed_scenarios = {}
52
- @regular_scenario_cache = {}
53
- end
54
- end
55
-
56
- def visit_header(header)
57
- formatters.header_executing(header)
58
- end
59
-
60
- def visit_row_scenario(scenario)
61
- execute_scenario(@regular_scenario_cache[scenario.name]) if executing_unprepared_row_scenario?(scenario)
62
- visit_scenario(scenario)
63
- end
64
-
65
- def visit_regular_scenario(scenario)
66
- @regular_scenario_cache[scenario.name] = scenario
67
- visit_scenario(scenario)
68
- end
69
-
70
- def visit_scenario(scenario)
71
- if accept_scenario?(scenario)
72
- @executed_scenarios[scenario.name] = true
73
- execute_scenario(scenario)
74
- end
75
- end
76
-
77
- def execute_scenario(scenario)
78
- @error = nil
79
- @pending = nil
80
-
81
- @world = create_world
82
- @world.extend(Spec::Matchers) if defined?(Spec::Matchers)
83
- define_step_call_methods(@world)
84
-
85
- formatters.scenario_executing(scenario)
86
- @before_scenario_procs.each{|p| p.call_in(@world, *[])}
87
- scenario.accept(self)
88
- @after_scenario_procs.each{|p| p.call_in(@world, *[])}
89
- formatters.scenario_executed(scenario)
90
- end
91
-
92
- def accept_scenario?(scenario)
93
- scenario_at_specified_line?(scenario) &&
94
- scenario_has_specified_name?(scenario)
95
- end
96
-
97
- def accept_feature?(feature)
98
- feature.scenarios.any? { |s| accept_scenario?(s) }
99
- end
100
-
101
- def visit_row_step(step)
102
- visit_step(step)
103
- end
104
-
105
- def visit_regular_step(step)
106
- visit_step(step)
107
- end
108
-
109
- def visit_step(step)
110
- unless @pending || @error
111
- begin
112
- regexp, args, proc = step.regexp_args_proc(@step_mother)
113
- formatters.step_executing(step, regexp, args)
114
- step.execute_in(@world, regexp, args, proc)
115
- @after_step_procs.each{|p| p.call_in(@world, *[])}
116
- formatters.step_passed(step, regexp, args)
117
- rescue Pending
118
- record_pending_step(step, regexp, args)
119
- rescue => e
120
- @failed = true
121
- @error = step.error = e
122
- formatters.step_failed(step, regexp, args)
123
- end
124
- else
125
- begin
126
- regexp, args, proc = step.regexp_args_proc(@step_mother)
127
- step.execute_in(@world, regexp, args, proc)
128
- formatters.step_skipped(step, regexp, args)
129
- rescue Pending
130
- record_pending_step(step, regexp, args)
131
- rescue Exception
132
- formatters.step_skipped(step, regexp, args)
133
- end
134
- end
135
- end
136
-
137
- def record_pending_step(step, regexp, args)
138
- @pending = true
139
- formatters.step_pending(step, regexp, args)
140
- end
141
-
142
- def define_step_call_methods(world)
143
- world.instance_variable_set('@__executor', self)
144
- world.instance_eval do
145
- class << self
146
- def run_step(name)
147
- _, args, proc = @__executor.instance_variable_get(:@step_mother).regexp_args_proc(name)
148
- proc.call_in(self, *args)
149
- end
150
-
151
- %w{given when then and but}.each do |keyword|
152
- alias_method Cucumber.language[keyword], :run_step
153
- end
154
- end
155
- end
156
- end
157
-
158
- def executing_unprepared_row_scenario?(scenario)
159
- accept_scenario?(scenario) && !@executed_scenarios[scenario.name]
160
- end
161
-
162
- def scenario_at_specified_line?(scenario)
163
- if lines_defined_for_current_feature?
164
- @lines_for_features[@feature_file].inject(false) { |at_line, line| at_line || scenario.at_line?(line) }
165
- else
166
- true
167
- end
168
- end
169
-
170
- def scenario_has_specified_name?(scenario)
171
- if @scenario_names && !@scenario_names.empty?
172
- @scenario_names.include?(scenario.name)
173
- else
174
- true
175
- end
176
- end
177
-
178
- def lines_defined_for_current_feature?
179
- @lines_for_features && !@lines_for_features[@feature_file].nil? && !@lines_for_features[@feature_file].empty?
180
- end
181
-
182
- def create_world
183
- world = Object.new
184
- @world_procs.each do |world_proc|
185
- world = world_proc.call(world)
186
- end
187
- world
188
- end
189
- end
190
- end