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,100 @@
1
+ /*
2
+ * Copyright (c) 2008 Greg Weber greg at gregweber.info
3
+ * Dual licensed under the MIT and GPL licenses:
4
+ * http://www.opensource.org/licenses/mit-license.php
5
+ * http://www.gnu.org/licenses/gpl.html
6
+ *
7
+ * jquery plugin
8
+ * make an html table editable by the user
9
+ * user clicks on a cell, edits the value,
10
+ * then presses enter or clicks on any cell to save the new value
11
+ * pressing escape returns the cell text to its orignal text
12
+ *
13
+ * documentation at http://gregweber.info/projects/uitableedit
14
+ *
15
+ * var t = $('table')
16
+ * $.uiTableEdit( t ) // returns t
17
+ *
18
+ * options : off, mouseDown, find, dataEntered, dataVerify, editDone
19
+ * off : turns off table editing
20
+ * find : defaults to tbody > tr > td
21
+ * mousedown : called in context of the table cell (as a normal event would be)
22
+ * if mouseDown returns false, cell will not become editable
23
+ * dataVerify : called in context of the cell,
24
+ * if dataVerify returns false, cell will stay in editable state
25
+ * if dataVerify returns text, that text will replace the cell's text
26
+ * arguments are the cell's text, original text, event, jquery object for the cell
27
+ * editDone : invoked on completion
28
+ * arguments: td cell's new text, original text, event, and jquery element for the td cell
29
+ */
30
+ jQuery.uiTableEdit = function(jq, options){
31
+ function unbind(){
32
+ return jq.find( options.find ).unbind('mousedown.uiTableEdit')
33
+ }
34
+ options = options || {}
35
+ options.find = options.find || 'tbody > tr > td'
36
+ if( options.off ){
37
+ unbind().find('form').each( function(){ var f = $(this);
38
+ f.parents("td:first").text( f.find(':text').attr('value') );
39
+ f.remove();
40
+ });
41
+ return jq;
42
+ }
43
+
44
+ function bind_mouse_down( mouseDn ){
45
+ unbind().bind('mousedown.uiTableEdit', mouseDn )
46
+ }
47
+ function td_edit(){
48
+ var td = jQuery(this);
49
+
50
+ function restore(e){
51
+ var val = td.find(':text').attr('value')
52
+ if( options.dataVerify ){
53
+ var value = options.dataVerify.call(this, val, orig_text, e, td);
54
+ if( value === false ){ return false; }
55
+ if( value !== null && value !== undefined ) val = value;
56
+ }
57
+ td.html( "" );
58
+ td.text( val );
59
+ if( options.editDone ) options.editDone(val,orig_text,e,td)
60
+ bind_mouse_down( td_edit_wrapper );
61
+ }
62
+
63
+ function checkEscape(e){
64
+ if (e.keyCode === 27) {
65
+ td.html( "" );
66
+ td.text( orig_text );
67
+ bind_mouse_down( td_edit );
68
+ }
69
+ }
70
+
71
+ var orig_text = td.text();
72
+ var w = td.width();
73
+ var h = td.height();
74
+ td.css({width: w + "px", height: h + "px", padding: "0", margin: "0"});
75
+ td.html( '<form name="td-editor" action="javascript:void(0);">' +
76
+ '<input type="text" name="td_edit" value="' +
77
+ td.text() + '"' + ' style="margin:0px;padding:0px;border:0px;width: ' +
78
+ w + 'px;">' + '</input></form>' )
79
+ .find('form').submit( restore ).mousedown( restore ).blur( restore ).keypress( checkEscape );
80
+
81
+ function focus_text(){ td.find('input:text').get(0).focus() }
82
+
83
+ // focus bug (seen in FireFox) fixed by small delay
84
+ setTimeout(focus_text, 50);
85
+
86
+ /* TODO: investigate removing bind_mouse_down
87
+ I also got rid of bind_mouse_down(restore),
88
+ because now that you can refocus on fields that have been blurred,
89
+ you can have multiple edits going simultaneously
90
+ */
91
+ bind_mouse_down( restore );
92
+ }
93
+
94
+ var td_edit_wrapper = !options.mouseDown ? td_edit : function(){
95
+ if( options.mouseDown.apply(this,arguments) == false ) return false;
96
+ td_edit.apply(this,arguments);
97
+ };
98
+ bind_mouse_down( td_edit_wrapper );
99
+ return jq;
100
+ }
@@ -1,8 +1,9 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/formatter/profile'
2
3
 
