kbaum-cucumber 0.4.5.pre

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 (511) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +18 -0
  3. data/Caliper.yml +5 -0
  4. data/History.txt +1292 -0
  5. data/LICENSE +22 -0
  6. data/README.rdoc +26 -0
  7. data/Rakefile +63 -0
  8. data/VERSION.yml +5 -0
  9. data/bin/cucumber +16 -0
  10. data/cucumber.gemspec +741 -0
  11. data/cucumber.yml +10 -0
  12. data/examples/dos_line_endings/Rakefile +6 -0
  13. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  14. data/examples/i18n/README.textile +18 -0
  15. data/examples/i18n/Rakefile +32 -0
  16. data/examples/i18n/ar/Rakefile +6 -0
  17. data/examples/i18n/ar/features/addition.feature +17 -0
  18. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  19. data/examples/i18n/ar/lib/calculator.rb +11 -0
  20. data/examples/i18n/bg/Rakefile +6 -0
  21. data/examples/i18n/bg/features/addition.feature +12 -0
  22. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  23. data/examples/i18n/bg/features/division.feature +17 -0
  24. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  25. data/examples/i18n/bg/features/support/env.rb +6 -0
  26. data/examples/i18n/bg/features/support/world.rb +8 -0
  27. data/examples/i18n/bg/lib/calculator.rb +24 -0
  28. data/examples/i18n/cat/Rakefile +6 -0
  29. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  30. data/examples/i18n/cat/features/suma.feature +17 -0
  31. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  32. data/examples/i18n/da/Rakefile +6 -0
  33. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  34. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  35. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  36. data/examples/i18n/de/.gitignore +1 -0
  37. data/examples/i18n/de/Rakefile +6 -0
  38. data/examples/i18n/de/features/addition.feature +17 -0
  39. data/examples/i18n/de/features/division.feature +10 -0
  40. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  41. data/examples/i18n/de/lib/calculator.rb +14 -0
  42. data/examples/i18n/en-lol/Rakefile +4 -0
  43. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  44. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  45. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  46. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  47. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  48. data/examples/i18n/en/.gitignore +1 -0
  49. data/examples/i18n/en/Rakefile +6 -0
  50. data/examples/i18n/en/features/addition.feature +17 -0
  51. data/examples/i18n/en/features/division.feature +10 -0
  52. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  53. data/examples/i18n/en/lib/calculator.rb +14 -0
  54. data/examples/i18n/es/Rakefile +6 -0
  55. data/examples/i18n/es/features/adicion.feature +17 -0
  56. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  57. data/examples/i18n/es/lib/calculador.rb +14 -0
  58. data/examples/i18n/et/Rakefile +6 -0
  59. data/examples/i18n/et/features/jagamine.feature +10 -0
  60. data/examples/i18n/et/features/liitmine.feature +17 -0
  61. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  62. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  63. data/examples/i18n/fi/.gitignore +1 -0
  64. data/examples/i18n/fi/Rakefile +6 -0
  65. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  66. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  67. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  68. data/examples/i18n/fi/lib/laskin.rb +14 -0
  69. data/examples/i18n/fr/Rakefile +6 -0
  70. data/examples/i18n/fr/features/addition.feature +18 -0
  71. data/examples/i18n/fr/features/addition2.feature +17 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +38 -0
  73. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  74. data/examples/i18n/he/Rakefile +6 -0
  75. data/examples/i18n/he/features/addition.feature +17 -0
  76. data/examples/i18n/he/features/division.feature +10 -0
  77. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  78. data/examples/i18n/he/lib/calculator.rb +14 -0
  79. data/examples/i18n/hu/.gitignore +1 -0
  80. data/examples/i18n/hu/Rakefile +6 -0
  81. data/examples/i18n/hu/features/addition.feature +17 -0
  82. data/examples/i18n/hu/features/division.feature +10 -0
  83. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  84. data/examples/i18n/hu/lib/calculator.rb +14 -0
  85. data/examples/i18n/id/.gitignore +1 -0
  86. data/examples/i18n/id/Rakefile +6 -0
  87. data/examples/i18n/id/features/addition.feature +17 -0
  88. data/examples/i18n/id/features/division.feature +10 -0
  89. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  90. data/examples/i18n/id/lib/calculator.rb +14 -0
  91. data/examples/i18n/it/Rakefile +6 -0
  92. data/examples/i18n/it/features/somma.feature +11 -0
  93. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  94. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  95. data/examples/i18n/ja/.gitignore +1 -0
  96. data/examples/i18n/ja/Rakefile +6 -0
  97. data/examples/i18n/ja/features/addition.feature +17 -0
  98. data/examples/i18n/ja/features/division.feature +10 -0
  99. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  100. data/examples/i18n/ja/lib/calculator.rb +14 -0
  101. data/examples/i18n/ko/.gitignore +1 -0
  102. data/examples/i18n/ko/Rakefile +6 -0
  103. data/examples/i18n/ko/features/addition.feature +17 -0
  104. data/examples/i18n/ko/features/division.feature +11 -0
  105. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  106. data/examples/i18n/ko/lib/calculator.rb +14 -0
  107. data/examples/i18n/lt/.gitignore +1 -0
  108. data/examples/i18n/lt/Rakefile +6 -0
  109. data/examples/i18n/lt/features/addition.feature +17 -0
  110. data/examples/i18n/lt/features/division.feature +10 -0
  111. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lt/lib/calculator.rb +14 -0
  113. data/examples/i18n/lv/Rakefile +6 -0
  114. data/examples/i18n/lv/features/addition.feature +17 -0
  115. data/examples/i18n/lv/features/division.feature +10 -0
  116. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  117. data/examples/i18n/lv/lib/calculator.rb +14 -0
  118. data/examples/i18n/no/Rakefile +6 -0
  119. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  120. data/examples/i18n/no/features/summering.feature +19 -0
  121. data/examples/i18n/no/features/support/env.rb +6 -0
  122. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  123. data/examples/i18n/pl/.gitignore +1 -0
  124. data/examples/i18n/pl/Rakefile +6 -0
  125. data/examples/i18n/pl/features/addition.feature +17 -0
  126. data/examples/i18n/pl/features/division.feature +10 -0
  127. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  128. data/examples/i18n/pl/features/support/env.rb +6 -0
  129. data/examples/i18n/pl/lib/calculator.rb +14 -0
  130. data/examples/i18n/pt/Rakefile +6 -0
  131. data/examples/i18n/pt/features/adicao.feature +11 -0
  132. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  133. data/examples/i18n/pt/features/support/env.rb +6 -0
  134. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  135. data/examples/i18n/ro/Rakefile +6 -0
  136. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  137. data/examples/i18n/ro/features/suma.feature +11 -0
  138. data/examples/i18n/ro/lib/calculator.rb +11 -0
  139. data/examples/i18n/ru/Rakefile +6 -0
  140. data/examples/i18n/ru/features/addition.feature +11 -0
  141. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  142. data/examples/i18n/ru/features/division.feature +16 -0
  143. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  144. data/examples/i18n/ru/features/support/env.rb +6 -0
  145. data/examples/i18n/ru/features/support/world.rb +8 -0
  146. data/examples/i18n/ru/lib/calculator.rb +24 -0
  147. data/examples/i18n/se/Rakefile +6 -0
  148. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  149. data/examples/i18n/se/features/summering.feature +18 -0
  150. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  151. data/examples/i18n/sk/.gitignore +1 -0
  152. data/examples/i18n/sk/Rakefile +6 -0
  153. data/examples/i18n/sk/features/addition.feature +17 -0
  154. data/examples/i18n/sk/features/division.feature +10 -0
  155. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  156. data/examples/i18n/sk/lib/calculator.rb +14 -0
  157. data/examples/i18n/sr-latn/Rakefile +6 -0
  158. data/examples/i18n/sr-latn/features/sabiranje.feature +18 -0
  159. data/examples/i18n/sr-latn/features/step_definitons/calculator_steps.rb +24 -0
  160. data/examples/i18n/sr-latn/lib/calculator.rb +12 -0
  161. data/examples/i18n/sr/Rakefile +6 -0
  162. data/examples/i18n/sr/features/sabiranje.feature +18 -0
  163. data/examples/i18n/sr/features/step_definitons/calculator_steps.rb +24 -0
  164. data/examples/i18n/sr/lib/calculator.rb +12 -0
  165. data/examples/i18n/tr/.gitignore +1 -0
  166. data/examples/i18n/tr/Rakefile +6 -0
  167. data/examples/i18n/tr/features/bolme.feature +10 -0
  168. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  169. data/examples/i18n/tr/features/toplama.feature +18 -0
  170. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  171. data/examples/i18n/uz/Rakefile +6 -0
  172. data/examples/i18n/uz/features/addition.feature +10 -0
  173. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  174. data/examples/i18n/uz/features/division.feature +17 -0
  175. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  176. data/examples/i18n/uz/features/support/env.rb +6 -0
  177. data/examples/i18n/uz/features/support/world.rb +8 -0
  178. data/examples/i18n/uz/lib/calculator.rb +24 -0
  179. data/examples/i18n/zh-CN/Rakefile +4 -0
  180. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  181. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  182. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  183. data/examples/i18n/zh-TW/.gitignore +1 -0
  184. data/examples/i18n/zh-TW/Rakefile +4 -0
  185. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  186. data/examples/i18n/zh-TW/features/division.feature +11 -0
  187. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  188. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  189. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  190. data/examples/junit/features/pending.feature +5 -0
  191. data/examples/junit/features/step_definitions/steps.rb +11 -0
  192. data/examples/python/features/fibonacci.feature +19 -0
  193. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  194. data/examples/python/lib/.gitignore +1 -0
  195. data/examples/python/lib/fib.py +7 -0
  196. data/examples/ramaze/README.textile +7 -0
  197. data/examples/ramaze/Rakefile +6 -0
  198. data/examples/ramaze/app.rb +21 -0
  199. data/examples/ramaze/features/add.feature +11 -0
  200. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  201. data/examples/ramaze/features/support/env.rb +32 -0
  202. data/examples/ramaze/layout/default.html.erb +8 -0
  203. data/examples/ramaze/view/index.html.erb +5 -0
  204. data/examples/ruby2python/features/fibonacci.feature +19 -0
  205. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  206. data/examples/ruby2python/features/support/env.rb +21 -0
  207. data/examples/ruby2python/lib/.gitignore +1 -0
  208. data/examples/ruby2python/lib/fib.py +7 -0
  209. data/examples/selenium/Rakefile +6 -0
  210. data/examples/selenium/features/search.feature +9 -0
  211. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  212. data/examples/selenium/features/support/env.rb +19 -0
  213. data/examples/selenium_webrat/Rakefile +6 -0
  214. data/examples/selenium_webrat/config.ru +0 -0
  215. data/examples/selenium_webrat/features/search.feature +9 -0
  216. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  217. data/examples/selenium_webrat/features/support/env.rb +45 -0
  218. data/examples/self_test/.gitignore +1 -0
  219. data/examples/self_test/README.textile +6 -0
  220. data/examples/self_test/Rakefile +6 -0
  221. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  222. data/examples/self_test/features/background/background_with_name.feature +7 -0
  223. data/examples/self_test/features/background/failing_background.feature +12 -0
  224. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  225. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  226. data/examples/self_test/features/background/passing_background.feature +10 -0
  227. data/examples/self_test/features/background/pending_background.feature +10 -0
  228. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  229. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  230. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  231. data/examples/self_test/features/failing_expectation.feature +4 -0
  232. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  233. data/examples/self_test/features/multiline_name.feature +27 -0
  234. data/examples/self_test/features/outline_sample.feature +15 -0
  235. data/examples/self_test/features/sample.feature +21 -0
  236. data/examples/self_test/features/search_sample.feature +32 -0
  237. data/examples/self_test/features/step_definitions/sample_steps.rb +81 -0
  238. data/examples/self_test/features/support/env.rb +18 -0
  239. data/examples/self_test/features/tags_sample.feature +17 -0
  240. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  241. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  242. data/examples/self_test/list-of-features.txt +1 -0
  243. data/examples/sinatra/README.textile +13 -0
  244. data/examples/sinatra/Rakefile +6 -0
  245. data/examples/sinatra/app.rb +14 -0
  246. data/examples/sinatra/features/add.feature +11 -0
  247. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  248. data/examples/sinatra/features/support/env.rb +30 -0
  249. data/examples/sinatra/views/add.erb +5 -0
  250. data/examples/sinatra/views/layout.erb +8 -0
  251. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  252. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  253. data/examples/tcl/README.textile +11 -0
  254. data/examples/tcl/Rakefile +6 -0
  255. data/examples/tcl/features/fibonnacci.feature +17 -0
  256. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  257. data/examples/tcl/features/support/env.rb +6 -0
  258. data/examples/tcl/src/fib.tcl +3 -0
  259. data/examples/test_unit/Rakefile +6 -0
  260. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  261. data/examples/test_unit/features/test_unit.feature +9 -0
  262. data/examples/tickets/Rakefile +20 -0
  263. data/examples/tickets/features.html +138 -0
  264. data/examples/tickets/features/172.feature +28 -0
  265. data/examples/tickets/features/177/1.feature +28 -0
  266. data/examples/tickets/features/177/2.feature +20 -0
  267. data/examples/tickets/features/177/3.feature +18 -0
  268. data/examples/tickets/features/180.feature +7 -0
  269. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  270. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  271. data/examples/tickets/features/236.feature +13 -0
  272. data/examples/tickets/features/241.feature +12 -0
  273. data/examples/tickets/features/246.feature +4 -0
  274. data/examples/tickets/features/248.feature +11 -0
  275. data/examples/tickets/features/270/back.feature +14 -0
  276. data/examples/tickets/features/270/back.steps.rb +14 -0
  277. data/examples/tickets/features/272/hooks.feature +26 -0
  278. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  279. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  280. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  281. data/examples/tickets/features/279/wrong.feature_ +11 -0
  282. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  283. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  284. data/examples/tickets/features/306/only_background.feature +4 -0
  285. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  286. data/examples/tickets/features/lib/pantry.rb +20 -0
  287. data/examples/tickets/features/scenario_outline.feature +95 -0
  288. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  289. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  290. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  291. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  292. data/examples/tickets/features/table_diffing.feature +13 -0
  293. data/examples/tickets/features/tickets.feature +28 -0
  294. data/examples/watir/README.textile +16 -0
  295. data/examples/watir/Rakefile +10 -0
  296. data/examples/watir/features/search.feature +12 -0
  297. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  298. data/examples/watir/features/support/env.rb +32 -0
  299. data/examples/watir/features/support/screenshots.rb +44 -0
  300. data/examples/webrat/features/search.feature +12 -0
  301. data/examples/webrat/features/step_definitions/kvasir_steps.rb +14 -0
  302. data/examples/webrat/features/support/env.rb +17 -0
  303. data/features/announce.feature +122 -0
  304. data/features/background.feature +308 -0
  305. data/features/bug_371.feature +32 -0
  306. data/features/bug_464.feature +16 -0
  307. data/features/bug_475.feature +43 -0
  308. data/features/call_many_steps.feature +124 -0
  309. data/features/cucumber_cli.feature +654 -0
  310. data/features/cucumber_cli_diff_disabled.feature +52 -0
  311. data/features/cucumber_cli_outlines.feature +105 -0
  312. data/features/custom_formatter.feature +47 -0
  313. data/features/default_snippets.feature +42 -0
  314. data/features/drb_server_integration.feature +174 -0
  315. data/features/exception_in_after_block.feature +100 -0
  316. data/features/exception_in_after_step_block.feature +102 -0
  317. data/features/exception_in_before_block.feature +78 -0
  318. data/features/exclude_files.feature +20 -0
  319. data/features/expand.feature +60 -0
  320. data/features/html_formatter.feature +7 -0
  321. data/features/html_formatter/a.html +400 -0
  322. data/features/junit_formatter.feature +88 -0
  323. data/features/language_from_header.feature +30 -0
  324. data/features/language_help.feature +68 -0
  325. data/features/listener_debugger_formatter.feature +41 -0
  326. data/features/multiline_names.feature +43 -0
  327. data/features/negative_tagged_hooks.feature +61 -0
  328. data/features/post_configuration_hook.feature +37 -0
  329. data/features/profiles.feature +112 -0
  330. data/features/rake_task.feature +152 -0
  331. data/features/report_called_undefined_steps.feature +34 -0
  332. data/features/simplest.feature +11 -0
  333. data/features/snippet.feature +22 -0
  334. data/features/step_definitions/cucumber_steps.rb +154 -0
  335. data/features/step_definitions/extra_steps.rb +2 -0
  336. data/features/step_definitions/simplest_steps.rb +3 -0
  337. data/features/step_definitions/wire_steps.rb +14 -0
  338. data/features/support/env.rb +141 -0
  339. data/features/support/env.rb.simplest +7 -0
  340. data/features/support/fake_wire_server.rb +63 -0
  341. data/features/table_diffing.feature +45 -0
  342. data/features/table_mapping.feature +35 -0
  343. data/features/tag_logic.feature +258 -0
  344. data/features/transform.feature +245 -0
  345. data/features/unicode_table.feature +35 -0
  346. data/features/usage_and_stepdefs_formatter.feature +169 -0
  347. data/features/wire_protocol.feature +177 -0
  348. data/features/work_in_progress.feature +156 -0
  349. data/gem_tasks/contributors.rake +13 -0
  350. data/gem_tasks/environment.rake +7 -0
  351. data/gem_tasks/features.rake +18 -0
  352. data/gem_tasks/fix_cr_lf.rake +10 -0
  353. data/gem_tasks/flog.rake +4 -0
  354. data/gem_tasks/rspec.rake +15 -0
  355. data/gem_tasks/sass.rake +4 -0
  356. data/gem_tasks/sdoc.rake +12 -0
  357. data/lib/README.rdoc +12 -0
  358. data/lib/autotest/cucumber.rb +6 -0
  359. data/lib/autotest/cucumber_mixin.rb +131 -0
  360. data/lib/autotest/cucumber_rails.rb +6 -0
  361. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  362. data/lib/autotest/cucumber_rspec.rb +6 -0
  363. data/lib/autotest/discover.rb +9 -0
  364. data/lib/cucumber.rb +15 -0
  365. data/lib/cucumber/ast.rb +30 -0
  366. data/lib/cucumber/ast/background.rb +75 -0
  367. data/lib/cucumber/ast/comment.rb +31 -0
  368. data/lib/cucumber/ast/examples.rb +36 -0
  369. data/lib/cucumber/ast/feature.rb +85 -0
  370. data/lib/cucumber/ast/feature_element.rb +68 -0
  371. data/lib/cucumber/ast/features.rb +40 -0
  372. data/lib/cucumber/ast/outline_table.rb +166 -0
  373. data/lib/cucumber/ast/py_string.rb +59 -0
  374. data/lib/cucumber/ast/scenario.rb +111 -0
  375. data/lib/cucumber/ast/scenario_outline.rb +100 -0
  376. data/lib/cucumber/ast/step.rb +121 -0
  377. data/lib/cucumber/ast/step_collection.rb +76 -0
  378. data/lib/cucumber/ast/step_invocation.rb +190 -0
  379. data/lib/cucumber/ast/table.rb +655 -0
  380. data/lib/cucumber/ast/tags.rb +122 -0
  381. data/lib/cucumber/ast/tree_walker.rb +201 -0
  382. data/lib/cucumber/ast/visitor.rb +11 -0
  383. data/lib/cucumber/broadcaster.rb +13 -0
  384. data/lib/cucumber/cli/configuration.rb +180 -0
  385. data/lib/cucumber/cli/drb_client.rb +32 -0
  386. data/lib/cucumber/cli/language_help_formatter.rb +72 -0
  387. data/lib/cucumber/cli/main.rb +121 -0
  388. data/lib/cucumber/cli/options.rb +404 -0
  389. data/lib/cucumber/cli/profile_loader.rb +82 -0
  390. data/lib/cucumber/constantize.rb +34 -0
  391. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  392. data/lib/cucumber/core_ext/proc.rb +30 -0
  393. data/lib/cucumber/core_ext/string.rb +16 -0
  394. data/lib/cucumber/feature_file.rb +54 -0
  395. data/lib/cucumber/filter.rb +41 -0
  396. data/lib/cucumber/formatter/ansicolor.rb +157 -0
  397. data/lib/cucumber/formatter/color_io.rb +23 -0
  398. data/lib/cucumber/formatter/console.rb +205 -0
  399. data/lib/cucumber/formatter/cucumber.css +248 -0
  400. data/lib/cucumber/formatter/cucumber.sass +241 -0
  401. data/lib/cucumber/formatter/debug.rb +33 -0
  402. data/lib/cucumber/formatter/duration.rb +13 -0
  403. data/lib/cucumber/formatter/html.rb +545 -0
  404. data/lib/cucumber/formatter/io.rb +33 -0
  405. data/lib/cucumber/formatter/junit.rb +149 -0
  406. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  407. data/lib/cucumber/formatter/pdf.rb +234 -0
  408. data/lib/cucumber/formatter/pretty.rb +237 -0
  409. data/lib/cucumber/formatter/progress.rb +75 -0
  410. data/lib/cucumber/formatter/rerun.rb +50 -0
  411. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  412. data/lib/cucumber/formatter/steps.rb +49 -0
  413. data/lib/cucumber/formatter/summary.rb +35 -0
  414. data/lib/cucumber/formatter/tag_cloud.rb +34 -0
  415. data/lib/cucumber/formatter/unicode.rb +35 -0
  416. data/lib/cucumber/formatter/usage.rb +127 -0
  417. data/lib/cucumber/language_support.rb +30 -0
  418. data/lib/cucumber/language_support/language_methods.rb +110 -0
  419. data/lib/cucumber/languages.yml +535 -0
  420. data/lib/cucumber/parser.rb +8 -0
  421. data/lib/cucumber/parser/common.rb +170 -0
  422. data/lib/cucumber/parser/common.tt +21 -0
  423. data/lib/cucumber/parser/feature.rb +1783 -0
  424. data/lib/cucumber/parser/feature.tt +317 -0
  425. data/lib/cucumber/parser/i18n.tt +34 -0
  426. data/lib/cucumber/parser/natural_language.rb +108 -0
  427. data/lib/cucumber/parser/py_string.rb +276 -0
  428. data/lib/cucumber/parser/py_string.tt +45 -0
  429. data/lib/cucumber/parser/table.rb +305 -0
  430. data/lib/cucumber/parser/table.tt +60 -0
  431. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  432. data/lib/cucumber/platform.rb +31 -0
  433. data/lib/cucumber/py_support/py_dsl.py +10 -0
  434. data/lib/cucumber/py_support/py_language.py +10 -0
  435. data/lib/cucumber/py_support/py_language.rb +81 -0
  436. data/lib/cucumber/rake/task.rb +166 -0
  437. data/lib/cucumber/rb_support/rb_dsl.rb +102 -0
  438. data/lib/cucumber/rb_support/rb_hook.rb +19 -0
  439. data/lib/cucumber/rb_support/rb_language.rb +179 -0
  440. data/lib/cucumber/rb_support/rb_step_definition.rb +75 -0
  441. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  442. data/lib/cucumber/rb_support/rb_world.rb +81 -0
  443. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  444. data/lib/cucumber/rspec_neuter.rb +23 -0
  445. data/lib/cucumber/step_argument.rb +9 -0
  446. data/lib/cucumber/step_definition_light.rb +20 -0
  447. data/lib/cucumber/step_match.rb +107 -0
  448. data/lib/cucumber/step_mother.rb +350 -0
  449. data/lib/cucumber/webrat/element_locator.rb +93 -0
  450. data/lib/cucumber/webrat/table_locator.rb +1 -0
  451. data/lib/cucumber/wire_support/connection.rb +42 -0
  452. data/lib/cucumber/wire_support/request_handler.rb +19 -0
  453. data/lib/cucumber/wire_support/wire_exception.rb +10 -0
  454. data/lib/cucumber/wire_support/wire_language.rb +52 -0
  455. data/lib/cucumber/wire_support/wire_packet.rb +34 -0
  456. data/lib/cucumber/wire_support/wire_protocol.rb +64 -0
  457. data/lib/cucumber/wire_support/wire_step_definition.rb +21 -0
  458. data/spec/cucumber/ast/background_spec.rb +54 -0
  459. data/spec/cucumber/ast/feature_element_spec.rb +41 -0
  460. data/spec/cucumber/ast/feature_factory.rb +62 -0
  461. data/spec/cucumber/ast/feature_spec.rb +44 -0
  462. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  463. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  464. data/spec/cucumber/ast/scenario_outline_spec.rb +73 -0
  465. data/spec/cucumber/ast/scenario_spec.rb +45 -0
  466. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  467. data/spec/cucumber/ast/step_spec.rb +66 -0
  468. data/spec/cucumber/ast/table_spec.rb +422 -0
  469. data/spec/cucumber/ast/tags_spec.rb +29 -0
  470. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  471. data/spec/cucumber/broadcaster_spec.rb +15 -0
  472. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  473. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  474. data/spec/cucumber/cli/main_spec.rb +172 -0
  475. data/spec/cucumber/cli/options_spec.rb +335 -0
  476. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  477. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  478. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  479. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  480. data/spec/cucumber/formatter/console_spec.rb +20 -0
  481. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  482. data/spec/cucumber/formatter/html_spec.rb +213 -0
  483. data/spec/cucumber/formatter/junit_spec.rb +110 -0
  484. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  485. data/spec/cucumber/formatter/spec_helper.rb +50 -0
  486. data/spec/cucumber/parser/feature_parser_spec.rb +400 -0
  487. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  488. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +132 -0
  489. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  490. data/spec/cucumber/sell_cucumbers.feature +19 -0
  491. data/spec/cucumber/step_match_spec.rb +56 -0
  492. data/spec/cucumber/step_mother_spec.rb +270 -0
  493. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  494. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  495. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  496. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  497. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  498. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  499. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  500. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  501. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  502. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  503. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  504. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  505. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  506. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  507. data/spec/cucumber/wire_support/wire_packet_spec.rb +26 -0
  508. data/spec/cucumber/world/pending_spec.rb +46 -0
  509. data/spec/spec.opts +4 -0
  510. data/spec/spec_helper.rb +18 -0
  511. metadata +813 -0
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/ast/feature_factory'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ describe Feature do
7
+ include FeatureFactory
8
+
9
+ it "should convert to sexp" do
10
+ step_mother = StepMother.new
11
+ step_mother.load_natural_language('en')
12
+ step_mother.load_programming_language('rb')
13
+ dsl = Object.new
14
+ dsl.extend RbSupport::RbDsl
15
+
16
+ feature = create_feature(dsl)
17
+ feature.to_sexp.should ==
18
+ [:feature,
19
+ "features/pretty_printing.feature",
20
+ "Pretty printing",
21
+ [:comment, "# My feature comment\n"],
22
+ [:tag, "one"],
23
+ [:tag, "two"],
24
+ [:background, 2, 'Background:',
25
+ [:step, 3, "Given", "a passing step"]],
26
+ [:scenario, 9, "Scenario:",
27
+ "A Scenario",
28
+ [:comment, " # My scenario comment \n# On two lines \n"],
29
+ [:tag, "three"],
30
+ [:tag, "four"],
31
+ [:step_invocation, 3, "Given", "a passing step"], # From the background
32
+ [:step_invocation, 10, "Given", "a passing step with an inline arg:",
33
+ [:table,
34
+ [:row, -1,
35
+ [:cell, "1"], [:cell, "22"], [:cell, "333"]],
36
+ [:row, -1,
37
+ [:cell, "4444"], [:cell, "55555"], [:cell, "666666"]]]],
38
+ [:step_invocation, 11, "Given", "a happy step with an inline arg:",
39
+ [:py_string, "\n I like\nCucumber sandwich\n"]],
40
+ [:step_invocation, 12, "Given", "a failing step"]]]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Cucumber::Ast
4
+ describe OutlineTable do
5
+ describe OutlineTable::ExampleRow do
6
+ describe "a header row" do
7
+ before(:each) do
8
+ @row = OutlineTable::ExampleRow.new(
9
+ mock('table', :index => 0),
10
+ [mock('cell', :status= => nil)]
11
+ )
12
+ end
13
+
14
+ it "should raise an error if you try to call #failed?" do
15
+ @row.accept_plain mock('visitor', :visit_table_cell => nil)
16
+ lambda{ @row.failed? }.should raise_error(NoMethodError, /cannot pass or fail/)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/ast/py_string'
3
+
4
+ module Cucumber
5
+ module Ast
6
+ describe PyString do
7
+ it "should handle unindented" do
8
+ ps = PyString.new(10, 13, "4.1\n4.2\n", 0)
9
+ ps.to_s.should == "4.1\n4.2\n"
10
+ end
11
+
12
+ it "should handle indented" do
13
+ # """
14
+ ps = PyString.new(10, 13, " 4.1\n 4.2\n", 2)
15
+ ps.to_s.should == " 4.1\n 4.2\n"
16
+ end
17
+
18
+ describe "replacing arguments" do
19
+
20
+ before(:each) do
21
+ @ps = PyString.new(10, 13, "<book>\n<qty>\n", 0)
22
+ end
23
+
24
+ it "should return a new py_string with arguments replaced with values" do
25
+ py_string_with_replaced_arg = @ps.arguments_replaced({'<book>' => 'Life is elsewhere', '<qty>' => '5'})
26
+
27
+ py_string_with_replaced_arg.to_s.should == "Life is elsewhere\n5\n"
28
+ end
29
+
30
+ it "should not change the original py_string" do
31
+ py_string_with_replaced_arg = @ps.arguments_replaced({'<book>' => 'Life is elsewhere'})
32
+
33
+ @ps.to_s.should_not include("Life is elsewhere")
34
+ end
35
+
36
+ it "should replaced nil with empty string" do
37
+ ps = PyString.new(10, 13, "'<book>'", 0)
38
+ py_string_with_replaced_arg = ps.arguments_replaced({'<book>' => nil})
39
+
40
+ py_string_with_replaced_arg.to_s.should == "''"
41
+ end
42
+
43
+ it "should recognise when just a subset of a cell is delimited" do
44
+ @ps.should have_text('<qty>')
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,73 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/core_ext/string'
5
+ require 'cucumber/rb_support/rb_language'
6
+
7
+ module Cucumber
8
+ module Ast
9
+ describe ScenarioOutline do
10
+ before do
11
+ @step_mother = StepMother.new
12
+ @step_mother.load_programming_language('rb')
13
+ @step_mother.load_natural_language('en')
14
+ @dsl = Object.new
15
+ @dsl.extend(RbSupport::RbDsl)
16
+
17
+ @dsl.Given(/^there are (\d+) cucumbers$/) do |n|
18
+ @initial = n.to_i
19
+ end
20
+ @dsl.When(/^I eat (\d+) cucumbers$/) do |n|
21
+ @eaten = n.to_i
22
+ end
23
+ @dsl.Then(/^I should have (\d+) cucumbers$/) do |n|
24
+ (@initial - @eaten).should == n.to_i
25
+ end
26
+ @dsl.Then(/^I should have (\d+) cucumbers in my belly$/) do |n|
27
+ @eaten.should == n.to_i
28
+ end
29
+
30
+ @scenario_outline = ScenarioOutline.new(
31
+ background=nil,
32
+ Comment.new(""),
33
+ Tags.new(18, []),
34
+ 19,
35
+ "Scenario:", "My outline",
36
+ [
37
+ Step.new(20, 'Given', 'there are <start> cucumbers'),
38
+ Step.new(21, 'When', 'I eat <eat> cucumbers'),
39
+ Step.new(22, 'Then', 'I should have <left> cucumbers'),
40
+ Step.new(23, 'And', 'I should have <eat> cucumbers in my belly')
41
+ ],
42
+ [
43
+ [
44
+ Comment.new("#Mmmm... cucumbers\n"),
45
+ 24,
46
+ 'Examples:',
47
+ 'First table',
48
+ [
49
+ %w{start eat left},
50
+ %w{12 5 7},
51
+ %w{20 6 14}
52
+ ]
53
+ ]
54
+ ]
55
+
56
+ )
57
+ end
58
+
59
+ it "should replace all variables and call outline once for each table row" do
60
+ visitor = TreeWalker.new(@step_mother)
61
+ visitor.should_receive(:visit_table_row).exactly(3).times
62
+ visitor.visit_feature_element(@scenario_outline)
63
+ end
64
+
65
+ it "should pretty print" do
66
+ require 'cucumber/formatter/pretty'
67
+ formatter = Formatter::Pretty.new(@step_mother, STDOUT, {:comment => true, :tag_names => {}})
68
+ visitor = TreeWalker.new(@step_mother, [formatter])
69
+ visitor.visit_feature_element(@scenario_outline)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/rb_support/rb_language'
5
+
6
+ module Cucumber
7
+ module Ast
8
+ describe Scenario do
9
+ before do
10
+ @step_mother = StepMother.new
11
+ @step_mother.load_natural_language('en')
12
+ @step_mother.load_programming_language('rb')
13
+ @dsl = Object.new
14
+ @dsl.extend(RbSupport::RbDsl)
15
+
16
+ $x = $y = nil
17
+ @dsl.Given /y is (\d+)/ do |n|
18
+ $y = n.to_i
19
+ end
20
+ @visitor = TreeWalker.new(@step_mother)
21
+ @visitor.options = {}
22
+ end
23
+
24
+ it "should skip steps when previous is not passed" do
25
+ scenario = Scenario.new(
26
+ background=nil,
27
+ comment=Comment.new(""),
28
+ tags=Tags.new(98, []),
29
+ line=99,
30
+ keyword="",
31
+ name="",
32
+ steps=[
33
+ Step.new(7, "Given", "this is missing"),
34
+ Step.new(8, "Given", "y is 5")
35
+ ]
36
+ )
37
+ scenario.feature = mock('feature', :null_object => true)
38
+ @visitor.visit_feature_element(scenario)
39
+
40
+ $y.should == nil
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Cucumber
4
+ module Ast
5
+ describe StepCollection do
6
+ it "should convert And to Given in snippets" do
7
+ s1 = Step.new(1, 'Given', 'cukes')
8
+ s2 = Step.new(2, 'And', 'turnips')
9
+ s1.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
10
+ s2.stub!(:language).and_return(Parser::NaturalLanguage.get(nil, 'en'))
11
+ c = StepCollection.new([s1, s2])
12
+ actual_keywords = c.step_invocations.map{|i| i.actual_keyword}
13
+ actual_keywords.should == %w{Given Given}
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require 'cucumber/step_mother'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/core_ext/string'
5
+
6
+ module Cucumber
7
+ module Ast
8
+ describe Step do
9
+ it "should replace arguments in name" do
10
+ step = Step.new(1, 'Given', 'a <color> cucumber')
11
+
12
+ invocation_table = Table.new([
13
+ %w{color taste},
14
+ %w{green juicy}
15
+ ])
16
+ cells = invocation_table.cells_rows[1]
17
+ step_invocation = step.step_invocation_from_cells(cells)
18
+
19
+ step_invocation.name.should == 'a green cucumber'
20
+ end
21
+
22
+ it "should use empty string for the replacement of arguments in name when replace value is nil" do
23
+ step = Step.new(1, 'Given', 'a <color>cucumber')
24
+
25
+ invocation_table = Table.new([
26
+ ['color'],
27
+ [nil]
28
+ ])
29
+ cells = invocation_table.cells_rows[1]
30
+ step_invocation = step.step_invocation_from_cells(cells)
31
+
32
+ step_invocation.name.should == 'a cucumber'
33
+ end
34
+
35
+ it "should replace arguments in table arg" do
36
+ arg_table = Table.new([%w{taste_<taste> color_<color>}])
37
+
38
+ step = Step.new(1, 'Given', 'a <color> cucumber', arg_table)
39
+
40
+ invocation_table = Table.new([
41
+ %w{color taste},
42
+ %w{green juicy}
43
+ ])
44
+ cells = invocation_table.cells_rows[1]
45
+ step_invocation = step.step_invocation_from_cells(cells)
46
+
47
+ step_invocation.instance_variable_get('@multiline_arg').raw.should == [%w{taste_juicy color_green}]
48
+ end
49
+
50
+ it "should replace arguments in py string arg" do
51
+ py_string = PyString.new(1, 2, 'taste_<taste> color_<color>', 0)
52
+
53
+ step = Step.new(1, 'Given', 'a <color> cucumber', py_string)
54
+
55
+ invocation_table = Table.new([
56
+ %w{color taste},
57
+ %w{green juicy}
58
+ ])
59
+ cells = invocation_table.cells_rows[1]
60
+ step_invocation = step.step_invocation_from_cells(cells)
61
+
62
+ step_invocation.instance_variable_get('@multiline_arg').to_s.should == 'taste_juicy color_green'
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,422 @@
1
+ # encoding: utf-8
2
+ require File.dirname(__FILE__) + '/../../spec_helper'
3
+ require 'cucumber/ast/table'
4
+
5
+ module Cucumber
6
+ module Ast
7
+ describe Table do
8
+ before do
9
+ @table = Table.new([
10
+ %w{one four seven},
11
+ %w{4444 55555 666666}
12
+ ])
13
+ def @table.cells_rows; super; end
14
+ def @table.columns; super; end
15
+ end
16
+
17
+ it "should have rows" do
18
+ @table.cells_rows[0].map{|cell| cell.value}.should == %w{one four seven}
19
+ end
20
+
21
+ it "should have columns" do
22
+ @table.columns[1].map{|cell| cell.value}.should == %w{four 55555}
23
+ end
24
+
25
+ it "should have headers" do
26
+ @table.headers.should == %w{one four seven}
27
+ end
28
+
29
+ it "should have same cell objects in rows and columns" do
30
+ # 666666
31
+ @table.cells_rows[1].__send__(:[], 2).should equal(@table.columns[2].__send__(:[], 1))
32
+ end
33
+
34
+ it "should know about max width of a row" do
35
+ @table.columns[1].__send__(:width).should == 5
36
+ end
37
+
38
+ it "should be convertible to an array of hashes" do
39
+ @table.hashes.should == [
40
+ {'one' => '4444', 'four' => '55555', 'seven' => '666666'}
41
+ ]
42
+ end
43
+
44
+ it "should accept symbols as keys for the hashes" do
45
+ @table.hashes.first[:one].should == '4444'
46
+ end
47
+
48
+ it "should allow map'ing columns" do
49
+ @table.map_column!('one') { |v| v.to_i }
50
+ @table.hashes.first['one'].should == 4444
51
+ end
52
+
53
+ it "should pass silently if a mapped column does not exist in non-strict mode" do
54
+ lambda {
55
+ @table.map_column!('two', false) { |v| v.to_i }
56
+ }.should_not raise_error
57
+ end
58
+
59
+ it "should fail if a mapped column does not exist in strict mode" do
60
+ lambda {
61
+ @table.map_column!('two', true) { |v| v.to_i }
62
+ }.should raise_error('The column named "two" does not exist')
63
+ end
64
+
65
+ describe "#match" do
66
+ before(:each) do
67
+ @table = Table.new([
68
+ %w{one four seven},
69
+ %w{4444 55555 666666}
70
+ ])
71
+ end
72
+
73
+ it "returns nil if headers do not match" do
74
+ @table.match('does,not,match').should be_nil
75
+ end
76
+ it "requires a table: prefix on match" do
77
+ @table.match('table:one,four,seven').should_not be_nil
78
+ end
79
+ it "does not match if no table: prefix on match" do
80
+ @table.match('one,four,seven').should be_nil
81
+ end
82
+ end
83
+ describe "#transpose" do
84
+ before(:each) do
85
+ @table = Table.new([
86
+ %w{one 1111},
87
+ %w{two 22222}
88
+ ])
89
+ end
90
+
91
+ it "should be convertible in to an array where each row is a hash" do
92
+ @table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
93
+ end
94
+ end
95
+
96
+ describe "#rows_hash" do
97
+
98
+ it "should return a hash of the rows" do
99
+ table = Table.new([
100
+ %w{one 1111},
101
+ %w{two 22222}
102
+ ])
103
+ table.rows_hash.should == {'one' => '1111', 'two' => '22222'}
104
+ end
105
+
106
+ it "should fail if the table doesn't have two columns" do
107
+ faulty_table = Table.new([
108
+ %w{one 1111 abc},
109
+ %w{two 22222 def}
110
+ ])
111
+ lambda {
112
+ faulty_table.rows_hash
113
+ }.should raise_error('The table must have exactly 2 columns')
114
+ end
115
+ end
116
+
117
+ describe '#map_headers' do
118
+ it "renames the columns to the specified values in the provided hash" do
119
+ table2 = @table.map_headers('one' => :three)
120
+ table2.hashes.first[:three].should == '4444'
121
+ end
122
+
123
+ it "allows renaming columns using regexp" do
124
+ table2 = @table.map_headers(/one|uno/ => :three)
125
+ table2.hashes.first[:three].should == '4444'
126
+ end
127
+
128
+ it "copies column mappings" do
129
+ @table.map_column!('one') { |v| v.to_i }
130
+ table2 = @table.map_headers('one' => 'three')
131
+ table2.hashes.first['three'].should == 4444
132
+ end
133
+
134
+ it "takes a block and operates on all the headers with it" do
135
+ table = Table.new([
136
+ ['HELLO', 'WORLD'],
137
+ %w{4444 55555}
138
+ ])
139
+
140
+ table.map_headers! do |header|
141
+ header.downcase
142
+ end
143
+
144
+ table.hashes.first.keys.should =~ %w[hello world]
145
+ end
146
+
147
+ it "treats the mappings in the provided hash as overrides when used with a block" do
148
+ table = Table.new([
149
+ ['HELLO', 'WORLD'],
150
+ %w{4444 55555}
151
+ ])
152
+
153
+ table.map_headers!('WORLD' => 'foo') do |header|
154
+ header.downcase
155
+ end
156
+
157
+ table.hashes.first.keys.should =~ %w[hello foo]
158
+ end
159
+
160
+ end
161
+
162
+ describe "replacing arguments" do
163
+
164
+ before(:each) do
165
+ @table = Table.new([
166
+ %w{qty book},
167
+ %w{<qty> <book>}
168
+ ])
169
+ end
170
+
171
+ it "should return a new table with arguments replaced with values" do
172
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => 'Unbearable lightness of being', '<qty>' => '5'})
173
+
174
+ table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
175
+ table_with_replaced_args.hashes[0]['qty'].should == '5'
176
+ end
177
+
178
+ it "should recognise when entire cell is delimited" do
179
+ @table.should have_text('<book>')
180
+ end
181
+
182
+ it "should recognise when just a subset of a cell is delimited" do
183
+ table = Table.new([
184
+ %w{qty book},
185
+ [nil, "This is <who>'s book"]
186
+ ])
187
+ table.should have_text('<who>')
188
+ end
189
+
190
+ it "should replace nil values with nil" do
191
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => nil})
192
+
193
+ table_with_replaced_args.hashes[0]['book'].should == nil
194
+ end
195
+
196
+ it "should preserve values which don't match a placeholder when replacing with nil" do
197
+ table = Table.new([
198
+ %w{book},
199
+ %w{cat}
200
+ ])
201
+ table_with_replaced_args = table.arguments_replaced({'<book>' => nil})
202
+
203
+ table_with_replaced_args.hashes[0]['book'].should == 'cat'
204
+ end
205
+
206
+ it "should not change the original table" do
207
+ @table.arguments_replaced({'<book>' => 'Unbearable lightness of being'})
208
+
209
+ @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
210
+ end
211
+
212
+ it "should not raise an error when there are nil values in the table" do
213
+ table = Table.new([
214
+ ['book', 'qty'],
215
+ ['<book>', nil],
216
+ ])
217
+ lambda{
218
+ table.arguments_replaced({'<book>' => nil, '<qty>' => '5'})
219
+ }.should_not raise_error
220
+ end
221
+
222
+ end
223
+
224
+ describe "diff!" do
225
+ it "should detect a complex diff" do
226
+ t1 = table(%{
227
+ | 1 | 22 | 333 | 4444 |
228
+ | 55555 | 666666 | 7777777 | 88888888 |
229
+ | 999999999 | 0000000000 | 01010101010 | 121212121212 |
230
+ | 4000 | ABC | DEF | 50000 |
231
+ })
232
+
233
+ t2 = table(%{
234
+ | a | 4444 | 1 |
235
+ | bb | 88888888 | 55555 |
236
+ | ccc | xxxxxxxx | 999999999 |
237
+ | dddd | 4000 | 300 |
238
+ | e | 50000 | 4000 |
239
+ })
240
+ lambda{t1.diff!(t2)}.should raise_error
241
+ t1.to_s(:indent => 12, :color => false).should == %{
242
+ | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
243
+ | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
244
+ | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
245
+ | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
246
+ | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
247
+ | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
248
+ }
249
+ end
250
+
251
+ it "should not change table when diffed with identical" do
252
+ t = table(%{
253
+ |a|b|c|
254
+ |d|e|f|
255
+ |g|h|i|
256
+ })
257
+ t.diff!(t.dup)
258
+ t.to_s(:indent => 12, :color => false).should == %{
259
+ | a | b | c |
260
+ | d | e | f |
261
+ | g | h | i |
262
+ }
263
+ end
264
+
265
+ it "should inspect missing and surplus cells" do
266
+ t1 = Table.new([
267
+ ['name', 'male', 'lastname', 'swedish'],
268
+ ['aslak', 'true', 'hellesøy', 'false']
269
+ ])
270
+ t2 = Table.new([
271
+ ['name', 'male', 'lastname', 'swedish'],
272
+ ['aslak', true, 'hellesøy', false]
273
+ ])
274
+ lambda{t1.diff!(t2)}.should raise_error
275
+ t1.to_s(:indent => 12, :color => false).should == %{
276
+ | name | male | lastname | swedish |
277
+ | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
278
+ | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
279
+ }
280
+ end
281
+
282
+ it "should allow column mapping of target before diffing" do
283
+ t1 = Table.new([
284
+ ['name', 'male'],
285
+ ['aslak', 'true']
286
+ ])
287
+ t1.map_column!('male') { |m| m == 'true' }
288
+ t2 = Table.new([
289
+ ['name', 'male'],
290
+ ['aslak', true]
291
+ ])
292
+ t1.diff!(t2)
293
+ t1.to_s(:indent => 12, :color => false).should == %{
294
+ | name | male |
295
+ | aslak | true |
296
+ }
297
+ end
298
+
299
+ it "should allow column mapping of argument before diffing" do
300
+ t1 = Table.new([
301
+ ['name', 'male'],
302
+ ['aslak', true]
303
+ ])
304
+ t1.map_column!('male') {
305
+ 'true'
306
+ }
307
+ t2 = Table.new([
308
+ ['name', 'male'],
309
+ ['aslak', 'true']
310
+ ])
311
+ t2.diff!(t1)
312
+ t1.to_s(:indent => 12, :color => false).should == %{
313
+ | name | male |
314
+ | aslak | true |
315
+ }
316
+ end
317
+
318
+ it "should allow header mapping before diffing" do
319
+ t1 = Table.new([
320
+ ['Name', 'Male'],
321
+ ['aslak', 'true']
322
+ ])
323
+ t1.map_headers!('Name' => 'name', 'Male' => 'male')
324
+ t1.map_column!('male') { |m| m == 'true' }
325
+ t2 = Table.new([
326
+ ['name', 'male'],
327
+ ['aslak', true]
328
+ ])
329
+ t1.diff!(t2)
330
+ t1.to_s(:indent => 12, :color => false).should == %{
331
+ | name | male |
332
+ | aslak | true |
333
+ }
334
+ end
335
+
336
+ it "should not allow mappings that match more than 1 column" do
337
+ t1 = Table.new([
338
+ ['Cuke', 'Duke'],
339
+ ['Foo', 'Bar']
340
+ ])
341
+ lambda do
342
+ t1.map_headers!(/uk/ => 'u')
343
+ end.should raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
344
+ end
345
+
346
+ describe "raising" do
347
+ before do
348
+ @t = table(%{
349
+ | a | b |
350
+ | c | d |
351
+ })
352
+ end
353
+
354
+ it "should raise on missing rows" do
355
+ t = table(%{
356
+ | a | b |
357
+ })
358
+ lambda { @t.dup.diff!(t) }.should raise_error
359
+ lambda { @t.dup.diff!(t, :missing_row => false) }.should_not raise_error
360
+ end
361
+
362
+ it "should raise on surplus rows" do
363
+ t = table(%{
364
+ | a | b |
365
+ | c | d |
366
+ | e | f |
367
+ })
368
+ lambda { @t.dup.diff!(t) }.should raise_error
369
+ lambda { @t.dup.diff!(t, :surplus_row => false) }.should_not raise_error
370
+ end
371
+
372
+ it "should raise on missing columns" do
373
+ t = table(%{
374
+ | a |
375
+ | c |
376
+ })
377
+ lambda { @t.dup.diff!(t) }.should raise_error
378
+ lambda { @t.dup.diff!(t, :missing_col => false) }.should_not raise_error
379
+ end
380
+
381
+ it "should not raise on surplus columns" do
382
+ t = table(%{
383
+ | a | b | x |
384
+ | c | d | y |
385
+ })
386
+ lambda { @t.dup.diff!(t) }.should_not raise_error
387
+ lambda { @t.dup.diff!(t, :surplus_col => true) }.should raise_error
388
+ end
389
+ end
390
+
391
+ def table(text, file=nil, line_offset=0)
392
+ @table_parser ||= Parser::TableParser.new
393
+ @table_parser.parse_or_fail(text.strip, file, line_offset)
394
+ end
395
+ end
396
+
397
+ describe "#new" do
398
+ it "should allow Array of Hash" do
399
+ t1 = Table.new([{'name' => 'aslak', 'male' => 'true'}])
400
+ t1.to_s(:indent => 12, :color => false).should == %{
401
+ | name | male |
402
+ | aslak | true |
403
+ }
404
+ end
405
+ end
406
+
407
+ it "should convert to sexp" do
408
+ @table.to_sexp.should ==
409
+ [:table,
410
+ [:row, -1,
411
+ [:cell, "one"],
412
+ [:cell, "four"],
413
+ [:cell, "seven"]
414
+ ],
415
+ [:row, -1,
416
+ [:cell, "4444"],
417
+ [:cell, "55555"],
418
+ [:cell, "666666"]]]
419
+ end
420
+ end
421
+ end
422
+ end