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.
- checksums.yaml +7 -0
- data/.cane +0 -0
- data/.gitignore +17 -0
- data/.tailor +4 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +3 -0
- data/LICENSE +15 -0
- data/README.md +41 -0
- data/Rakefile +68 -0
- data/busser-behave.gemspec +30 -0
- data/features/plugin_install_command.feature +11 -0
- data/features/plugin_list_command.feature +8 -0
- data/features/support/env.rb +13 -0
- data/features/test_command.feature +31 -0
- data/lib/busser/behave/version.rb +26 -0
- data/lib/busser/runner_plugin/behave.rb +37 -0
- data/vendor/behave/CHANGES.rst +483 -0
- data/vendor/behave/LICENSE +23 -0
- data/vendor/behave/MANIFEST.in +37 -0
- data/vendor/behave/PROJECT_INFO.rst +21 -0
- data/vendor/behave/README.rst +112 -0
- data/vendor/behave/VERSION.txt +1 -0
- data/vendor/behave/behave.ini +22 -0
- data/vendor/behave/behave/__init__.py +30 -0
- data/vendor/behave/behave/__main__.py +187 -0
- data/vendor/behave/behave/_stepimport.py +185 -0
- data/vendor/behave/behave/_types.py +134 -0
- data/vendor/behave/behave/api/__init__.py +7 -0
- data/vendor/behave/behave/api/async_step.py +283 -0
- data/vendor/behave/behave/capture.py +227 -0
- data/vendor/behave/behave/compat/__init__.py +5 -0
- data/vendor/behave/behave/compat/collections.py +20 -0
- data/vendor/behave/behave/configuration.py +788 -0
- data/vendor/behave/behave/contrib/__init__.py +0 -0
- data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
- data/vendor/behave/behave/formatter/__init__.py +12 -0
- data/vendor/behave/behave/formatter/_builtins.py +39 -0
- data/vendor/behave/behave/formatter/_registry.py +135 -0
- data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
- data/vendor/behave/behave/formatter/base.py +200 -0
- data/vendor/behave/behave/formatter/formatters.py +57 -0
- data/vendor/behave/behave/formatter/json.py +253 -0
- data/vendor/behave/behave/formatter/null.py +12 -0
- data/vendor/behave/behave/formatter/plain.py +158 -0
- data/vendor/behave/behave/formatter/pretty.py +351 -0
- data/vendor/behave/behave/formatter/progress.py +287 -0
- data/vendor/behave/behave/formatter/rerun.py +114 -0
- data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
- data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
- data/vendor/behave/behave/formatter/steps.py +497 -0
- data/vendor/behave/behave/formatter/tags.py +178 -0
- data/vendor/behave/behave/i18n.py +614 -0
- data/vendor/behave/behave/importer.py +102 -0
- data/vendor/behave/behave/json_parser.py +264 -0
- data/vendor/behave/behave/log_capture.py +233 -0
- data/vendor/behave/behave/matchers.py +402 -0
- data/vendor/behave/behave/model.py +1737 -0
- data/vendor/behave/behave/model_core.py +416 -0
- data/vendor/behave/behave/model_describe.py +105 -0
- data/vendor/behave/behave/parser.py +615 -0
- data/vendor/behave/behave/reporter/__init__.py +0 -0
- data/vendor/behave/behave/reporter/base.py +45 -0
- data/vendor/behave/behave/reporter/junit.py +473 -0
- data/vendor/behave/behave/reporter/summary.py +94 -0
- data/vendor/behave/behave/runner.py +753 -0
- data/vendor/behave/behave/runner_util.py +417 -0
- data/vendor/behave/behave/step_registry.py +112 -0
- data/vendor/behave/behave/tag_expression.py +111 -0
- data/vendor/behave/behave/tag_matcher.py +465 -0
- data/vendor/behave/behave/textutil.py +137 -0
- data/vendor/behave/behave/userdata.py +130 -0
- data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
- data/vendor/behave/behave4cmd0/__init__.py +5 -0
- data/vendor/behave/behave4cmd0/__setup.py +11 -0
- data/vendor/behave/behave4cmd0/command_shell.py +216 -0
- data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
- data/vendor/behave/behave4cmd0/command_steps.py +532 -0
- data/vendor/behave/behave4cmd0/command_util.py +147 -0
- data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
- data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
- data/vendor/behave/behave4cmd0/log/steps.py +395 -0
- data/vendor/behave/behave4cmd0/note_steps.py +29 -0
- data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
- data/vendor/behave/behave4cmd0/pathutil.py +146 -0
- data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
- data/vendor/behave/behave4cmd0/textutil.py +304 -0
- data/vendor/behave/bin/behave +44 -0
- data/vendor/behave/bin/behave.cmd +10 -0
- data/vendor/behave/bin/behave.junit_filter.py +85 -0
- data/vendor/behave/bin/behave.step_durations.py +163 -0
- data/vendor/behave/bin/behave2cucumber_json.py +63 -0
- data/vendor/behave/bin/behave_cmd.py +44 -0
- data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
- data/vendor/behave/bin/explore_platform_encoding.py +24 -0
- data/vendor/behave/bin/i18n.yml +621 -0
- data/vendor/behave/bin/invoke +8 -0
- data/vendor/behave/bin/invoke.cmd +9 -0
- data/vendor/behave/bin/json.format.py +167 -0
- data/vendor/behave/bin/jsonschema_validate.py +122 -0
- data/vendor/behave/bin/make_localpi.py +279 -0
- data/vendor/behave/bin/project_bootstrap.sh +30 -0
- data/vendor/behave/bin/toxcmd.py +270 -0
- data/vendor/behave/bin/toxcmd3.py +270 -0
- data/vendor/behave/conftest.py +27 -0
- data/vendor/behave/docs/Makefile +154 -0
- data/vendor/behave/docs/_static/agogo.css +501 -0
- data/vendor/behave/docs/_static/behave_logo.png +0 -0
- data/vendor/behave/docs/_static/behave_logo1.png +0 -0
- data/vendor/behave/docs/_static/behave_logo2.png +0 -0
- data/vendor/behave/docs/_static/behave_logo3.png +0 -0
- data/vendor/behave/docs/_themes/LICENSE +45 -0
- data/vendor/behave/docs/_themes/kr/layout.html +17 -0
- data/vendor/behave/docs/_themes/kr/relations.html +19 -0
- data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
- data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
- data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
- data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
- data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
- data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
- data/vendor/behave/docs/api.rst +408 -0
- data/vendor/behave/docs/appendix.rst +19 -0
- data/vendor/behave/docs/behave.rst +640 -0
- data/vendor/behave/docs/behave.rst-template +86 -0
- data/vendor/behave/docs/behave_ecosystem.rst +81 -0
- data/vendor/behave/docs/comparison.rst +85 -0
- data/vendor/behave/docs/conf.py +293 -0
- data/vendor/behave/docs/context_attributes.rst +66 -0
- data/vendor/behave/docs/django.rst +192 -0
- data/vendor/behave/docs/formatters.rst +61 -0
- data/vendor/behave/docs/gherkin.rst +673 -0
- data/vendor/behave/docs/index.rst +57 -0
- data/vendor/behave/docs/install.rst +60 -0
- data/vendor/behave/docs/more_info.rst +184 -0
- data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
- data/vendor/behave/docs/parse_builtin_types.rst +59 -0
- data/vendor/behave/docs/philosophy.rst +235 -0
- data/vendor/behave/docs/regular_expressions.rst +71 -0
- data/vendor/behave/docs/related.rst +14 -0
- data/vendor/behave/docs/test_domains.rst +62 -0
- data/vendor/behave/docs/tutorial.rst +636 -0
- data/vendor/behave/docs/update_behave_rst.py +100 -0
- data/vendor/behave/etc/json/behave.json-schema +172 -0
- data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
- data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
- data/vendor/behave/examples/async_step/README.txt +8 -0
- data/vendor/behave/examples/async_step/behave.ini +14 -0
- data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
- data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
- data/vendor/behave/examples/async_step/features/environment.py +28 -0
- data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
- data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
- data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
- data/vendor/behave/examples/env_vars/README.rst +26 -0
- data/vendor/behave/examples/env_vars/behave.ini +15 -0
- data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
- data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
- data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
- data/vendor/behave/features/README.txt +12 -0
- data/vendor/behave/features/background.feature +392 -0
- data/vendor/behave/features/capture_stderr.feature +172 -0
- data/vendor/behave/features/capture_stdout.feature +125 -0
- data/vendor/behave/features/cmdline.lang_list.feature +33 -0
- data/vendor/behave/features/configuration.default_paths.feature +116 -0
- data/vendor/behave/features/context.global_params.feature +35 -0
- data/vendor/behave/features/context.local_params.feature +17 -0
- data/vendor/behave/features/directory_layout.advanced.feature +147 -0
- data/vendor/behave/features/directory_layout.basic.feature +75 -0
- data/vendor/behave/features/directory_layout.basic2.feature +87 -0
- data/vendor/behave/features/environment.py +53 -0
- data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
- data/vendor/behave/features/feature.description.feature +0 -0
- data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
- data/vendor/behave/features/formatter.help.feature +30 -0
- data/vendor/behave/features/formatter.json.feature +420 -0
- data/vendor/behave/features/formatter.progress3.feature +235 -0
- data/vendor/behave/features/formatter.rerun.feature +296 -0
- data/vendor/behave/features/formatter.steps.feature +181 -0
- data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
- data/vendor/behave/features/formatter.steps_doc.feature +140 -0
- data/vendor/behave/features/formatter.steps_usage.feature +404 -0
- data/vendor/behave/features/formatter.tags.feature +134 -0
- data/vendor/behave/features/formatter.tags_location.feature +183 -0
- data/vendor/behave/features/formatter.user_defined.feature +196 -0
- data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
- data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
- data/vendor/behave/features/logcapture.feature +188 -0
- data/vendor/behave/features/logcapture.filter.feature +130 -0
- data/vendor/behave/features/logging.no_capture.feature +99 -0
- data/vendor/behave/features/logging.setup_format.feature +157 -0
- data/vendor/behave/features/logging.setup_level.feature +168 -0
- data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
- data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
- data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
- data/vendor/behave/features/runner.abort_by_user.feature +305 -0
- data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
- data/vendor/behave/features/runner.default_format.feature +175 -0
- data/vendor/behave/features/runner.dry_run.feature +184 -0
- data/vendor/behave/features/runner.feature_listfile.feature +223 -0
- data/vendor/behave/features/runner.hook_errors.feature +382 -0
- data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
- data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
- data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
- data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
- data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
- data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
- data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
- data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
- data/vendor/behave/features/runner.tag_logic.feature +67 -0
- data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
- data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
- data/vendor/behave/features/scenario.description.feature +171 -0
- data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
- data/vendor/behave/features/scenario_outline.basics.feature +100 -0
- data/vendor/behave/features/scenario_outline.improved.feature +177 -0
- data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
- data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
- data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
- data/vendor/behave/features/step.async_steps.feature +225 -0
- data/vendor/behave/features/step.duplicated_step.feature +106 -0
- data/vendor/behave/features/step.execute_steps.feature +59 -0
- data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
- data/vendor/behave/features/step.import_other_step_module.feature +103 -0
- data/vendor/behave/features/step.pending_steps.feature +128 -0
- data/vendor/behave/features/step.undefined_steps.feature +307 -0
- data/vendor/behave/features/step.use_step_library.feature +44 -0
- data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
- data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
- data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
- data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
- data/vendor/behave/features/step_param.custom_types.feature +134 -0
- data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
- data/vendor/behave/features/steps/behave_context_steps.py +67 -0
- data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
- data/vendor/behave/features/steps/behave_model_util.py +105 -0
- data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
- data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
- data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
- data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
- data/vendor/behave/features/summary.undefined_steps.feature +114 -0
- data/vendor/behave/features/tags.active_tags.feature +385 -0
- data/vendor/behave/features/tags.default_tags.feature +104 -0
- data/vendor/behave/features/tags.tag_expression.feature +105 -0
- data/vendor/behave/features/userdata.feature +331 -0
- data/vendor/behave/invoke.yaml +21 -0
- data/vendor/behave/issue.features/README.txt +17 -0
- data/vendor/behave/issue.features/environment.py +97 -0
- data/vendor/behave/issue.features/issue0030.feature +21 -0
- data/vendor/behave/issue.features/issue0031.feature +16 -0
- data/vendor/behave/issue.features/issue0032.feature +28 -0
- data/vendor/behave/issue.features/issue0035.feature +74 -0
- data/vendor/behave/issue.features/issue0040.feature +154 -0
- data/vendor/behave/issue.features/issue0041.feature +135 -0
- data/vendor/behave/issue.features/issue0042.feature +230 -0
- data/vendor/behave/issue.features/issue0044.feature +51 -0
- data/vendor/behave/issue.features/issue0046.feature +77 -0
- data/vendor/behave/issue.features/issue0052.feature +66 -0
- data/vendor/behave/issue.features/issue0059.feature +29 -0
- data/vendor/behave/issue.features/issue0063.feature +102 -0
- data/vendor/behave/issue.features/issue0064.feature +97 -0
- data/vendor/behave/issue.features/issue0065.feature +18 -0
- data/vendor/behave/issue.features/issue0066.feature +80 -0
- data/vendor/behave/issue.features/issue0067.feature +90 -0
- data/vendor/behave/issue.features/issue0069.feature +64 -0
- data/vendor/behave/issue.features/issue0072.feature +32 -0
- data/vendor/behave/issue.features/issue0073.feature +228 -0
- data/vendor/behave/issue.features/issue0075.feature +18 -0
- data/vendor/behave/issue.features/issue0077.feature +89 -0
- data/vendor/behave/issue.features/issue0080.feature +49 -0
- data/vendor/behave/issue.features/issue0081.feature +138 -0
- data/vendor/behave/issue.features/issue0083.feature +69 -0
- data/vendor/behave/issue.features/issue0084.feature +69 -0
- data/vendor/behave/issue.features/issue0085.feature +119 -0
- data/vendor/behave/issue.features/issue0092.feature +66 -0
- data/vendor/behave/issue.features/issue0096.feature +173 -0
- data/vendor/behave/issue.features/issue0099.feature +130 -0
- data/vendor/behave/issue.features/issue0109.feature +60 -0
- data/vendor/behave/issue.features/issue0111.feature +53 -0
- data/vendor/behave/issue.features/issue0112.feature +64 -0
- data/vendor/behave/issue.features/issue0114.feature +118 -0
- data/vendor/behave/issue.features/issue0116.feature +71 -0
- data/vendor/behave/issue.features/issue0125.feature +49 -0
- data/vendor/behave/issue.features/issue0127.feature +64 -0
- data/vendor/behave/issue.features/issue0139.feature +67 -0
- data/vendor/behave/issue.features/issue0142.feature +37 -0
- data/vendor/behave/issue.features/issue0143.feature +54 -0
- data/vendor/behave/issue.features/issue0145.feature +63 -0
- data/vendor/behave/issue.features/issue0148.feature +105 -0
- data/vendor/behave/issue.features/issue0152.feature +52 -0
- data/vendor/behave/issue.features/issue0159.feature +74 -0
- data/vendor/behave/issue.features/issue0162.feature +86 -0
- data/vendor/behave/issue.features/issue0171.feature +16 -0
- data/vendor/behave/issue.features/issue0172.feature +51 -0
- data/vendor/behave/issue.features/issue0175.feature +91 -0
- data/vendor/behave/issue.features/issue0177.feature +40 -0
- data/vendor/behave/issue.features/issue0181.feature +36 -0
- data/vendor/behave/issue.features/issue0184.feature +144 -0
- data/vendor/behave/issue.features/issue0186.feature +12 -0
- data/vendor/behave/issue.features/issue0188.feature +60 -0
- data/vendor/behave/issue.features/issue0191.feature +178 -0
- data/vendor/behave/issue.features/issue0194.feature +215 -0
- data/vendor/behave/issue.features/issue0197.feature +11 -0
- data/vendor/behave/issue.features/issue0216.feature +129 -0
- data/vendor/behave/issue.features/issue0226.feature +51 -0
- data/vendor/behave/issue.features/issue0228.feature +41 -0
- data/vendor/behave/issue.features/issue0230.feature +46 -0
- data/vendor/behave/issue.features/issue0231.feature +77 -0
- data/vendor/behave/issue.features/issue0238.feature +52 -0
- data/vendor/behave/issue.features/issue0251.feature +15 -0
- data/vendor/behave/issue.features/issue0280.feature +118 -0
- data/vendor/behave/issue.features/issue0288.feature +95 -0
- data/vendor/behave/issue.features/issue0300.feature +49 -0
- data/vendor/behave/issue.features/issue0302.feature +91 -0
- data/vendor/behave/issue.features/issue0309.feature +52 -0
- data/vendor/behave/issue.features/issue0330.feature +124 -0
- data/vendor/behave/issue.features/issue0349.feature +9 -0
- data/vendor/behave/issue.features/issue0361.feature +79 -0
- data/vendor/behave/issue.features/issue0383.feature +76 -0
- data/vendor/behave/issue.features/issue0384.feature +103 -0
- data/vendor/behave/issue.features/issue0385.feature +109 -0
- data/vendor/behave/issue.features/issue0424.feature +66 -0
- data/vendor/behave/issue.features/issue0446.feature +116 -0
- data/vendor/behave/issue.features/issue0449.feature +42 -0
- data/vendor/behave/issue.features/issue0453.feature +42 -0
- data/vendor/behave/issue.features/issue0457.feature +65 -0
- data/vendor/behave/issue.features/issue0462.feature +38 -0
- data/vendor/behave/issue.features/issue0476.feature +39 -0
- data/vendor/behave/issue.features/issue0487.feature +92 -0
- data/vendor/behave/issue.features/issue0506.feature +77 -0
- data/vendor/behave/issue.features/issue0510.feature +51 -0
- data/vendor/behave/issue.features/requirements.txt +12 -0
- data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
- data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
- data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
- data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
- data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
- data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
- data/vendor/behave/more.features/tutorial.feature +6 -0
- data/vendor/behave/py.requirements/README.txt +5 -0
- data/vendor/behave/py.requirements/all.txt +16 -0
- data/vendor/behave/py.requirements/basic.txt +21 -0
- data/vendor/behave/py.requirements/develop.txt +28 -0
- data/vendor/behave/py.requirements/docs.txt +6 -0
- data/vendor/behave/py.requirements/json.txt +7 -0
- data/vendor/behave/py.requirements/more_py26.txt +8 -0
- data/vendor/behave/py.requirements/testing.txt +10 -0
- data/vendor/behave/pytest.ini +24 -0
- data/vendor/behave/setup.cfg +29 -0
- data/vendor/behave/setup.py +118 -0
- data/vendor/behave/setuptools_behave.py +130 -0
- data/vendor/behave/tasks/__behave.py +45 -0
- data/vendor/behave/tasks/__init__.py +55 -0
- data/vendor/behave/tasks/__main__.py +70 -0
- data/vendor/behave/tasks/_setup.py +135 -0
- data/vendor/behave/tasks/_vendor/README.rst +35 -0
- data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
- data/vendor/behave/tasks/_vendor/path.py +1725 -0
- data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
- data/vendor/behave/tasks/_vendor/six.py +868 -0
- data/vendor/behave/tasks/clean.py +246 -0
- data/vendor/behave/tasks/docs.py +97 -0
- data/vendor/behave/tasks/requirements.txt +17 -0
- data/vendor/behave/tasks/test.py +192 -0
- data/vendor/behave/test/__init__.py +0 -0
- data/vendor/behave/test/_importer_candidate.py +3 -0
- data/vendor/behave/test/reporters/__init__.py +0 -0
- data/vendor/behave/test/reporters/test_summary.py +240 -0
- data/vendor/behave/test/test_ansi_escapes.py +73 -0
- data/vendor/behave/test/test_configuration.py +172 -0
- data/vendor/behave/test/test_formatter.py +265 -0
- data/vendor/behave/test/test_formatter_progress.py +39 -0
- data/vendor/behave/test/test_formatter_rerun.py +97 -0
- data/vendor/behave/test/test_formatter_tags.py +57 -0
- data/vendor/behave/test/test_importer.py +151 -0
- data/vendor/behave/test/test_log_capture.py +29 -0
- data/vendor/behave/test/test_matchers.py +236 -0
- data/vendor/behave/test/test_model.py +871 -0
- data/vendor/behave/test/test_parser.py +1590 -0
- data/vendor/behave/test/test_runner.py +1074 -0
- data/vendor/behave/test/test_step_registry.py +96 -0
- data/vendor/behave/test/test_tag_expression.py +506 -0
- data/vendor/behave/test/test_tag_expression2.py +462 -0
- data/vendor/behave/test/test_tag_matcher.py +729 -0
- data/vendor/behave/test/test_userdata.py +184 -0
- data/vendor/behave/tests/README.txt +12 -0
- data/vendor/behave/tests/__init__.py +0 -0
- data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
- data/vendor/behave/tests/api/__init__.py +0 -0
- data/vendor/behave/tests/api/_test_async_step34.py +130 -0
- data/vendor/behave/tests/api/_test_async_step35.py +75 -0
- data/vendor/behave/tests/api/test_async_step.py +18 -0
- data/vendor/behave/tests/api/testing_support.py +94 -0
- data/vendor/behave/tests/api/testing_support_async.py +21 -0
- data/vendor/behave/tests/issues/test_issue0336.py +66 -0
- data/vendor/behave/tests/issues/test_issue0449.py +55 -0
- data/vendor/behave/tests/issues/test_issue0453.py +62 -0
- data/vendor/behave/tests/issues/test_issue0458.py +54 -0
- data/vendor/behave/tests/issues/test_issue0495.py +65 -0
- data/vendor/behave/tests/unit/__init__.py +0 -0
- data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
- data/vendor/behave/tests/unit/test_capture.py +280 -0
- data/vendor/behave/tests/unit/test_model_core.py +56 -0
- data/vendor/behave/tests/unit/test_textutil.py +267 -0
- data/vendor/behave/tools/test-features/background.feature +9 -0
- data/vendor/behave/tools/test-features/environment.py +8 -0
- data/vendor/behave/tools/test-features/french.feature +11 -0
- data/vendor/behave/tools/test-features/outline.feature +39 -0
- data/vendor/behave/tools/test-features/parse.feature +10 -0
- data/vendor/behave/tools/test-features/step-data.feature +60 -0
- data/vendor/behave/tools/test-features/steps/steps.py +120 -0
- data/vendor/behave/tools/test-features/tags.feature +18 -0
- data/vendor/behave/tox.ini +159 -0
- metadata +562 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Unittests for :mod:`behave.capture` module.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import absolute_import, print_function
|
|
7
|
+
import sys
|
|
8
|
+
from behave.capture import Captured, CaptureController
|
|
9
|
+
from mock import Mock
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
# -----------------------------------------------------------------------------
|
|
13
|
+
# TEST SUPPORT:
|
|
14
|
+
# -----------------------------------------------------------------------------
|
|
15
|
+
def create_capture_controller(config=None):
|
|
16
|
+
if not config:
|
|
17
|
+
config = Mock()
|
|
18
|
+
config.stdout_capture = True
|
|
19
|
+
config.stderr_capture = True
|
|
20
|
+
config.log_capture = True
|
|
21
|
+
config.logging_filter = None
|
|
22
|
+
config.logging_level = "INFO"
|
|
23
|
+
return CaptureController(config)
|
|
24
|
+
|
|
25
|
+
def setup_capture_controller(capture_controller, context=None):
|
|
26
|
+
if not context:
|
|
27
|
+
context = Mock()
|
|
28
|
+
context.aborted = False
|
|
29
|
+
context.config = capture_controller.config
|
|
30
|
+
capture_controller.setup_capture(context)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# -----------------------------------------------------------------------------
|
|
34
|
+
# FIXTURES:
|
|
35
|
+
# -----------------------------------------------------------------------------
|
|
36
|
+
@pytest.fixture
|
|
37
|
+
def capture_controller():
|
|
38
|
+
"""Provides a capture_controller that is already setup and automatically
|
|
39
|
+
performs a teardown afterwards.
|
|
40
|
+
"""
|
|
41
|
+
capture_controller = create_capture_controller()
|
|
42
|
+
setup_capture_controller(capture_controller)
|
|
43
|
+
yield capture_controller
|
|
44
|
+
# -- CLEANUP:
|
|
45
|
+
capture_controller.teardown_capture()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# -----------------------------------------------------------------------------
|
|
49
|
+
# TEST SUITE:
|
|
50
|
+
# -----------------------------------------------------------------------------
|
|
51
|
+
class TestCaptured(object):
|
|
52
|
+
|
|
53
|
+
def test_default_ctor(self):
|
|
54
|
+
captured = Captured()
|
|
55
|
+
assert captured.stdout == u""
|
|
56
|
+
assert captured.stderr == u""
|
|
57
|
+
assert captured.log_output == u""
|
|
58
|
+
assert not captured
|
|
59
|
+
|
|
60
|
+
def test_ctor_with_params(self):
|
|
61
|
+
captured = Captured(u"STDOUT", u"STDERR", u"LOG_OUTPUT")
|
|
62
|
+
assert captured.stdout == u"STDOUT"
|
|
63
|
+
assert captured.stderr == u"STDERR"
|
|
64
|
+
assert captured.log_output == u"LOG_OUTPUT"
|
|
65
|
+
|
|
66
|
+
captured = Captured(stdout=u"STDOUT")
|
|
67
|
+
assert captured.stdout == u"STDOUT"
|
|
68
|
+
assert captured.stderr == u""
|
|
69
|
+
assert captured.log_output == u""
|
|
70
|
+
|
|
71
|
+
captured = Captured(stderr=u"STDERR")
|
|
72
|
+
assert captured.stdout == u""
|
|
73
|
+
assert captured.stderr == u"STDERR"
|
|
74
|
+
assert captured.log_output == u""
|
|
75
|
+
|
|
76
|
+
captured = Captured(log_output=u"LOG_OUTPUT")
|
|
77
|
+
assert captured.stdout == u""
|
|
78
|
+
assert captured.stderr == u""
|
|
79
|
+
assert captured.log_output == u"LOG_OUTPUT"
|
|
80
|
+
|
|
81
|
+
def test_reset(self):
|
|
82
|
+
captured = Captured("STDOUT", "STDERR", "LOG_OUTPUT")
|
|
83
|
+
captured.reset()
|
|
84
|
+
assert captured.stdout == u""
|
|
85
|
+
assert captured.stderr == u""
|
|
86
|
+
assert captured.log_output == u""
|
|
87
|
+
assert not captured
|
|
88
|
+
|
|
89
|
+
def test_bool_conversion__returns_false_without_captured_output(self):
|
|
90
|
+
captured = Captured()
|
|
91
|
+
assert bool(captured) == False
|
|
92
|
+
|
|
93
|
+
@pytest.mark.parametrize("params", [
|
|
94
|
+
dict(stdout="xxx"),
|
|
95
|
+
dict(stderr="yyy"),
|
|
96
|
+
dict(log_output="zzz"),
|
|
97
|
+
dict(stderr="yyy", log_output="zzz"),
|
|
98
|
+
dict(stdout="xxx", stderr="yyy", log_output="zzz"),
|
|
99
|
+
])
|
|
100
|
+
def test_bool_conversion__returns_true_with_captured_output(self, params):
|
|
101
|
+
captured = Captured(**params)
|
|
102
|
+
assert bool(captured)
|
|
103
|
+
|
|
104
|
+
@pytest.mark.parametrize("params, expected", [
|
|
105
|
+
(dict(), ""),
|
|
106
|
+
(dict(stdout="STDOUT"), "STDOUT"),
|
|
107
|
+
(dict(stderr="STDERR"), "STDERR"),
|
|
108
|
+
(dict(log_output="LOG_OUTPUT"), "LOG_OUTPUT"),
|
|
109
|
+
(dict(stdout="STDOUT", stderr="STDERR"), "STDOUT\nSTDERR"),
|
|
110
|
+
(dict(stdout="STDOUT", log_output="LOG_OUTPUT"), "STDOUT\nLOG_OUTPUT"),
|
|
111
|
+
(dict(stdout="STDOUT", stderr="STDERR", log_output="LOG_OUTPUT"),
|
|
112
|
+
"STDOUT\nSTDERR\nLOG_OUTPUT"),
|
|
113
|
+
])
|
|
114
|
+
def test_output__contains_concatenated_parts(self, params, expected):
|
|
115
|
+
captured = Captured(**params)
|
|
116
|
+
assert captured.output == expected
|
|
117
|
+
|
|
118
|
+
def test_add__without_captured_data(self):
|
|
119
|
+
captured1 = Captured()
|
|
120
|
+
captured2 = Captured("STDOUT", "STDERR", "LOG_OUTPUT")
|
|
121
|
+
captured1.add(captured2)
|
|
122
|
+
assert captured1.stdout == "STDOUT"
|
|
123
|
+
assert captured1.stderr == "STDERR"
|
|
124
|
+
assert captured1.log_output == "LOG_OUTPUT"
|
|
125
|
+
|
|
126
|
+
def test_add__with_captured_data(self):
|
|
127
|
+
captured1 = Captured("stdout1", "stderr1", "log_output1")
|
|
128
|
+
captured2 = Captured("STDOUT2", "STDERR2", "LOG_OUTPUT2")
|
|
129
|
+
|
|
130
|
+
captured1.add(captured2)
|
|
131
|
+
assert captured1.stdout == "stdout1\nSTDOUT2"
|
|
132
|
+
assert captured1.stderr == "stderr1\nSTDERR2"
|
|
133
|
+
assert captured1.log_output == "log_output1\nLOG_OUTPUT2"
|
|
134
|
+
|
|
135
|
+
def test_operator_add(self):
|
|
136
|
+
captured1 = Captured("stdout1", "stderr1", "log_output1")
|
|
137
|
+
captured2 = Captured("STDOUT2", "STDERR2", "LOG_OUTPUT2")
|
|
138
|
+
|
|
139
|
+
captured3 = captured1 + captured2
|
|
140
|
+
assert captured3.stdout == "stdout1\nSTDOUT2"
|
|
141
|
+
assert captured3.stderr == "stderr1\nSTDERR2"
|
|
142
|
+
assert captured3.log_output == "log_output1\nLOG_OUTPUT2"
|
|
143
|
+
# -- ENSURE: captured1 is not modified.
|
|
144
|
+
assert captured1.stdout == "stdout1"
|
|
145
|
+
assert captured1.stderr == "stderr1"
|
|
146
|
+
assert captured1.log_output == "log_output1"
|
|
147
|
+
# -- ENSURE: captured2 is not modified.
|
|
148
|
+
assert captured2.stdout == "STDOUT2"
|
|
149
|
+
assert captured2.stderr == "STDERR2"
|
|
150
|
+
assert captured2.log_output == "LOG_OUTPUT2"
|
|
151
|
+
|
|
152
|
+
def test_operator_iadd(self):
|
|
153
|
+
captured1 = Captured("stdout1", "stderr1", "log_output1")
|
|
154
|
+
captured2 = Captured("STDOUT2", "STDERR2", "LOG_OUTPUT2")
|
|
155
|
+
|
|
156
|
+
captured1 += captured2
|
|
157
|
+
assert captured1.stdout == "stdout1\nSTDOUT2"
|
|
158
|
+
assert captured1.stderr == "stderr1\nSTDERR2"
|
|
159
|
+
assert captured1.log_output == "log_output1\nLOG_OUTPUT2"
|
|
160
|
+
# -- ENSURE: captured2 is not modified.
|
|
161
|
+
assert captured2.stdout == "STDOUT2"
|
|
162
|
+
assert captured2.stderr == "STDERR2"
|
|
163
|
+
assert captured2.log_output == "LOG_OUTPUT2"
|
|
164
|
+
|
|
165
|
+
def test_make_report__with_all_sections(self):
|
|
166
|
+
captured = Captured(stdout="xxx", stderr="yyy", log_output="zzz")
|
|
167
|
+
expected = """\
|
|
168
|
+
Captured stdout:
|
|
169
|
+
xxx
|
|
170
|
+
|
|
171
|
+
Captured stderr:
|
|
172
|
+
yyy
|
|
173
|
+
|
|
174
|
+
Captured logging:
|
|
175
|
+
zzz"""
|
|
176
|
+
assert captured.make_report() == expected
|
|
177
|
+
|
|
178
|
+
def test_make_report__should_only_contain_nonempty_data_sections(self):
|
|
179
|
+
captured1 = Captured(stdout="xxx")
|
|
180
|
+
expected = "Captured stdout:\nxxx"
|
|
181
|
+
assert captured1.make_report() == expected
|
|
182
|
+
|
|
183
|
+
captured2 = Captured(stderr="yyy")
|
|
184
|
+
expected = "Captured stderr:\nyyy"
|
|
185
|
+
assert captured2.make_report() == expected
|
|
186
|
+
|
|
187
|
+
captured3 = Captured(log_output="zzz")
|
|
188
|
+
expected = "Captured logging:\nzzz"
|
|
189
|
+
assert captured3.make_report() == expected
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class Theory4ActiveCaptureController(object):
|
|
193
|
+
@staticmethod
|
|
194
|
+
def check_invariants(controller):
|
|
195
|
+
if controller.config.capture_stdout:
|
|
196
|
+
assert controller.stdout_capture is not None
|
|
197
|
+
assert sys.stdout is controller.stdout_capture
|
|
198
|
+
else:
|
|
199
|
+
assert controller.stdout_capture is None
|
|
200
|
+
assert sys.stdout is not controller.stdout_capture
|
|
201
|
+
|
|
202
|
+
if controller.config.capture_stderr:
|
|
203
|
+
assert controller.stderr_capture is not None
|
|
204
|
+
assert sys.stderr is controller.stderr_capture
|
|
205
|
+
else:
|
|
206
|
+
assert controller.stderr_capture is None
|
|
207
|
+
assert sys.stderr is not controller.stderr_capture
|
|
208
|
+
|
|
209
|
+
if controller.config.capture_log:
|
|
210
|
+
assert controller.log_capture is not None
|
|
211
|
+
# assert sys.stderr is controller.stderr_capture
|
|
212
|
+
else:
|
|
213
|
+
assert controller.log_capture is None
|
|
214
|
+
# assert sys.stderr is not controller.stderr_capture
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class TestCaptureController(object):
|
|
218
|
+
|
|
219
|
+
# @pytest.no_capture
|
|
220
|
+
def test_basics(self):
|
|
221
|
+
capture_controller = create_capture_controller()
|
|
222
|
+
context = Mock()
|
|
223
|
+
context.aborted = False
|
|
224
|
+
context.config = capture_controller.config
|
|
225
|
+
|
|
226
|
+
capture_controller.setup_capture(context)
|
|
227
|
+
# XXX AVOID: Due to pytest capture mode
|
|
228
|
+
# Theory4ActiveCaptureController.check_invariants(capture_controller)
|
|
229
|
+
|
|
230
|
+
capture_controller.start_capture()
|
|
231
|
+
sys.stdout.write("HELLO\n")
|
|
232
|
+
sys.stderr.write("world\n")
|
|
233
|
+
capture_controller.stop_capture()
|
|
234
|
+
assert capture_controller.captured.output == "HELLO\nworld\n"
|
|
235
|
+
|
|
236
|
+
# -- FINALLY:
|
|
237
|
+
capture_controller.teardown_capture()
|
|
238
|
+
|
|
239
|
+
def test_capturing__retrieve_captured_several_times(self, capture_controller):
|
|
240
|
+
capture_controller.start_capture()
|
|
241
|
+
sys.stdout.write("HELLO\n")
|
|
242
|
+
sys.stderr.write("Alice\n")
|
|
243
|
+
assert capture_controller.captured.output == "HELLO\nAlice\n"
|
|
244
|
+
|
|
245
|
+
print("Sam")
|
|
246
|
+
sys.stderr.write("Bob\n")
|
|
247
|
+
capture_controller.stop_capture()
|
|
248
|
+
assert capture_controller.captured.output == "HELLO\nSam\nAlice\nBob\n"
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def test_capturing__with_several_start_stop_cycles(self, capture_controller):
|
|
252
|
+
capture_controller.start_capture()
|
|
253
|
+
sys.stdout.write("HELLO\n")
|
|
254
|
+
sys.stderr.write("Alice\n")
|
|
255
|
+
capture_controller.stop_capture()
|
|
256
|
+
assert capture_controller.captured.output == "HELLO\nAlice\n"
|
|
257
|
+
|
|
258
|
+
sys.stdout.write("__UNCAPTURED:stdout;\n")
|
|
259
|
+
sys.stderr.write("__UNCAPTURED:stderr;\n")
|
|
260
|
+
|
|
261
|
+
capture_controller.start_capture()
|
|
262
|
+
sys.stdout.write("Sam\n")
|
|
263
|
+
sys.stderr.write("Bob\n")
|
|
264
|
+
capture_controller.stop_capture()
|
|
265
|
+
assert capture_controller.captured.output == "HELLO\nSam\nAlice\nBob\n"
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def test_make_capture_report(self, capture_controller):
|
|
269
|
+
capture_controller.start_capture()
|
|
270
|
+
print("HELLO")
|
|
271
|
+
sys.stderr.write("Alice\n")
|
|
272
|
+
capture_controller.stop_capture()
|
|
273
|
+
report = capture_controller.make_capture_report()
|
|
274
|
+
expected = """\
|
|
275
|
+
Captured stdout:
|
|
276
|
+
HELLO
|
|
277
|
+
|
|
278
|
+
Captured stderr:
|
|
279
|
+
Alice"""
|
|
280
|
+
assert report == expected
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
(Additional) Unit tests for :mod:`behave.model_core` module.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import print_function
|
|
7
|
+
from behave.model_core import Status
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
|
+
# TESTS:
|
|
13
|
+
# -----------------------------------------------------------------------------
|
|
14
|
+
class TestStatus(object):
|
|
15
|
+
"""Test Status enum class.
|
|
16
|
+
In addition, checks if it is partly backward compatibility to
|
|
17
|
+
string-based status.
|
|
18
|
+
|
|
19
|
+
EXAMPLE::
|
|
20
|
+
|
|
21
|
+
status = Status.passed
|
|
22
|
+
assert status == "passed"
|
|
23
|
+
assert status != "failed"
|
|
24
|
+
assert status == Status.from_name("passed")
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@pytest.mark.parametrize("enum_value", list(Status.__members__.values()))
|
|
28
|
+
def test_equals__with_string_value(self, enum_value):
|
|
29
|
+
"""Ensure that Status enum value can be compared with a string-status"""
|
|
30
|
+
assert enum_value == enum_value.name
|
|
31
|
+
|
|
32
|
+
@pytest.mark.parametrize("enum_value", list(Status.__members__.values()))
|
|
33
|
+
def test_equals__with_unknown_name(self, enum_value):
|
|
34
|
+
assert enum_value != "__UNKNOWN__"
|
|
35
|
+
assert not (enum_value == "__UNKNOWN__")
|
|
36
|
+
|
|
37
|
+
@pytest.mark.parametrize("enum_value, similar_name", [
|
|
38
|
+
(Status.passed, "Passed"),
|
|
39
|
+
(Status.failed, "FAILED"),
|
|
40
|
+
(Status.passed, "passed1"),
|
|
41
|
+
(Status.failed, "failed2"),
|
|
42
|
+
])
|
|
43
|
+
def test_equals__with_similar_name(self, enum_value, similar_name):
|
|
44
|
+
assert enum_value != similar_name
|
|
45
|
+
|
|
46
|
+
@pytest.mark.parametrize("enum_value", list(Status.__members__.values()))
|
|
47
|
+
def test_from_name__with_known_names(self, enum_value):
|
|
48
|
+
assert enum_value == Status.from_name(enum_value.name)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@pytest.mark.parametrize("unknown_name", [
|
|
52
|
+
"Passed", "Failed", "passed2", "failed1"
|
|
53
|
+
])
|
|
54
|
+
def test_from_name__with_unknown_name_raises_lookuperror(self, unknown_name):
|
|
55
|
+
with pytest.raises(LookupError):
|
|
56
|
+
Status.from_name(unknown_name)
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Unit tests for :mod:`behave.textutil`.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import absolute_import, print_function
|
|
7
|
+
from behave.textutil import text, is_ascii_encoding, select_best_encoding
|
|
8
|
+
import pytest
|
|
9
|
+
import codecs
|
|
10
|
+
import six
|
|
11
|
+
|
|
12
|
+
# -----------------------------------------------------------------------------
|
|
13
|
+
# TEST SUPPORT:
|
|
14
|
+
# -----------------------------------------------------------------------------
|
|
15
|
+
class ConvertableToUnicode(object):
|
|
16
|
+
"""Class that can be converted into a unicode string.
|
|
17
|
+
If parameter is a bytes-string, it is converted into unicode.
|
|
18
|
+
|
|
19
|
+
.. code-block:: python
|
|
20
|
+
|
|
21
|
+
obj1 = ConvertableToUnicode(u"Ärgernis")
|
|
22
|
+
obj2 = ConvertableToUnicode(u"Ärgernis".encode("latin-1")
|
|
23
|
+
|
|
24
|
+
# -- CASE Python2: string is a bytes-string
|
|
25
|
+
text_value21 = unicode(obj1)
|
|
26
|
+
text_value22 = unicode(obj2)
|
|
27
|
+
|
|
28
|
+
# -- CASE Python3: string is a unicode-string
|
|
29
|
+
text_value31 = str(obj1)
|
|
30
|
+
text_value32 = str(obj2)
|
|
31
|
+
"""
|
|
32
|
+
encoding = "utf-8"
|
|
33
|
+
|
|
34
|
+
def __init__(self, text, encoding=None):
|
|
35
|
+
self.text = text
|
|
36
|
+
self.encoding = encoding or self.__class__.encoding
|
|
37
|
+
|
|
38
|
+
def __str__(self):
|
|
39
|
+
"""Convert into a unicode string."""
|
|
40
|
+
text = self.text
|
|
41
|
+
if isinstance(text, six.binary_type):
|
|
42
|
+
text = codecs.decode(text, self.encoding)
|
|
43
|
+
return text
|
|
44
|
+
|
|
45
|
+
if six.PY2:
|
|
46
|
+
__unicode__ = __str__
|
|
47
|
+
__str__ = lambda self: self.__unicode__().encode(self.encoding)
|
|
48
|
+
|
|
49
|
+
class ConvertableToString(object):
|
|
50
|
+
encoding = "utf-8"
|
|
51
|
+
|
|
52
|
+
def __init__(self, text, encoding=None):
|
|
53
|
+
self.text = text
|
|
54
|
+
self.encoding = encoding or self.__class__.encoding
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
text = self.text
|
|
58
|
+
if isinstance(text, six.binary_type):
|
|
59
|
+
text = codecs.decode(text, self.encoding)
|
|
60
|
+
return text
|
|
61
|
+
|
|
62
|
+
if six.PY2:
|
|
63
|
+
__unicode__ = __str__
|
|
64
|
+
|
|
65
|
+
def __str__(self):
|
|
66
|
+
# MAYBE: self.__unicode__().encode(self.encoding)
|
|
67
|
+
text = self.text
|
|
68
|
+
if isinstance(text, six.text_type):
|
|
69
|
+
text = codecs.encode(text, self.encoding)
|
|
70
|
+
return text
|
|
71
|
+
|
|
72
|
+
class ConvertableToPy2String(object):
|
|
73
|
+
encoding = "utf-8"
|
|
74
|
+
|
|
75
|
+
def __init__(self, text, encoding=None):
|
|
76
|
+
self.text = text
|
|
77
|
+
self.encoding = encoding or self.__class__.encoding
|
|
78
|
+
|
|
79
|
+
def __str__(self):
|
|
80
|
+
text = self.text
|
|
81
|
+
if six.PY2:
|
|
82
|
+
if isinstance(text, six.text_type):
|
|
83
|
+
text = codecs.encode(text, self.encoding)
|
|
84
|
+
else:
|
|
85
|
+
if isinstance(text, six.bytes_type):
|
|
86
|
+
text = codecs.decode(text, self.encoding)
|
|
87
|
+
return text
|
|
88
|
+
|
|
89
|
+
if six.PY2:
|
|
90
|
+
__unicode__ = __str__
|
|
91
|
+
|
|
92
|
+
def __str__(self):
|
|
93
|
+
# MAYBE: self.__unicode__().encode(self.encoding)
|
|
94
|
+
text = self.text
|
|
95
|
+
if isinstance(text, six.text_type):
|
|
96
|
+
text = codecs.encode(text, self.encoding)
|
|
97
|
+
return text
|
|
98
|
+
|
|
99
|
+
# def raise_exception(exception_class, *args):
|
|
100
|
+
# raise exception_class(*args)
|
|
101
|
+
#
|
|
102
|
+
# def catch_raised_exception_and_return_as_text(exception_class, *args, **kwargs):
|
|
103
|
+
# encoding = kwargs.pop("encoding", None)
|
|
104
|
+
# try:
|
|
105
|
+
# raise_exception(*args)
|
|
106
|
+
# except Exception as e:
|
|
107
|
+
# return text(e, encoding=encoding)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# -----------------------------------------------------------------------------
|
|
111
|
+
# TEST SUITE
|
|
112
|
+
# -----------------------------------------------------------------------------
|
|
113
|
+
xfail = pytest.mark.xfail
|
|
114
|
+
requires_python2 = pytest.mark.skipif(not six.PY2, reason="requires python2")
|
|
115
|
+
|
|
116
|
+
UNICODE_TEXT_VALUES1 = [u"Alice", u"Bob"]
|
|
117
|
+
UNICODE_TEXT_VALUES = [u"Café", u"100€ (Euro)", u"Frühaufsteher"]
|
|
118
|
+
BYTES_TEXT_TUPLES_WITH_UTF8_ENCODING = [
|
|
119
|
+
(codecs.encode(_text, "utf-8"), _text) for _text in UNICODE_TEXT_VALUES
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class TestTextConversion(object):
|
|
124
|
+
"""Unit tests for the :func:`behave.textutil.text()` function."""
|
|
125
|
+
|
|
126
|
+
@pytest.mark.parametrize("value", UNICODE_TEXT_VALUES)
|
|
127
|
+
def test_text__with_unicode_value(self, value):
|
|
128
|
+
value_id = id(value)
|
|
129
|
+
actual_text = text(value)
|
|
130
|
+
assert actual_text == value
|
|
131
|
+
assert id(actual_text) == value_id # PARANOID check w/ unicode copy.
|
|
132
|
+
|
|
133
|
+
@pytest.mark.parametrize("bytes_value, expected_text",
|
|
134
|
+
BYTES_TEXT_TUPLES_WITH_UTF8_ENCODING)
|
|
135
|
+
def test_text__with_bytes_value(self, bytes_value, expected_text):
|
|
136
|
+
actual_text = text(bytes_value)
|
|
137
|
+
assert actual_text == expected_text
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@pytest.mark.parametrize("text_value, encoding", [
|
|
141
|
+
(u"Ärgernis", "UTF-8"),
|
|
142
|
+
(u"Übermut", "UTF-8"),
|
|
143
|
+
])
|
|
144
|
+
def test_text__with_bytes_value_and_encoding(self, text_value, encoding):
|
|
145
|
+
bytes_value = text_value.encode(encoding)
|
|
146
|
+
assert isinstance(bytes_value, bytes)
|
|
147
|
+
|
|
148
|
+
actual = text(bytes_value, encoding)
|
|
149
|
+
assert isinstance(actual, six.text_type)
|
|
150
|
+
assert actual == text_value
|
|
151
|
+
|
|
152
|
+
def test_text__with_exception_traceback(self): pass
|
|
153
|
+
|
|
154
|
+
@pytest.mark.parametrize("text_value", UNICODE_TEXT_VALUES)
|
|
155
|
+
def test_text__with_object_convertable_to_unicode(self, text_value):
|
|
156
|
+
obj = ConvertableToUnicode(text_value)
|
|
157
|
+
actual_text = text(obj)
|
|
158
|
+
assert actual_text == text_value
|
|
159
|
+
assert isinstance(actual_text, six.text_type)
|
|
160
|
+
|
|
161
|
+
# @pytest.mark.parametrize("expected, text_value, encoding", [
|
|
162
|
+
# (u"Ärgernis", u"Ärgernis".encode("UTF-8"), "UTF-8"),
|
|
163
|
+
# (u"Übermut", u"Übermut".encode("latin-1"), "latin-1"),
|
|
164
|
+
# ])
|
|
165
|
+
# def test_text__with_object_convertable_to_unicode2(self, expected,
|
|
166
|
+
# text_value, encoding):
|
|
167
|
+
# obj = ConvertableToUnicode(text_value, encoding)
|
|
168
|
+
# actual_text = text(obj)
|
|
169
|
+
# assert actual_text == expected
|
|
170
|
+
# assert isinstance(actual_text, six.text_type)
|
|
171
|
+
|
|
172
|
+
@pytest.mark.parametrize("text_value", UNICODE_TEXT_VALUES)
|
|
173
|
+
def test_text__with_object_convertable_to_string(self, text_value):
|
|
174
|
+
obj = ConvertableToString(text_value)
|
|
175
|
+
actual_text = text(obj)
|
|
176
|
+
assert actual_text == text_value
|
|
177
|
+
assert isinstance(actual_text, six.text_type)
|
|
178
|
+
|
|
179
|
+
@xfail
|
|
180
|
+
@requires_python2
|
|
181
|
+
@pytest.mark.parametrize("text_value", UNICODE_TEXT_VALUES)
|
|
182
|
+
def test_text__with_object_convertable_to_py2string_only(self, text_value):
|
|
183
|
+
class ConvertableToPy2String(object):
|
|
184
|
+
"""Lacks feature: convertable-to-unicode (only: to-string)"""
|
|
185
|
+
def __init__(self, message=""):
|
|
186
|
+
self.message = message or ""
|
|
187
|
+
if self.message and isinstance(self.message, six.text_type):
|
|
188
|
+
self.message = self.message.encode("UTF-8")
|
|
189
|
+
|
|
190
|
+
def __str__(self):
|
|
191
|
+
# assert isinstance(self.message, str)
|
|
192
|
+
return self.message
|
|
193
|
+
|
|
194
|
+
obj = ConvertableToPy2String(text_value.encode("UTF-8"))
|
|
195
|
+
actual = text(obj)
|
|
196
|
+
print(u"actual: %s" % actual)
|
|
197
|
+
print(u"text_value: %s" % text_value)
|
|
198
|
+
assert actual == text_value
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class TestObjectToTextConversion(object):
|
|
202
|
+
"""Unit tests for the :func:`behave.textutil.text()` function.
|
|
203
|
+
Explore case with object-to-text conversion.
|
|
204
|
+
"""
|
|
205
|
+
ENCODING = "UTF-8"
|
|
206
|
+
|
|
207
|
+
# -- CASE: object=exception
|
|
208
|
+
@pytest.mark.parametrize("message", [
|
|
209
|
+
u"Ärgernis", u"Übermütig"
|
|
210
|
+
])
|
|
211
|
+
def test_text__with_assert_failed_and_unicode_message(self, message):
|
|
212
|
+
with pytest.raises(AssertionError) as e:
|
|
213
|
+
assert False, message
|
|
214
|
+
|
|
215
|
+
text2 = text(e)
|
|
216
|
+
expected = u"AssertionError: %s" % message
|
|
217
|
+
assert text2.endswith(expected)
|
|
218
|
+
|
|
219
|
+
@requires_python2
|
|
220
|
+
@pytest.mark.parametrize("message", [
|
|
221
|
+
u"Ärgernis", u"Übermütig"
|
|
222
|
+
])
|
|
223
|
+
def test_text__with_assert_failed_and_bytes_message(self, message):
|
|
224
|
+
# -- ONLY PYTHON2: Use case makes no sense for Python 3.
|
|
225
|
+
bytes_message = message.encode(self.ENCODING)
|
|
226
|
+
with pytest.raises(AssertionError) as e:
|
|
227
|
+
assert False, bytes_message
|
|
228
|
+
|
|
229
|
+
text2 = text(e)
|
|
230
|
+
expected = u"AssertionError: %s" % message
|
|
231
|
+
assert text2.endswith(expected)
|
|
232
|
+
|
|
233
|
+
@pytest.mark.parametrize("exception_class, message", [
|
|
234
|
+
(AssertionError, u"Ärgernis"),
|
|
235
|
+
(RuntimeError, u"Übermütig"),
|
|
236
|
+
])
|
|
237
|
+
def test_text__with_raised_exception_and_unicode_message(self,
|
|
238
|
+
exception_class,
|
|
239
|
+
message):
|
|
240
|
+
with pytest.raises(exception_class) as e:
|
|
241
|
+
raise exception_class(message)
|
|
242
|
+
|
|
243
|
+
text2 = text(e)
|
|
244
|
+
expected = u"%s: %s" % (exception_class.__name__, message)
|
|
245
|
+
assert isinstance(text2, six.text_type)
|
|
246
|
+
assert text2.endswith(expected)
|
|
247
|
+
|
|
248
|
+
@requires_python2
|
|
249
|
+
@pytest.mark.parametrize("exception_class, message", [
|
|
250
|
+
(AssertionError, u"Ärgernis"),
|
|
251
|
+
(RuntimeError, u"Übermütig"),
|
|
252
|
+
])
|
|
253
|
+
def test_text__with_raised_exception_and_bytes_message(self, exception_class,
|
|
254
|
+
message):
|
|
255
|
+
# -- ONLY PYTHON2: Use case makes no sense for Python 3.
|
|
256
|
+
bytes_message = message.encode(self.ENCODING)
|
|
257
|
+
with pytest.raises(exception_class) as e:
|
|
258
|
+
raise exception_class(bytes_message)
|
|
259
|
+
|
|
260
|
+
text2 = text(e)
|
|
261
|
+
unicode_message = bytes_message.decode(self.ENCODING)
|
|
262
|
+
expected = u"%s: %s" % (exception_class.__name__, unicode_message)
|
|
263
|
+
assert isinstance(text2, six.text_type)
|
|
264
|
+
assert text2.endswith(expected)
|
|
265
|
+
# -- DIAGNOSTICS:
|
|
266
|
+
print(u"text2: "+ text2)
|
|
267
|
+
print(u"expected: " + expected)
|