busser-behave 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (418) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +0 -0
  3. data/.gitignore +17 -0
  4. data/.tailor +4 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +15 -0
  9. data/README.md +41 -0
  10. data/Rakefile +68 -0
  11. data/busser-behave.gemspec +30 -0
  12. data/features/plugin_install_command.feature +11 -0
  13. data/features/plugin_list_command.feature +8 -0
  14. data/features/support/env.rb +13 -0
  15. data/features/test_command.feature +31 -0
  16. data/lib/busser/behave/version.rb +26 -0
  17. data/lib/busser/runner_plugin/behave.rb +37 -0
  18. data/vendor/behave/CHANGES.rst +483 -0
  19. data/vendor/behave/LICENSE +23 -0
  20. data/vendor/behave/MANIFEST.in +37 -0
  21. data/vendor/behave/PROJECT_INFO.rst +21 -0
  22. data/vendor/behave/README.rst +112 -0
  23. data/vendor/behave/VERSION.txt +1 -0
  24. data/vendor/behave/behave.ini +22 -0
  25. data/vendor/behave/behave/__init__.py +30 -0
  26. data/vendor/behave/behave/__main__.py +187 -0
  27. data/vendor/behave/behave/_stepimport.py +185 -0
  28. data/vendor/behave/behave/_types.py +134 -0
  29. data/vendor/behave/behave/api/__init__.py +7 -0
  30. data/vendor/behave/behave/api/async_step.py +283 -0
  31. data/vendor/behave/behave/capture.py +227 -0
  32. data/vendor/behave/behave/compat/__init__.py +5 -0
  33. data/vendor/behave/behave/compat/collections.py +20 -0
  34. data/vendor/behave/behave/configuration.py +788 -0
  35. data/vendor/behave/behave/contrib/__init__.py +0 -0
  36. data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
  37. data/vendor/behave/behave/formatter/__init__.py +12 -0
  38. data/vendor/behave/behave/formatter/_builtins.py +39 -0
  39. data/vendor/behave/behave/formatter/_registry.py +135 -0
  40. data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
  41. data/vendor/behave/behave/formatter/base.py +200 -0
  42. data/vendor/behave/behave/formatter/formatters.py +57 -0
  43. data/vendor/behave/behave/formatter/json.py +253 -0
  44. data/vendor/behave/behave/formatter/null.py +12 -0
  45. data/vendor/behave/behave/formatter/plain.py +158 -0
  46. data/vendor/behave/behave/formatter/pretty.py +351 -0
  47. data/vendor/behave/behave/formatter/progress.py +287 -0
  48. data/vendor/behave/behave/formatter/rerun.py +114 -0
  49. data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
  50. data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
  51. data/vendor/behave/behave/formatter/steps.py +497 -0
  52. data/vendor/behave/behave/formatter/tags.py +178 -0
  53. data/vendor/behave/behave/i18n.py +614 -0
  54. data/vendor/behave/behave/importer.py +102 -0
  55. data/vendor/behave/behave/json_parser.py +264 -0
  56. data/vendor/behave/behave/log_capture.py +233 -0
  57. data/vendor/behave/behave/matchers.py +402 -0
  58. data/vendor/behave/behave/model.py +1737 -0
  59. data/vendor/behave/behave/model_core.py +416 -0
  60. data/vendor/behave/behave/model_describe.py +105 -0
  61. data/vendor/behave/behave/parser.py +615 -0
  62. data/vendor/behave/behave/reporter/__init__.py +0 -0
  63. data/vendor/behave/behave/reporter/base.py +45 -0
  64. data/vendor/behave/behave/reporter/junit.py +473 -0
  65. data/vendor/behave/behave/reporter/summary.py +94 -0
  66. data/vendor/behave/behave/runner.py +753 -0
  67. data/vendor/behave/behave/runner_util.py +417 -0
  68. data/vendor/behave/behave/step_registry.py +112 -0
  69. data/vendor/behave/behave/tag_expression.py +111 -0
  70. data/vendor/behave/behave/tag_matcher.py +465 -0
  71. data/vendor/behave/behave/textutil.py +137 -0
  72. data/vendor/behave/behave/userdata.py +130 -0
  73. data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
  74. data/vendor/behave/behave4cmd0/__init__.py +5 -0
  75. data/vendor/behave/behave4cmd0/__setup.py +11 -0
  76. data/vendor/behave/behave4cmd0/command_shell.py +216 -0
  77. data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
  78. data/vendor/behave/behave4cmd0/command_steps.py +532 -0
  79. data/vendor/behave/behave4cmd0/command_util.py +147 -0
  80. data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
  81. data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
  82. data/vendor/behave/behave4cmd0/log/steps.py +395 -0
  83. data/vendor/behave/behave4cmd0/note_steps.py +29 -0
  84. data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
  85. data/vendor/behave/behave4cmd0/pathutil.py +146 -0
  86. data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
  87. data/vendor/behave/behave4cmd0/textutil.py +304 -0
  88. data/vendor/behave/bin/behave +44 -0
  89. data/vendor/behave/bin/behave.cmd +10 -0
  90. data/vendor/behave/bin/behave.junit_filter.py +85 -0
  91. data/vendor/behave/bin/behave.step_durations.py +163 -0
  92. data/vendor/behave/bin/behave2cucumber_json.py +63 -0
  93. data/vendor/behave/bin/behave_cmd.py +44 -0
  94. data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
  95. data/vendor/behave/bin/explore_platform_encoding.py +24 -0
  96. data/vendor/behave/bin/i18n.yml +621 -0
  97. data/vendor/behave/bin/invoke +8 -0
  98. data/vendor/behave/bin/invoke.cmd +9 -0
  99. data/vendor/behave/bin/json.format.py +167 -0
  100. data/vendor/behave/bin/jsonschema_validate.py +122 -0
  101. data/vendor/behave/bin/make_localpi.py +279 -0
  102. data/vendor/behave/bin/project_bootstrap.sh +30 -0
  103. data/vendor/behave/bin/toxcmd.py +270 -0
  104. data/vendor/behave/bin/toxcmd3.py +270 -0
  105. data/vendor/behave/conftest.py +27 -0
  106. data/vendor/behave/docs/Makefile +154 -0
  107. data/vendor/behave/docs/_static/agogo.css +501 -0
  108. data/vendor/behave/docs/_static/behave_logo.png +0 -0
  109. data/vendor/behave/docs/_static/behave_logo1.png +0 -0
  110. data/vendor/behave/docs/_static/behave_logo2.png +0 -0
  111. data/vendor/behave/docs/_static/behave_logo3.png +0 -0
  112. data/vendor/behave/docs/_themes/LICENSE +45 -0
  113. data/vendor/behave/docs/_themes/kr/layout.html +17 -0
  114. data/vendor/behave/docs/_themes/kr/relations.html +19 -0
  115. data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
  116. data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
  117. data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
  118. data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
  119. data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
  120. data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
  121. data/vendor/behave/docs/api.rst +408 -0
  122. data/vendor/behave/docs/appendix.rst +19 -0
  123. data/vendor/behave/docs/behave.rst +640 -0
  124. data/vendor/behave/docs/behave.rst-template +86 -0
  125. data/vendor/behave/docs/behave_ecosystem.rst +81 -0
  126. data/vendor/behave/docs/comparison.rst +85 -0
  127. data/vendor/behave/docs/conf.py +293 -0
  128. data/vendor/behave/docs/context_attributes.rst +66 -0
  129. data/vendor/behave/docs/django.rst +192 -0
  130. data/vendor/behave/docs/formatters.rst +61 -0
  131. data/vendor/behave/docs/gherkin.rst +673 -0
  132. data/vendor/behave/docs/index.rst +57 -0
  133. data/vendor/behave/docs/install.rst +60 -0
  134. data/vendor/behave/docs/more_info.rst +184 -0
  135. data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
  136. data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
  137. data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
  138. data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
  139. data/vendor/behave/docs/parse_builtin_types.rst +59 -0
  140. data/vendor/behave/docs/philosophy.rst +235 -0
  141. data/vendor/behave/docs/regular_expressions.rst +71 -0
  142. data/vendor/behave/docs/related.rst +14 -0
  143. data/vendor/behave/docs/test_domains.rst +62 -0
  144. data/vendor/behave/docs/tutorial.rst +636 -0
  145. data/vendor/behave/docs/update_behave_rst.py +100 -0
  146. data/vendor/behave/etc/json/behave.json-schema +172 -0
  147. data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
  148. data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
  149. data/vendor/behave/examples/async_step/README.txt +8 -0
  150. data/vendor/behave/examples/async_step/behave.ini +14 -0
  151. data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
  152. data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
  153. data/vendor/behave/examples/async_step/features/environment.py +28 -0
  154. data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
  155. data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
  156. data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
  157. data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
  158. data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
  159. data/vendor/behave/examples/env_vars/README.rst +26 -0
  160. data/vendor/behave/examples/env_vars/behave.ini +15 -0
  161. data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
  162. data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
  163. data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
  164. data/vendor/behave/features/README.txt +12 -0
  165. data/vendor/behave/features/background.feature +392 -0
  166. data/vendor/behave/features/capture_stderr.feature +172 -0
  167. data/vendor/behave/features/capture_stdout.feature +125 -0
  168. data/vendor/behave/features/cmdline.lang_list.feature +33 -0
  169. data/vendor/behave/features/configuration.default_paths.feature +116 -0
  170. data/vendor/behave/features/context.global_params.feature +35 -0
  171. data/vendor/behave/features/context.local_params.feature +17 -0
  172. data/vendor/behave/features/directory_layout.advanced.feature +147 -0
  173. data/vendor/behave/features/directory_layout.basic.feature +75 -0
  174. data/vendor/behave/features/directory_layout.basic2.feature +87 -0
  175. data/vendor/behave/features/environment.py +53 -0
  176. data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
  177. data/vendor/behave/features/feature.description.feature +0 -0
  178. data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
  179. data/vendor/behave/features/formatter.help.feature +30 -0
  180. data/vendor/behave/features/formatter.json.feature +420 -0
  181. data/vendor/behave/features/formatter.progress3.feature +235 -0
  182. data/vendor/behave/features/formatter.rerun.feature +296 -0
  183. data/vendor/behave/features/formatter.steps.feature +181 -0
  184. data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
  185. data/vendor/behave/features/formatter.steps_doc.feature +140 -0
  186. data/vendor/behave/features/formatter.steps_usage.feature +404 -0
  187. data/vendor/behave/features/formatter.tags.feature +134 -0
  188. data/vendor/behave/features/formatter.tags_location.feature +183 -0
  189. data/vendor/behave/features/formatter.user_defined.feature +196 -0
  190. data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
  191. data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
  192. data/vendor/behave/features/logcapture.feature +188 -0
  193. data/vendor/behave/features/logcapture.filter.feature +130 -0
  194. data/vendor/behave/features/logging.no_capture.feature +99 -0
  195. data/vendor/behave/features/logging.setup_format.feature +157 -0
  196. data/vendor/behave/features/logging.setup_level.feature +168 -0
  197. data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
  198. data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
  199. data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
  200. data/vendor/behave/features/runner.abort_by_user.feature +305 -0
  201. data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
  202. data/vendor/behave/features/runner.default_format.feature +175 -0
  203. data/vendor/behave/features/runner.dry_run.feature +184 -0
  204. data/vendor/behave/features/runner.feature_listfile.feature +223 -0
  205. data/vendor/behave/features/runner.hook_errors.feature +382 -0
  206. data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
  207. data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
  208. data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
  209. data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
  210. data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
  211. data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
  212. data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
  213. data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
  214. data/vendor/behave/features/runner.tag_logic.feature +67 -0
  215. data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
  216. data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
  217. data/vendor/behave/features/scenario.description.feature +171 -0
  218. data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
  219. data/vendor/behave/features/scenario_outline.basics.feature +100 -0
  220. data/vendor/behave/features/scenario_outline.improved.feature +177 -0
  221. data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
  222. data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
  223. data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
  224. data/vendor/behave/features/step.async_steps.feature +225 -0
  225. data/vendor/behave/features/step.duplicated_step.feature +106 -0
  226. data/vendor/behave/features/step.execute_steps.feature +59 -0
  227. data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
  228. data/vendor/behave/features/step.import_other_step_module.feature +103 -0
  229. data/vendor/behave/features/step.pending_steps.feature +128 -0
  230. data/vendor/behave/features/step.undefined_steps.feature +307 -0
  231. data/vendor/behave/features/step.use_step_library.feature +44 -0
  232. data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
  233. data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
  234. data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
  235. data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
  236. data/vendor/behave/features/step_param.custom_types.feature +134 -0
  237. data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
  238. data/vendor/behave/features/steps/behave_context_steps.py +67 -0
  239. data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
  240. data/vendor/behave/features/steps/behave_model_util.py +105 -0
  241. data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
  242. data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
  243. data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
  244. data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
  245. data/vendor/behave/features/summary.undefined_steps.feature +114 -0
  246. data/vendor/behave/features/tags.active_tags.feature +385 -0
  247. data/vendor/behave/features/tags.default_tags.feature +104 -0
  248. data/vendor/behave/features/tags.tag_expression.feature +105 -0
  249. data/vendor/behave/features/userdata.feature +331 -0
  250. data/vendor/behave/invoke.yaml +21 -0
  251. data/vendor/behave/issue.features/README.txt +17 -0
  252. data/vendor/behave/issue.features/environment.py +97 -0
  253. data/vendor/behave/issue.features/issue0030.feature +21 -0
  254. data/vendor/behave/issue.features/issue0031.feature +16 -0
  255. data/vendor/behave/issue.features/issue0032.feature +28 -0
  256. data/vendor/behave/issue.features/issue0035.feature +74 -0
  257. data/vendor/behave/issue.features/issue0040.feature +154 -0
  258. data/vendor/behave/issue.features/issue0041.feature +135 -0
  259. data/vendor/behave/issue.features/issue0042.feature +230 -0
  260. data/vendor/behave/issue.features/issue0044.feature +51 -0
  261. data/vendor/behave/issue.features/issue0046.feature +77 -0
  262. data/vendor/behave/issue.features/issue0052.feature +66 -0
  263. data/vendor/behave/issue.features/issue0059.feature +29 -0
  264. data/vendor/behave/issue.features/issue0063.feature +102 -0
  265. data/vendor/behave/issue.features/issue0064.feature +97 -0
  266. data/vendor/behave/issue.features/issue0065.feature +18 -0
  267. data/vendor/behave/issue.features/issue0066.feature +80 -0
  268. data/vendor/behave/issue.features/issue0067.feature +90 -0
  269. data/vendor/behave/issue.features/issue0069.feature +64 -0
  270. data/vendor/behave/issue.features/issue0072.feature +32 -0
  271. data/vendor/behave/issue.features/issue0073.feature +228 -0
  272. data/vendor/behave/issue.features/issue0075.feature +18 -0
  273. data/vendor/behave/issue.features/issue0077.feature +89 -0
  274. data/vendor/behave/issue.features/issue0080.feature +49 -0
  275. data/vendor/behave/issue.features/issue0081.feature +138 -0
  276. data/vendor/behave/issue.features/issue0083.feature +69 -0
  277. data/vendor/behave/issue.features/issue0084.feature +69 -0
  278. data/vendor/behave/issue.features/issue0085.feature +119 -0
  279. data/vendor/behave/issue.features/issue0092.feature +66 -0
  280. data/vendor/behave/issue.features/issue0096.feature +173 -0
  281. data/vendor/behave/issue.features/issue0099.feature +130 -0
  282. data/vendor/behave/issue.features/issue0109.feature +60 -0
  283. data/vendor/behave/issue.features/issue0111.feature +53 -0
  284. data/vendor/behave/issue.features/issue0112.feature +64 -0
  285. data/vendor/behave/issue.features/issue0114.feature +118 -0
  286. data/vendor/behave/issue.features/issue0116.feature +71 -0
  287. data/vendor/behave/issue.features/issue0125.feature +49 -0
  288. data/vendor/behave/issue.features/issue0127.feature +64 -0
  289. data/vendor/behave/issue.features/issue0139.feature +67 -0
  290. data/vendor/behave/issue.features/issue0142.feature +37 -0
  291. data/vendor/behave/issue.features/issue0143.feature +54 -0
  292. data/vendor/behave/issue.features/issue0145.feature +63 -0
  293. data/vendor/behave/issue.features/issue0148.feature +105 -0
  294. data/vendor/behave/issue.features/issue0152.feature +52 -0
  295. data/vendor/behave/issue.features/issue0159.feature +74 -0
  296. data/vendor/behave/issue.features/issue0162.feature +86 -0
  297. data/vendor/behave/issue.features/issue0171.feature +16 -0
  298. data/vendor/behave/issue.features/issue0172.feature +51 -0
  299. data/vendor/behave/issue.features/issue0175.feature +91 -0
  300. data/vendor/behave/issue.features/issue0177.feature +40 -0
  301. data/vendor/behave/issue.features/issue0181.feature +36 -0
  302. data/vendor/behave/issue.features/issue0184.feature +144 -0
  303. data/vendor/behave/issue.features/issue0186.feature +12 -0
  304. data/vendor/behave/issue.features/issue0188.feature +60 -0
  305. data/vendor/behave/issue.features/issue0191.feature +178 -0
  306. data/vendor/behave/issue.features/issue0194.feature +215 -0
  307. data/vendor/behave/issue.features/issue0197.feature +11 -0
  308. data/vendor/behave/issue.features/issue0216.feature +129 -0
  309. data/vendor/behave/issue.features/issue0226.feature +51 -0
  310. data/vendor/behave/issue.features/issue0228.feature +41 -0
  311. data/vendor/behave/issue.features/issue0230.feature +46 -0
  312. data/vendor/behave/issue.features/issue0231.feature +77 -0
  313. data/vendor/behave/issue.features/issue0238.feature +52 -0
  314. data/vendor/behave/issue.features/issue0251.feature +15 -0
  315. data/vendor/behave/issue.features/issue0280.feature +118 -0
  316. data/vendor/behave/issue.features/issue0288.feature +95 -0
  317. data/vendor/behave/issue.features/issue0300.feature +49 -0
  318. data/vendor/behave/issue.features/issue0302.feature +91 -0
  319. data/vendor/behave/issue.features/issue0309.feature +52 -0
  320. data/vendor/behave/issue.features/issue0330.feature +124 -0
  321. data/vendor/behave/issue.features/issue0349.feature +9 -0
  322. data/vendor/behave/issue.features/issue0361.feature +79 -0
  323. data/vendor/behave/issue.features/issue0383.feature +76 -0
  324. data/vendor/behave/issue.features/issue0384.feature +103 -0
  325. data/vendor/behave/issue.features/issue0385.feature +109 -0
  326. data/vendor/behave/issue.features/issue0424.feature +66 -0
  327. data/vendor/behave/issue.features/issue0446.feature +116 -0
  328. data/vendor/behave/issue.features/issue0449.feature +42 -0
  329. data/vendor/behave/issue.features/issue0453.feature +42 -0
  330. data/vendor/behave/issue.features/issue0457.feature +65 -0
  331. data/vendor/behave/issue.features/issue0462.feature +38 -0
  332. data/vendor/behave/issue.features/issue0476.feature +39 -0
  333. data/vendor/behave/issue.features/issue0487.feature +92 -0
  334. data/vendor/behave/issue.features/issue0506.feature +77 -0
  335. data/vendor/behave/issue.features/issue0510.feature +51 -0
  336. data/vendor/behave/issue.features/requirements.txt +12 -0
  337. data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
  338. data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
  339. data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
  340. data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
  341. data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
  342. data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
  343. data/vendor/behave/more.features/tutorial.feature +6 -0
  344. data/vendor/behave/py.requirements/README.txt +5 -0
  345. data/vendor/behave/py.requirements/all.txt +16 -0
  346. data/vendor/behave/py.requirements/basic.txt +21 -0
  347. data/vendor/behave/py.requirements/develop.txt +28 -0
  348. data/vendor/behave/py.requirements/docs.txt +6 -0
  349. data/vendor/behave/py.requirements/json.txt +7 -0
  350. data/vendor/behave/py.requirements/more_py26.txt +8 -0
  351. data/vendor/behave/py.requirements/testing.txt +10 -0
  352. data/vendor/behave/pytest.ini +24 -0
  353. data/vendor/behave/setup.cfg +29 -0
  354. data/vendor/behave/setup.py +118 -0
  355. data/vendor/behave/setuptools_behave.py +130 -0
  356. data/vendor/behave/tasks/__behave.py +45 -0
  357. data/vendor/behave/tasks/__init__.py +55 -0
  358. data/vendor/behave/tasks/__main__.py +70 -0
  359. data/vendor/behave/tasks/_setup.py +135 -0
  360. data/vendor/behave/tasks/_vendor/README.rst +35 -0
  361. data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
  362. data/vendor/behave/tasks/_vendor/path.py +1725 -0
  363. data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
  364. data/vendor/behave/tasks/_vendor/six.py +868 -0
  365. data/vendor/behave/tasks/clean.py +246 -0
  366. data/vendor/behave/tasks/docs.py +97 -0
  367. data/vendor/behave/tasks/requirements.txt +17 -0
  368. data/vendor/behave/tasks/test.py +192 -0
  369. data/vendor/behave/test/__init__.py +0 -0
  370. data/vendor/behave/test/_importer_candidate.py +3 -0
  371. data/vendor/behave/test/reporters/__init__.py +0 -0
  372. data/vendor/behave/test/reporters/test_summary.py +240 -0
  373. data/vendor/behave/test/test_ansi_escapes.py +73 -0
  374. data/vendor/behave/test/test_configuration.py +172 -0
  375. data/vendor/behave/test/test_formatter.py +265 -0
  376. data/vendor/behave/test/test_formatter_progress.py +39 -0
  377. data/vendor/behave/test/test_formatter_rerun.py +97 -0
  378. data/vendor/behave/test/test_formatter_tags.py +57 -0
  379. data/vendor/behave/test/test_importer.py +151 -0
  380. data/vendor/behave/test/test_log_capture.py +29 -0
  381. data/vendor/behave/test/test_matchers.py +236 -0
  382. data/vendor/behave/test/test_model.py +871 -0
  383. data/vendor/behave/test/test_parser.py +1590 -0
  384. data/vendor/behave/test/test_runner.py +1074 -0
  385. data/vendor/behave/test/test_step_registry.py +96 -0
  386. data/vendor/behave/test/test_tag_expression.py +506 -0
  387. data/vendor/behave/test/test_tag_expression2.py +462 -0
  388. data/vendor/behave/test/test_tag_matcher.py +729 -0
  389. data/vendor/behave/test/test_userdata.py +184 -0
  390. data/vendor/behave/tests/README.txt +12 -0
  391. data/vendor/behave/tests/__init__.py +0 -0
  392. data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
  393. data/vendor/behave/tests/api/__init__.py +0 -0
  394. data/vendor/behave/tests/api/_test_async_step34.py +130 -0
  395. data/vendor/behave/tests/api/_test_async_step35.py +75 -0
  396. data/vendor/behave/tests/api/test_async_step.py +18 -0
  397. data/vendor/behave/tests/api/testing_support.py +94 -0
  398. data/vendor/behave/tests/api/testing_support_async.py +21 -0
  399. data/vendor/behave/tests/issues/test_issue0336.py +66 -0
  400. data/vendor/behave/tests/issues/test_issue0449.py +55 -0
  401. data/vendor/behave/tests/issues/test_issue0453.py +62 -0
  402. data/vendor/behave/tests/issues/test_issue0458.py +54 -0
  403. data/vendor/behave/tests/issues/test_issue0495.py +65 -0
  404. data/vendor/behave/tests/unit/__init__.py +0 -0
  405. data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
  406. data/vendor/behave/tests/unit/test_capture.py +280 -0
  407. data/vendor/behave/tests/unit/test_model_core.py +56 -0
  408. data/vendor/behave/tests/unit/test_textutil.py +267 -0
  409. data/vendor/behave/tools/test-features/background.feature +9 -0
  410. data/vendor/behave/tools/test-features/environment.py +8 -0
  411. data/vendor/behave/tools/test-features/french.feature +11 -0
  412. data/vendor/behave/tools/test-features/outline.feature +39 -0
  413. data/vendor/behave/tools/test-features/parse.feature +10 -0
  414. data/vendor/behave/tools/test-features/step-data.feature +60 -0
  415. data/vendor/behave/tools/test-features/steps/steps.py +120 -0
  416. data/vendor/behave/tools/test-features/tags.feature +18 -0
  417. data/vendor/behave/tox.ini +159 -0
  418. metadata +562 -0
