stefl-cucumber 0.10.1

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 (538) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/History.txt +1613 -0
  6. data/LICENSE +22 -0
  7. data/README.rdoc +26 -0
  8. data/Rakefile +12 -0
  9. data/bin/cucumber +22 -0
  10. data/cucumber.gemspec +50 -0
  11. data/cucumber.yml +20 -0
  12. data/examples/i18n/README.textile +18 -0
  13. data/examples/i18n/Rakefile +33 -0
  14. data/examples/i18n/ar/Rakefile +6 -0
  15. data/examples/i18n/ar/features/addition.feature +17 -0
  16. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  17. data/examples/i18n/ar/lib/calculator.rb +11 -0
  18. data/examples/i18n/bg/Rakefile +6 -0
  19. data/examples/i18n/bg/features/addition.feature +12 -0
  20. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  21. data/examples/i18n/bg/features/division.feature +17 -0
  22. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/bg/features/support/env.rb +5 -0
  24. data/examples/i18n/bg/features/support/world.rb +8 -0
  25. data/examples/i18n/bg/lib/calculator.rb +24 -0
  26. data/examples/i18n/ca/Rakefile +6 -0
  27. data/examples/i18n/ca/features/step_definitons/calculator_steps.rb +21 -0
  28. data/examples/i18n/ca/features/suma.feature +17 -0
  29. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  30. data/examples/i18n/da/Rakefile +6 -0
  31. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  32. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  33. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  34. data/examples/i18n/de/.gitignore +1 -0
  35. data/examples/i18n/de/Rakefile +6 -0
  36. data/examples/i18n/de/features/addition.feature +17 -0
  37. data/examples/i18n/de/features/division.feature +10 -0
  38. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  39. data/examples/i18n/de/lib/calculator.rb +14 -0
  40. data/examples/i18n/en-lol/Rakefile +4 -0
  41. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  42. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  43. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  44. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  45. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  46. data/examples/i18n/en/.gitignore +1 -0
  47. data/examples/i18n/en/Rakefile +6 -0
  48. data/examples/i18n/en/features/addition.feature +17 -0
  49. data/examples/i18n/en/features/division.feature +10 -0
  50. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  51. data/examples/i18n/en/lib/calculator.rb +14 -0
  52. data/examples/i18n/eo/.gitignore +1 -0
  53. data/examples/i18n/eo/Rakefile +6 -0
  54. data/examples/i18n/eo/features/adicio.feature +17 -0
  55. data/examples/i18n/eo/features/divido.feature +10 -0
  56. data/examples/i18n/eo/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/eo/lib/calculator.rb +14 -0
  58. data/examples/i18n/es/Rakefile +6 -0
  59. data/examples/i18n/es/features/adicion.feature +17 -0
  60. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  61. data/examples/i18n/es/lib/calculador.rb +14 -0
  62. data/examples/i18n/et/Rakefile +6 -0
  63. data/examples/i18n/et/features/jagamine.feature +10 -0
  64. data/examples/i18n/et/features/liitmine.feature +17 -0
  65. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  66. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  67. data/examples/i18n/fi/.gitignore +1 -0
  68. data/examples/i18n/fi/Rakefile +6 -0
  69. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  70. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  71. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  72. data/examples/i18n/fi/lib/laskin.rb +14 -0
  73. data/examples/i18n/fr/Rakefile +6 -0
  74. data/examples/i18n/fr/features/addition.feature +18 -0
  75. data/examples/i18n/fr/features/addition2.feature +17 -0
  76. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  77. data/examples/i18n/fr/features/support/env.rb +5 -0
  78. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  79. data/examples/i18n/he/Rakefile +6 -0
  80. data/examples/i18n/he/features/addition.feature +17 -0
  81. data/examples/i18n/he/features/division.feature +10 -0
  82. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  83. data/examples/i18n/he/lib/calculator.rb +15 -0
  84. data/examples/i18n/hu/.gitignore +1 -0
  85. data/examples/i18n/hu/Rakefile +6 -0
  86. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  87. data/examples/i18n/hu/features/osztas.feature +10 -0
  88. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  89. data/examples/i18n/hu/lib/calculator.rb +14 -0
  90. data/examples/i18n/id/.gitignore +1 -0
  91. data/examples/i18n/id/Rakefile +6 -0
  92. data/examples/i18n/id/features/addition.feature +17 -0
  93. data/examples/i18n/id/features/division.feature +10 -0
  94. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  95. data/examples/i18n/id/lib/calculator.rb +14 -0
  96. data/examples/i18n/it/Rakefile +6 -0
  97. data/examples/i18n/it/features/somma.feature +11 -0
  98. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  99. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  100. data/examples/i18n/ja/.gitignore +1 -0
  101. data/examples/i18n/ja/Rakefile +6 -0
  102. data/examples/i18n/ja/features/addition.feature +17 -0
  103. data/examples/i18n/ja/features/division.feature +10 -0
  104. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +19 -0
  105. data/examples/i18n/ja/features/support/env.rb +5 -0
  106. data/examples/i18n/ja/lib/calculator.rb +14 -0
  107. data/examples/i18n/ko/.gitignore +1 -0
  108. data/examples/i18n/ko/Rakefile +6 -0
  109. data/examples/i18n/ko/features/addition.feature +17 -0
  110. data/examples/i18n/ko/features/division.feature +11 -0
  111. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/ko/lib/calculator.rb +14 -0
  113. data/examples/i18n/lt/.gitignore +1 -0
  114. data/examples/i18n/lt/Rakefile +6 -0
  115. data/examples/i18n/lt/features/addition.feature +17 -0
  116. data/examples/i18n/lt/features/division.feature +10 -0
  117. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  118. data/examples/i18n/lt/lib/calculator.rb +14 -0
  119. data/examples/i18n/lv/Rakefile +6 -0
  120. data/examples/i18n/lv/features/addition.feature +17 -0
  121. data/examples/i18n/lv/features/division.feature +10 -0
  122. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  123. data/examples/i18n/lv/lib/calculator.rb +14 -0
  124. data/examples/i18n/no/Rakefile +6 -0
  125. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  126. data/examples/i18n/no/features/summering.feature +19 -0
  127. data/examples/i18n/no/features/support/env.rb +6 -0
  128. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  129. data/examples/i18n/pl/.gitignore +1 -0
  130. data/examples/i18n/pl/Rakefile +6 -0
  131. data/examples/i18n/pl/features/addition.feature +17 -0
  132. data/examples/i18n/pl/features/division.feature +10 -0
  133. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  134. data/examples/i18n/pl/features/support/env.rb +5 -0
  135. data/examples/i18n/pl/lib/calculator.rb +14 -0
  136. data/examples/i18n/pt/Rakefile +6 -0
  137. data/examples/i18n/pt/features/adicao.feature +11 -0
  138. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  139. data/examples/i18n/pt/features/support/env.rb +5 -0
  140. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  141. data/examples/i18n/ro/Rakefile +6 -0
  142. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  143. data/examples/i18n/ro/features/suma.feature +11 -0
  144. data/examples/i18n/ro/lib/calculator.rb +11 -0
  145. data/examples/i18n/ru/Rakefile +6 -0
  146. data/examples/i18n/ru/features/addition.feature +11 -0
  147. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  148. data/examples/i18n/ru/features/division.feature +16 -0
  149. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  150. data/examples/i18n/ru/features/support/env.rb +5 -0
  151. data/examples/i18n/ru/features/support/world.rb +8 -0
  152. data/examples/i18n/ru/lib/calculator.rb +24 -0
  153. data/examples/i18n/sk/.gitignore +1 -0
  154. data/examples/i18n/sk/Rakefile +6 -0
  155. data/examples/i18n/sk/features/addition.feature +17 -0
  156. data/examples/i18n/sk/features/division.feature +10 -0
  157. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/sk/lib/calculator.rb +14 -0
  159. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  160. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  161. data/examples/i18n/sr-Cyrl/features/step_definitons/calculator_steps.rb +20 -0
  162. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  163. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  164. data/examples/i18n/sr-Latn/Rakefile +6 -0
  165. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  166. data/examples/i18n/sr-Latn/features/step_definitons/calculator_steps.rb +24 -0
  167. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  168. data/examples/i18n/sv/Rakefile +6 -0
  169. data/examples/i18n/sv/features/step_definitons/kalkulator_steps.rb +24 -0
  170. data/examples/i18n/sv/features/summering.feature +18 -0
  171. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  172. data/examples/i18n/tr/.gitignore +1 -0
  173. data/examples/i18n/tr/Rakefile +6 -0
  174. data/examples/i18n/tr/features/bolme.feature +10 -0
  175. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  176. data/examples/i18n/tr/features/toplama.feature +18 -0
  177. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  178. data/examples/i18n/uk/Rakefile +6 -0
  179. data/examples/i18n/uk/features/addition.feature +11 -0
  180. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  181. data/examples/i18n/uk/features/division.feature +16 -0
  182. data/examples/i18n/uk/features/step_definitons/calculator_steps.rb +19 -0
  183. data/examples/i18n/uk/features/support/env.rb +5 -0
  184. data/examples/i18n/uk/features/support/world.rb +8 -0
  185. data/examples/i18n/uk/lib/calculator.rb +24 -0
  186. data/examples/i18n/uz/Rakefile +6 -0
  187. data/examples/i18n/uz/features/addition.feature +10 -0
  188. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  189. data/examples/i18n/uz/features/division.feature +17 -0
  190. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  191. data/examples/i18n/uz/features/support/env.rb +5 -0
  192. data/examples/i18n/uz/features/support/world.rb +8 -0
  193. data/examples/i18n/uz/lib/calculator.rb +24 -0
  194. data/examples/i18n/zh-CN/Rakefile +4 -0
  195. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  196. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  197. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  198. data/examples/i18n/zh-TW/.gitignore +1 -0
  199. data/examples/i18n/zh-TW/Rakefile +4 -0
  200. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  201. data/examples/i18n/zh-TW/features/division.feature +11 -0
  202. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  203. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  204. data/examples/python/README.textile +7 -0
  205. data/examples/python/Rakefile +4 -0
  206. data/examples/python/features/fibonacci.feature +19 -0
  207. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  208. data/examples/python/lib/.gitignore +1 -0
  209. data/examples/python/lib/fib.py +7 -0
  210. data/examples/ramaze/README.textile +7 -0
  211. data/examples/ramaze/Rakefile +6 -0
  212. data/examples/ramaze/app.rb +21 -0
  213. data/examples/ramaze/features/add.feature +11 -0
  214. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  215. data/examples/ramaze/features/support/env.rb +32 -0
  216. data/examples/ramaze/layout/default.html.erb +8 -0
  217. data/examples/ramaze/view/index.html.erb +5 -0
  218. data/examples/rspec_doubles/Rakefile +4 -0
  219. data/examples/rspec_doubles/features/mocking.feature +9 -0
  220. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  221. data/examples/rspec_doubles/features/support/env.rb +12 -0
  222. data/examples/ruby2python/README.textile +7 -0
  223. data/examples/ruby2python/Rakefile +4 -0
  224. data/examples/ruby2python/features/fibonacci.feature +19 -0
  225. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  226. data/examples/ruby2python/features/support/env.rb +21 -0
  227. data/examples/ruby2python/lib/.gitignore +1 -0
  228. data/examples/ruby2python/lib/fib.py +7 -0
  229. data/examples/sinatra/README.textile +13 -0
  230. data/examples/sinatra/Rakefile +6 -0
  231. data/examples/sinatra/app.rb +14 -0
  232. data/examples/sinatra/features/add.feature +11 -0
  233. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  234. data/examples/sinatra/features/support/env.rb +10 -0
  235. data/examples/sinatra/views/add.erb +7 -0
  236. data/examples/sinatra/views/layout.erb +8 -0
  237. data/examples/tcl/README.textile +11 -0
  238. data/examples/tcl/Rakefile +6 -0
  239. data/examples/tcl/features/fibonnacci.feature +17 -0
  240. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  241. data/examples/tcl/features/support/env.rb +6 -0
  242. data/examples/tcl/src/fib.tcl +3 -0
  243. data/examples/test_unit/Rakefile +6 -0
  244. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  245. data/examples/test_unit/features/test_unit.feature +9 -0
  246. data/examples/v8/Rakefile +6 -0
  247. data/examples/v8/features/fibonacci.feature +43 -0
  248. data/examples/v8/features/step_definitions/fib_steps.js +49 -0
  249. data/examples/v8/features/support/env.js +14 -0
  250. data/examples/v8/lib/fibonacci.js +19 -0
  251. data/examples/watir/.gitignore +2 -0
  252. data/examples/watir/README.textile +16 -0
  253. data/examples/watir/Rakefile +12 -0
  254. data/examples/watir/cucumber.yml +1 -0
  255. data/examples/watir/features/search.feature +12 -0
  256. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  257. data/examples/watir/features/support/env.rb +32 -0
  258. data/examples/watir/features/support/screenshots.rb +47 -0
  259. data/features/background.feature +498 -0
  260. data/features/custom_formatter.feature +41 -0
  261. data/features/execute_with_tag_filter.feature +63 -0
  262. data/features/hooks.feature +59 -0
  263. data/features/json_formatter.feature +249 -0
  264. data/features/stats_formatters.feature +70 -0
  265. data/features/step_definitions/cucumber_steps.rb +8 -0
  266. data/features/support/env.rb +31 -0
  267. data/features/tagged_hooks.feature +217 -0
  268. data/fixtures/json/features/background.feature +7 -0
  269. data/fixtures/json/features/embed.feature +4 -0
  270. data/fixtures/json/features/one_passing_one_failing.feature +11 -0
  271. data/fixtures/json/features/step_definitions/steps.rb +32 -0
  272. data/fixtures/json/features/tables.feature +13 -0
  273. data/fixtures/junit/features/one_passing_one_failing.feature +8 -0
  274. data/fixtures/junit/features/pending.feature +5 -0
  275. data/fixtures/junit/features/step_definitions/steps.rb +11 -0
  276. data/fixtures/self_test/.gitignore +1 -0
  277. data/fixtures/self_test/README.textile +6 -0
  278. data/fixtures/self_test/Rakefile +6 -0
  279. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  280. data/fixtures/self_test/features/failing_expectation.feature +4 -0
  281. data/fixtures/self_test/features/lots_of_undefined.feature +8 -0
  282. data/fixtures/self_test/features/multiline_name.feature +27 -0
  283. data/fixtures/self_test/features/outline_sample.feature +15 -0
  284. data/fixtures/self_test/features/sample.feature +21 -0
  285. data/fixtures/self_test/features/search_sample.feature +32 -0
  286. data/fixtures/self_test/features/step_definitions/sample_steps.rb +84 -0
  287. data/fixtures/self_test/features/support/env.rb +18 -0
  288. data/fixtures/self_test/features/tags_sample.feature +17 -0
  289. data/fixtures/self_test/features/tons_of_cukes.feature +52 -0
  290. data/fixtures/self_test/features/undefined_multiline_args.feature +12 -0
  291. data/fixtures/self_test/list-of-features.txt +1 -0
  292. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  293. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  294. data/fixtures/tickets/Rakefile +20 -0
  295. data/fixtures/tickets/features.html +138 -0
  296. data/fixtures/tickets/features/172.feature +28 -0
  297. data/fixtures/tickets/features/177/1.feature +28 -0
  298. data/fixtures/tickets/features/177/2.feature +20 -0
  299. data/fixtures/tickets/features/177/3.feature +18 -0
  300. data/fixtures/tickets/features/180.feature +7 -0
  301. data/fixtures/tickets/features/229/tagged_hooks.feature +8 -0
  302. data/fixtures/tickets/features/229/tagged_hooks.rb +14 -0
  303. data/fixtures/tickets/features/236.feature +13 -0
  304. data/fixtures/tickets/features/241.feature +12 -0
  305. data/fixtures/tickets/features/246.feature +4 -0
  306. data/fixtures/tickets/features/248.feature +11 -0
  307. data/fixtures/tickets/features/270/back.feature +14 -0
  308. data/fixtures/tickets/features/270/back.steps.rb +14 -0
  309. data/fixtures/tickets/features/272/hooks.feature +26 -0
  310. data/fixtures/tickets/features/272/hooks_steps.rb +53 -0
  311. data/fixtures/tickets/features/279/py_string_indent.feature +25 -0
  312. data/fixtures/tickets/features/279/py_string_indent.steps.rb +12 -0
  313. data/fixtures/tickets/features/279/wrong.feature_ +11 -0
  314. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  315. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  316. data/fixtures/tickets/features/306/only_background.feature +4 -0
  317. data/fixtures/tickets/features/around_timeout.feature +6 -0
  318. data/fixtures/tickets/features/gherkin_67.feature +12 -0
  319. data/fixtures/tickets/features/gherkin_68.feature +4 -0
  320. data/fixtures/tickets/features/half_manual.feature +11 -0
  321. data/fixtures/tickets/features/lib/eatting_machine.rb +18 -0
  322. data/fixtures/tickets/features/lib/pantry.rb +20 -0
  323. data/fixtures/tickets/features/scenario_outline.feature +95 -0
  324. data/fixtures/tickets/features/step_definitons/246_steps.rb +3 -0
  325. data/fixtures/tickets/features/step_definitons/248_steps.rb +15 -0
  326. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +9 -0
  327. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +11 -0
  328. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  329. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +88 -0
  330. data/fixtures/tickets/features/table_diffing.feature +13 -0
  331. data/fixtures/tickets/features/tickets.feature +28 -0
  332. data/gem_tasks/contributors.rake +15 -0
  333. data/gem_tasks/cucumber.rake +19 -0
  334. data/gem_tasks/environment.rake +7 -0
  335. data/gem_tasks/examples.rake +11 -0
  336. data/gem_tasks/fix_cr_lf.rake +10 -0
  337. data/gem_tasks/flog.rake +4 -0
  338. data/gem_tasks/rspec.rake +8 -0
  339. data/gem_tasks/sass.rake +4 -0
  340. data/gem_tasks/sdoc.rake +12 -0
  341. data/legacy_features/announce.feature +164 -0
  342. data/legacy_features/api/list_step_defs_as_json.feature +50 -0
  343. data/legacy_features/api/run_cli_main_with_existing_runtime.feature +34 -0
  344. data/legacy_features/around_hooks.feature +232 -0
  345. data/legacy_features/bug_371.feature +32 -0
  346. data/legacy_features/bug_464.feature +16 -0
  347. data/legacy_features/bug_475.feature +42 -0
  348. data/legacy_features/bug_585_tab_indentation.feature +22 -0
  349. data/legacy_features/bug_600.feature +67 -0
  350. data/legacy_features/call_steps_from_stepdefs.feature +154 -0
  351. data/legacy_features/cucumber_cli.feature +591 -0
  352. data/legacy_features/cucumber_cli_outlines.feature +117 -0
  353. data/legacy_features/default_snippets.feature +42 -0
  354. data/legacy_features/diffing.feature +25 -0
  355. data/legacy_features/drb_server_integration.feature +174 -0
  356. data/legacy_features/exception_in_after_block.feature +127 -0
  357. data/legacy_features/exception_in_after_step_block.feature +104 -0
  358. data/legacy_features/exception_in_before_block.feature +98 -0
  359. data/legacy_features/exclude_files.feature +20 -0
  360. data/legacy_features/expand.feature +60 -0
  361. data/legacy_features/html_formatter.feature +8 -0
  362. data/legacy_features/html_formatter/a.html +550 -0
  363. data/legacy_features/junit_formatter.feature +92 -0
  364. data/legacy_features/language_from_header.feature +30 -0
  365. data/legacy_features/language_help.feature +78 -0
  366. data/legacy_features/listener_debugger_formatter.feature +42 -0
  367. data/legacy_features/multiline_names.feature +44 -0
  368. data/legacy_features/post_configuration_hook.feature +50 -0
  369. data/legacy_features/profiles.feature +126 -0
  370. data/legacy_features/rake_task.feature +152 -0
  371. data/legacy_features/report_called_undefined_steps.feature +34 -0
  372. data/legacy_features/rerun_formatter.feature +45 -0
  373. data/legacy_features/simplest.feature +11 -0
  374. data/legacy_features/snippet.feature +23 -0
  375. data/legacy_features/snippets_when_using_star_keyword.feature +36 -0
  376. data/legacy_features/step_definitions/cucumber_steps.rb +168 -0
  377. data/legacy_features/step_definitions/extra_steps.rb +2 -0
  378. data/legacy_features/step_definitions/simplest_steps.rb +3 -0
  379. data/legacy_features/step_definitions/wire_steps.rb +34 -0
  380. data/legacy_features/support/env.rb +157 -0
  381. data/legacy_features/support/env.rb.simplest +7 -0
  382. data/legacy_features/support/fake_wire_server.rb +77 -0
  383. data/legacy_features/table_diffing.feature +45 -0
  384. data/legacy_features/table_mapping.feature +34 -0
  385. data/legacy_features/transform.feature +245 -0
  386. data/legacy_features/unicode_table.feature +35 -0
  387. data/legacy_features/wire_protocol.feature +332 -0
  388. data/legacy_features/wire_protocol_table_diffing.feature +119 -0
  389. data/legacy_features/wire_protocol_tags.feature +87 -0
  390. data/legacy_features/wire_protocol_timeouts.feature +63 -0
  391. data/legacy_features/work_in_progress.feature +156 -0
  392. data/lib/README.rdoc +12 -0
  393. data/lib/autotest/cucumber.rb +6 -0
  394. data/lib/autotest/cucumber_mixin.rb +135 -0
  395. data/lib/autotest/cucumber_rails.rb +6 -0
  396. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  397. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  398. data/lib/autotest/cucumber_rspec.rb +6 -0
  399. data/lib/autotest/cucumber_rspec2.rb +6 -0
  400. data/lib/autotest/discover.rb +9 -0
  401. data/lib/cucumber.rb +27 -0
  402. data/lib/cucumber/ast.rb +30 -0
  403. data/lib/cucumber/ast/background.rb +99 -0
  404. data/lib/cucumber/ast/comment.rb +31 -0
  405. data/lib/cucumber/ast/examples.rb +43 -0
  406. data/lib/cucumber/ast/feature.rb +103 -0
  407. data/lib/cucumber/ast/feature_element.rb +78 -0
  408. data/lib/cucumber/ast/features.rb +35 -0
  409. data/lib/cucumber/ast/outline_table.rb +187 -0
  410. data/lib/cucumber/ast/py_string.rb +80 -0
  411. data/lib/cucumber/ast/scenario.rb +117 -0
  412. data/lib/cucumber/ast/scenario_outline.rb +122 -0
  413. data/lib/cucumber/ast/step.rb +126 -0
  414. data/lib/cucumber/ast/step_collection.rb +76 -0
  415. data/lib/cucumber/ast/step_invocation.rb +199 -0
  416. data/lib/cucumber/ast/table.rb +689 -0
  417. data/lib/cucumber/ast/tags.rb +28 -0
  418. data/lib/cucumber/ast/tree_walker.rb +184 -0
  419. data/lib/cucumber/ast/visitor.rb +11 -0
  420. data/lib/cucumber/broadcaster.rb +13 -0
  421. data/lib/cucumber/cli/configuration.rb +209 -0
  422. data/lib/cucumber/cli/drb_client.rb +43 -0
  423. data/lib/cucumber/cli/main.rb +78 -0
  424. data/lib/cucumber/cli/options.rb +406 -0
  425. data/lib/cucumber/cli/profile_loader.rb +91 -0
  426. data/lib/cucumber/configuration.rb +49 -0
  427. data/lib/cucumber/constantize.rb +34 -0
  428. data/lib/cucumber/core_ext/disable_mini_unit_autorun.rb +14 -0
  429. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  430. data/lib/cucumber/core_ext/proc.rb +34 -0
  431. data/lib/cucumber/core_ext/string.rb +9 -0
  432. data/lib/cucumber/errors.rb +40 -0
  433. data/lib/cucumber/feature_file.rb +62 -0
  434. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  435. data/lib/cucumber/formatter/console.rb +177 -0
  436. data/lib/cucumber/formatter/cucumber.css +275 -0
  437. data/lib/cucumber/formatter/cucumber.sass +271 -0
  438. data/lib/cucumber/formatter/debug.rb +33 -0
  439. data/lib/cucumber/formatter/duration.rb +13 -0
  440. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +84 -0
  441. data/lib/cucumber/formatter/gpretty.rb +24 -0
  442. data/lib/cucumber/formatter/html.rb +644 -0
  443. data/lib/cucumber/formatter/io.rb +31 -0
  444. data/lib/cucumber/formatter/jquery-min.js +154 -0
  445. data/lib/cucumber/formatter/json.rb +29 -0
  446. data/lib/cucumber/formatter/json_pretty.rb +13 -0
  447. data/lib/cucumber/formatter/junit.rb +150 -0
  448. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  449. data/lib/cucumber/formatter/pdf.rb +244 -0
  450. data/lib/cucumber/formatter/pretty.rb +237 -0
  451. data/lib/cucumber/formatter/progress.rb +92 -0
  452. data/lib/cucumber/formatter/rerun.rb +55 -0
  453. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  454. data/lib/cucumber/formatter/steps.rb +49 -0
  455. data/lib/cucumber/formatter/summary.rb +35 -0
  456. data/lib/cucumber/formatter/unicode.rb +79 -0
  457. data/lib/cucumber/formatter/usage.rb +127 -0
  458. data/lib/cucumber/js_support/js_dsl.js +57 -0
  459. data/lib/cucumber/js_support/js_language.rb +185 -0
  460. data/lib/cucumber/js_support/js_snippets.rb +27 -0
  461. data/lib/cucumber/language_support.rb +30 -0
  462. data/lib/cucumber/language_support/language_methods.rb +129 -0
  463. data/lib/cucumber/parser.rb +2 -0
  464. data/lib/cucumber/parser/gherkin_builder.rb +130 -0
  465. data/lib/cucumber/platform.rb +29 -0
  466. data/lib/cucumber/py_support/py_dsl.py +10 -0
  467. data/lib/cucumber/py_support/py_language.py +10 -0
  468. data/lib/cucumber/py_support/py_language.rb +84 -0
  469. data/lib/cucumber/rake/task.rb +170 -0
  470. data/lib/cucumber/rb_support/rb_dsl.rb +112 -0
  471. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  472. data/lib/cucumber/rb_support/rb_language.rb +195 -0
  473. data/lib/cucumber/rb_support/rb_step_definition.rb +82 -0
  474. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  475. data/lib/cucumber/rb_support/rb_world.rb +95 -0
  476. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  477. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  478. data/lib/cucumber/rspec/doubles.rb +16 -0
  479. data/lib/cucumber/runtime.rb +145 -0
  480. data/lib/cucumber/runtime/features_loader.rb +62 -0
  481. data/lib/cucumber/runtime/for_programming_languages.rb +65 -0
  482. data/lib/cucumber/runtime/results.rb +64 -0
  483. data/lib/cucumber/runtime/support_code.rb +203 -0
  484. data/lib/cucumber/runtime/user_interface.rb +80 -0
  485. data/lib/cucumber/step_argument.rb +9 -0
  486. data/lib/cucumber/step_definition_light.rb +20 -0
  487. data/lib/cucumber/step_definitions.rb +14 -0
  488. data/lib/cucumber/step_match.rb +115 -0
  489. data/lib/cucumber/step_mother.rb +10 -0
  490. data/lib/cucumber/wire_support/configuration.rb +30 -0
  491. data/lib/cucumber/wire_support/connection.rb +55 -0
  492. data/lib/cucumber/wire_support/request_handler.rb +32 -0
  493. data/lib/cucumber/wire_support/wire_exception.rb +32 -0
  494. data/lib/cucumber/wire_support/wire_language.rb +54 -0
  495. data/lib/cucumber/wire_support/wire_packet.rb +32 -0
  496. data/lib/cucumber/wire_support/wire_protocol.rb +44 -0
  497. data/lib/cucumber/wire_support/wire_protocol/requests.rb +123 -0
  498. data/lib/cucumber/wire_support/wire_step_definition.rb +26 -0
  499. data/spec/cucumber/ast/background_spec.rb +110 -0
  500. data/spec/cucumber/ast/feature_factory.rb +60 -0
  501. data/spec/cucumber/ast/feature_spec.rb +63 -0
  502. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  503. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  504. data/spec/cucumber/ast/scenario_outline_spec.rb +68 -0
  505. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  506. data/spec/cucumber/ast/step_spec.rb +66 -0
  507. data/spec/cucumber/ast/table_spec.rb +474 -0
  508. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  509. data/spec/cucumber/broadcaster_spec.rb +15 -0
  510. data/spec/cucumber/cli/configuration_spec.rb +431 -0
  511. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  512. data/spec/cucumber/cli/main_spec.rb +137 -0
  513. data/spec/cucumber/cli/options_spec.rb +351 -0
  514. data/spec/cucumber/cli/profile_loader_spec.rb +35 -0
  515. data/spec/cucumber/configuration_spec.rb +23 -0
  516. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  517. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  518. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  519. data/spec/cucumber/formatter/html_spec.rb +258 -0
  520. data/spec/cucumber/formatter/junit_spec.rb +111 -0
  521. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  522. data/spec/cucumber/formatter/spec_helper.rb +51 -0
  523. data/spec/cucumber/rb_support/rb_language_spec.rb +283 -0
  524. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +99 -0
  525. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  526. data/spec/cucumber/runtime/support_code_spec.rb +112 -0
  527. data/spec/cucumber/runtime_spec.rb +41 -0
  528. data/spec/cucumber/sell_cucumbers.feature +19 -0
  529. data/spec/cucumber/step_match_spec.rb +69 -0
  530. data/spec/cucumber/wire_support/configuration_spec.rb +51 -0
  531. data/spec/cucumber/wire_support/connection_spec.rb +46 -0
  532. data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
  533. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  534. data/spec/cucumber/wire_support/wire_packet_spec.rb +40 -0
  535. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
  536. data/spec/cucumber/world/pending_spec.rb +46 -0
  537. data/spec/spec_helper.rb +10 -0
  538. metadata +884 -0