3
4
  module Cucumber
4
- module Formatters
5
- describe ProfileFormatter do
5
+ module Formatter
6
+ describe Progress do
6
7
  attr_reader :io, :formatter
7
8
 
8
9
  def mock_proc(stubs={})
@@ -20,18 +21,23 @@ module Cucumber
20
21
  end
21
22
 
22
23
  before(:each) do
24
+ ::Term::ANSIColor.coloring = false
23
25
  @io = StringIO.new
24
26
  step_mother = stub('step_mother')
25
- @formatter = ProfileFormatter.new(io, step_mother)
27
+ @formatter = ProfileFormatter.new(step_mother, io)
28
+ end
29
+
30
+ after(:each) do
31
+ ::Term::ANSIColor.coloring = true
26
32
  end
27
33
 
28
- it "should print a heading" do
34
+ xit "should print a heading" do
29
35
  formatter.visit_features(nil)
30
36
 
31
37
  io.string.should eql("Profiling enabled.\n")
32
38
  end
33
39
 
34
- it "should record the current time when starting a new step" do
40
+ xit "should record the current time when starting a new step" do
35
41
  now = Time.now
36
42
  Time.stub!(:now).and_return(now)
37
43
  formatter.step_executing('should foo', nil, nil)
@@ -47,7 +53,7 @@ module Cucumber
47
53
  Time.stub!(:now).and_return(now, now)
48
54
  end
49
55
 
50
- it "should group by regular expressions and actual keyword" do
56
+ xit "should group by regular expressions and actual keyword" do
51
57
  step_1 = mock_step(:actual_keyword => 'Given')
52
58
  step_2 = mock_step(:actual_keyword => 'Given')
53
59
 
@@ -60,7 +66,7 @@ module Cucumber
60
66
  step_times.has_key?('Given /ichiban/').should be_true
61
67
  end
62
68
 
63
- it "should use a previous step's keyword when recording row steps" do
69
+ xit "should use a previous step's keyword when recording row steps" do
64
70
  step = mock_step(:actual_keyword => 'Given')
65
71
  step_row = mock_step(:row? => true)
66
72
 
@@ -74,7 +80,7 @@ module Cucumber
74
80
 
75
81
  end
76
82
 
77
- it "should correctly record a passed step" do
83
+ xit "should correctly record a passed step" do
78
84
  formatter.step_executing(nil, nil, nil)
79
85
  formatter.step_passed(mock_step(:format => 'she doth teach the torches to burn bright', :actual_keyword => 'Given'), nil, nil)
80
86
  formatter.dump
@@ -82,7 +88,7 @@ module Cucumber
82
88
  io.string.should include('Given she doth teach the torches to burn bright')
83
89
  end
84
90
 
85
- it "should correctly record a passed step row" do
91
+ xit "should correctly record a passed step row" do
86
92
  formatter.step_executing(nil, nil, nil)
87
93
  formatter.step_passed(mock_step(:row? => true), /example/, ['fitty'])
88
94
  formatter.dump
@@ -90,7 +96,7 @@ module Cucumber
90
96
  io.string.should include('fitty')
91
97
  end
92
98
 
93
- it "should calculate the mean step execution time" do
99
+ xit "should calculate the mean step execution time" do
94
100
  now = Time.now
95
101
  Time.stub!(:now).and_return(now, now+5, now, now+1)
96
102
 
@@ -104,7 +110,7 @@ module Cucumber
104
110
  io.string.should include('3.0000000')
105
111
  end
106
112
 
107
- it "should display file and line comment for step invocation" do
113
+ xit "should display file and line comment for step invocation" do
108
114
  step = mock_step(:format => 'test', :actual_keyword => 'Given', :file => 'test.feature', :line => 5)
109
115
 
110
116
  formatter.step_executing(step, nil, nil)
