busser-behave 0.1.3

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 (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,21 @@
1
+ # =====================================================
2
+ # INVOKE CONFIGURATION:
3
+ # =====================================================
4
+ # -- ON WINDOWS:
5
+ # run:
6
+ # echo: true
7
+ # pty: false
8
+ # shell: C:\Windows\System32\cmd.exe
9
+ # =====================================================
10
+
11
+ run:
12
+ echo: true
13
+ pty: true
14
+
15
+ behave_test:
16
+ scopes:
17
+ - features
18
+ - tools/test-features
19
+ - issue.features
20
+ args: features tools/test-features issue.features
21
+
@@ -0,0 +1,17 @@
1
+ issue.features:
2
+ ===============================================================================
3
+
4
+ :Status: PREPARED (fixes are being applied).
5
+ :Requires: Python >= 2.6 (due to step implementations)
6
+
7
+ This directory contains behave self-tests to ensure that behave related
8
+ issues are fixed.
9
+
10
+ PROCEDURE:
11
+
12
+ * ONCE: Install python requirements ("requirements.txt")
13
+ * Run the tests with behave
14
+
15
+ ::
16
+
17
+ bin/behave -f progress issue.features/
@@ -0,0 +1,97 @@
1
+ # -*- coding: UTF-8 -*-
2
+ # FILE: features/environment.py
3
+ # pylint: disable=unused-argument
4
+ """
5
+ Functionality:
6
+
7
+ * active tags
8
+ """
9
+
10
+ from __future__ import print_function
11
+ import sys
12
+ import platform
13
+ import os.path
14
+ import six
15
+ from behave.tag_matcher import ActiveTagMatcher
16
+ from behave4cmd0.setup_command_shell import setup_command_shell_processors4behave
17
+ # PREPARED:
18
+ # from behave.tag_matcher import setup_active_tag_values
19
+
20
+
21
+ def require_tool(tool_name):
22
+ """Check if a tool (an executable program) is provided on this platform.
23
+
24
+ :params tool_name: Name of the tool to check if it is available.
25
+ :return: True, if tool is found.
26
+ :return: False, if tool is not available (or not in search path).
27
+ """
28
+ # print("CHECK-TOOL: %s" % tool_name)
29
+ path = os.environ.get("PATH")
30
+ if not path:
31
+ return False
32
+
33
+ for searchdir in path.split(os.pathsep):
34
+ executable1 = os.path.normpath(os.path.join(searchdir, tool_name))
35
+ executables = [executable1]
36
+ if sys.platform.startswith("win"):
37
+ executables.append(executable1 + ".exe")
38
+
39
+ for executable in executables:
40
+ # print("TOOL-CHECK: %s" % os.path.abspath(executable))
41
+ if os.path.isfile(executable):
42
+ # print("TOOL-FOUND: %s" % os.path.abspath(executable))
43
+ return True
44
+ # -- OTHERWISE: Tool not found
45
+ # print("TOOL-NOT-FOUND: %s" % tool_name)
46
+ return False
47
+
48
+ def as_bool_string(value):
49
+ if bool(value):
50
+ return "yes"
51
+ else:
52
+ return "no"
53
+
54
+ def discover_ci_server():
55
+ # pylint: disable=invalid-name
56
+ ci_server = "none"
57
+ CI = os.environ.get("CI", "false").lower() == "true"
58
+ APPVEYOR = os.environ.get("APPVEYOR", "false").lower() == "true"
59
+ TRAVIS = os.environ.get("TRAVIS", "false").lower() == "true"
60
+ if CI:
61
+ if APPVEYOR:
62
+ ci_server = "appveyor"
63
+ elif TRAVIS:
64
+ ci_server = "travis"
65
+ else:
66
+ ci_server = "unknown"
67
+ return ci_server
68
+
69
+
70
+ # -- MATCHES ANY TAGS: @use.with_{category}={value}
71
+ # NOTE: active_tag_value_provider provides category values for active tags.
72
+ active_tag_value_provider = {
73
+ "python2": str(six.PY2).lower(),
74
+ "python3": str(six.PY3).lower(),
75
+ # -- python.implementation: cpython, pypy, jython, ironpython
76
+ "python.implementation": platform.python_implementation().lower(),
77
+ "pypy": str("__pypy__" in sys.modules).lower(),
78
+ "os": sys.platform,
79
+ "xmllint": as_bool_string(require_tool("xmllint")),
80
+ "ci": discover_ci_server()
81
+ }
82
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
83
+
84
+ def before_all(context):
85
+ # -- SETUP ACTIVE-TAG MATCHER (with userdata):
86
+ # USE: behave -D browser=safari ...
87
+ # NOT-NEEDED: setup_active_tag_values(active_tag_value_provider,
88
+ # context.config.userdata)
89
+ setup_command_shell_processors4behave()
90
+
91
+ def before_feature(context, feature):
92
+ if active_tag_matcher.should_exclude_with(feature.tags):
93
+ feature.skip(reason=active_tag_matcher.exclude_reason)
94
+
95
+ def before_scenario(context, scenario):
96
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
97
+ scenario.skip(reason=active_tag_matcher.exclude_reason)
@@ -0,0 +1,21 @@
1
+ @issue
2
+ Feature: Issue #30 "behave --version" runs features and shows no version
3
+
4
+ Scenario: Ensure environment assumptions are correct (Sanity Check)
5
+ Given a new working directory
6
+ When I run "behave"
7
+ Then it should fail
8
+ And the command output should contain:
9
+ """
10
+ No steps directory in '{__WORKDIR__}/features'
11
+ """
12
+
13
+ Scenario: Ensure --version option is processed correctly
14
+ Given a new working directory
15
+ When I run "behave --version"
16
+ Then it should pass
17
+ And the command output should not contain:
18
+ """
19
+ No steps directory in '{__WORKDIR__}/features'
20
+ """
21
+
@@ -0,0 +1,16 @@
1
+ @issue
2
+ Feature: Issue #31 "behave --format help" raises an error
3
+
4
+ Scenario:
5
+ Given a new working directory
6
+ When I run "behave --format=help"
7
+ Then it should pass
8
+ And the command output should contain:
9
+ """
10
+ Available formatters:
11
+ json JSON dump of test run
12
+ json.pretty JSON dump of test run (human readable)
13
+ null Provides formatter that does not output anything.
14
+ plain Very basic formatter with maximum compatibility
15
+ pretty Standard colourised pretty formatter
16
+ """
@@ -0,0 +1,28 @@
1
+ @issue
2
+ Feature: Issue #32 "behave --junit-directory=xxx" fails if more than 1 level must be created
3
+
4
+ Scenario:
5
+ Given a new working directory
6
+ And a file named "features/steps/steps.py" with:
7
+ """
8
+ from behave import given, when, then
9
+
10
+ @given(u'passing')
11
+ def step(context):
12
+ pass
13
+ """
14
+ And a file named "features/issue32_1.feature" with:
15
+ """
16
+ Feature: One
17
+ Scenario: One
18
+ Given passing
19
+ """
20
+
21
+ When I run "behave --junit --junit-directory=report/test_results"
22
+ Then it should pass with:
23
+ """
24
+ 1 feature passed, 0 failed, 0 skipped
25
+ 1 scenario passed, 0 failed, 0 skipped
26
+ 1 step passed, 0 failed, 0 skipped, 0 undefined
27
+ """
28
+ And the directory "report/test_results" should exist
@@ -0,0 +1,74 @@
1
+ @issue
2
+ Feature: Issue #35 Plain Formatter shows wrong steps when tag-selection is used
3
+
4
+ Background: Test Setup
5
+ Given a new working directory
6
+ And a file named "features/steps/steps.py" with:
7
+ """
8
+ from behave import given, when, then
9
+
10
+ @given(u'the ninja has a third level black-belt')
11
+ def step(context):
12
+ pass
13
+
14
+ @when(u'attacked by {opponent}')
15
+ def step(context, opponent):
16
+ pass
17
+
18
+ @then(u'the ninja should {reaction}')
19
+ def step(context, reaction):
20
+ pass
21
+ """
22
+ And a file named "features/issue35_1.feature" with:
23
+ """
24
+ Feature: Using Tags with Features and Scenarios
25
+
26
+ @one
27
+ Scenario: Weaker opponent
28
+ Given the ninja has a third level black-belt
29
+ When attacked by a samurai
30
+ Then the ninja should engage the opponent
31
+
32
+ @two
33
+ Scenario: Stronger opponent
34
+ Given the ninja has a third level black-belt
35
+ When attacked by Chuck Norris
36
+ Then the ninja should run for his life
37
+ """
38
+
39
+ Scenario: Select First Scenario with Tag
40
+ When I run "behave --no-timings -f plain --tags=@one features/issue35_1.feature"
41
+ Then it should pass with:
42
+ """
43
+ 1 feature passed, 0 failed, 0 skipped
44
+ 1 scenario passed, 0 failed, 1 skipped
45
+ 3 steps passed, 0 failed, 3 skipped, 0 undefined
46
+ """
47
+ And the command output should contain:
48
+ """
49
+ Feature: Using Tags with Features and Scenarios
50
+ Scenario: Weaker opponent
51
+ Given the ninja has a third level black-belt ... passed
52
+ When attacked by a samurai ... passed
53
+ Then the ninja should engage the opponent ... passed
54
+ Scenario: Stronger opponent
55
+ """
56
+
57
+ Scenario: Select Second Scenario with Tag
58
+ When I run "behave --no-timings -f plain --tags=@two features/issue35_1.feature"
59
+ Then it should pass with:
60
+ """
61
+ 1 feature passed, 0 failed, 0 skipped
62
+ 1 scenario passed, 0 failed, 1 skipped
63
+ 3 steps passed, 0 failed, 3 skipped, 0 undefined
64
+ """
65
+ And the command output should contain:
66
+ """
67
+ Feature: Using Tags with Features and Scenarios
68
+ Scenario: Weaker opponent
69
+ Scenario: Stronger opponent
70
+ Given the ninja has a third level black-belt ... passed
71
+ When attacked by Chuck Norris ... passed
72
+ Then the ninja should run for his life ... passed
73
+ """
74
+
@@ -0,0 +1,154 @@
1
+ @issue
2
+ Feature: Issue #40 Test Summary Scenario/Step Counts are incorrect for Scenario Outline
3
+
4
+ As I user
5
+ I want that each passed and each failed scenario is counted
6
+ And I want that each passed and failed step in a ScenarioOutline is counted
7
+
8
+ Background: Test Setup
9
+ Given a new working directory
10
+ And a file named "features/steps/steps.py" with:
11
+ """
12
+ from behave import given, when, then
13
+
14
+ @given(u'a step {outcome} with "{name}"')
15
+ def step(context, outcome, name):
16
+ context.name = name
17
+ assert outcome == "passes"
18
+
19
+ @when(u'a step {outcome} with "{name}"')
20
+ def step(context, outcome, name):
21
+ assert outcome == "passes"
22
+ assert context.name == name
23
+
24
+ @then(u'a step {outcome} with "{name}"')
25
+ def step(context, outcome, name):
26
+ assert outcome == "passes"
27
+ assert context.name == name
28
+ """
29
+
30
+ Scenario: ScenarioOutline with Passing Steps
31
+ Given a file named "features/issue40_1.feature" with:
32
+ """
33
+ Feature: Verify Scenario/Step Summary Pass Count with ScenarioOutline
34
+ Scenario Outline:
35
+ Given a step passes with "<name>"
36
+ When a step passes with "<name>"
37
+ Then a step passes with "<name>"
38
+
39
+ Examples:
40
+ |name |
41
+ |Alice|
42
+ |Bob |
43
+ """
44
+ When I run "behave -c -f plain features/issue40_1.feature"
45
+ Then it should pass with:
46
+ """
47
+ 2 scenarios passed, 0 failed, 0 skipped
48
+ 6 steps passed, 0 failed, 0 skipped, 0 undefined
49
+ """
50
+
51
+ Scenario: ScenarioOutline with Failing Given-Steps
52
+ Given a file named "features/issue40_2G.feature" with:
53
+ """
54
+ Feature: Scenario/Step Summary Pass/Fail Count with ScenarioOutline
55
+ Scenario Outline:
56
+ Given a step fails with "<name>"
57
+ When a step passes with "<name>"
58
+ Then a step passes with "<name>"
59
+
60
+ Examples:
61
+ |name |
62
+ |Alice|
63
+ |Bob |
64
+ """
65
+ When I run "behave -c -f plain features/issue40_2G.feature"
66
+ Then it should fail with:
67
+ """
68
+ 0 scenarios passed, 2 failed, 0 skipped
69
+ 0 steps passed, 2 failed, 4 skipped, 0 undefined
70
+ """
71
+
72
+ Scenario: ScenarioOutline with Failing When-Steps
73
+ Given a file named "features/issue40_2W.feature" with:
74
+ """
75
+ Feature: Scenario/Step Summary Pass/Fail Count with ScenarioOutline
76
+ Scenario Outline:
77
+ Given a step passes with "<name>"
78
+ When a step fails with "<name>"
79
+ Then a step passes with "<name>"
80
+
81
+ Examples:
82
+ |name |
83
+ |Alice|
84
+ |Bob |
85
+ """
86
+ When I run "behave -c -f plain features/issue40_2W.feature"
87
+ Then it should fail with:
88
+ """
89
+ 0 scenarios passed, 2 failed, 0 skipped
90
+ 2 steps passed, 2 failed, 2 skipped, 0 undefined
91
+ """
92
+
93
+ Scenario: ScenarioOutline with Failing Then-Steps
94
+ Given a file named "features/issue40_2T.feature" with:
95
+ """
96
+ Feature: Scenario/Step Summary Pass/Fail Count with ScenarioOutline
97
+ Scenario Outline:
98
+ Given a step passes with "<name>"
99
+ When a step passes with "<name>"
100
+ Then a step fails with "<name>"
101
+
102
+ Examples:
103
+ |name |
104
+ |Alice|
105
+ |Bob |
106
+ """
107
+ When I run "behave -c -f plain features/issue40_2T.feature"
108
+ Then it should fail with:
109
+ """
110
+ 0 scenarios passed, 2 failed, 0 skipped
111
+ 4 steps passed, 2 failed, 0 skipped, 0 undefined
112
+ """
113
+
114
+ Scenario: ScenarioOutline with Mismatched When-Step Example Row
115
+ Given a file named "features/issue40_3W.feature" with:
116
+ """
117
+ Feature: Scenario/Step Summary Pass/Fail Count with ScenarioOutline
118
+ Scenario Outline:
119
+ Given a step passes with "<name>"
120
+ When a step passes with "Alice"
121
+ Then a step passes with "<name>"
122
+
123
+ Examples:
124
+ |name |
125
+ |Alice|
126
+ |Bob |
127
+ """
128
+ When I run "behave -c -f plain features/issue40_3W.feature"
129
+ Then it should fail with:
130
+ """
131
+ 1 scenario passed, 1 failed, 0 skipped
132
+ 4 steps passed, 1 failed, 1 skipped, 0 undefined
133
+ """
134
+
135
+ Scenario: ScenarioOutline with Mismatched Then-Step Example Row
136
+ Given a file named "features/issue40_3W.feature" with:
137
+ """
138
+ Feature: Scenario/Step Summary Pass/Fail Count with ScenarioOutline
139
+ Scenario Outline:
140
+ Given a step passes with "<name>"
141
+ When a step passes with "<name>"
142
+ Then a step passes with "Alice"
143
+
144
+ Examples:
145
+ |name |
146
+ |Alice|
147
+ |Bob |
148
+ """
149
+ When I run "behave -c -f plain features/issue40_3W.feature"
150
+ Then it should fail with:
151
+ """
152
+ 1 scenario passed, 1 failed, 0 skipped
153
+ 5 steps passed, 1 failed, 0 skipped, 0 undefined
154
+ """
@@ -0,0 +1,135 @@
1
+ @issue
2
+ Feature: Issue #41 Missing Steps are duplicated in a Scenario Outline
3
+
4
+ As I user
5
+ I want that missing steps are reported only once.
6
+
7
+ Background: Test Setup
8
+ Given a new working directory
9
+ And a file named "features/steps/steps.py" with:
10
+ """
11
+ from behave import given, when, then
12
+
13
+ @given(u'I enter a "{name}"')
14
+ def step(context, name):
15
+ context.name = name
16
+
17
+ @when(u'I enter a "{name}"')
18
+ def step(context, name):
19
+ context.name = name
20
+
21
+ @then(u'the name is "{name}"')
22
+ def step(context, name):
23
+ assert context.name == name
24
+ """
25
+
26
+ Scenario: Missing Given Step
27
+ Given a file named "features/issue41_missing1.feature" with:
28
+ """
29
+ Feature: Missing Given-Step in a Scenario Outline
30
+ Scenario Outline:
31
+ Given an unknown step
32
+ When I enter a "<name>"
33
+ Then the name is "<name>"
34
+
35
+ Examples:
36
+ |name |
37
+ |Alice|
38
+ |Bob |
39
+ """
40
+ When I run "behave -c -f plain features/issue41_missing1.feature"
41
+ Then it should fail with:
42
+ """
43
+ 0 steps passed, 0 failed, 4 skipped, 2 undefined
44
+ """
45
+ And the command output should contain:
46
+ """
47
+ You can implement step definitions for undefined steps with these snippets:
48
+ @given(u'an unknown step')
49
+ def step_impl(context):
50
+ raise NotImplementedError(u'STEP: Given an unknown step')
51
+ """
52
+ But the command output should not contain:
53
+ """
54
+ You can implement step definitions for undefined steps with these snippets:
55
+ @given(u'an unknown step')
56
+ def step_impl(context):
57
+ raise NotImplementedError(u'STEP: Given an unknown step')
58
+ @given(u'an unknown step')
59
+ def step_impl(context):
60
+ raise NotImplementedError(u'STEP: Given an unknown step')
61
+ """
62
+
63
+ Scenario: Missing When Step
64
+ Given a file named "features/issue41_missing2.feature" with:
65
+ """
66
+ Feature: Missing When-Step in a Scenario Outline
67
+ Scenario Outline:
68
+ Given I enter a "<name>"
69
+ When I use an unknown step
70
+ Then the name is "<name>"
71
+
72
+ Examples:
73
+ |name |
74
+ |Alice|
75
+ |Bob |
76
+ """
77
+ When I run "behave -c -f plain features/issue41_missing2.feature"
78
+ Then it should fail with:
79
+ """
80
+ 2 steps passed, 0 failed, 2 skipped, 2 undefined
81
+ """
82
+ And the command output should contain:
83
+ """
84
+ You can implement step definitions for undefined steps with these snippets:
85
+ @when(u'I use an unknown step')
86
+ def step_impl(context):
87
+ raise NotImplementedError(u'STEP: When I use an unknown step')
88
+ """
89
+ But the command output should not contain:
90
+ """
91
+ You can implement step definitions for undefined steps with these snippets:
92
+ @when(u'I use an unknown step')
93
+ def step_impl(context):
94
+ raise NotImplementedError(u'STEP: When I use an unknown step')
95
+ @when(u'I use an unknown step')
96
+ def step_impl(context):
97
+ raise NotImplementedError(u'STEP: When I use an unknown step')
98
+ """
99
+
100
+ Scenario: Missing Then Step
101
+ Given a file named "features/issue41_missing3.feature" with:
102
+ """
103
+ Feature: Missing Then-Step in a Scenario Outline
104
+ Scenario Outline:
105
+ Given I enter a "<name>"
106
+ When I enter a "<name>"
107
+ Then I use an unknown step
108
+
109
+ Examples:
110
+ |name |
111
+ |Alice|
112
+ |Bob |
113
+ """
114
+ When I run "behave -c -f plain features/issue41_missing3.feature"
115
+ Then it should fail with:
116
+ """
117
+ 4 steps passed, 0 failed, 0 skipped, 2 undefined
118
+ """
119
+ And the command output should contain:
120
+ """
121
+ You can implement step definitions for undefined steps with these snippets:
122
+ @then(u'I use an unknown step')
123
+ def step_impl(context):
124
+ raise NotImplementedError(u'STEP: Then I use an unknown step')
125
+ """
126
+ But the command output should not contain:
127
+ """
128
+ You can implement step definitions for undefined steps with these snippets:
129
+ @then(u'I use an unknown step')
130
+ def step_impl(context):
131
+ raise NotImplementedError(u'STEP: Then I use an unknown step')
132
+ @then(u'I use an unknown step')
133
+ def step_impl(context):
134
+ raise NotImplementedError(u'STEP: Then I use an unknown step')
135
+ """