@@ -0,0 +1,1590 @@
1
+ #-*- coding: UTF-8 -*-
2
+
3
+ from __future__ import absolute_import
4
+ from nose.tools import *
5
+
6
+ from behave import i18n, model, parser
7
+
8
+ class Common(object):
9
+ def compare_steps(self, steps, expected):
10
+ have = [(s.step_type, s.keyword, s.name, s.text, s.table) for s in steps]
11
+ eq_(have, expected)
12
+
13
+ class TestParser(Common):
14
+ def test_parses_feature_name(self):
15
+ feature = parser.parse_feature(u"Feature: Stuff\n")
16
+ eq_(feature.name, "Stuff")
17
+
18
+ def test_parses_feature_name_without_newline(self):
19
+ feature = parser.parse_feature(u"Feature: Stuff")
20
+ eq_(feature.name, "Stuff")
21
+
22
+ def test_parses_feature_description(self):
23
+ doc = u"""
24
+ Feature: Stuff
25
+ In order to thing
26
+ As an entity
27
+ I want to do stuff
28
+ """.strip()
29
+ feature = parser.parse_feature(doc)
30
+ eq_(feature.name, "Stuff")
31
+ eq_(feature.description,
32
+ ["In order to thing", "As an entity", "I want to do stuff"])
33
+
34
+ def test_parses_feature_with_a_tag(self):
35
+ doc = u"""
36
+ @foo
37
+ Feature: Stuff
38
+ In order to thing
39
+ As an entity
40
+ I want to do stuff
41
+ """.strip()
42
+ feature = parser.parse_feature(doc)
43
+ eq_(feature.name, "Stuff")
44
+ eq_(feature.description,
45
+ ["In order to thing", "As an entity", "I want to do stuff"])
46
+ eq_(feature.tags, [model.Tag(u'foo', 1)])
47
+
48
+ def test_parses_feature_with_more_tags(self):
49
+ doc = u"""
50
+ @foo @bar @baz @qux @winkle_pickers @number8
51
+ Feature: Stuff
52
+ In order to thing
53
+ As an entity
54
+ I want to do stuff
55
+ """.strip()
56
+ feature = parser.parse_feature(doc)
57
+ eq_(feature.name, "Stuff")
58
+ eq_(feature.description,
59
+ ["In order to thing", "As an entity", "I want to do stuff"])
60
+ eq_(feature.tags, [model.Tag(name, 1)
61
+ for name in (u'foo', u'bar', u'baz', u'qux', u'winkle_pickers', u'number8')])
62
+
63
+ def test_parses_feature_with_a_tag_and_comment(self):
64
+ doc = u"""
65
+ @foo # Comment: ...
66
+ Feature: Stuff
67
+ In order to thing
68
+ As an entity
69
+ I want to do stuff
70
+ """.strip()
71
+ feature = parser.parse_feature(doc)
72
+ eq_(feature.name, "Stuff")
73
+ eq_(feature.description,
74
+ ["In order to thing", "As an entity", "I want to do stuff"])
75
+ eq_(feature.tags, [model.Tag(u'foo', 1)])
76
+
77
+ def test_parses_feature_with_more_tags_and_comment(self):
78
+ doc = u"""
79
+ @foo @bar @baz @qux @winkle_pickers # Comment: @number8
80
+ Feature: Stuff
81
+ In order to thing
82
+ As an entity
83
+ I want to do stuff
84
+ """.strip()
85
+ feature = parser.parse_feature(doc)
86
+ eq_(feature.name, "Stuff")
87
+ eq_(feature.description,
88
+ ["In order to thing", "As an entity", "I want to do stuff"])
89
+ eq_(feature.tags, [model.Tag(name, 1)
90
+ for name in (u'foo', u'bar', u'baz', u'qux', u'winkle_pickers')])
91
+ # -- NOT A TAG: u'number8'
92
+
93
+ def test_parses_feature_with_background(self):
94
+ doc = u"""
95
+ Feature: Stuff
96
+ Background:
97
+ Given there is stuff
98
+ When I do stuff
99
+ Then stuff happens
100
+ """.lstrip()
101
+ feature = parser.parse_feature(doc)
102
+ eq_(feature.name, "Stuff")
103
+ assert(feature.background)
104
+ self.compare_steps(feature.background.steps, [
105
+ ('given', 'Given', 'there is stuff', None, None),
106
+ ('when', 'When', 'I do stuff', None, None),
107
+ ('then', 'Then', 'stuff happens', None, None),
108
+ ])
109
+
110
+ def test_parses_feature_with_description_and_background(self):
111
+ doc = u"""
112
+ Feature: Stuff
113
+ This... is... STUFF!
114
+
115
+ Background:
116
+ Given there is stuff
117
+ When I do stuff
118
+ Then stuff happens
119
+ """.lstrip()
120
+ feature = parser.parse_feature(doc)
121
+ eq_(feature.name, "Stuff")
122
+ eq_(feature.description, ["This... is... STUFF!"])
123
+ assert(feature.background)
124
+ self.compare_steps(feature.background.steps, [
125
+ ('given', 'Given', 'there is stuff', None, None),
126
+ ('when', 'When', 'I do stuff', None, None),
127
+ ('then', 'Then', 'stuff happens', None, None),
128
+ ])
129
+
130
+ def test_parses_feature_with_a_scenario(self):
131
+ doc = u"""
132
+ Feature: Stuff
133
+
134
+ Scenario: Doing stuff
135
+ Given there is stuff
136
+ When I do stuff
137
+ Then stuff happens
138
+ """.lstrip()
139
+ feature = parser.parse_feature(doc)
140
+ eq_(feature.name, "Stuff")
141
+ assert(len(feature.scenarios) == 1)
142
+ eq_(feature.scenarios[0].name, 'Doing stuff')
143
+ self.compare_steps(feature.scenarios[0].steps, [
144
+ ('given', 'Given', 'there is stuff', None, None),
145
+ ('when', 'When', 'I do stuff', None, None),
146
+ ('then', 'Then', 'stuff happens', None, None),
147
+ ])
148
+
149
+ def test_parses_lowercase_step_keywords(self):
150
+ doc = u"""
151
+ Feature: Stuff
152
+
153
+ Scenario: Doing stuff
154
+ giVeN there is stuff
155
+ when I do stuff
156
+ tHEn stuff happens
157
+ """.lstrip()
158
+ feature = parser.parse_feature(doc)
159
+ eq_(feature.name, "Stuff")
160
+ assert(len(feature.scenarios) == 1)
161
+ eq_(feature.scenarios[0].name, 'Doing stuff')
162
+ self.compare_steps(feature.scenarios[0].steps, [
163
+ ('given', 'Given', 'there is stuff', None, None),
164
+ ('when', 'When', 'I do stuff', None, None),
165
+ ('then', 'Then', 'stuff happens', None, None),
166
+ ])
167
+
168
+ def test_parses_ja_keywords(self):
169
+ doc = u"""
170
+ 機能: Stuff
171
+
172
+ シナリオ: Doing stuff
173
+ 前提there is stuff
174
+ もしI do stuff
175
+ ならばstuff happens
176
+ """.lstrip()
177
+ feature = parser.parse_feature(doc, language='ja')
178
+ eq_(feature.name, "Stuff")
179
+ assert(len(feature.scenarios) == 1)
180
+ eq_(feature.scenarios[0].name, 'Doing stuff')
181
+ self.compare_steps(feature.scenarios[0].steps, [
182
+ ('given', u'前提', 'there is stuff', None, None),
183
+ ('when', u'もし', 'I do stuff', None, None),
184
+ ('then', u'ならば', 'stuff happens', None, None),
185
+ ])
186
+
187
+ def test_parses_feature_with_description_and_background_and_scenario(self):
188
+ doc = u"""
189
+ Feature: Stuff
190
+ Oh my god, it's full of stuff...
191
+
192
+ Background:
193
+ Given I found some stuff
194
+
195
+ Scenario: Doing stuff
196
+ Given there is stuff
197
+ When I do stuff
198
+ Then stuff happens
199
+ """.lstrip()
200
+ feature = parser.parse_feature(doc)
201
+ eq_(feature.name, "Stuff")
202
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
203
+ assert(feature.background)
204
+ self.compare_steps(feature.background.steps, [
205
+ ('given', 'Given', 'I found some stuff', None, None),
206
+ ])
207
+
208
+ assert(len(feature.scenarios) == 1)
209
+ eq_(feature.scenarios[0].name, 'Doing stuff')
210
+ self.compare_steps(feature.scenarios[0].steps, [
211
+ ('given', 'Given', 'there is stuff', None, None),
212
+ ('when', 'When', 'I do stuff', None, None),
213
+ ('then', 'Then', 'stuff happens', None, None),
214
+ ])
215
+
216
+ def test_parses_feature_with_multiple_scenarios(self):
217
+ doc = u"""
218
+ Feature: Stuff
219
+
220
+ Scenario: Doing stuff
221
+ Given there is stuff
222
+ When I do stuff
223
+ Then stuff happens
224
+
225
+ Scenario: Doing other stuff
226
+ When stuff happens
227
+ Then I am stuffed
228
+
229
+ Scenario: Doing different stuff
230
+ Given stuff
231
+ Then who gives a stuff
232
+ """.lstrip()
233
+ feature = parser.parse_feature(doc)
234
+ eq_(feature.name, "Stuff")
235
+
236
+ assert(len(feature.scenarios) == 3)
237
+
238
+ eq_(feature.scenarios[0].name, 'Doing stuff')
239
+ self.compare_steps(feature.scenarios[0].steps, [
240
+ ('given', 'Given', 'there is stuff', None, None),
241
+ ('when', 'When', 'I do stuff', None, None),
242
+ ('then', 'Then', 'stuff happens', None, None),
243
+ ])
244
+
245
+ eq_(feature.scenarios[1].name, 'Doing other stuff')
246
+ self.compare_steps(feature.scenarios[1].steps, [
247
+ ('when', 'When', 'stuff happens', None, None),
248
+ ('then', 'Then', 'I am stuffed', None, None),
249
+ ])
250
+
251
+ eq_(feature.scenarios[2].name, 'Doing different stuff')
252
+ self.compare_steps(feature.scenarios[2].steps, [
253
+ ('given', 'Given', 'stuff', None, None),
254
+ ('then', 'Then', 'who gives a stuff', None, None),
255
+ ])
256
+
257
+ def test_parses_feature_with_multiple_scenarios_with_tags(self):
258
+ doc = u"""
259
+ Feature: Stuff
260
+
261
+ Scenario: Doing stuff
262
+ Given there is stuff
263
+ When I do stuff
264
+ Then stuff happens
265
+
266
+ @one_tag
267
+ Scenario: Doing other stuff
268
+ When stuff happens
269
+ Then I am stuffed
270
+
271
+ @lots @of @tags
272
+ Scenario: Doing different stuff
273
+ Given stuff
274
+ Then who gives a stuff
275
+ """.lstrip()
276
+ feature = parser.parse_feature(doc)
277
+ eq_(feature.name, "Stuff")
278
+
279
+ assert(len(feature.scenarios) == 3)
280
+
281
+ eq_(feature.scenarios[0].name, 'Doing stuff')
282
+ self.compare_steps(feature.scenarios[0].steps, [
283
+ ('given', 'Given', 'there is stuff', None, None),
284
+ ('when', 'When', 'I do stuff', None, None),
285
+ ('then', 'Then', 'stuff happens', None, None),
286
+ ])
287
+
288
+ eq_(feature.scenarios[1].name, 'Doing other stuff')
289
+ eq_(feature.scenarios[1].tags, [model.Tag(u'one_tag', 1)])
290
+ self.compare_steps(feature.scenarios[1].steps, [
291
+ ('when', 'When', 'stuff happens', None, None),
292
+ ('then', 'Then', 'I am stuffed', None, None),
293
+ ])
294
+
295
+ eq_(feature.scenarios[2].name, 'Doing different stuff')
296
+ eq_(feature.scenarios[2].tags, [model.Tag(n, 1) for n in (u'lots', u'of', u'tags')])
297
+ self.compare_steps(feature.scenarios[2].steps, [
298
+ ('given', 'Given', 'stuff', None, None),
299
+ ('then', 'Then', 'who gives a stuff', None, None),
300
+ ])
301
+
302
+ def test_parses_feature_with_multiple_scenarios_and_other_bits(self):
303
+ doc = u"""
304
+ Feature: Stuff
305
+ Stuffing
306
+
307
+ Background:
308
+ Given you're all stuffed
309
+
310
+ Scenario: Doing stuff
311
+ Given there is stuff
312
+ When I do stuff
313
+ Then stuff happens
314
+
315
+ Scenario: Doing other stuff
316
+ When stuff happens
317
+ Then I am stuffed
318
+
319
+ Scenario: Doing different stuff
320
+ Given stuff
321
+ Then who gives a stuff
322
+ """.lstrip()
323
+ feature = parser.parse_feature(doc)
324
+ eq_(feature.name, "Stuff")
325
+ eq_(feature.description, ["Stuffing"])
326
+
327
+ assert(feature.background)
328
+ self.compare_steps(feature.background.steps, [
329
+ ('given', 'Given', "you're all stuffed", None, None)
330
+ ])
331
+
332
+ assert(len(feature.scenarios) == 3)
333
+
334
+ eq_(feature.scenarios[0].name, 'Doing stuff')
335
+ self.compare_steps(feature.scenarios[0].steps, [
336
+ ('given', 'Given', 'there is stuff', None, None),
337
+ ('when', 'When', 'I do stuff', None, None),
338
+ ('then', 'Then', 'stuff happens', None, None),
339
+ ])
340
+
341
+ eq_(feature.scenarios[1].name, 'Doing other stuff')
342
+ self.compare_steps(feature.scenarios[1].steps, [
343
+ ('when', 'When', 'stuff happens', None, None),
344
+ ('then', 'Then', 'I am stuffed', None, None),
345
+ ])
346
+
347
+ eq_(feature.scenarios[2].name, 'Doing different stuff')
348
+ self.compare_steps(feature.scenarios[2].steps, [
349
+ ('given', 'Given', 'stuff', None, None),
350
+ ('then', 'Then', 'who gives a stuff', None, None),
351
+ ])
352
+
353
+ def test_parses_feature_with_a_scenario_with_and_and_but(self):
354
+ doc = u"""
355
+ Feature: Stuff
356
+
357
+ Scenario: Doing stuff
358
+ Given there is stuff
359
+ And some other stuff
360
+ When I do stuff
361
+ Then stuff happens
362
+ But not the bad stuff
363
+ """.lstrip()
364
+ feature = parser.parse_feature(doc)
365
+ eq_(feature.name, "Stuff")
366
+ assert(len(feature.scenarios) == 1)
367
+ eq_(feature.scenarios[0].name, 'Doing stuff')
368
+ self.compare_steps(feature.scenarios[0].steps, [
369
+ ('given', 'Given', 'there is stuff', None, None),
370
+ ('given', 'And', 'some other stuff', None, None),
371
+ ('when', 'When', 'I do stuff', None, None),
372
+ ('then', 'Then', 'stuff happens', None, None),
373
+ ('then', 'But', 'not the bad stuff', None, None),
374
+ ])
375
+
376
+ def test_parses_feature_with_a_step_with_a_string_argument(self):
377
+ doc = u'''
378
+ Feature: Stuff
379
+
380
+ Scenario: Doing stuff
381
+ Given there is stuff:
382
+ """
383
+ So
384
+ Much
385
+ Stuff
386
+ """
387
+ Then stuff happens
388
+ '''.lstrip()
389
+ feature = parser.parse_feature(doc)
390
+ eq_(feature.name, "Stuff")
391
+ assert(len(feature.scenarios) == 1)
392
+ eq_(feature.scenarios[0].name, 'Doing stuff')
393
+ self.compare_steps(feature.scenarios[0].steps, [
394
+ ('given', 'Given', 'there is stuff', "So\nMuch\nStuff", None),
395
+ ('then', 'Then', 'stuff happens', None, None),
396
+ ])
397
+
398
+ def test_parses_string_argument_correctly_handle_whitespace(self):
399
+ doc = u'''
400
+ Feature: Stuff
401
+
402
+ Scenario: Doing stuff
403
+ Given there is stuff:
404
+ """
405
+ So
406
+ Much
407
+ Stuff
408
+ Has
409
+ Indents
410
+ """
411
+ Then stuff happens
412
+ '''.lstrip()
413
+ feature = parser.parse_feature(doc)
414
+ eq_(feature.name, "Stuff")
415
+ assert(len(feature.scenarios) == 1)
416
+ eq_(feature.scenarios[0].name, 'Doing stuff')
417
+ string = "So\n Much\n Stuff\n Has\nIndents"
418
+ self.compare_steps(feature.scenarios[0].steps, [
419
+ ('given', 'Given', 'there is stuff', string, None),
420
+ ('then', 'Then', 'stuff happens', None, None),
421
+ ])
422
+
423
+ def test_parses_feature_with_a_step_with_a_string_with_blank_lines(self):
424
+ doc = u'''
425
+ Feature: Stuff
426
+
427
+ Scenario: Doing stuff
428
+ Given there is stuff:
429
+ """
430
+ So
431
+
432
+ Much
433
+
434
+
435
+ Stuff
436
+ """
437
+ Then stuff happens
438
+ '''.lstrip()
439
+ feature = parser.parse_feature(doc)
440
+ eq_(feature.name, "Stuff")
441
+ assert(len(feature.scenarios) == 1)
442
+ eq_(feature.scenarios[0].name, 'Doing stuff')
443
+ self.compare_steps(feature.scenarios[0].steps, [
444
+ ('given', 'Given', 'there is stuff', "So\n\nMuch\n\n\nStuff", None),
445
+ ('then', 'Then', 'stuff happens', None, None),
446
+ ])
447
+
448
+ # MORE-JE-ADDED:
449
+ def test_parses_string_argument_without_stripping_empty_lines(self):
450
+ # -- ISSUE 44: Parser removes comments in multiline text string.
451
+ doc = u'''
452
+ Feature: Multiline
453
+
454
+ Scenario: Multiline Text with Comments
455
+ Given a multiline argument with:
456
+ """
457
+
458
+ """
459
+ And a multiline argument with:
460
+ """
461
+ Alpha.
462
+
463
+ Omega.
464
+ """
465
+ Then empty middle lines are not stripped
466
+ '''.lstrip()
467
+ feature = parser.parse_feature(doc)
468
+ eq_(feature.name, "Multiline")
469
+ assert(len(feature.scenarios) == 1)
470
+ eq_(feature.scenarios[0].name, "Multiline Text with Comments")
471
+ text1 = ""
472
+ text2 = "Alpha.\n\nOmega."
473
+ self.compare_steps(feature.scenarios[0].steps, [
474
+ ('given', 'Given', 'a multiline argument with', text1, None),
475
+ ('given', 'And', 'a multiline argument with', text2, None),
476
+ ('then', 'Then', 'empty middle lines are not stripped', None, None),
477
+ ])
478
+
479
+ def test_parses_feature_with_a_step_with_a_string_with_comments(self):
480
+ doc = u'''
481
+ Feature: Stuff
482
+
483
+ Scenario: Doing stuff
484
+ Given there is stuff:
485
+ """
486
+ So
487
+ Much
488
+ # Derp
489
+ """
490
+ Then stuff happens
491
+ '''.lstrip()
492
+ feature = parser.parse_feature(doc)
493
+ eq_(feature.name, "Stuff")
494
+ assert(len(feature.scenarios) == 1)
495
+ eq_(feature.scenarios[0].name, 'Doing stuff')
496
+ self.compare_steps(feature.scenarios[0].steps, [
497
+ ('given', 'Given', 'there is stuff', "So\nMuch\n# Derp",
498
+ None),
499
+ ('then', 'Then', 'stuff happens', None, None),
500
+ ])
501
+
502
+ def test_parses_feature_with_a_step_with_a_table_argument(self):
503
+ doc = u'''
504
+ Feature: Stuff
505
+
506
+ Scenario: Doing stuff
507
+ Given we classify stuff:
508
+ | type of stuff | awesomeness | ridiculousness |
509
+ | fluffy | large | frequent |
510
+ | lint | low | high |
511
+ | green | variable | awkward |
512
+ Then stuff is in buckets
513
+ '''.lstrip()
514
+ feature = parser.parse_feature(doc)
515
+ eq_(feature.name, "Stuff")
516
+ assert(len(feature.scenarios) == 1)
517
+ eq_(feature.scenarios[0].name, 'Doing stuff')
518
+ table = model.Table(
519
+ [u'type of stuff', u'awesomeness', u'ridiculousness'],
520
+ 0,
521
+ [
522
+ [u'fluffy', u'large', u'frequent'],
523
+ [u'lint', u'low', u'high'],
524
+ [u'green', u'variable', u'awkward'],
525
+ ]
526
+ )
527
+ self.compare_steps(feature.scenarios[0].steps, [
528
+ ('given', 'Given', 'we classify stuff', None, table),
529
+ ('then', 'Then', 'stuff is in buckets', None, None),
530
+ ])
531
+
532
+ def test_parses_feature_with_table_and_escaped_pipe_in_cell_values(self):
533
+ doc = u'''
534
+ Feature:
535
+ Scenario:
536
+ Given we have special cell values:
537
+ | name | value |
538
+ | alice | one\|two |
539
+ | bob |\|one |
540
+ | charly | one\||
541
+ | doro | one\|two\|three\|four |
542
+ '''.lstrip()
543
+ feature = parser.parse_feature(doc)
544
+ assert(len(feature.scenarios) == 1)
545
+ table = model.Table(
546
+ [u"name", u"value"],
547
+ 0,
548
+ [
549
+ [u"alice", u"one|two"],
550
+ [u"bob", u"|one"],
551
+ [u"charly", u"one|"],
552
+ [u"doro", u"one|two|three|four"],
553
+ ]
554
+ )
555
+ self.compare_steps(feature.scenarios[0].steps, [
556
+ ('given', 'Given', 'we have special cell values', None, table),
557
+ ])
558
+
559
+ def test_parses_feature_with_a_scenario_outline(self):
560
+ doc = u'''
561
+ Feature: Stuff
562
+
563
+ Scenario Outline: Doing all sorts of stuff
564
+ Given we have <Stuff>
565
+ When we do stuff
566
+ Then we have <Things>
567
+
568
+ Examples: Some stuff
569
+ | Stuff | Things |
570
+ | wool | felt |
571
+ | cotton | thread |
572
+ | wood | paper |
573
+ | explosives | hilarity |
574
+ '''.lstrip()
575
+ feature = parser.parse_feature(doc)
576
+ eq_(feature.name, "Stuff")
577
+
578
+ assert(len(feature.scenarios) == 1)
579
+ eq_(feature.scenarios[0].name, 'Doing all sorts of stuff')
580
+
581
+ table = model.Table(
582
+ [u'Stuff', u'Things'],
583
+ 0,
584
+ [
585
+ [u'wool', u'felt'],
586
+ [u'cotton', u'thread'],
587
+ [u'wood', u'paper'],
588
+ [u'explosives', u'hilarity'],
589
+ ]
590
+ )
591
+ eq_(feature.scenarios[0].examples[0].name, 'Some stuff')
592
+ eq_(feature.scenarios[0].examples[0].table, table)
593
+ self.compare_steps(feature.scenarios[0].steps, [
594
+ ('given', 'Given', 'we have <Stuff>', None, None),
595
+ ('when', 'When', 'we do stuff', None, None),
596
+ ('then', 'Then', 'we have <Things>', None, None),
597
+ ])
598
+
599
+ def test_parses_feature_with_a_scenario_outline_with_multiple_examples(self):
600
+ doc = u'''
601
+ Feature: Stuff
602
+
603
+ Scenario Outline: Doing all sorts of stuff
604
+ Given we have <Stuff>
605
+ When we do stuff
606
+ Then we have <Things>
607
+
608
+ Examples: Some stuff
609
+ | Stuff | Things |
610
+ | wool | felt |
611
+ | cotton | thread |
612
+
613
+ Examples: Some other stuff
614
+ | Stuff | Things |
615
+ | wood | paper |
616
+ | explosives | hilarity |
617
+ '''.lstrip()
618
+ feature = parser.parse_feature(doc)
619
+ eq_(feature.name, "Stuff")
620
+
621
+ assert(len(feature.scenarios) == 1)
622
+ eq_(feature.scenarios[0].name, 'Doing all sorts of stuff')
623
+ self.compare_steps(feature.scenarios[0].steps, [
624
+ ('given', 'Given', 'we have <Stuff>', None, None),
625
+ ('when', 'When', 'we do stuff', None, None),
626
+ ('then', 'Then', 'we have <Things>', None, None),
627
+ ])
628
+
629
+ table = model.Table(
630
+ [u'Stuff', u'Things'],
631
+ 0,
632
+ [
633
+ [u'wool', u'felt'],
634
+ [u'cotton', u'thread'],
635
+ ]
636
+ )
637
+ eq_(feature.scenarios[0].examples[0].name, 'Some stuff')
638
+ eq_(feature.scenarios[0].examples[0].table, table)
639
+
640
+ table = model.Table(
641
+ [u'Stuff', u'Things'],
642
+ 0,
643
+ [
644
+ [u'wood', u'paper'],
645
+ [u'explosives', u'hilarity'],
646
+ ]
647
+ )
648
+ eq_(feature.scenarios[0].examples[1].name, 'Some other stuff')
649
+ eq_(feature.scenarios[0].examples[1].table, table)
650
+
651
+ def test_parses_feature_with_a_scenario_outline_with_tags(self):
652
+ doc = u'''
653
+ Feature: Stuff
654
+
655
+ @stuff @derp
656
+ Scenario Outline: Doing all sorts of stuff
657
+ Given we have <Stuff>
658
+ When we do stuff
659
+ Then we have <Things>
660
+
661
+ Examples: Some stuff
662
+ | Stuff | Things |
663
+ | wool | felt |
664
+ | cotton | thread |
665
+ | wood | paper |
666
+ | explosives | hilarity |
667
+ '''.lstrip()
668
+ feature = parser.parse_feature(doc)
669
+ eq_(feature.name, "Stuff")
670
+
671
+ assert(len(feature.scenarios) == 1)
672
+ eq_(feature.scenarios[0].name, 'Doing all sorts of stuff')
673
+ eq_(feature.scenarios[0].tags, [model.Tag(u'stuff', 1), model.Tag(u'derp', 1)])
674
+ self.compare_steps(feature.scenarios[0].steps, [
675
+ ('given', 'Given', 'we have <Stuff>', None, None),
676
+ ('when', 'When', 'we do stuff', None, None),
677
+ ('then', 'Then', 'we have <Things>', None, None),
678
+ ])
679
+
680
+ table = model.Table(
681
+ [u'Stuff', u'Things'],
682
+ 0,
683
+ [
684
+ [u'wool', u'felt'],
685
+ [u'cotton', u'thread'],
686
+ [u'wood', u'paper'],
687
+ [u'explosives', u'hilarity'],
688
+ ]
689
+ )
690
+ eq_(feature.scenarios[0].examples[0].name, 'Some stuff')
691
+ eq_(feature.scenarios[0].examples[0].table, table)
692
+
693
+ def test_parses_scenario_outline_with_tagged_examples1(self):
694
+ # -- CASE: Examples with 1 tag-line (= 1 tag)
695
+ doc = u'''
696
+ Feature: Alice
697
+
698
+ @foo
699
+ Scenario Outline: Bob
700
+ Given we have <Stuff>
701
+
702
+ @bar
703
+ Examples: Charly
704
+ | Stuff | Things |
705
+ | wool | felt |
706
+ | cotton | thread |
707
+ '''.lstrip()
708
+ feature = parser.parse_feature(doc)
709
+ eq_(feature.name, "Alice")
710
+
711
+ assert(len(feature.scenarios) == 1)
712
+ scenario_outline = feature.scenarios[0]
713
+ eq_(scenario_outline.name, "Bob")
714
+ eq_(scenario_outline.tags, [model.Tag(u"foo", 1)])
715
+ self.compare_steps(scenario_outline.steps, [
716
+ ("given", "Given", "we have <Stuff>", None, None),
717
+ ])
718
+
719
+ table = model.Table(
720
+ [u"Stuff", u"Things"], 0,
721
+ [
722
+ [u"wool", u"felt"],
723
+ [u"cotton", u"thread"],
724
+ ]
725
+ )
726
+ eq_(scenario_outline.examples[0].name, "Charly")
727
+ eq_(scenario_outline.examples[0].table, table)
728
+ eq_(scenario_outline.examples[0].tags, [model.Tag(u"bar", 1)])
729
+
730
+ # -- ScenarioOutline.scenarios:
731
+ # Inherit tags from ScenarioOutline and Examples element.
732
+ eq_(len(scenario_outline.scenarios), 2)
733
+ expected_tags = [model.Tag(u"foo", 1), model.Tag(u"bar", 1)]
734
+ eq_(set(scenario_outline.scenarios[0].tags), set(expected_tags))
735
+ eq_(set(scenario_outline.scenarios[1].tags), set(expected_tags))
736
+
737
+ def test_parses_scenario_outline_with_tagged_examples2(self):
738
+ # -- CASE: Examples with multiple tag-lines (= 2 tag-lines)
739
+ doc = u'''
740
+ Feature: Alice
741
+
742
+ @foo
743
+ Scenario Outline: Bob
744
+ Given we have <Stuff>
745
+
746
+ @bar
747
+ @baz
748
+ Examples: Charly
749
+ | Stuff | Things |
750
+ | wool | felt |
751
+ | cotton | thread |
752
+ '''.lstrip()
753
+ feature = parser.parse_feature(doc)
754
+ eq_(feature.name, "Alice")
755
+
756
+ assert(len(feature.scenarios) == 1)
757
+ scenario_outline = feature.scenarios[0]
758
+ eq_(scenario_outline.name, "Bob")
759
+ eq_(scenario_outline.tags, [model.Tag(u"foo", 1)])
760
+ self.compare_steps(scenario_outline.steps, [
761
+ ("given", "Given", "we have <Stuff>", None, None),
762
+ ])
763
+
764
+ table = model.Table(
765
+ [u"Stuff", u"Things"], 0,
766
+ [
767
+ [u"wool", u"felt"],
768
+ [u"cotton", u"thread"],
769
+ ]
770
+ )
771
+ eq_(scenario_outline.examples[0].name, "Charly")
772
+ eq_(scenario_outline.examples[0].table, table)
773
+ expected_tags = [model.Tag(u"bar", 1), model.Tag(u"baz", 1)]
774
+ eq_(scenario_outline.examples[0].tags, expected_tags)
775
+
776
+ # -- ScenarioOutline.scenarios:
777
+ # Inherit tags from ScenarioOutline and Examples element.
778
+ eq_(len(scenario_outline.scenarios), 2)
779
+ expected_tags = [
780
+ model.Tag(u"foo", 1),
781
+ model.Tag(u"bar", 1),
782
+ model.Tag(u"baz", 1)
783
+ ]
784
+ eq_(set(scenario_outline.scenarios[0].tags), set(expected_tags))
785
+ eq_(set(scenario_outline.scenarios[1].tags), set(expected_tags))
786
+
787
+ def test_parses_feature_with_the_lot(self):
788
+ doc = u'''
789
+ # This one's got comments too.
790
+
791
+ @derp
792
+ Feature: Stuff
793
+ In order to test my parser
794
+ As a test runner
795
+ I want to run tests
796
+
797
+ # A møøse once bit my sister
798
+ Background:
799
+ Given this is a test
800
+
801
+ @fred
802
+ Scenario: Testing stuff
803
+ Given we are testing
804
+ And this is only a test
805
+ But this is an important test
806
+ When we test with a multiline string:
807
+ """
808
+ Yarr, my hovercraft be full of stuff.
809
+ Also, I be feelin' this pirate schtick be a mite overdone, me hearties.
810
+ Also: rum.
811
+ """
812
+ Then we want it to work
813
+
814
+ #These comments are everywhere man
815
+ Scenario Outline: Gosh this is long
816
+ Given this is <length>
817
+ Then we want it to be <width>
818
+ But not <height>
819
+
820
+ Examples: Initial
821
+ | length | width | height |
822
+ # I don't know why this one is here
823
+ | 1 | 2 | 3 |
824
+ | 4 | 5 | 6 |
825
+
826
+ Examples: Subsequent
827
+ | length | width | height |
828
+ | 7 | 8 | 9 |
829
+
830
+ Scenario: This one doesn't have a tag
831
+ Given we don't have a tag
832
+ Then we don't really mind
833
+
834
+ @stuff @derp
835
+ Scenario Outline: Doing all sorts of stuff
836
+ Given we have <Stuff>
837
+ When we do stuff with a table:
838
+ | a | b | c | d | e |
839
+ | 1 | 2 | 3 | 4 | 5 |
840
+ # I can see a comment line from here
841
+ | 6 | 7 | 8 | 9 | 10 |
842
+ Then we have <Things>
843
+
844
+ Examples: Some stuff
845
+ | Stuff | Things |
846
+ | wool | felt |
847
+ | cotton | thread |
848
+ | wood | paper |
849
+ | explosives | hilarity |
850
+ '''.lstrip()
851
+ feature = parser.parse_feature(doc)
852
+ eq_(feature.name, "Stuff")
853
+ eq_(feature.tags, [model.Tag(u'derp', 1)])
854
+ eq_(feature.description, ['In order to test my parser',
855
+ 'As a test runner',
856
+ 'I want to run tests'])
857
+
858
+ assert(feature.background)
859
+ self.compare_steps(feature.background.steps, [
860
+ ('given', 'Given', 'this is a test', None, None)
861
+ ])
862
+
863
+ assert(len(feature.scenarios) == 4)
864
+
865
+ eq_(feature.scenarios[0].name, 'Testing stuff')
866
+ eq_(feature.scenarios[0].tags, [model.Tag(u'fred', 1)])
867
+ string = '\n'.join([
868
+ 'Yarr, my hovercraft be full of stuff.',
869
+ "Also, I be feelin' this pirate schtick be a mite overdone, " + \
870
+ "me hearties.",
871
+ ' Also: rum.'
872
+ ])
873
+ self.compare_steps(feature.scenarios[0].steps, [
874
+ ('given', 'Given', 'we are testing', None, None),
875
+ ('given', 'And', 'this is only a test', None, None),
876
+ ('given', 'But', 'this is an important test', None, None),
877
+ ('when', 'When', 'we test with a multiline string', string, None),
878
+ ('then', 'Then', 'we want it to work', None, None),
879
+ ])
880
+
881
+ eq_(feature.scenarios[1].name, 'Gosh this is long')
882
+ eq_(feature.scenarios[1].tags, [])
883
+ table = model.Table(
884
+ [u'length', u'width', u'height'],
885
+ 0,
886
+ [
887
+ [u'1', u'2', u'3'],
888
+ [u'4', u'5', u'6'],
889
+ ]
890
+ )
891
+ eq_(feature.scenarios[1].examples[0].name, 'Initial')
892
+ eq_(feature.scenarios[1].examples[0].table, table)
893
+ table = model.Table(
894
+ [u'length', u'width', u'height'],
895
+ 0,
896
+ [
897
+ [u'7', u'8', u'9'],
898
+ ]
899
+ )
900
+ eq_(feature.scenarios[1].examples[1].name, 'Subsequent')
901
+ eq_(feature.scenarios[1].examples[1].table, table)
902
+ self.compare_steps(feature.scenarios[1].steps, [
903
+ ('given', 'Given', 'this is <length>', None, None),
904
+ ('then', 'Then', 'we want it to be <width>', None, None),
905
+ ('then', 'But', 'not <height>', None, None),
906
+ ])
907
+
908
+ eq_(feature.scenarios[2].name, "This one doesn't have a tag")
909
+ eq_(feature.scenarios[2].tags, [])
910
+ self.compare_steps(feature.scenarios[2].steps, [
911
+ ('given', 'Given', "we don't have a tag", None, None),
912
+ ('then', 'Then', "we don't really mind", None, None),
913
+ ])
914
+
915
+ table = model.Table(
916
+ [u'Stuff', u'Things'],
917
+ 0,
918
+ [
919
+ [u'wool', u'felt'],
920
+ [u'cotton', u'thread'],
921
+ [u'wood', u'paper'],
922
+ [u'explosives', u'hilarity'],
923
+ ]
924
+ )
925
+ eq_(feature.scenarios[3].name, 'Doing all sorts of stuff')
926
+ eq_(feature.scenarios[3].tags, [model.Tag(u'stuff', 1), model.Tag(u'derp', 1)])
927
+ eq_(feature.scenarios[3].examples[0].name, 'Some stuff')
928
+ eq_(feature.scenarios[3].examples[0].table, table)
929
+ table = model.Table(
930
+ [u'a', u'b', u'c', u'd', u'e'],
931
+ 0,
932
+ [
933
+ [u'1', u'2', u'3', u'4', u'5'],
934
+ [u'6', u'7', u'8', u'9', u'10'],
935
+ ]
936
+ )
937
+ self.compare_steps(feature.scenarios[3].steps, [
938
+ ('given', 'Given', 'we have <Stuff>', None, None),
939
+ ('when', 'When', 'we do stuff with a table', None, table),
940
+ ('then', 'Then', 'we have <Things>', None, None),
941
+ ])
942
+
943
+
944
+ def test_fails_to_parse_when_and_is_out_of_order(self):
945
+ doc = u"""
946
+ Feature: Stuff
947
+
948
+ Scenario: Failing at stuff
949
+ And we should fail
950
+ """.lstrip()
951
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
952
+
953
+ def test_fails_to_parse_when_but_is_out_of_order(self):
954
+ doc = u"""
955
+ Feature: Stuff
956
+
957
+ Scenario: Failing at stuff
958
+ But we shall fail
959
+ """.lstrip()
960
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
961
+
962
+ def test_fails_to_parse_when_examples_is_in_the_wrong_place(self):
963
+ doc = u"""
964
+ Feature: Stuff
965
+
966
+ Scenario: Failing at stuff
967
+ But we shall fail
968
+
969
+ Examples: Failure
970
+ | Fail | Wheel|
971
+ """.lstrip()
972
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
973
+
974
+ class TestForeign(Common):
975
+ def test_first_line_comment_sets_language(self):
976
+ doc = u"""
977
+ # language: fr
978
+ Fonctionnalit\xe9: testing stuff
979
+ Oh my god, it's full of stuff...
980
+ """
981
+
982
+ feature = parser.parse_feature(doc)
983
+ eq_(feature.name, "testing stuff")
984
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
985
+
986
+ def test_multiple_language_comments(self):
987
+ # -- LAST LANGUAGE is used.
988
+ doc = u"""
989
+ # language: en
990
+ # language: fr
991
+ Fonctionnalit\xe9: testing stuff
992
+ Oh my god, it's full of stuff...
993
+ """
994
+
995
+ feature = parser.parse_feature(doc)
996
+ eq_(feature.name, "testing stuff")
997
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
998
+
999
+ def test_language_comment_wins_over_commandline(self):
1000
+ doc = u"""
1001
+ # language: fr
1002
+ Fonctionnalit\xe9: testing stuff
1003
+ Oh my god, it's full of stuff...
1004
+ """
1005
+
1006
+ feature = parser.parse_feature(doc, language="de")
1007
+ eq_(feature.name, "testing stuff")
1008
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1009
+
1010
+ def test_whitespace_before_first_line_comment_still_sets_language(self):
1011
+ doc = u"""
1012
+
1013
+
1014
+ # language: cs
1015
+ Po\u017eadavek: testing stuff
1016
+ Oh my god, it's full of stuff...
1017
+ """
1018
+
1019
+ feature = parser.parse_feature(doc)
1020
+ eq_(feature.name, "testing stuff")
1021
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1022
+
1023
+ def test_anything_before_language_comment_makes_it_not_count(self):
1024
+ doc = u"""
1025
+
1026
+ @wombles
1027
+ # language: cy-GB
1028
+ Arwedd: testing stuff
1029
+ Oh my god, it's full of stuff...
1030
+ """
1031
+
1032
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
1033
+
1034
+ def test_defaults_to_DEFAULT_LANGUAGE(self):
1035
+ feature_kwd = i18n.languages[parser.DEFAULT_LANGUAGE]['feature'][0]
1036
+ doc = u"""
1037
+
1038
+ @wombles
1039
+ # language: cs
1040
+ %s: testing stuff
1041
+ Oh my god, it's full of stuff...
1042
+ """ % feature_kwd
1043
+
1044
+ feature = parser.parse_feature(doc)
1045
+ eq_(feature.name, "testing stuff")
1046
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1047
+
1048
+ def test_whitespace_in_the_language_comment_is_flexible_1(self):
1049
+ doc = u"""
1050
+ #language:da
1051
+ Egenskab: testing stuff
1052
+ Oh my god, it's full of stuff...
1053
+ """
1054
+
1055
+ feature = parser.parse_feature(doc)
1056
+ eq_(feature.name, "testing stuff")
1057
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1058
+
1059
+ def test_whitespace_in_the_language_comment_is_flexible_2(self):
1060
+ doc = u"""
1061
+ # language:de
1062
+ Funktionalit\xe4t: testing stuff
1063
+ Oh my god, it's full of stuff...
1064
+ """
1065
+
1066
+ feature = parser.parse_feature(doc)
1067
+ eq_(feature.name, "testing stuff")
1068
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1069
+
1070
+ def test_whitespace_in_the_language_comment_is_flexible_3(self):
1071
+ doc = u"""
1072
+ #language: en-lol
1073
+ OH HAI: testing stuff
1074
+ Oh my god, it's full of stuff...
1075
+ """
1076
+
1077
+ feature = parser.parse_feature(doc)
1078
+ eq_(feature.name, "testing stuff")
1079
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1080
+
1081
+ def test_whitespace_in_the_language_comment_is_flexible_4(self):
1082
+ doc = u"""
1083
+ # language: lv
1084
+ F\u012b\u010da: testing stuff
1085
+ Oh my god, it's full of stuff...
1086
+ """
1087
+
1088
+ feature = parser.parse_feature(doc)
1089
+ eq_(feature.name, "testing stuff")
1090
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1091
+
1092
+ def test_parses_french(self):
1093
+ doc = u"""
1094
+ Fonctionnalit\xe9: testing stuff
1095
+ Oh my god, it's full of stuff...
1096
+
1097
+ Contexte:
1098
+ Soit I found some stuff
1099
+
1100
+ Sc\xe9nario: test stuff
1101
+ Soit I am testing stuff
1102
+ Alors it should work
1103
+
1104
+ Sc\xe9nario: test more stuff
1105
+ Soit I am testing stuff
1106
+ Alors it will work
1107
+ """.lstrip()
1108
+ feature = parser.parse_feature(doc, 'fr')
1109
+ eq_(feature.name, "testing stuff")
1110
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1111
+ assert(feature.background)
1112
+ self.compare_steps(feature.background.steps, [
1113
+ ('given', 'Soit', 'I found some stuff', None, None),
1114
+ ])
1115
+
1116
+ assert(len(feature.scenarios) == 2)
1117
+ eq_(feature.scenarios[0].name, 'test stuff')
1118
+ self.compare_steps(feature.scenarios[0].steps, [
1119
+ ('given', 'Soit', 'I am testing stuff', None, None),
1120
+ ('then', 'Alors', 'it should work', None, None),
1121
+ ])
1122
+
1123
+ def test_parses_french_multi_word(self):
1124
+ doc = u"""
1125
+ Fonctionnalit\xe9: testing stuff
1126
+ Oh my god, it's full of stuff...
1127
+
1128
+ Sc\xe9nario: test stuff
1129
+ Etant donn\xe9 I am testing stuff
1130
+ Alors it should work
1131
+ """.lstrip()
1132
+ feature = parser.parse_feature(doc, 'fr')
1133
+ eq_(feature.name, "testing stuff")
1134
+ eq_(feature.description, ["Oh my god, it's full of stuff..."])
1135
+
1136
+ assert(len(feature.scenarios) == 1)
1137
+ eq_(feature.scenarios[0].name, 'test stuff')
1138
+ self.compare_steps(feature.scenarios[0].steps, [
1139
+ ('given', u'Etant donn\xe9', 'I am testing stuff', None, None),
1140
+ ('then', 'Alors', 'it should work', None, None),
1141
+ ])
1142
+ test_parses_french_multi_word.go = 1
1143
+
1144
+ def test_properly_handles_whitespace_on_keywords_that_do_not_want_it(self):
1145
+ doc = u"""
1146
+ # language: zh-TW
1147
+
1148
+ \u529f\u80fd: I have no idea what I'm saying
1149
+
1150
+ \u5834\u666f: No clue whatsoever
1151
+ \u5047\u8a2dI've got no idea
1152
+ \u7576I say things
1153
+ \u800c\u4e14People don't understand
1154
+ \u90a3\u9ebcPeople should laugh
1155
+ \u4f46\u662fI should take it well
1156
+ """
1157
+
1158
+ feature = parser.parse_feature(doc)
1159
+ eq_(feature.name, "I have no idea what I'm saying")
1160
+
1161
+ eq_(len(feature.scenarios), 1)
1162
+ eq_(feature.scenarios[0].name, 'No clue whatsoever')
1163
+ self.compare_steps(feature.scenarios[0].steps, [
1164
+ ('given', u'\u5047\u8a2d', "I've got no idea", None, None),
1165
+ ('when', u'\u7576', 'I say things', None, None),
1166
+ ('when', u'\u800c\u4e14', "People don't understand", None, None),
1167
+ ('then', u'\u90a3\u9ebc', "People should laugh", None, None),
1168
+ ('then', u'\u4f46\u662f', "I should take it well", None, None),
1169
+ ])
1170
+
1171
+
1172
+ class TestParser4ScenarioDescription(Common):
1173
+
1174
+ def test_parse_scenario_description(self):
1175
+ doc = u'''
1176
+ Feature: Scenario Description
1177
+
1178
+ Scenario: With scenario description
1179
+
1180
+ First line of scenario description.
1181
+ Second line of scenario description.
1182
+
1183
+ Third line of scenario description (after an empty line).
1184
+
1185
+ Given we have stuff
1186
+ When we do stuff
1187
+ Then we have things
1188
+ '''.lstrip()
1189
+ feature = parser.parse_feature(doc)
1190
+ eq_(feature.name, "Scenario Description")
1191
+
1192
+ assert(len(feature.scenarios) == 1)
1193
+ eq_(feature.scenarios[0].name, "With scenario description")
1194
+ eq_(feature.scenarios[0].tags, [])
1195
+ eq_(feature.scenarios[0].description, [
1196
+ "First line of scenario description.",
1197
+ "Second line of scenario description.",
1198
+ "Third line of scenario description (after an empty line).",
1199
+ ])
1200
+ self.compare_steps(feature.scenarios[0].steps, [
1201
+ ('given', 'Given', 'we have stuff', None, None),
1202
+ ('when', 'When', 'we do stuff', None, None),
1203
+ ('then', 'Then', 'we have things', None, None),
1204
+ ])
1205
+
1206
+
1207
+ def test_parse_scenario_with_description_but_without_steps(self):
1208
+ doc = u'''
1209
+ Feature: Scenario Description
1210
+
1211
+ Scenario: With description but without steps
1212
+
1213
+ First line of scenario description.
1214
+ Second line of scenario description.
1215
+
1216
+ Scenario: Another one
1217
+ Given we have stuff
1218
+ When we do stuff
1219
+ Then we have things
1220
+ '''.lstrip()
1221
+ feature = parser.parse_feature(doc)
1222
+ eq_(feature.name, "Scenario Description")
1223
+
1224
+ assert(len(feature.scenarios) == 2)
1225
+ eq_(feature.scenarios[0].name, "With description but without steps")
1226
+ eq_(feature.scenarios[0].tags, [])
1227
+ eq_(feature.scenarios[0].description, [
1228
+ "First line of scenario description.",
1229
+ "Second line of scenario description.",
1230
+ ])
1231
+ eq_(feature.scenarios[0].steps, [])
1232
+
1233
+ eq_(feature.scenarios[1].name, "Another one")
1234
+ eq_(feature.scenarios[1].tags, [])
1235
+ eq_(feature.scenarios[1].description, [])
1236
+ self.compare_steps(feature.scenarios[1].steps, [
1237
+ ('given', 'Given', 'we have stuff', None, None),
1238
+ ('when', 'When', 'we do stuff', None, None),
1239
+ ('then', 'Then', 'we have things', None, None),
1240
+ ])
1241
+
1242
+
1243
+ def test_parse_scenario_with_description_but_without_steps_followed_by_scenario_with_tags(self):
1244
+ doc = u'''
1245
+ Feature: Scenario Description
1246
+
1247
+ Scenario: With description but without steps
1248
+
1249
+ First line of scenario description.
1250
+ Second line of scenario description.
1251
+
1252
+ @foo @bar
1253
+ Scenario: Another one
1254
+ Given we have stuff
1255
+ When we do stuff
1256
+ Then we have things
1257
+ '''.lstrip()
1258
+ feature = parser.parse_feature(doc)
1259
+ eq_(feature.name, "Scenario Description")
1260
+
1261
+ assert(len(feature.scenarios) == 2)
1262
+ eq_(feature.scenarios[0].name, "With description but without steps")
1263
+ eq_(feature.scenarios[0].tags, [])
1264
+ eq_(feature.scenarios[0].description, [
1265
+ "First line of scenario description.",
1266
+ "Second line of scenario description.",
1267
+ ])
1268
+ eq_(feature.scenarios[0].steps, [])
1269
+
1270
+ eq_(feature.scenarios[1].name, "Another one")
1271
+ eq_(feature.scenarios[1].tags, ["foo", "bar"])
1272
+ eq_(feature.scenarios[1].description, [])
1273
+ self.compare_steps(feature.scenarios[1].steps, [
1274
+ ('given', 'Given', 'we have stuff', None, None),
1275
+ ('when', 'When', 'we do stuff', None, None),
1276
+ ('then', 'Then', 'we have things', None, None),
1277
+ ])
1278
+
1279
+ def test_parse_two_scenarios_with_description(self):
1280
+ doc = u'''
1281
+ Feature: Scenario Description
1282
+
1283
+ Scenario: One with description but without steps
1284
+
1285
+ First line of scenario description.
1286
+ Second line of scenario description.
1287
+
1288
+ Scenario: Two with description and with steps
1289
+
1290
+ Another line of scenario description.
1291
+
1292
+ Given we have stuff
1293
+ When we do stuff
1294
+ Then we have things
1295
+ '''.lstrip()
1296
+ feature = parser.parse_feature(doc)
1297
+ eq_(feature.name, "Scenario Description")
1298
+
1299
+ assert(len(feature.scenarios) == 2)
1300
+ eq_(feature.scenarios[0].name, "One with description but without steps")
1301
+ eq_(feature.scenarios[0].tags, [])
1302
+ eq_(feature.scenarios[0].description, [
1303
+ "First line of scenario description.",
1304
+ "Second line of scenario description.",
1305
+ ])
1306
+ eq_(feature.scenarios[0].steps, [])
1307
+
1308
+ eq_(feature.scenarios[1].name, "Two with description and with steps")
1309
+ eq_(feature.scenarios[1].tags, [])
1310
+ eq_(feature.scenarios[1].description, [
1311
+ "Another line of scenario description.",
1312
+ ])
1313
+ self.compare_steps(feature.scenarios[1].steps, [
1314
+ ('given', 'Given', 'we have stuff', None, None),
1315
+ ('when', 'When', 'we do stuff', None, None),
1316
+ ('then', 'Then', 'we have things', None, None),
1317
+ ])
1318
+
1319
+
1320
+ def parse_tags(line):
1321
+ the_parser = parser.Parser()
1322
+ return the_parser.parse_tags(line.strip())
1323
+
1324
+ class TestParser4Tags(Common):
1325
+
1326
+ def test_parse_tags_with_one_tag(self):
1327
+ tags = parse_tags('@one ')
1328
+ eq_(len(tags), 1)
1329
+ eq_(tags[0], "one")
1330
+
1331
+ def test_parse_tags_with_more_tags(self):
1332
+ tags = parse_tags('@one @two.three-four @xxx')
1333
+ eq_(len(tags), 3)
1334
+ eq_(tags, [model.Tag(name, 1)
1335
+ for name in (u'one', u'two.three-four', u'xxx' )])
1336
+
1337
+ def test_parse_tags_with_tag_and_comment(self):
1338
+ tags = parse_tags('@one # @fake-tag-in-comment xxx')
1339
+ eq_(len(tags), 1)
1340
+ eq_(tags[0], "one")
1341
+
1342
+ def test_parse_tags_with_tags_and_comment(self):
1343
+ tags = parse_tags('@one @two.three-four @xxx # @fake-tag-in-comment xxx')
1344
+ eq_(len(tags), 3)
1345
+ eq_(tags, [model.Tag(name, 1)
1346
+ for name in (u'one', u'two.three-four', u'xxx' )])
1347
+
1348
+ @raises(parser.ParserError)
1349
+ def test_parse_tags_with_invalid_tags(self):
1350
+ parse_tags('@one invalid.tag boom')
1351
+
1352
+
1353
+ class TestParser4Background(Common):
1354
+
1355
+ def test_parse_background(self):
1356
+ doc = u'''
1357
+ Feature: Background
1358
+
1359
+ A feature description line 1.
1360
+ A feature description line 2.
1361
+
1362
+ Background: One
1363
+ Given we init stuff
1364
+ When we init more stuff
1365
+
1366
+ Scenario: One
1367
+ Given we have stuff
1368
+ When we do stuff
1369
+ Then we have things
1370
+ '''.lstrip()
1371
+ feature = parser.parse_feature(doc)
1372
+ eq_(feature.name, "Background")
1373
+ eq_(feature.description, [
1374
+ "A feature description line 1.",
1375
+ "A feature description line 2.",
1376
+ ])
1377
+ assert feature.background is not None
1378
+ eq_(feature.background.name, "One")
1379
+ self.compare_steps(feature.background.steps, [
1380
+ ('given', 'Given', 'we init stuff', None, None),
1381
+ ('when', 'When', 'we init more stuff', None, None),
1382
+ ])
1383
+
1384
+ assert(len(feature.scenarios) == 1)
1385
+ eq_(feature.scenarios[0].name, "One")
1386
+ eq_(feature.scenarios[0].tags, [])
1387
+ self.compare_steps(feature.scenarios[0].steps, [
1388
+ ('given', 'Given', 'we have stuff', None, None),
1389
+ ('when', 'When', 'we do stuff', None, None),
1390
+ ('then', 'Then', 'we have things', None, None),
1391
+ ])
1392
+
1393
+
1394
+ def test_parse_background_with_tags_should_fail(self):
1395
+ doc = u'''
1396
+ Feature: Background with tags
1397
+ Expect that a ParserError occurs
1398
+ because Background does not support tags/tagging.
1399
+
1400
+ @tags_are @not_supported
1401
+ @here
1402
+ Background: One
1403
+ Given we init stuff
1404
+ '''.lstrip()
1405
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
1406
+
1407
+
1408
+ def test_parse_two_background_should_fail(self):
1409
+ doc = u'''
1410
+ Feature: Two Backgrounds
1411
+ Expect that a ParserError occurs
1412
+ because at most one Background is supported.
1413
+
1414
+ Background: One
1415
+ Given we init stuff
1416
+
1417
+ Background: Two
1418
+ When we init more stuff
1419
+ '''.lstrip()
1420
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
1421
+
1422
+
1423
+ def test_parse_background_after_scenario_should_fail(self):
1424
+ doc = u'''
1425
+ Feature: Background after Scenario
1426
+ Expect that a ParserError occurs
1427
+ because Background is only allowed before any Scenario.
1428
+
1429
+ Scenario: One
1430
+ Given we have stuff
1431
+
1432
+ Background: Two
1433
+ When we init more stuff
1434
+ '''.lstrip()
1435
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
1436
+
1437
+
1438
+ def test_parse_background_after_scenario_outline_should_fail(self):
1439
+ doc = u'''
1440
+ Feature: Background after ScenarioOutline
1441
+ Expect that a ParserError occurs
1442
+ because Background is only allowed before any ScenarioOuline.
1443
+ Scenario Outline: ...
1444
+ Given there is <name>
1445
+
1446
+ Examples:
1447
+ | name |
1448
+ | Alice |
1449
+
1450
+ Background: Two
1451
+ When we init more stuff
1452
+ '''.lstrip()
1453
+ assert_raises(parser.ParserError, parser.parse_feature, doc)
1454
+
1455
+
1456
+ class TestParser4Steps(Common):
1457
+ """
1458
+ Tests parser.parse_steps() and parser.Parser.parse_steps() functionality.
1459
+ """
1460
+
1461
+ def test_parse_steps_with_simple_steps(self):
1462
+ doc = u'''
1463
+ Given a simple step
1464
+ When I have another simple step
1465
+ And I have another simple step
1466
+ Then every step will be parsed without errors
1467
+ '''.lstrip()
1468
+ steps = parser.parse_steps(doc)
1469
+ eq_(len(steps), 4)
1470
+ # -- EXPECTED STEP DATA:
1471
+ # SCHEMA: step_type, keyword, name, text, table
1472
+ self.compare_steps(steps, [
1473
+ ("given", "Given", "a simple step", None, None),
1474
+ ("when", "When", "I have another simple step", None, None),
1475
+ ("when", "And", "I have another simple step", None, None),
1476
+ ("then", "Then", "every step will be parsed without errors",
1477
+ None, None),
1478
+ ])
1479
+
1480
+ def test_parse_steps_with_multiline_text(self):
1481
+ doc = u'''
1482
+ Given a step with multi-line text:
1483
+ """
1484
+ Lorem ipsum
1485
+ Ipsum lorem
1486
+ """
1487
+ When I have a step with multi-line text:
1488
+ """
1489
+ Ipsum lorem
1490
+ Lorem ipsum
1491
+ """
1492
+ Then every step will be parsed without errors
1493
+ '''.lstrip()
1494
+ steps = parser.parse_steps(doc)
1495
+ eq_(len(steps), 3)
1496
+ # -- EXPECTED STEP DATA:
1497
+ # SCHEMA: step_type, keyword, name, text, table
1498
+ text1 = "Lorem ipsum\nIpsum lorem"
1499
+ text2 = "Ipsum lorem\nLorem ipsum"
1500
+ self.compare_steps(steps, [
1501
+ ("given", "Given", "a step with multi-line text", text1, None),
1502
+ ("when", "When", "I have a step with multi-line text", text2, None),
1503
+ ("then", "Then", "every step will be parsed without errors",
1504
+ None, None),
1505
+ ])
1506
+
1507
+ def test_parse_steps_when_last_step_has_multiline_text(self):
1508
+ doc = u'''
1509
+ Given a simple step
1510
+ Then the last step has multi-line text:
1511
+ """
1512
+ Lorem ipsum
1513
+ Ipsum lorem
1514
+ """
1515
+ '''.lstrip()
1516
+ steps = parser.parse_steps(doc)
1517
+ eq_(len(steps), 2)
1518
+ # -- EXPECTED STEP DATA:
1519
+ # SCHEMA: step_type, keyword, name, text, table
1520
+ text2 = "Lorem ipsum\nIpsum lorem"
1521
+ self.compare_steps(steps, [
1522
+ ("given", "Given", "a simple step", None, None),
1523
+ ("then", "Then", "the last step has multi-line text", text2, None),
1524
+ ])
1525
+
1526
+ def test_parse_steps_with_table(self):
1527
+ doc = u'''
1528
+ Given a step with a table:
1529
+ | Name | Age |
1530
+ | Alice | 12 |
1531
+ | Bob | 23 |
1532
+ When I have a step with a table:
1533
+ | Country | Capital |
1534
+ | France | Paris |
1535
+ | Germany | Berlin |
1536
+ | Spain | Madrid |
1537
+ | USA | Washington |
1538
+ Then every step will be parsed without errors
1539
+ '''.lstrip()
1540
+ steps = parser.parse_steps(doc)
1541
+ eq_(len(steps), 3)
1542
+ # -- EXPECTED STEP DATA:
1543
+ # SCHEMA: step_type, keyword, name, text, table
1544
+ table1 = model.Table([u"Name", u"Age"], 0, [
1545
+ [ u"Alice", u"12" ],
1546
+ [ u"Bob", u"23" ],
1547
+ ])
1548
+ table2 = model.Table([u"Country", u"Capital"], 0, [
1549
+ [ u"France", u"Paris" ],
1550
+ [ u"Germany", u"Berlin" ],
1551
+ [ u"Spain", u"Madrid" ],
1552
+ [ u"USA", u"Washington" ],
1553
+ ])
1554
+ self.compare_steps(steps, [
1555
+ ("given", "Given", "a step with a table", None, table1),
1556
+ ("when", "When", "I have a step with a table", None, table2),
1557
+ ("then", "Then", "every step will be parsed without errors",
1558
+ None, None),
1559
+ ])
1560
+
1561
+ def test_parse_steps_when_last_step_has_a_table(self):
1562
+ doc = u'''
1563
+ Given a simple step
1564
+ Then the last step has a final table:
1565
+ | Name | City |
1566
+ | Alonso | Barcelona |
1567
+ | Bred | London |
1568
+ '''.lstrip()
1569
+ steps = parser.parse_steps(doc)
1570
+ eq_(len(steps), 2)
1571
+ # -- EXPECTED STEP DATA:
1572
+ # SCHEMA: step_type, keyword, name, text, table
1573
+ table2 = model.Table([u"Name", u"City"], 0, [
1574
+ [ u"Alonso", u"Barcelona" ],
1575
+ [ u"Bred", u"London" ],
1576
+ ])
1577
+ self.compare_steps(steps, [
1578
+ ("given", "Given", "a simple step", None, None),
1579
+ ("then", "Then", "the last step has a final table", None, table2),
1580
+ ])
1581
+
1582
+ @raises(parser.ParserError)
1583
+ def test_parse_steps_with_malformed_table(self):
1584
+ doc = u'''
1585
+ Given a step with a malformed table:
1586
+ | Name | City |
1587
+ | Alonso | Barcelona | 2004 |
1588
+ | Bred | London | 2010 |
1589
+ '''.lstrip()
1590
+ steps = parser.parse_steps(doc)