@@ -114,7 +120,7 @@ module Cucumber
114
120
  @io.string.should include("# test.feature:5")
115
121
  end
116
122
 
117
- it "should display file and line comment for step definition" do
123
+ xit "should display file and line comment for step definition" do
118
124
  step = mock_step(:format => 'test', :actual_keyword => 'Given',
119
125
  :regexp_args_proc => [/test/, nil, mock_proc(:to_comment_line => '# steps/example_steps.rb:11')])
120
126
 
@@ -125,7 +131,7 @@ module Cucumber
125
131
  @io.string.should include("# steps/example_steps.rb:11")
126
132
  end
127
133
 
128
- it "should show the performance times of the step invocations for a step definition" do
134
+ xit "should show the performance times of the step invocations for a step definition" do
129
135
  now = Time.now
130
136
  Time.stub!(:now).and_return(now, now+5, now, now+1)
131
137
 
@@ -143,7 +149,7 @@ module Cucumber
143
149
  io.string.should include("1.0000000 Given step invocation")
144
150
  end
145
151
 
146
- it "should sort the step invocations in descending order" do
152
+ xit "should sort the step invocations in descending order" do
147
153
  now = Time.now
148
154
  Time.stub!(:now).and_return(now, now+1, now, now+5)
149
155
 
@@ -161,7 +167,7 @@ module Cucumber
161
167
  io_string_lines.at(-1).should include('1.0000000')
162
168
  end
163
169
 
164
- it "should print the top average 10 step results" do
170
+ xit "should print the top average 10 step results" do
165
171
  formatter.instance_variable_set("@step_time", Time.now)
166
172
 
167
173
  11.times do |test_number|
@@ -175,7 +181,7 @@ module Cucumber
175
181
  io.string.scan(/unique_test_\d+/).length.should == 10
176
182
  end
177
183
 
178
- it "should print the top 5 step invocations for step definition" do
184
+ xit "should print the top 5 step invocations for step definition" do
179
185
  formatter.instance_variable_set("@step_time", Time.now)
180
186
 
181
187
  10.times do |test_number|
