dwaite-cucumber 0.3.101

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 (454) hide show
  1. data/History.txt +1067 -0
  2. data/License.txt +22 -0
  3. data/Manifest.txt +453 -0
  4. data/README.txt +4 -0
  5. data/Rakefile +9 -0
  6. data/bin/cucumber +17 -0
  7. data/config/hoe.rb +78 -0
  8. data/config/requirements.rb +15 -0
  9. data/cucumber.yml +2 -0
  10. data/examples/cs/README.textile +1 -0
  11. data/examples/cs/Rakefile +12 -0
  12. data/examples/cs/compile.bat +1 -0
  13. data/examples/cs/features/addition.feature +16 -0
  14. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  15. data/examples/cs/src/demo/Calculator.cs +20 -0
  16. data/examples/dos_line_endings/Rakefile +6 -0
  17. data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
  18. data/examples/i18n/README.textile +18 -0
  19. data/examples/i18n/Rakefile +32 -0
  20. data/examples/i18n/ar/Rakefile +6 -0
  21. data/examples/i18n/ar/features/addition.feature +17 -0
  22. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/ar/lib/calculator.rb +11 -0
  24. data/examples/i18n/bg/Rakefile +6 -0
  25. data/examples/i18n/bg/features/addition.feature +12 -0
  26. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  27. data/examples/i18n/bg/features/division.feature +17 -0
  28. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  29. data/examples/i18n/bg/features/support/env.rb +6 -0
  30. data/examples/i18n/bg/features/support/world.rb +8 -0
  31. data/examples/i18n/bg/lib/calculator.rb +24 -0
  32. data/examples/i18n/cat/Rakefile +6 -0
  33. data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
  34. data/examples/i18n/cat/features/suma.feature +17 -0
  35. data/examples/i18n/cat/lib/calculadora.rb +16 -0
  36. data/examples/i18n/da/Rakefile +6 -0
  37. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
  38. data/examples/i18n/da/features/summering.feature +18 -0
  39. data/examples/i18n/da/lib/kalkulator.rb +11 -0
  40. data/examples/i18n/de/Rakefile +6 -0
  41. data/examples/i18n/de/features/addition.feature +17 -0
  42. data/examples/i18n/de/features/division.feature +10 -0
  43. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  44. data/examples/i18n/de/lib/calculator.rb +14 -0
  45. data/examples/i18n/en/Rakefile +6 -0
  46. data/examples/i18n/en/features/addition.feature +17 -0
  47. data/examples/i18n/en/features/division.feature +10 -0
  48. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  49. data/examples/i18n/en/lib/calculator.rb +14 -0
  50. data/examples/i18n/en-lol/Rakefile +6 -0
  51. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  52. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  53. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  54. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  55. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  56. data/examples/i18n/es/Rakefile +6 -0
  57. data/examples/i18n/es/features/adicion.feature +17 -0
  58. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  59. data/examples/i18n/es/lib/calculador.rb +14 -0
  60. data/examples/i18n/et/Rakefile +6 -0
  61. data/examples/i18n/et/features/jagamine.feature +10 -0
  62. data/examples/i18n/et/features/liitmine.feature +17 -0
  63. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  64. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  65. data/examples/i18n/fi/Rakefile +6 -0
  66. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  67. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  68. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  69. data/examples/i18n/fi/lib/laskin.rb +14 -0
  70. data/examples/i18n/fr/Rakefile +6 -0
  71. data/examples/i18n/fr/features/addition.feature +18 -0
  72. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -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/Rakefile +6 -0
  80. data/examples/i18n/hu/features/addition.feature +17 -0
  81. data/examples/i18n/hu/features/division.feature +10 -0
  82. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  83. data/examples/i18n/hu/lib/calculator.rb +14 -0
  84. data/examples/i18n/id/Rakefile +6 -0
  85. data/examples/i18n/id/features/addition.feature +17 -0
  86. data/examples/i18n/id/features/division.feature +10 -0
  87. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  88. data/examples/i18n/id/lib/calculator.rb +14 -0
  89. data/examples/i18n/it/Rakefile +6 -0
  90. data/examples/i18n/it/features/somma.feature +11 -0
  91. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  92. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  93. data/examples/i18n/ja/Rakefile +6 -0
  94. data/examples/i18n/ja/features/addition.feature +17 -0
  95. data/examples/i18n/ja/features/division.feature +10 -0
  96. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
  97. data/examples/i18n/ja/lib/calculator.rb +14 -0
  98. data/examples/i18n/ko/Rakefile +6 -0
  99. data/examples/i18n/ko/features/addition.feature +17 -0
  100. data/examples/i18n/ko/features/division.feature +11 -0
  101. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  102. data/examples/i18n/ko/lib/calculator.rb +14 -0
  103. data/examples/i18n/lt/Rakefile +6 -0
  104. data/examples/i18n/lt/features/addition.feature +17 -0
  105. data/examples/i18n/lt/features/division.feature +10 -0
  106. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  107. data/examples/i18n/lt/lib/calculator.rb +14 -0
  108. data/examples/i18n/lv/Rakefile +6 -0
  109. data/examples/i18n/lv/features/addition.feature +17 -0
  110. data/examples/i18n/lv/features/division.feature +10 -0
  111. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/lv/lib/calculator.rb +14 -0
  113. data/examples/i18n/no/Rakefile +6 -0
  114. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  115. data/examples/i18n/no/features/summering.feature +19 -0
  116. data/examples/i18n/no/features/support/env.rb +6 -0
  117. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  118. data/examples/i18n/pl/Rakefile +6 -0
  119. data/examples/i18n/pl/features/addition.feature +17 -0
  120. data/examples/i18n/pl/features/division.feature +10 -0
  121. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  122. data/examples/i18n/pl/features/support/env.rb +6 -0
  123. data/examples/i18n/pl/lib/calculator.rb +14 -0
  124. data/examples/i18n/pt/Rakefile +6 -0
  125. data/examples/i18n/pt/features/adicao.feature +11 -0
  126. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  127. data/examples/i18n/pt/features/support/env.rb +6 -0
  128. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  129. data/examples/i18n/ro/Rakefile +6 -0
  130. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  131. data/examples/i18n/ro/features/suma.feature +11 -0
  132. data/examples/i18n/ro/lib/calculator.rb +11 -0
  133. data/examples/i18n/ru/Rakefile +6 -0
  134. data/examples/i18n/ru/features/addition.feature +11 -0
  135. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  136. data/examples/i18n/ru/features/division.feature +16 -0
  137. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  138. data/examples/i18n/ru/features/support/env.rb +6 -0
  139. data/examples/i18n/ru/features/support/world.rb +8 -0
  140. data/examples/i18n/ru/lib/calculator.rb +24 -0
  141. data/examples/i18n/se/Rakefile +6 -0
  142. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
  143. data/examples/i18n/se/features/summering.feature +18 -0
  144. data/examples/i18n/se/lib/kalkulator.rb +11 -0
  145. data/examples/i18n/sk/Rakefile +6 -0
  146. data/examples/i18n/sk/features/addition.feature +17 -0
  147. data/examples/i18n/sk/features/division.feature +10 -0
  148. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  149. data/examples/i18n/sk/lib/calculator.rb +14 -0
  150. data/examples/i18n/uz/Rakefile +6 -0
  151. data/examples/i18n/uz/features/addition.feature +10 -0
  152. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  153. data/examples/i18n/uz/features/division.feature +17 -0
  154. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  155. data/examples/i18n/uz/features/support/env.rb +6 -0
  156. data/examples/i18n/uz/features/support/world.rb +8 -0
  157. data/examples/i18n/uz/lib/calculator.rb +24 -0
  158. data/examples/i18n/zh-CN/Rakefile +6 -0
  159. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  160. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  161. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  162. data/examples/i18n/zh-TW/Rakefile +6 -0
  163. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  164. data/examples/i18n/zh-TW/features/division.feature +11 -0
  165. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  166. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  167. data/examples/java/README.textile +18 -0
  168. data/examples/java/build.xml +33 -0
  169. data/examples/java/features/hello.feature +11 -0
  170. data/examples/java/features/step_definitons/hello_steps.rb +23 -0
  171. data/examples/java/features/step_definitons/tree_steps.rb +14 -0
  172. data/examples/java/features/tree.feature +9 -0
  173. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  174. data/examples/junit/features/one_passing_one_failing.feature +8 -0
  175. data/examples/junit/features/pending.feature +5 -0
  176. data/examples/junit/features/step_definitions/steps.rb +11 -0
  177. data/examples/pure_java/README.textile +5 -0
  178. data/examples/python/features/fibonacci.feature +19 -0
  179. data/examples/python/features/step_definitions/fib_steps.py +3 -0
  180. data/examples/python/features/step_definitions/fib_steps.rb +7 -0
  181. data/examples/python/features/support/env.rb +21 -0
  182. data/examples/python/lib/fib.py +7 -0
  183. data/examples/selenium/Rakefile +6 -0
  184. data/examples/selenium/features/search.feature +9 -0
  185. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  186. data/examples/selenium/features/support/env.rb +19 -0
  187. data/examples/selenium_webrat/Rakefile +6 -0
  188. data/examples/selenium_webrat/config.ru +0 -0
  189. data/examples/selenium_webrat/features/search.feature +9 -0
  190. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  191. data/examples/selenium_webrat/features/support/env.rb +45 -0
  192. data/examples/self_test/README.textile +6 -0
  193. data/examples/self_test/Rakefile +6 -0
  194. data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
  195. data/examples/self_test/features/background/background_with_name.feature +7 -0
  196. data/examples/self_test/features/background/failing_background.feature +12 -0
  197. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  198. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  199. data/examples/self_test/features/background/passing_background.feature +10 -0
  200. data/examples/self_test/features/background/pending_background.feature +10 -0
  201. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  202. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  203. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  204. data/examples/self_test/features/failing_expectation.feature +4 -0
  205. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  206. data/examples/self_test/features/multiline_name.feature +27 -0
  207. data/examples/self_test/features/outline_sample.feature +15 -0
  208. data/examples/self_test/features/sample.feature +21 -0
  209. data/examples/self_test/features/search_sample.feature +32 -0
  210. data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
  211. data/examples/self_test/features/support/env.rb +24 -0
  212. data/examples/self_test/features/tags_sample.feature +17 -0
  213. data/examples/self_test/features/tons_of_cukes.feature +52 -0
  214. data/examples/self_test/features/transform_sample.feature +10 -0
  215. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  216. data/examples/self_test/list-of-features.txt +1 -0
  217. data/examples/sinatra/README.textile +13 -0
  218. data/examples/sinatra/Rakefile +6 -0
  219. data/examples/sinatra/app.rb +14 -0
  220. data/examples/sinatra/features/add.feature +11 -0
  221. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  222. data/examples/sinatra/features/support/env.rb +32 -0
  223. data/examples/sinatra/views/add.erb +5 -0
  224. data/examples/sinatra/views/layout.erb +8 -0
  225. data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  226. data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  227. data/examples/test_unit/Rakefile +6 -0
  228. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  229. data/examples/test_unit/features/test_unit.feature +9 -0
  230. data/examples/tickets/Rakefile +16 -0
  231. data/examples/tickets/features/172.feature +28 -0
  232. data/examples/tickets/features/177/1.feature +29 -0
  233. data/examples/tickets/features/177/2.feature +21 -0
  234. data/examples/tickets/features/177/3.feature +18 -0
  235. data/examples/tickets/features/180.feature +7 -0
  236. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  237. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  238. data/examples/tickets/features/236.feature +13 -0
  239. data/examples/tickets/features/241.feature +13 -0
  240. data/examples/tickets/features/246.feature +4 -0
  241. data/examples/tickets/features/248.feature +11 -0
  242. data/examples/tickets/features/270/back.feature +14 -0
  243. data/examples/tickets/features/270/back.steps.rb +14 -0
  244. data/examples/tickets/features/272/hooks.feature +26 -0
  245. data/examples/tickets/features/272/hooks_steps.rb +53 -0
  246. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  247. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  248. data/examples/tickets/features/279/wrong.feature_ +11 -0
  249. data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  250. data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  251. data/examples/tickets/features/306/only_background.feature +4 -0
  252. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  253. data/examples/tickets/features/lib/pantry.rb +20 -0
  254. data/examples/tickets/features/scenario_outline.feature +95 -0
  255. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  256. data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
  257. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  258. data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
  259. data/examples/tickets/features/table_diffing.feature +13 -0
  260. data/examples/tickets/features/tickets.feature +28 -0
  261. data/examples/watir/README.textile +16 -0
  262. data/examples/watir/Rakefile +6 -0
  263. data/examples/watir/features/search.feature +12 -0
  264. data/examples/watir/features/step_definitons/search_steps.rb +26 -0
  265. data/examples/watir/features/support/env.rb +32 -0
  266. data/features/background.feature +311 -0
  267. data/features/bug_371.feature +32 -0
  268. data/features/cucumber_cli.feature +667 -0
  269. data/features/cucumber_cli_diff_disabled.feature +54 -0
  270. data/features/cucumber_cli_outlines.feature +109 -0
  271. data/features/custom_formatter.feature +11 -0
  272. data/features/drb_server_integration.feature +173 -0
  273. data/features/exception_in_after_block.feature +102 -0
  274. data/features/exception_in_after_step_block.feature +104 -0
  275. data/features/exception_in_before_block.feature +47 -0
  276. data/features/exclude_files.feature +20 -0
  277. data/features/expand.feature +49 -0
  278. data/features/html_formatter/a.html +183 -0
  279. data/features/html_formatter.feature +7 -0
  280. data/features/junit_formatter.feature +89 -0
  281. data/features/language_from_header.feature +30 -0
  282. data/features/multiline_names.feature +43 -0
  283. data/features/post_configuration_hook.feature +37 -0
  284. data/features/profiles.feature +112 -0
  285. data/features/rake_task.feature +178 -0
  286. data/features/report_called_undefined_steps.feature +35 -0
  287. data/features/snippet.feature +22 -0
  288. data/features/step_definitions/cucumber_steps.rb +154 -0
  289. data/features/step_definitions/extra_steps.rb +2 -0
  290. data/features/steps_formatter.feature +25 -0
  291. data/features/support/env.rb +139 -0
  292. data/features/table_diffing.feature +45 -0
  293. data/features/transform.feature +24 -0
  294. data/features/unicode_table.feature +35 -0
  295. data/features/usage.feature +132 -0
  296. data/features/work_in_progress.feature +158 -0
  297. data/gem_tasks/contributors.rake +12 -0
  298. data/gem_tasks/deployment.rake +11 -0
  299. data/gem_tasks/environment.rake +7 -0
  300. data/gem_tasks/features.rake +11 -0
  301. data/gem_tasks/fix_cr_lf.rake +10 -0
  302. data/gem_tasks/flog.rake +4 -0
  303. data/gem_tasks/gemspec.rake +10 -0
  304. data/gem_tasks/rspec.rake +45 -0
  305. data/gem_tasks/sass.rake +4 -0
  306. data/gem_tasks/sdoc.rake +7 -0
  307. data/lib/README.rdoc +12 -0
  308. data/lib/autotest/cucumber.rb +6 -0
  309. data/lib/autotest/cucumber_mixin.rb +125 -0
  310. data/lib/autotest/cucumber_rails.rb +6 -0
  311. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  312. data/lib/autotest/cucumber_rspec.rb +6 -0
  313. data/lib/autotest/discover.rb +9 -0
  314. data/lib/cucumber/ast/background.rb +63 -0
  315. data/lib/cucumber/ast/comment.rb +31 -0
  316. data/lib/cucumber/ast/examples.rb +32 -0
  317. data/lib/cucumber/ast/feature.rb +81 -0
  318. data/lib/cucumber/ast/feature_element.rb +61 -0
  319. data/lib/cucumber/ast/features.rb +40 -0
  320. data/lib/cucumber/ast/outline_table.rb +146 -0
  321. data/lib/cucumber/ast/py_string.rb +57 -0
  322. data/lib/cucumber/ast/scenario.rb +108 -0
  323. data/lib/cucumber/ast/scenario_outline.rb +96 -0
  324. data/lib/cucumber/ast/step.rb +116 -0
  325. data/lib/cucumber/ast/step_collection.rb +76 -0
  326. data/lib/cucumber/ast/step_invocation.rb +166 -0
  327. data/lib/cucumber/ast/table.rb +626 -0
  328. data/lib/cucumber/ast/tags.rb +44 -0
  329. data/lib/cucumber/ast/visitor.rb +115 -0
  330. data/lib/cucumber/ast.rb +29 -0
  331. data/lib/cucumber/broadcaster.rb +13 -0
  332. data/lib/cucumber/cli/configuration.rb +190 -0
  333. data/lib/cucumber/cli/drb_client.rb +26 -0
  334. data/lib/cucumber/cli/language_help_formatter.rb +61 -0
  335. data/lib/cucumber/cli/main.rb +116 -0
  336. data/lib/cucumber/cli/options.rb +394 -0
  337. data/lib/cucumber/cli/profile_loader.rb +70 -0
  338. data/lib/cucumber/constantize.rb +28 -0
  339. data/lib/cucumber/core_ext/instance_exec.rb +93 -0
  340. data/lib/cucumber/core_ext/proc.rb +29 -0
  341. data/lib/cucumber/core_ext/string.rb +48 -0
  342. data/lib/cucumber/feature_file.rb +54 -0
  343. data/lib/cucumber/filter.rb +52 -0
  344. data/lib/cucumber/formatter/ansicolor.rb +143 -0
  345. data/lib/cucumber/formatter/color_io.rb +23 -0
  346. data/lib/cucumber/formatter/console.rb +185 -0
  347. data/lib/cucumber/formatter/cucumber.css +132 -0
  348. data/lib/cucumber/formatter/cucumber.sass +139 -0
  349. data/lib/cucumber/formatter/duration.rb +13 -0
  350. data/lib/cucumber/formatter/html.rb +261 -0
  351. data/lib/cucumber/formatter/junit.rb +121 -0
  352. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  353. data/lib/cucumber/formatter/pdf.rb +217 -0
  354. data/lib/cucumber/formatter/pretty.rb +222 -0
  355. data/lib/cucumber/formatter/profile.rb +78 -0
  356. data/lib/cucumber/formatter/progress.rb +67 -0
  357. data/lib/cucumber/formatter/rerun.rb +46 -0
  358. data/lib/cucumber/formatter/steps.rb +50 -0
  359. data/lib/cucumber/formatter/tag_cloud.rb +29 -0
  360. data/lib/cucumber/formatter/unicode.rb +35 -0
  361. data/lib/cucumber/formatter/usage.rb +86 -0
  362. data/lib/cucumber/formatters/unicode.rb +7 -0
  363. data/lib/cucumber/language_support/language_methods.rb +75 -0
  364. data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
  365. data/lib/cucumber/language_support.rb +30 -0
  366. data/lib/cucumber/languages.yml +561 -0
  367. data/lib/cucumber/parser/feature.rb +1838 -0
  368. data/lib/cucumber/parser/feature.tt +351 -0
  369. data/lib/cucumber/parser/i18n.tt +42 -0
  370. data/lib/cucumber/parser/natural_language.rb +72 -0
  371. data/lib/cucumber/parser/table.rb +417 -0
  372. data/lib/cucumber/parser/table.tt +71 -0
  373. data/lib/cucumber/parser/treetop_ext.rb +53 -0
  374. data/lib/cucumber/parser.rb +6 -0
  375. data/lib/cucumber/platform.rb +27 -0
  376. data/lib/cucumber/py_support/py_dsl.py +8 -0
  377. data/lib/cucumber/py_support/py_language.py +2 -0
  378. data/lib/cucumber/py_support/py_language.rb +68 -0
  379. data/lib/cucumber/rails/rspec.rb +10 -0
  380. data/lib/cucumber/rails/world.rb +100 -0
  381. data/lib/cucumber/rake/task.rb +241 -0
  382. data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
  383. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  384. data/lib/cucumber/rb_support/rb_language.rb +153 -0
  385. data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
  386. data/lib/cucumber/rb_support/rb_world.rb +93 -0
  387. data/lib/cucumber/rspec_neuter.rb +23 -0
  388. data/lib/cucumber/step_match.rb +61 -0
  389. data/lib/cucumber/step_mother.rb +307 -0
  390. data/lib/cucumber/version.rb +10 -0
  391. data/lib/cucumber/webrat/element_locator.rb +87 -0
  392. data/lib/cucumber/webrat/table_locator.rb +1 -0
  393. data/lib/cucumber.rb +10 -0
  394. data/rails_generators/cucumber/USAGE +11 -0
  395. data/rails_generators/cucumber/cucumber_generator.rb +70 -0
  396. data/rails_generators/cucumber/templates/cucumber +9 -0
  397. data/rails_generators/cucumber/templates/cucumber.rake +36 -0
  398. data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
  399. data/rails_generators/cucumber/templates/env.rb +27 -0
  400. data/rails_generators/cucumber/templates/paths.rb +27 -0
  401. data/rails_generators/cucumber/templates/spork_env.rb +35 -0
  402. data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
  403. data/rails_generators/feature/USAGE +12 -0
  404. data/rails_generators/feature/feature_generator.rb +40 -0
  405. data/rails_generators/feature/templates/feature.erb +31 -0
  406. data/rails_generators/feature/templates/steps.erb +14 -0
  407. data/spec/cucumber/ast/background_spec.rb +60 -0
  408. data/spec/cucumber/ast/feature_element_spec.rb +40 -0
  409. data/spec/cucumber/ast/feature_factory.rb +62 -0
  410. data/spec/cucumber/ast/feature_spec.rb +44 -0
  411. data/spec/cucumber/ast/py_string_spec.rb +51 -0
  412. data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
  413. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  414. data/spec/cucumber/ast/step_collection_spec.rb +17 -0
  415. data/spec/cucumber/ast/step_spec.rb +66 -0
  416. data/spec/cucumber/ast/table_spec.rb +394 -0
  417. data/spec/cucumber/broadcaster_spec.rb +15 -0
  418. data/spec/cucumber/cli/configuration_spec.rb +396 -0
  419. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  420. data/spec/cucumber/cli/main_spec.rb +172 -0
  421. data/spec/cucumber/cli/options_spec.rb +331 -0
  422. data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
  423. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  424. data/spec/cucumber/core_ext/string_spec.rb +43 -0
  425. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  426. data/spec/cucumber/formatter/color_io_spec.rb +27 -0
  427. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  428. data/spec/cucumber/formatter/html_spec.rb +18 -0
  429. data/spec/cucumber/formatter/progress_spec.rb +33 -0
  430. data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
  431. data/spec/cucumber/parser/table_parser_spec.rb +52 -0
  432. data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
  433. data/spec/cucumber/rails/stubs/test_help.rb +1 -0
  434. data/spec/cucumber/rails/world_spec.rb +16 -0
  435. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
  436. data/spec/cucumber/sell_cucumbers.feature +19 -0
  437. data/spec/cucumber/step_mother_spec.rb +282 -0
  438. data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
  439. data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
  440. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  441. data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
  442. data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
  443. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  444. data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
  445. data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
  446. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  447. data/spec/cucumber/treetop_parser/spaces.feature +12 -0
  448. data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
  449. data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
  450. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  451. data/spec/cucumber/world/pending_spec.rb +46 -0
  452. data/spec/spec.opts +4 -0
  453. data/spec/spec_helper.rb +18 -0
  454. metadata +561 -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,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,72 @@
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 = Visitor.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
+ visitor = Formatter::Pretty.new(@step_mother, STDOUT, {:comment => true, :include_tags => {}, :exclude_tags => {}})
68
+ visitor.visit_feature_element(@scenario_outline)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,43 @@
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 = Visitor.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
+ @visitor.visit_feature_element(scenario)
37
+
38
+ $y.should == nil
39
+ end
40
+
41
+ end
42
+ end
43
+ 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,394 @@
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 "#transpose" do
66
+ before(:each) do
67
+ @table = Table.new([
68
+ %w{one 1111},
69
+ %w{two 22222}
70
+ ])
71
+ end
72
+
73
+ it "should be convertible in to an array where each row is a hash" do
74
+ @table.transpose.hashes[0].should == {'one' => '1111', 'two' => '22222'}
75
+ end
76
+ end
77
+
78
+ describe "#rows_hash" do
79
+
80
+ it "should return a hash of the rows" do
81
+ table = Table.new([
82
+ %w{one 1111},
83
+ %w{two 22222}
84
+ ])
85
+ table.rows_hash.should == {'one' => '1111', 'two' => '22222'}
86
+ end
87
+
88
+ it "should fail if the table doesn't have two columns" do
89
+ faulty_table = Table.new([
90
+ %w{one 1111 abc},
91
+ %w{two 22222 def}
92
+ ])
93
+ lambda {
94
+ faulty_table.rows_hash
95
+ }.should raise_error('The table must have exactly 2 columns')
96
+ end
97
+ end
98
+
99
+ describe '#map_headers' do
100
+ it "renames the columns to the specified values in the provided hash" do
101
+ table2 = @table.map_headers('one' => :three)
102
+ table2.hashes.first[:three].should == '4444'
103
+ end
104
+
105
+ it "allows renaming columns using regexp" do
106
+ table2 = @table.map_headers(/one|uno/ => :three)
107
+ table2.hashes.first[:three].should == '4444'
108
+ end
109
+
110
+ it "copies column mappings" do
111
+ @table.map_column!('one') { |v| v.to_i }
112
+ table2 = @table.map_headers('one' => 'three')
113
+ table2.hashes.first['three'].should == 4444
114
+ end
115
+
116
+ it "takes a block and operates on all the headers with it" do
117
+ table = Table.new([
118
+ ['HELLO', 'WORLD'],
119
+ %w{4444 55555}
120
+ ])
121
+
122
+ table.map_headers! do |header|
123
+ header.downcase
124
+ end
125
+
126
+ table.hashes.first.keys.should =~ %w[hello world]
127
+ end
128
+
129
+ it "treats the mappings in the provided hash as overrides when used with a block" do
130
+ table = Table.new([
131
+ ['HELLO', 'WORLD'],
132
+ %w{4444 55555}
133
+ ])
134
+
135
+ table.map_headers!('WORLD' => 'foo') do |header|
136
+ header.downcase
137
+ end
138
+
139
+ table.hashes.first.keys.should =~ %w[hello foo]
140
+ end
141
+
142
+ end
143
+
144
+ describe "replacing arguments" do
145
+
146
+ before(:each) do
147
+ @table = Table.new([
148
+ %w{qty book},
149
+ %w{<qty> <book>}
150
+ ])
151
+ end
152
+
153
+ it "should return a new table with arguments replaced with values" do
154
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => 'Unbearable lightness of being', '<qty>' => '5'})
155
+
156
+ table_with_replaced_args.hashes[0]['book'].should == 'Unbearable lightness of being'
157
+ table_with_replaced_args.hashes[0]['qty'].should == '5'
158
+ end
159
+
160
+ it "should recognise when entire cell is delimited" do
161
+ @table.should have_text('<book>')
162
+ end
163
+
164
+ it "should recognise when just a subset of a cell is delimited" do
165
+ table = Table.new([
166
+ %w{qty book},
167
+ [nil, "This is <who>'s book"]
168
+ ])
169
+ table.should have_text('<who>')
170
+ end
171
+
172
+ it "should replace nil values with nil" do
173
+ table_with_replaced_args = @table.arguments_replaced({'<book>' => nil})
174
+
175
+ table_with_replaced_args.hashes[0]['book'].should == nil
176
+ end
177
+
178
+ it "should preserve values which don't match a placeholder when replacing with nil" do
179
+ table = Table.new([
180
+ %w{book},
181
+ %w{cat}
182
+ ])
183
+ table_with_replaced_args = table.arguments_replaced({'<book>' => nil})
184
+
185
+ table_with_replaced_args.hashes[0]['book'].should == 'cat'
186
+ end
187
+
188
+ it "should not change the original table" do
189
+ @table.arguments_replaced({'<book>' => 'Unbearable lightness of being'})
190
+
191
+ @table.hashes[0]['book'].should_not == 'Unbearable lightness of being'
192
+ end
193
+
194
+ it "should not raise an error when there are nil values in the table" do
195
+ table = Table.new([
196
+ ['book', 'qty'],
197
+ ['<book>', nil],
198
+ ])
199
+ lambda{
200
+ table.arguments_replaced({'<book>' => nil, '<qty>' => '5'})
201
+ }.should_not raise_error
202
+ end
203
+
204
+ end
205
+
206
+ describe "diff!" do
207
+ it "should detect a complex diff" do
208
+ t1 = table(%{
209
+ | 1 | 22 | 333 | 4444 |
210
+ | 55555 | 666666 | 7777777 | 88888888 |
211
+ | 999999999 | 0000000000 | 01010101010 | 121212121212 |
212
+ | 4000 | ABC | DEF | 50000 |
213
+ })
214
+
215
+ t2 = table(%{
216
+ | a | 4444 | 1 |
217
+ | bb | 88888888 | 55555 |
218
+ | ccc | xxxxxxxx | 999999999 |
219
+ | dddd | 4000 | 300 |
220
+ | e | 50000 | 4000 |
221
+ })
222
+ lambda{t1.diff!(t2)}.should raise_error
223
+ t1.to_s(:indent => 12, :color => false).should == %{
224
+ | 1 | (-) 22 | (-) 333 | 4444 | (+) a |
225
+ | 55555 | (-) 666666 | (-) 7777777 | 88888888 | (+) bb |
226
+ | (-) 999999999 | (-) 0000000000 | (-) 01010101010 | (-) 121212121212 | (+) |
227
+ | (+) 999999999 | (+) | (+) | (+) xxxxxxxx | (+) ccc |
228
+ | (+) 300 | (+) | (+) | (+) 4000 | (+) dddd |
229
+ | 4000 | (-) ABC | (-) DEF | 50000 | (+) e |
230
+ }
231
+ end
232
+
233
+ it "should not change table when diffed with identical" do
234
+ t = table(%{
235
+ |a|b|c|
236
+ |d|e|f|
237
+ |g|h|i|
238
+ })
239
+ t.diff!(t.dup)
240
+ t.to_s(:indent => 12, :color => false).should == %{
241
+ | a | b | c |
242
+ | d | e | f |
243
+ | g | h | i |
244
+ }
245
+ end
246
+
247
+ it "should inspect missing and surplus cells" do
248
+ t1 = Table.new([
249
+ ['name', 'male', 'lastname', 'swedish'],
250
+ ['aslak', 'true', 'hellesøy', 'false']
251
+ ])
252
+ t2 = Table.new([
253
+ ['name', 'male', 'lastname', 'swedish'],
254
+ ['aslak', true, 'hellesøy', false]
255
+ ])
256
+ lambda{t1.diff!(t2)}.should raise_error
257
+ t1.to_s(:indent => 12, :color => false).should == %{
258
+ | name | male | lastname | swedish |
259
+ | (-) aslak | (-) (i) "true" | (-) hellesøy | (-) (i) "false" |
260
+ | (+) aslak | (+) (i) true | (+) hellesøy | (+) (i) false |
261
+ }
262
+ end
263
+
264
+ it "should allow column mapping of target before diffing" do
265
+ t1 = Table.new([
266
+ ['name', 'male'],
267
+ ['aslak', 'true']
268
+ ])
269
+ t1.map_column!('male') { |m| m == 'true' }
270
+ t2 = Table.new([
271
+ ['name', 'male'],
272
+ ['aslak', true]
273
+ ])
274
+ t1.diff!(t2)
275
+ t1.to_s(:indent => 12, :color => false).should == %{
276
+ | name | male |
277
+ | aslak | true |
278
+ }
279
+ end
280
+
281
+ it "should allow column mapping of argument before diffing" do
282
+ t1 = Table.new([
283
+ ['name', 'male'],
284
+ ['aslak', true]
285
+ ])
286
+ t1.map_column!('male') {
287
+ 'true'
288
+ }
289
+ t2 = Table.new([
290
+ ['name', 'male'],
291
+ ['aslak', 'true']
292
+ ])
293
+ t2.diff!(t1)
294
+ t1.to_s(:indent => 12, :color => false).should == %{
295
+ | name | male |
296
+ | aslak | true |
297
+ }
298
+ end
299
+
300
+ it "should allow header mapping before diffing" do
301
+ t1 = Table.new([
302
+ ['Name', 'Male'],
303
+ ['aslak', 'true']
304
+ ])
305
+ t1.map_headers!('Name' => 'name', 'Male' => 'male')
306
+ t1.map_column!('male') { |m| m == 'true' }
307
+ t2 = Table.new([
308
+ ['name', 'male'],
309
+ ['aslak', true]
310
+ ])
311
+ t1.diff!(t2)
312
+ t1.to_s(:indent => 12, :color => false).should == %{
313
+ | name | male |
314
+ | aslak | true |
315
+ }
316
+ end
317
+
318
+ it "should not allow mappings that match more than 1 column" do
319
+ t1 = Table.new([
320
+ ['Cuke', 'Duke'],
321
+ ['Foo', 'Bar']
322
+ ])
323
+ lambda do
324
+ t1.map_headers!(/uk/ => 'u')
325
+ end.should raise_error(%{2 headers matched /uk/: ["Cuke", "Duke"]})
326
+ end
327
+
328
+ describe "raising" do
329
+ before do
330
+ @t = table(%{
331
+ | a | b |
332
+ | c | d |
333
+ })
334
+ end
335
+
336
+ it "should raise on missing rows" do
337
+ t = table(%{
338
+ | a | b |
339
+ })
340
+ lambda { @t.dup.diff!(t) }.should raise_error
341
+ lambda { @t.dup.diff!(t, :missing_row => false) }.should_not raise_error
342
+ end
343
+
344
+ it "should raise on surplus rows" do
345
+ t = table(%{
346
+ | a | b |
347
+ | c | d |
348
+ | e | f |
349
+ })
350
+ lambda { @t.dup.diff!(t) }.should raise_error
351
+ lambda { @t.dup.diff!(t, :surplus_row => false) }.should_not raise_error
352
+ end
353
+
354
+ it "should raise on missing columns" do
355
+ t = table(%{
356
+ | a |
357
+ | c |
358
+ })
359
+ lambda { @t.dup.diff!(t) }.should raise_error
360
+ lambda { @t.dup.diff!(t, :missing_col => false) }.should_not raise_error
361
+ end
362
+
363
+ it "should not raise on surplus columns" do
364
+ t = table(%{
365
+ | a | b | x |
366
+ | c | d | y |
367
+ })
368
+ lambda { @t.dup.diff!(t) }.should_not raise_error
369
+ lambda { @t.dup.diff!(t, :surplus_col => true) }.should raise_error
370
+ end
371
+ end
372
+
373
+ def table(text, file=nil, line_offset=0)
374
+ @table_parser ||= Parser::TableParser.new
375
+ @table_parser.parse_or_fail(text.strip, file, line_offset)
376
+ end
377
+ end
378
+
379
+ it "should convert to sexp" do
380
+ @table.to_sexp.should ==
381
+ [:table,
382
+ [:row, -1,
383
+ [:cell, "one"],
384
+ [:cell, "four"],
385
+ [:cell, "seven"]
386
+ ],
387
+ [:row, -1,
388
+ [:cell, "4444"],
389
+ [:cell, "55555"],
390
+ [:cell, "666666"]]]
391
+ end
392
+ end
393
+ end
394
+ end