busser-behave 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|