@@ -0,0 +1,282 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/parser'
3
+
4
+ module Cucumber
5
+ module Parser
6
+ describe Feature do
7
+ before do
8
+ @parser = FeatureParser.new
9
+ end
10
+
11
+ def parse(text)
12
+ feature = @parser.parse_or_fail(text)
13
+ end
14
+
15
+ def parse_file(file)
16
+ @parser.parse_file(File.dirname(__FILE__) + "/../treetop_parser/" + file)
17
+ end
18
+
19
+ def parse_example_file(file)
20
+ @parser.parse_file(File.dirname(__FILE__) + "/../../../examples/" + file)
21
+ end
22
+
23
+ describe "Header" do
24
+ it "should parse Feature with blurb" do
25
+ parse(%{Feature: hi
26
+ with blurb
27
+ })
28
+ end
29
+ end
30
+
31
+ describe "Comments" do
32
+ it "should parse a file with only a one line comment" do
33
+ parse(%{# My comment
34
+ Feature: hi
35
+ }).to_sexp.should ==
36
+ [:feature, "Feature: hi\n",
37
+ [:comment, "# My comment\n"]]
38
+ end
39
+
40
+ it "should parse a comment within a scenario" do
41
+ pending "Store comment in node and output it in pretty formatter"
42
+ parse(%{Feature: Hi
43
+ Scenario: Hello
44
+ Given foo
45
+ # When bar
46
+ Then baz
47
+ }).to_sexp.should ==
48
+ [:feature, "Feature: Hi",
49
+ [:scenario, 2, "Scenario:", "Hello",
50
+ [:step, 3, "Given", "foo"],
51
+ [:comment, "# When bar\n"],
52
+ [:step, 5, "Then", "baz"]
53
+ ]
54
+ ]
55
+ end
56
+
57
+ it "should parse a file with only a multiline comment" do
58
+ parse(%{# Hello
59
+ # World
60
+ Feature: hi
61
+ }).to_sexp.should ==
62
+ [:feature, "Feature: hi\n",
63
+ [:comment, "# Hello\n# World\n"]]
64
+ end
65
+
66
+ it "should parse a file with no comments" do
67
+ parse("Feature: hi\n").to_sexp.should ==
68
+ [:feature, "Feature: hi\n"]
69
+ end
70
+
71
+ it "should parse a file with only a multiline comment with newlines" do
72
+ parse("# Hello\n\n# World\n").to_sexp.should ==
73
+ [:feature, "",
74
+ [:comment, "# Hello\n\n# World\n"]]
75
+ end
76
+ end
77
+
78
+ describe "Tags" do
79
+ it "should parse a file with tags on a feature" do
80
+ parse("# My comment\n@hello @world Feature: hi\n").to_sexp.should ==
81
+ [:feature, "Feature: hi\n",
82
+ [:comment, "# My comment\n"],
83
+ [:tag, "hello"],
84
+ [:tag, "world"]]
85
+ end
86
+
87
+ it "should parse a file with tags on a scenario" do
88
+ parse(%{# FC
89
+ @ft
90
+ Feature: hi
91
+
92
+ @st1 @st2
93
+ Scenario: First
94
+ Given Pepper
95
+
96
+ @st3
97
+ @st4 @ST5 @#^%&ST6**!
98
+ Scenario: Second}).to_sexp.should ==
99
+ [:feature, "Feature: hi",
100
+ [:comment, "# FC\n "],
101
+ [:tag, "ft"],
102
+ [:scenario, 6, 'Scenario:', 'First',
103
+ [:tag, "st1"], [:tag, "st2"],
104
+ [:step_invocation, 7, "Given", "Pepper"]
105
+ ],
106
+ [:scenario, 11, 'Scenario:', 'Second',
107
+ [:tag, "st3"], [:tag, "st4"], [:tag, "ST5"], [:tag, "#^%&ST6**!"]]]
108
+ end
109
+ end
110
+
111
+ describe "Background" do
112
+ it "should have steps" do
113
+ parse("Feature: Hi\nBackground:\nGiven I am a step\n").to_sexp.should ==
114
+ [:feature, "Feature: Hi",
115
+ [:background, 2, "Background:",
116
+ [:step, 3, "Given", "I am a step"]]]
117
+ end
118
+ end
119
+
120
+ describe "Scenarios" do
121
+ it "can be empty" do
122
+ parse("Feature: Hi\n\nScenario: Hello\n").to_sexp.should ==
123
+ [:feature, "Feature: Hi",
124
+ [:scenario, 3, "Scenario:", "Hello"]]
125
+ end
126
+
127
+ it "should allow whitespace lines after the Scenario line" do
128
+ parse(%{Feature: Foo
129
+
130
+ Scenario: bar
131
+
132
+ Given baz})
133
+ end
134
+
135
+ it "should have steps" do
136
+ parse("Feature: Hi\nScenario: Hello\nGiven I am a step\n").to_sexp.should ==
137
+ [:feature, "Feature: Hi",
138
+ [:scenario, 2, "Scenario:", "Hello",
139
+ [:step_invocation, 3, "Given", "I am a step"]]]
140
+ end
141
+
142
+ it "should have steps with inline table" do
143
+ parse(%{Feature: Hi
144
+ Scenario: Hello
145
+ Given I have a table
146
+ |a|b|
147
+ }).to_sexp.should ==
148
+ [:feature, "Feature: Hi",
149
+ [:scenario, 2, "Scenario:", "Hello",
150
+ [:step_invocation, 3, "Given", "I have a table",
151
+ [:table,
152
+ [:row,
153
+ [:cell, "a"],
154
+ [:cell, "b"]]]]]]
155
+ end
156
+
157
+ it "should have steps with inline py_string" do
158
+ parse(%{Feature: Hi
159
+ Scenario: Hello
160
+ Given I have a string
161
+
162
+
163
+ """
164
+ hello
165
+ world
166
+ """
167
+
168
+ }).to_sexp.should ==
169
+ [:feature, "Feature: Hi",
170
+ [:scenario, 2, "Scenario:", "Hello",
171
+ [:step_invocation, 3, "Given", "I have a string",
172
+ [:py_string, "hello\nworld"]]]]
173
+ end
174
+ end
175
+
176
+ describe "Scenario Outlines" do
177
+ it "can be empty" do
178
+ parse(%{Feature: Hi
179
+ Scenario Outline: Hello
180
+ Given a <what> cucumber
181
+ Examples:
182
+ |what|
183
+ |green|
184
+ }).to_sexp.should ==
185
+ [:feature, "Feature: Hi",
186
+ [:scenario_outline, "Scenario Outline:", "Hello",
187
+ [:step, 3, "Given", "a <what> cucumber"],
188
+ [:examples, "Examples:", "",
189
+ [:table,
190
+ [:row,
191
+ [:cell, "what"]],
192
+ [:row, [:cell, "green"]]]]]]
193
+ end
194
+
195
+ it "should have line numbered steps with inline table" do
196
+ parse(%{Feature: Hi
197
+ Scenario Outline: Hello
198
+
199
+ Given I have a table
200
+
201
+ |<a>|<b>|
202
+ Examples:
203
+ |a|b|
204
+ |c|d|
205
+ }).to_sexp.should ==
206
+ [:feature, "Feature: Hi",
207
+ [:scenario_outline, "Scenario Outline:", "Hello",
208
+ [:step, 4, "Given", "I have a table",
209
+ [:table,
210
+ [:row,
211
+ [:cell, "<a>"],
212
+ [:cell, "<b>"]]]],
213
+ [:examples, "Examples:", "",
214
+ [:table,
215
+ [:row,
216
+ [:cell, "a"],
217
+ [:cell, "b"]],
218
+ [:row,
219
+ [:cell, "c"],
220
+ [:cell, "d"]]]]]]
221
+ end
222
+
223
+ it "should have examples" do
224
+ parse("Feature: Hi
225
+
226
+ Scenario Outline: Hello
227
+
228
+ Given I have a table
229
+ |1|2|
230
+
231
+ Examples:
232
+ |x|y|
233
+ |5|6|
234
+
235
+ ").to_sexp.should ==
236
+ [:feature, "Feature: Hi",
237
+ [:scenario_outline, "Scenario Outline:", "Hello",
238
+ [:step, 5, "Given", "I have a table",
239
+ [:table,
240
+ [:row,
241
+ [:cell, "1"],
242
+ [:cell, "2"]]]],
243
+ [:examples, "Examples:", "",
244
+ [:table,
245
+ [:row,
246
+ [:cell, "x"],
247
+ [:cell, "y"]],
248
+ [:row,
249
+ [:cell, "5"],
250
+ [:cell, "6"]]]]]]
251
+ end
252
+
253
+ it "should set line numbers on feature" do
254
+ feature = parse_file("empty_feature.feature:11:12")
255
+ feature.instance_variable_get('@lines').should == [11, 12]
256
+ end
257
+ end
258
+
259
+ describe "Syntax" do
260
+ it "should parse empty_feature" do
261
+ parse_file("empty_feature.feature")
262
+ end
263
+
264
+ it "should parse empty_scenario" do
265
+ parse_file("empty_scenario.feature")
266
+ end
267
+
268
+ it "should parse empty_scenario_outline" do
269
+ parse_file("empty_scenario_outline.feature")
270
+ end
271
+
272
+ it "should parse fit_scenario" do
273
+ parse_file("multiline_steps.feature")
274
+ end
275
+
276
+ it "should parse scenario_outline" do
277
+ parse_file("scenario_outline.feature")
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'treetop'
3
+ require 'cucumber/parser'
4
+
5
+ module Cucumber
6
+ module Parser
7
+ describe 'Tables' do
8
+ before do
9
+ @parser = FeatureParser.new
10
+ end
11
+
12
+ def parse(text)
13
+ @parser.__send__(:prepare_to_parse, text)
14
+ @parser.root = :table
15
+ table = @parser._nt_table
16
+ table.raw
17
+ end
18
+
19
+ it "should parse a 1x2 table with newline" do
20
+ parse(" | 1 | 2 | \n").should == [%w{1 2}]
21
+ end
22
+
23
+ it "should parse a 1x2 table without newline" do
24
+ parse("| 1 | 2 |").should == [%w{1 2}]
25
+ end
26
+
27
+ it "should parse a 1x2 table without spaces" do
28
+ parse("|1|2|").should == [%w{1 2}]
29
+ end
30
+
31
+ it "should parse a 2x2 table" do
32
+ parse("| 1 | 2 |\n| 3 | 4 |\n").should == [%w{1 2}, %w{3 4}]
33
+ end
34
+
35
+ it "should parse a 2x2 table with several newlines" do
36
+ parse("| 1 | 2 |\n| 3 | 4 |\n\n\n").should == [%w{1 2}, %w{3 4}]
37
+ end
38
+
39
+ it "should parse a 2x2 table with empty cells" do
40
+ parse("| 1 | |\n|| 4 |\n").should == [['1', nil], [nil, '4']]
41
+ end
42
+
43
+ it "should not parse a 2x2 table that isn't closed" do
44
+ parse("| 1 | |\n|| 4 ").should_not == [['1', nil], [nil, '4']]
45
+ end
46
+ end
47
+ end
48
+ end
@@ -5,13 +5,14 @@ module ActiveRecord
5
5
  end
6
6
 
7
7
  module ActionController
8
+ class Dispatcher
9
+ end
10
+
8
11
  class Base
9
12
  end
13
+
10
14
  class IntegrationTest
11
15
  def self.use_transactional_fixtures=(x)
12
16
  end
13
17
  end
14
18
  end
15
-
16
- module Dispatcher
17
- end
@@ -0,0 +1,81 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require 'cucumber/ast'
4
+ require 'cucumber/step_mother'
5
+ require 'cucumber/step_definition'
6
+
7
+ module Cucumber
8
+ describe StepDefinition do
9
+ before do
10
+ extend StepMother
11
+ @world = new_world!
12
+ $inside = nil
13
+ end
14
+
15
+ it "should allow calling of other steps" do
16
+ Given /Outside/ do
17
+ Given "Inside"
18
+ end
19
+ Given /Inside/ do
20
+ $inside = true
21
+ end
22
+
23
+ step_match("Outside").invoke(@world, nil)
24
+ $inside.should == true
25
+ end
26
+
27
+ it "should allow calling of other steps with inline arg" do
28
+ Given /Outside/ do
29
+ Given "Inside", Ast::Table.new([['inside']])
30
+ end
31
+ Given /Inside/ do |table|
32
+ $inside = table.raw[0][0]
33
+ end
34
+
35
+ step_match("Outside").invoke(@world, nil)
36
+ $inside.should == 'inside'
37
+ end
38
+
39
+ it "should raise Undefined when inside step is not defined" do
40
+ Given /Outside/ do
41
+ Given 'Inside'
42
+ end
43
+
44
+ step = mock('Step')
45
+ step.should_receive(:exception=)
46
+ lambda do
47
+ @world.__cucumber_current_step = step
48
+ step_match('Outside').invoke(@world, nil)
49
+ end.should raise_error(Undefined, 'Undefined step: "Inside"')
50
+ end
51
+
52
+ it "should allow forced pending" do
53
+ Given /Outside/ do
54
+ pending("Do me!")
55
+ end
56
+
57
+ lambda do
58
+ step_match("Outside").invoke(@world, nil)
59
+ end.should raise_error(Pending, "Do me!")
60
+ end
61
+
62
+ it "should have a #to_s suitable for automcompletion" do
63
+ stepdef = Given /Hello (.*)/ do
64
+ end
65
+
66
+ stepdef.to_s.should == '/Hello (.*)/ # spec/cucumber/step_definition_spec.rb:63'
67
+ stepdef.to_s(2).should == '/Hello (.*)/ # spec/cucumber/step_definition_spec.rb:63'
68
+ end
69
+
70
+ it "should allow announce" do
71
+ v = mock('visitor')
72
+ v.should_receive(:announce).with('wasup')
73
+ self.visitor = v
74
+ world = new_world!
75
+ Given /Loud/ do
76
+ announce 'wasup'
77
+ end
78
+ step_match("Loud").invoke(world, nil)
79
+ end
80
+ end
81
+ end