@@ -0,0 +1,35 @@
1
+ module Cucumber
2
+ module Ast
3
+ class Features #:nodoc:
4
+ include Enumerable
5
+
6
+ attr_reader :duration
7
+
8
+ def initialize
9
+ @features = []
10
+ end
11
+
12
+ def [](index)
13
+ @features[index]
14
+ end
15
+
16
+ def each(&proc)
17
+ @features.each(&proc)
18
+ end
19
+
20
+ def add_feature(feature)
21
+ feature.features = self
22
+ @features << feature
23
+ end
24
+
25
+ def accept(visitor)
26
+ return if Cucumber.wants_to_quit
27
+ start = Time.now
28
+ self.each do |feature|
29
+ visitor.visit_feature(feature)
30
+ end
31
+ @duration = Time.now - start
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,187 @@
1
+ module Cucumber
2
+ module Ast
3
+ class OutlineTable < Table #:nodoc:
4
+ def initialize(raw, scenario_outline)
5
+ super(raw)
6
+ @scenario_outline = scenario_outline
7
+ @cells_class = ExampleRow
8
+ init
9
+ end
10
+
11
+ def init
12
+ create_step_invocations_for_example_rows!(@scenario_outline)
13
+ end
14
+
15
+ def to_sexp
16
+ init
17
+ super
18
+ end
19
+
20
+ def accept(visitor)
21
+ return if Cucumber.wants_to_quit
22
+ init
23
+ cells_rows.each_with_index do |row, n|
24
+ if(visitor.configuration.expand?)
25
+ row.accept(visitor)
26
+ else
27
+ visitor.visit_table_row(row)
28
+ end
29
+ end
30
+ nil
31
+ end
32
+
33
+ def accept_hook?(hook)
34
+ @scenario_outline.accept_hook?(hook)
35
+ end
36
+
37
+ def source_tag_names
38
+ @scenario_outline.source_tag_names
39
+ end
40
+
41
+ def skip_invoke!
42
+ init
43
+ example_rows.each do |cells|
44
+ cells.skip_invoke!
45
+ end
46
+ end
47
+
48
+ def create_step_invocations_for_example_rows!(scenario_outline)
49
+ return if @dunit
50
+ @dunit = true
51
+ example_rows.each do |cells|
52
+ cells.create_step_invocations!(scenario_outline)
53
+ end
54
+ end
55
+
56
+ def example_rows
57
+ cells_rows[1..-1]
58
+ end
59
+
60
+ def visit_scenario_name(visitor, row)
61
+ @scenario_outline.visit_scenario_name(visitor, row)
62
+ end
63
+
64
+ def language
65
+ @scenario_outline.language
66
+ end
67
+
68
+ class ExampleRow < Cells #:nodoc:
69
+ class InvalidForHeaderRowError < NoMethodError
70
+ def initialize(*args)
71
+ super 'This is a header row and cannot pass or fail'
72
+ end
73
+ end
74
+
75
+ attr_reader :scenario_outline # https://rspec.lighthouseapp.com/projects/16211/tickets/342
76
+
77
+ def initialize(table, cells)
78
+ super
79
+ @scenario_exception = nil
80
+ end
81
+
82
+ def source_tag_names
83
+ @table.source_tag_names
84
+ end
85
+
86
+ def create_step_invocations!(scenario_outline)
87
+ @scenario_outline = scenario_outline
88
+ @step_invocations = scenario_outline.step_invocations(self)
89
+ end
90
+
91
+ def skip_invoke!
92
+ @step_invocations.each do |step_invocation|
93
+ step_invocation.skip_invoke!
94
+ end
95
+ end
96
+
97
+ def accept(visitor)
98
+ return if Cucumber.wants_to_quit
99
+ visitor.configuration.expand? ? accept_expand(visitor) : accept_plain(visitor)
100
+ end
101
+
102
+ def accept_plain(visitor)
103
+ if header?
104
+ @cells.each do |cell|
105
+ cell.status = :skipped_param
106
+ visitor.visit_table_cell(cell)
107
+ end
108
+ else
109
+ visitor.step_mother.with_hooks(self) do
110
+ @step_invocations.each do |step_invocation|
111
+ step_invocation.invoke(visitor.step_mother, visitor.configuration)
112
+ @exception ||= step_invocation.reported_exception
113
+ end
114
+
115
+ @cells.each do |cell|
116
+ visitor.visit_table_cell(cell)
117
+ end
118
+
119
+ visitor.visit_exception(@scenario_exception, :failed) if @scenario_exception
120
+ end
121
+ end
122
+ end
123
+
124
+ def accept_expand(visitor)
125
+ if header?
126
+ else
127
+ visitor.step_mother.with_hooks(self) do
128
+ @table.visit_scenario_name(visitor, self)
129
+ @step_invocations.each do |step_invocation|
130
+ step_invocation.invoke(visitor.step_mother, visitor.configuration)
131
+ @exception ||= step_invocation.reported_exception
132
+ step_invocation.visit_step_result(visitor)
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ def accept_hook?(hook)
139
+ @table.accept_hook?(hook)
140
+ end
141
+
142
+ def exception
143
+ @exception || @scenario_exception
144
+ end
145
+
146
+ def fail!(exception)
147
+ @scenario_exception = exception
148
+ end
149
+
150
+ # Returns true if one or more steps failed
151
+ def failed?
152
+ raise InvalidForHeaderRowError if header?
153
+ @step_invocations.failed? || !!@scenario_exception
154
+ end
155
+
156
+ # Returns true if all steps passed
157
+ def passed?
158
+ !failed?
159
+ end
160
+
161
+ # Returns the status
162
+ def status
163
+ return :failed if @scenario_exception
164
+ @step_invocations.status
165
+ end
166
+
167
+ def backtrace_line
168
+ @scenario_outline.backtrace_line(name, line)
169
+ end
170
+
171
+ def name
172
+ "| #{@cells.collect{|c| c.value }.join(' | ')} |"
173
+ end
174
+
175
+ def language
176
+ @table.language
177
+ end
178
+
179
+ private
180
+
181
+ def header?
182
+ index == 0
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,80 @@
1
+ module Cucumber
2
+ module Ast
3
+ # Represents an inline argument in a step. Example:
4
+ #
5
+ # Given the message
6
+ # """
7
+ # I like
8
+ # Cucumber sandwich
9
+ # """
10
+ #
11
+ # The text between the pair of <tt>"""</tt> is stored inside a PyString,
12
+ # which is yielded to the StepDefinition block as the last argument.
13
+ #
14
+ # The StepDefinition can then access the String via the #to_s method. In the
15
+ # example above, that would return: <tt>"I like\nCucumber sandwich"</tt>
16
+ #
17
+ # Note how the indentation from the source is stripped away.
18
+ #
19
+ class PyString #:nodoc:
20
+ class Builder
21
+ attr_reader :string
22
+
23
+ def initialize
24
+ @string = ''
25
+ end
26
+
27
+ def py_string(string, line_number)
28
+ @string = string
29
+ end
30
+
31
+ def eof
32
+ end
33
+ end
34
+
35
+ attr_accessor :file
36
+
37
+ def self.default_arg_name
38
+ "string"
39
+ end
40
+
41
+ def self.parse(text)
42
+ builder = Builder.new
43
+ lexer = Gherkin::I18nLexer.new(builder)
44
+ lexer.scan(text)
45
+ new(builder.string)
46
+ end
47
+
48
+ def initialize(string)
49
+ @string = string
50
+ end
51
+
52
+ def to_step_definition_arg
53
+ @string
54
+ end
55
+
56
+ def accept(visitor)
57
+ return if Cucumber.wants_to_quit
58
+ visitor.visit_py_string(@string)
59
+ end
60
+
61
+ def arguments_replaced(arguments) #:nodoc:
62
+ string = @string
63
+ arguments.each do |name, value|
64
+ value ||= ''
65
+ string = string.gsub(name, value)
66
+ end
67
+ PyString.new(string)
68
+ end
69
+
70
+ def has_text?(text)
71
+ @string.index(text)
72
+ end
73
+
74
+ # For testing only
75
+ def to_sexp #:nodoc:
76
+ [:py_string, to_step_definition_arg]
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,117 @@
1
+ require 'cucumber/ast/feature_element'
2
+
3
+ module Cucumber
4
+ module Ast
5
+ class Scenario #:nodoc:
6
+ include FeatureElement
7
+
8
+ attr_reader :name, :line
9
+
10
+ class EmptyBackground
11
+ def failed?
12
+ false
13
+ end
14
+
15
+ def feature_elements
16
+ []
17
+ end
18
+
19
+ def step_collection(step_invocations)
20
+ StepCollection.new(step_invocations)
21
+ end
22
+
23
+ def init
24
+ end
25
+ end
26
+
27
+ def initialize(background, comment, tags, line, keyword, name, raw_steps)
28
+ @background = background || EmptyBackground.new
29
+ @comment, @tags, @line, @keyword, @name, @raw_steps = comment, tags, line, keyword, name, raw_steps
30
+ @exception = @executed = nil
31
+ end
32
+
33
+ def init
34
+ return if @steps
35
+ @background.init
36
+ @background.feature_elements << self
37
+ attach_steps(@raw_steps)
38
+ step_invocations = @raw_steps.map{|step| step.step_invocation}
39
+ @steps = @background.step_collection(step_invocations)
40
+ end
41
+
42
+ def accept(visitor)
43
+ return if Cucumber.wants_to_quit
44
+
45
+ with_visitor(visitor) do
46
+ visitor.visit_comment(@comment) unless @comment.empty?
47
+ visitor.visit_tags(@tags)
48
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
49
+
50
+ skip_invoke! if @background.failed?
51
+ visitor.step_mother.with_hooks(self, skip_hooks?) do
52
+ skip_invoke! if failed?
53
+ visitor.visit_steps(@steps)
54
+ end
55
+ @executed = true
56
+ end
57
+ end
58
+
59
+ # Returns true if one or more steps failed
60
+ def failed?
61
+ @steps.failed? || !!@exception
62
+ end
63
+
64
+ def fail!(exception)
65
+ @exception = exception
66
+ @current_visitor.visit_exception(@exception, :failed)
67
+ end
68
+
69
+ # Returns true if all steps passed
70
+ def passed?
71
+ !failed?
72
+ end
73
+
74
+ # Returns the first exception (if any)
75
+ def exception
76
+ @exception || @steps.exception
77
+ end
78
+
79
+ # Returns the status
80
+ def status
81
+ return :failed if @exception
82
+ @steps.status
83
+ end
84
+
85
+ def skip_invoke!
86
+ @steps.each{|step_invocation| step_invocation.skip_invoke!}
87
+ @feature.next_feature_element(self) do |next_one|
88
+ next_one.skip_invoke!
89
+ end
90
+ end
91
+
92
+ def to_sexp
93
+ sexp = [:scenario, @line, @keyword, @name]
94
+ comment = @comment.to_sexp
95
+ sexp += [comment] if comment
96
+ tags = @tags.to_sexp
97
+ sexp += tags if tags.any?
98
+ steps = @steps.to_sexp
99
+ sexp += steps if steps.any?
100
+ sexp
101
+ end
102
+
103
+
104
+ def with_visitor(visitor)
105
+ @current_visitor = visitor
106
+ yield
107
+ @current_visitor = nil
108
+ end
109
+
110
+ private
111
+
112
+ def skip_hooks?
113
+ @background.failed? || @executed
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,122 @@
1
+ module Cucumber
2
+ module Ast
3
+ class ScenarioOutline #:nodoc:
4
+ include FeatureElement
5
+
6
+ attr_reader :name
7
+
8
+ module ExamplesArray #:nodoc:
9
+ def accept(visitor)
10
+ return if Cucumber.wants_to_quit
11
+ each do |examples|
12
+ visitor.visit_examples(examples)
13
+ end
14
+ end
15
+ end
16
+
17
+ # The +example_sections+ argument must be an Array where each element is another array representing
18
+ # an Examples section. This array has 3 elements:
19
+ #
20
+ # * Examples keyword
21
+ # * Examples section name
22
+ # * Raw matrix
23
+ def initialize(background, comment, tags, line, keyword, name, raw_steps, example_sections)
24
+ @background, @comment, @tags, @line, @keyword, @name, @raw_steps, @example_sections = background, comment, tags, line, keyword, name, raw_steps, example_sections
25
+ end
26
+
27
+ def add_examples(example_section, gherkin_examples)
28
+ @example_sections << [example_section, gherkin_examples]
29
+ end
30
+
31
+ def init
32
+ return if @steps
33
+ attach_steps(@raw_steps)
34
+ @steps = StepCollection.new(@raw_steps)
35
+
36
+ @examples_array = @example_sections.map do |example_section_and_gherkin_examples|
37
+ example_section = example_section_and_gherkin_examples[0]
38
+ gherkin_examples = example_section_and_gherkin_examples[1]
39
+
40
+ examples_comment = example_section[0]
41
+ examples_line = example_section[1]
42
+ examples_keyword = example_section[2]
43
+ examples_name = example_section[3]
44
+ examples_matrix = example_section[4]
45
+
46
+ examples_table = OutlineTable.new(examples_matrix, self)
47
+ ex = Examples.new(examples_comment, examples_line, examples_keyword, examples_name, examples_table)
48
+ ex.gherkin_statement(gherkin_examples)
49
+ ex
50
+ end
51
+
52
+ @examples_array.extend(ExamplesArray)
53
+
54
+ @background.feature_elements << self if @background
55
+ end
56
+
57
+ def accept(visitor)
58
+ return if Cucumber.wants_to_quit
59
+ visitor.visit_comment(@comment) unless @comment.empty?
60
+ visitor.visit_tags(@tags)
61
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
62
+ visitor.visit_steps(@steps)
63
+
64
+ skip_invoke! if @background && @background.failed?
65
+ visitor.visit_examples_array(@examples_array) unless @examples_array.empty?
66
+ end
67
+
68
+ def fail!(exception)
69
+ # Just a hack for https://rspec.lighthouseapp.com/projects/16211/tickets/413-scenario-outlines-that-fail-with-exception-exit-process
70
+ # Also see http://groups.google.com/group/cukes/browse_thread/thread/41cd567cb9df4bc3
71
+ end
72
+
73
+ def skip_invoke!
74
+ @examples_array.each{|examples| examples.skip_invoke!}
75
+ @feature.next_feature_element(self) do |next_one|
76
+ next_one.skip_invoke!
77
+ end
78
+ end
79
+
80
+ def step_invocations(cells)
81
+ step_invocations = @steps.step_invocations_from_cells(cells)
82
+ if @background
83
+ @background.step_collection(step_invocations)
84
+ else
85
+ StepCollection.new(step_invocations)
86
+ end
87
+ end
88
+
89
+ def each_example_row(&proc)
90
+ @examples_array.each do |examples|
91
+ examples.each_example_row(&proc)
92
+ end
93
+ end
94
+
95
+ def visit_scenario_name(visitor, row)
96
+ visitor.visit_scenario_name(
97
+ @feature.language.keywords('scenario')[0],
98
+ row.name,
99
+ file_colon_line(row.line),
100
+ source_indent(first_line_length)
101
+ )
102
+ end
103
+
104
+ def failed?
105
+ @examples_array.select{|examples| examples.failed?}.any?
106
+ end
107
+
108
+ def to_sexp
109
+ init
110
+ sexp = [:scenario_outline, @keyword, @name]
111
+ comment = @comment.to_sexp
112
+ sexp += [comment] if comment
113
+ tags = @tags.to_sexp
114
+ sexp += tags if tags.any?
115
+ steps = @steps.to_sexp
116
+ sexp += steps if steps.any?
117
+ sexp += @examples_array.map{|e| e.to_sexp}
118
+ sexp
119
+ end
120
+ end
121
+ end
122
+ end