busser-behave 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +0 -0
  3. data/.gitignore +17 -0
  4. data/.tailor +4 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +15 -0
  9. data/README.md +41 -0
  10. data/Rakefile +68 -0
  11. data/busser-behave.gemspec +30 -0
  12. data/features/plugin_install_command.feature +11 -0
  13. data/features/plugin_list_command.feature +8 -0
  14. data/features/support/env.rb +13 -0
  15. data/features/test_command.feature +31 -0
  16. data/lib/busser/behave/version.rb +26 -0
  17. data/lib/busser/runner_plugin/behave.rb +37 -0
  18. data/vendor/behave/CHANGES.rst +483 -0
  19. data/vendor/behave/LICENSE +23 -0
  20. data/vendor/behave/MANIFEST.in +37 -0
  21. data/vendor/behave/PROJECT_INFO.rst +21 -0
  22. data/vendor/behave/README.rst +112 -0
  23. data/vendor/behave/VERSION.txt +1 -0
  24. data/vendor/behave/behave.ini +22 -0
  25. data/vendor/behave/behave/__init__.py +30 -0
  26. data/vendor/behave/behave/__main__.py +187 -0
  27. data/vendor/behave/behave/_stepimport.py +185 -0
  28. data/vendor/behave/behave/_types.py +134 -0
  29. data/vendor/behave/behave/api/__init__.py +7 -0
  30. data/vendor/behave/behave/api/async_step.py +283 -0
  31. data/vendor/behave/behave/capture.py +227 -0
  32. data/vendor/behave/behave/compat/__init__.py +5 -0
  33. data/vendor/behave/behave/compat/collections.py +20 -0
  34. data/vendor/behave/behave/configuration.py +788 -0
  35. data/vendor/behave/behave/contrib/__init__.py +0 -0
  36. data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
  37. data/vendor/behave/behave/formatter/__init__.py +12 -0
  38. data/vendor/behave/behave/formatter/_builtins.py +39 -0
  39. data/vendor/behave/behave/formatter/_registry.py +135 -0
  40. data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
  41. data/vendor/behave/behave/formatter/base.py +200 -0
  42. data/vendor/behave/behave/formatter/formatters.py +57 -0
  43. data/vendor/behave/behave/formatter/json.py +253 -0
  44. data/vendor/behave/behave/formatter/null.py +12 -0
  45. data/vendor/behave/behave/formatter/plain.py +158 -0
  46. data/vendor/behave/behave/formatter/pretty.py +351 -0
  47. data/vendor/behave/behave/formatter/progress.py +287 -0
  48. data/vendor/behave/behave/formatter/rerun.py +114 -0
  49. data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
  50. data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
  51. data/vendor/behave/behave/formatter/steps.py +497 -0
  52. data/vendor/behave/behave/formatter/tags.py +178 -0
  53. data/vendor/behave/behave/i18n.py +614 -0
  54. data/vendor/behave/behave/importer.py +102 -0
  55. data/vendor/behave/behave/json_parser.py +264 -0
  56. data/vendor/behave/behave/log_capture.py +233 -0
  57. data/vendor/behave/behave/matchers.py +402 -0
  58. data/vendor/behave/behave/model.py +1737 -0
  59. data/vendor/behave/behave/model_core.py +416 -0
  60. data/vendor/behave/behave/model_describe.py +105 -0
  61. data/vendor/behave/behave/parser.py +615 -0
  62. data/vendor/behave/behave/reporter/__init__.py +0 -0
  63. data/vendor/behave/behave/reporter/base.py +45 -0
  64. data/vendor/behave/behave/reporter/junit.py +473 -0
  65. data/vendor/behave/behave/reporter/summary.py +94 -0
  66. data/vendor/behave/behave/runner.py +753 -0
  67. data/vendor/behave/behave/runner_util.py +417 -0
  68. data/vendor/behave/behave/step_registry.py +112 -0
  69. data/vendor/behave/behave/tag_expression.py +111 -0
  70. data/vendor/behave/behave/tag_matcher.py +465 -0
  71. data/vendor/behave/behave/textutil.py +137 -0
  72. data/vendor/behave/behave/userdata.py +130 -0
  73. data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
  74. data/vendor/behave/behave4cmd0/__init__.py +5 -0
  75. data/vendor/behave/behave4cmd0/__setup.py +11 -0
  76. data/vendor/behave/behave4cmd0/command_shell.py +216 -0
  77. data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
  78. data/vendor/behave/behave4cmd0/command_steps.py +532 -0
  79. data/vendor/behave/behave4cmd0/command_util.py +147 -0
  80. data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
  81. data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
  82. data/vendor/behave/behave4cmd0/log/steps.py +395 -0
  83. data/vendor/behave/behave4cmd0/note_steps.py +29 -0
  84. data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
  85. data/vendor/behave/behave4cmd0/pathutil.py +146 -0
  86. data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
  87. data/vendor/behave/behave4cmd0/textutil.py +304 -0
  88. data/vendor/behave/bin/behave +44 -0
  89. data/vendor/behave/bin/behave.cmd +10 -0
  90. data/vendor/behave/bin/behave.junit_filter.py +85 -0
  91. data/vendor/behave/bin/behave.step_durations.py +163 -0
  92. data/vendor/behave/bin/behave2cucumber_json.py +63 -0
  93. data/vendor/behave/bin/behave_cmd.py +44 -0
  94. data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
  95. data/vendor/behave/bin/explore_platform_encoding.py +24 -0
  96. data/vendor/behave/bin/i18n.yml +621 -0
  97. data/vendor/behave/bin/invoke +8 -0
  98. data/vendor/behave/bin/invoke.cmd +9 -0
  99. data/vendor/behave/bin/json.format.py +167 -0
  100. data/vendor/behave/bin/jsonschema_validate.py +122 -0
  101. data/vendor/behave/bin/make_localpi.py +279 -0
  102. data/vendor/behave/bin/project_bootstrap.sh +30 -0
  103. data/vendor/behave/bin/toxcmd.py +270 -0
  104. data/vendor/behave/bin/toxcmd3.py +270 -0
  105. data/vendor/behave/conftest.py +27 -0
  106. data/vendor/behave/docs/Makefile +154 -0
  107. data/vendor/behave/docs/_static/agogo.css +501 -0
  108. data/vendor/behave/docs/_static/behave_logo.png +0 -0
  109. data/vendor/behave/docs/_static/behave_logo1.png +0 -0
  110. data/vendor/behave/docs/_static/behave_logo2.png +0 -0
  111. data/vendor/behave/docs/_static/behave_logo3.png +0 -0
  112. data/vendor/behave/docs/_themes/LICENSE +45 -0
  113. data/vendor/behave/docs/_themes/kr/layout.html +17 -0
  114. data/vendor/behave/docs/_themes/kr/relations.html +19 -0
  115. data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
  116. data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
  117. data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
  118. data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
  119. data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
  120. data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
  121. data/vendor/behave/docs/api.rst +408 -0
  122. data/vendor/behave/docs/appendix.rst +19 -0
  123. data/vendor/behave/docs/behave.rst +640 -0
  124. data/vendor/behave/docs/behave.rst-template +86 -0
  125. data/vendor/behave/docs/behave_ecosystem.rst +81 -0
  126. data/vendor/behave/docs/comparison.rst +85 -0
  127. data/vendor/behave/docs/conf.py +293 -0
  128. data/vendor/behave/docs/context_attributes.rst +66 -0
  129. data/vendor/behave/docs/django.rst +192 -0
  130. data/vendor/behave/docs/formatters.rst +61 -0
  131. data/vendor/behave/docs/gherkin.rst +673 -0
  132. data/vendor/behave/docs/index.rst +57 -0
  133. data/vendor/behave/docs/install.rst +60 -0
  134. data/vendor/behave/docs/more_info.rst +184 -0
  135. data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
  136. data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
  137. data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
  138. data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
  139. data/vendor/behave/docs/parse_builtin_types.rst +59 -0
  140. data/vendor/behave/docs/philosophy.rst +235 -0
  141. data/vendor/behave/docs/regular_expressions.rst +71 -0
  142. data/vendor/behave/docs/related.rst +14 -0
  143. data/vendor/behave/docs/test_domains.rst +62 -0
  144. data/vendor/behave/docs/tutorial.rst +636 -0
  145. data/vendor/behave/docs/update_behave_rst.py +100 -0
  146. data/vendor/behave/etc/json/behave.json-schema +172 -0
  147. data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
  148. data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
  149. data/vendor/behave/examples/async_step/README.txt +8 -0
  150. data/vendor/behave/examples/async_step/behave.ini +14 -0
  151. data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
  152. data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
  153. data/vendor/behave/examples/async_step/features/environment.py +28 -0
  154. data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
  155. data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
  156. data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
  157. data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
  158. data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
  159. data/vendor/behave/examples/env_vars/README.rst +26 -0
  160. data/vendor/behave/examples/env_vars/behave.ini +15 -0
  161. data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
  162. data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
  163. data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
  164. data/vendor/behave/features/README.txt +12 -0
  165. data/vendor/behave/features/background.feature +392 -0
  166. data/vendor/behave/features/capture_stderr.feature +172 -0
  167. data/vendor/behave/features/capture_stdout.feature +125 -0
  168. data/vendor/behave/features/cmdline.lang_list.feature +33 -0
  169. data/vendor/behave/features/configuration.default_paths.feature +116 -0
  170. data/vendor/behave/features/context.global_params.feature +35 -0
  171. data/vendor/behave/features/context.local_params.feature +17 -0
  172. data/vendor/behave/features/directory_layout.advanced.feature +147 -0
  173. data/vendor/behave/features/directory_layout.basic.feature +75 -0
  174. data/vendor/behave/features/directory_layout.basic2.feature +87 -0
  175. data/vendor/behave/features/environment.py +53 -0
  176. data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
  177. data/vendor/behave/features/feature.description.feature +0 -0
  178. data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
  179. data/vendor/behave/features/formatter.help.feature +30 -0
  180. data/vendor/behave/features/formatter.json.feature +420 -0
  181. data/vendor/behave/features/formatter.progress3.feature +235 -0
  182. data/vendor/behave/features/formatter.rerun.feature +296 -0
  183. data/vendor/behave/features/formatter.steps.feature +181 -0
  184. data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
  185. data/vendor/behave/features/formatter.steps_doc.feature +140 -0
  186. data/vendor/behave/features/formatter.steps_usage.feature +404 -0
  187. data/vendor/behave/features/formatter.tags.feature +134 -0
  188. data/vendor/behave/features/formatter.tags_location.feature +183 -0
  189. data/vendor/behave/features/formatter.user_defined.feature +196 -0
  190. data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
  191. data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
  192. data/vendor/behave/features/logcapture.feature +188 -0
  193. data/vendor/behave/features/logcapture.filter.feature +130 -0
  194. data/vendor/behave/features/logging.no_capture.feature +99 -0
  195. data/vendor/behave/features/logging.setup_format.feature +157 -0
  196. data/vendor/behave/features/logging.setup_level.feature +168 -0
  197. data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
  198. data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
  199. data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
  200. data/vendor/behave/features/runner.abort_by_user.feature +305 -0
  201. data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
  202. data/vendor/behave/features/runner.default_format.feature +175 -0
  203. data/vendor/behave/features/runner.dry_run.feature +184 -0
  204. data/vendor/behave/features/runner.feature_listfile.feature +223 -0
  205. data/vendor/behave/features/runner.hook_errors.feature +382 -0
  206. data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
  207. data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
  208. data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
  209. data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
  210. data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
  211. data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
  212. data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
  213. data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
  214. data/vendor/behave/features/runner.tag_logic.feature +67 -0
  215. data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
  216. data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
  217. data/vendor/behave/features/scenario.description.feature +171 -0
  218. data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
  219. data/vendor/behave/features/scenario_outline.basics.feature +100 -0
  220. data/vendor/behave/features/scenario_outline.improved.feature +177 -0
  221. data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
  222. data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
  223. data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
  224. data/vendor/behave/features/step.async_steps.feature +225 -0
  225. data/vendor/behave/features/step.duplicated_step.feature +106 -0
  226. data/vendor/behave/features/step.execute_steps.feature +59 -0
  227. data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
  228. data/vendor/behave/features/step.import_other_step_module.feature +103 -0
  229. data/vendor/behave/features/step.pending_steps.feature +128 -0
  230. data/vendor/behave/features/step.undefined_steps.feature +307 -0
  231. data/vendor/behave/features/step.use_step_library.feature +44 -0
  232. data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
  233. data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
  234. data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
  235. data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
  236. data/vendor/behave/features/step_param.custom_types.feature +134 -0
  237. data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
  238. data/vendor/behave/features/steps/behave_context_steps.py +67 -0
  239. data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
  240. data/vendor/behave/features/steps/behave_model_util.py +105 -0
  241. data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
  242. data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
  243. data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
  244. data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
  245. data/vendor/behave/features/summary.undefined_steps.feature +114 -0
  246. data/vendor/behave/features/tags.active_tags.feature +385 -0
  247. data/vendor/behave/features/tags.default_tags.feature +104 -0
  248. data/vendor/behave/features/tags.tag_expression.feature +105 -0
  249. data/vendor/behave/features/userdata.feature +331 -0
  250. data/vendor/behave/invoke.yaml +21 -0
  251. data/vendor/behave/issue.features/README.txt +17 -0
  252. data/vendor/behave/issue.features/environment.py +97 -0
  253. data/vendor/behave/issue.features/issue0030.feature +21 -0
  254. data/vendor/behave/issue.features/issue0031.feature +16 -0
  255. data/vendor/behave/issue.features/issue0032.feature +28 -0
  256. data/vendor/behave/issue.features/issue0035.feature +74 -0
  257. data/vendor/behave/issue.features/issue0040.feature +154 -0
  258. data/vendor/behave/issue.features/issue0041.feature +135 -0
  259. data/vendor/behave/issue.features/issue0042.feature +230 -0
  260. data/vendor/behave/issue.features/issue0044.feature +51 -0
  261. data/vendor/behave/issue.features/issue0046.feature +77 -0
  262. data/vendor/behave/issue.features/issue0052.feature +66 -0
  263. data/vendor/behave/issue.features/issue0059.feature +29 -0
  264. data/vendor/behave/issue.features/issue0063.feature +102 -0
  265. data/vendor/behave/issue.features/issue0064.feature +97 -0
  266. data/vendor/behave/issue.features/issue0065.feature +18 -0
  267. data/vendor/behave/issue.features/issue0066.feature +80 -0
  268. data/vendor/behave/issue.features/issue0067.feature +90 -0
  269. data/vendor/behave/issue.features/issue0069.feature +64 -0
  270. data/vendor/behave/issue.features/issue0072.feature +32 -0
  271. data/vendor/behave/issue.features/issue0073.feature +228 -0
  272. data/vendor/behave/issue.features/issue0075.feature +18 -0
  273. data/vendor/behave/issue.features/issue0077.feature +89 -0
  274. data/vendor/behave/issue.features/issue0080.feature +49 -0
  275. data/vendor/behave/issue.features/issue0081.feature +138 -0
  276. data/vendor/behave/issue.features/issue0083.feature +69 -0
  277. data/vendor/behave/issue.features/issue0084.feature +69 -0
  278. data/vendor/behave/issue.features/issue0085.feature +119 -0
  279. data/vendor/behave/issue.features/issue0092.feature +66 -0
  280. data/vendor/behave/issue.features/issue0096.feature +173 -0
  281. data/vendor/behave/issue.features/issue0099.feature +130 -0
  282. data/vendor/behave/issue.features/issue0109.feature +60 -0
  283. data/vendor/behave/issue.features/issue0111.feature +53 -0
  284. data/vendor/behave/issue.features/issue0112.feature +64 -0
  285. data/vendor/behave/issue.features/issue0114.feature +118 -0
  286. data/vendor/behave/issue.features/issue0116.feature +71 -0
  287. data/vendor/behave/issue.features/issue0125.feature +49 -0
  288. data/vendor/behave/issue.features/issue0127.feature +64 -0
  289. data/vendor/behave/issue.features/issue0139.feature +67 -0
  290. data/vendor/behave/issue.features/issue0142.feature +37 -0
  291. data/vendor/behave/issue.features/issue0143.feature +54 -0
  292. data/vendor/behave/issue.features/issue0145.feature +63 -0
  293. data/vendor/behave/issue.features/issue0148.feature +105 -0
  294. data/vendor/behave/issue.features/issue0152.feature +52 -0
  295. data/vendor/behave/issue.features/issue0159.feature +74 -0
  296. data/vendor/behave/issue.features/issue0162.feature +86 -0
  297. data/vendor/behave/issue.features/issue0171.feature +16 -0
  298. data/vendor/behave/issue.features/issue0172.feature +51 -0
  299. data/vendor/behave/issue.features/issue0175.feature +91 -0
  300. data/vendor/behave/issue.features/issue0177.feature +40 -0
  301. data/vendor/behave/issue.features/issue0181.feature +36 -0
  302. data/vendor/behave/issue.features/issue0184.feature +144 -0
  303. data/vendor/behave/issue.features/issue0186.feature +12 -0
  304. data/vendor/behave/issue.features/issue0188.feature +60 -0
  305. data/vendor/behave/issue.features/issue0191.feature +178 -0
  306. data/vendor/behave/issue.features/issue0194.feature +215 -0
  307. data/vendor/behave/issue.features/issue0197.feature +11 -0
  308. data/vendor/behave/issue.features/issue0216.feature +129 -0
  309. data/vendor/behave/issue.features/issue0226.feature +51 -0
  310. data/vendor/behave/issue.features/issue0228.feature +41 -0
  311. data/vendor/behave/issue.features/issue0230.feature +46 -0
  312. data/vendor/behave/issue.features/issue0231.feature +77 -0
  313. data/vendor/behave/issue.features/issue0238.feature +52 -0
  314. data/vendor/behave/issue.features/issue0251.feature +15 -0
  315. data/vendor/behave/issue.features/issue0280.feature +118 -0
  316. data/vendor/behave/issue.features/issue0288.feature +95 -0
  317. data/vendor/behave/issue.features/issue0300.feature +49 -0
  318. data/vendor/behave/issue.features/issue0302.feature +91 -0
  319. data/vendor/behave/issue.features/issue0309.feature +52 -0
  320. data/vendor/behave/issue.features/issue0330.feature +124 -0
  321. data/vendor/behave/issue.features/issue0349.feature +9 -0
  322. data/vendor/behave/issue.features/issue0361.feature +79 -0
  323. data/vendor/behave/issue.features/issue0383.feature +76 -0
  324. data/vendor/behave/issue.features/issue0384.feature +103 -0
  325. data/vendor/behave/issue.features/issue0385.feature +109 -0
  326. data/vendor/behave/issue.features/issue0424.feature +66 -0
  327. data/vendor/behave/issue.features/issue0446.feature +116 -0
  328. data/vendor/behave/issue.features/issue0449.feature +42 -0
  329. data/vendor/behave/issue.features/issue0453.feature +42 -0
  330. data/vendor/behave/issue.features/issue0457.feature +65 -0
  331. data/vendor/behave/issue.features/issue0462.feature +38 -0
  332. data/vendor/behave/issue.features/issue0476.feature +39 -0
  333. data/vendor/behave/issue.features/issue0487.feature +92 -0
  334. data/vendor/behave/issue.features/issue0506.feature +77 -0
  335. data/vendor/behave/issue.features/issue0510.feature +51 -0
  336. data/vendor/behave/issue.features/requirements.txt +12 -0
  337. data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
  338. data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
  339. data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
  340. data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
  341. data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
  342. data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
  343. data/vendor/behave/more.features/tutorial.feature +6 -0
  344. data/vendor/behave/py.requirements/README.txt +5 -0
  345. data/vendor/behave/py.requirements/all.txt +16 -0
  346. data/vendor/behave/py.requirements/basic.txt +21 -0
  347. data/vendor/behave/py.requirements/develop.txt +28 -0
  348. data/vendor/behave/py.requirements/docs.txt +6 -0
  349. data/vendor/behave/py.requirements/json.txt +7 -0
  350. data/vendor/behave/py.requirements/more_py26.txt +8 -0
  351. data/vendor/behave/py.requirements/testing.txt +10 -0
  352. data/vendor/behave/pytest.ini +24 -0
  353. data/vendor/behave/setup.cfg +29 -0
  354. data/vendor/behave/setup.py +118 -0
  355. data/vendor/behave/setuptools_behave.py +130 -0
  356. data/vendor/behave/tasks/__behave.py +45 -0
  357. data/vendor/behave/tasks/__init__.py +55 -0
  358. data/vendor/behave/tasks/__main__.py +70 -0
  359. data/vendor/behave/tasks/_setup.py +135 -0
  360. data/vendor/behave/tasks/_vendor/README.rst +35 -0
  361. data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
  362. data/vendor/behave/tasks/_vendor/path.py +1725 -0
  363. data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
  364. data/vendor/behave/tasks/_vendor/six.py +868 -0
  365. data/vendor/behave/tasks/clean.py +246 -0
  366. data/vendor/behave/tasks/docs.py +97 -0
  367. data/vendor/behave/tasks/requirements.txt +17 -0
  368. data/vendor/behave/tasks/test.py +192 -0
  369. data/vendor/behave/test/__init__.py +0 -0
  370. data/vendor/behave/test/_importer_candidate.py +3 -0
  371. data/vendor/behave/test/reporters/__init__.py +0 -0
  372. data/vendor/behave/test/reporters/test_summary.py +240 -0
  373. data/vendor/behave/test/test_ansi_escapes.py +73 -0
  374. data/vendor/behave/test/test_configuration.py +172 -0
  375. data/vendor/behave/test/test_formatter.py +265 -0
  376. data/vendor/behave/test/test_formatter_progress.py +39 -0
  377. data/vendor/behave/test/test_formatter_rerun.py +97 -0
  378. data/vendor/behave/test/test_formatter_tags.py +57 -0
  379. data/vendor/behave/test/test_importer.py +151 -0
  380. data/vendor/behave/test/test_log_capture.py +29 -0
  381. data/vendor/behave/test/test_matchers.py +236 -0
  382. data/vendor/behave/test/test_model.py +871 -0
  383. data/vendor/behave/test/test_parser.py +1590 -0
  384. data/vendor/behave/test/test_runner.py +1074 -0
  385. data/vendor/behave/test/test_step_registry.py +96 -0
  386. data/vendor/behave/test/test_tag_expression.py +506 -0
  387. data/vendor/behave/test/test_tag_expression2.py +462 -0
  388. data/vendor/behave/test/test_tag_matcher.py +729 -0
  389. data/vendor/behave/test/test_userdata.py +184 -0
  390. data/vendor/behave/tests/README.txt +12 -0
  391. data/vendor/behave/tests/__init__.py +0 -0
  392. data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
  393. data/vendor/behave/tests/api/__init__.py +0 -0
  394. data/vendor/behave/tests/api/_test_async_step34.py +130 -0
  395. data/vendor/behave/tests/api/_test_async_step35.py +75 -0
  396. data/vendor/behave/tests/api/test_async_step.py +18 -0
  397. data/vendor/behave/tests/api/testing_support.py +94 -0
  398. data/vendor/behave/tests/api/testing_support_async.py +21 -0
  399. data/vendor/behave/tests/issues/test_issue0336.py +66 -0
  400. data/vendor/behave/tests/issues/test_issue0449.py +55 -0
  401. data/vendor/behave/tests/issues/test_issue0453.py +62 -0
  402. data/vendor/behave/tests/issues/test_issue0458.py +54 -0
  403. data/vendor/behave/tests/issues/test_issue0495.py +65 -0
  404. data/vendor/behave/tests/unit/__init__.py +0 -0
  405. data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
  406. data/vendor/behave/tests/unit/test_capture.py +280 -0
  407. data/vendor/behave/tests/unit/test_model_core.py +56 -0
  408. data/vendor/behave/tests/unit/test_textutil.py +267 -0
  409. data/vendor/behave/tools/test-features/background.feature +9 -0
  410. data/vendor/behave/tools/test-features/environment.py +8 -0
  411. data/vendor/behave/tools/test-features/french.feature +11 -0
  412. data/vendor/behave/tools/test-features/outline.feature +39 -0
  413. data/vendor/behave/tools/test-features/parse.feature +10 -0
  414. data/vendor/behave/tools/test-features/step-data.feature +60 -0
  415. data/vendor/behave/tools/test-features/steps/steps.py +120 -0
  416. data/vendor/behave/tools/test-features/tags.feature +18 -0
  417. data/vendor/behave/tox.ini +159 -0
  418. metadata +562 -0
@@ -0,0 +1,96 @@
1
+ # -*- coding: UTF-8 -*-
2
+ # pylint: disable=unused-wildcard-import
3
+ from __future__ import absolute_import, with_statement
4
+ from mock import Mock, patch
5
+ from nose.tools import * # pylint: disable=wildcard-import
6
+ from six.moves import range # pylint: disable=redefined-builtin
7
+ from behave import step_registry
8
+
9
+
10
+ class TestStepRegistry(object):
11
+ # pylint: disable=invalid-name, no-self-use
12
+
13
+ def test_add_step_definition_adds_to_lowercased_keyword(self):
14
+ registry = step_registry.StepRegistry()
15
+ # -- MONKEYPATCH-PROBLEM:
16
+ # with patch('behave.matchers.get_matcher') as get_matcher:
17
+ with patch('behave.step_registry.get_matcher') as get_matcher:
18
+ func = lambda x: -x
19
+ string = 'just a test string'
20
+ magic_object = object()
21
+ get_matcher.return_value = magic_object
22
+
23
+ for step_type in list(registry.steps.keys()):
24
+ l = []
25
+ registry.steps[step_type] = l
26
+
27
+ registry.add_step_definition(step_type.upper(), string, func)
28
+ get_matcher.assert_called_with(func, string)
29
+ eq_(l, [magic_object])
30
+
31
+ def test_find_match_with_specific_step_type_also_searches_generic(self):
32
+ registry = step_registry.StepRegistry()
33
+
34
+ given_mock = Mock()
35
+ given_mock.match.return_value = None
36
+ step_mock = Mock()
37
+ step_mock.match.return_value = None
38
+
39
+ registry.steps['given'].append(given_mock)
40
+ registry.steps['step'].append(step_mock)
41
+
42
+ step = Mock()
43
+ step.step_type = 'given'
44
+ step.name = 'just a test step'
45
+
46
+ assert registry.find_match(step) is None
47
+
48
+ given_mock.match.assert_called_with(step.name)
49
+ step_mock.match.assert_called_with(step.name)
50
+
51
+ def test_find_match_with_no_match_returns_none(self):
52
+ registry = step_registry.StepRegistry()
53
+
54
+ step_defs = [Mock() for x in range(0, 10)]
55
+ for mock in step_defs:
56
+ mock.match.return_value = None
57
+
58
+ registry.steps['when'] = step_defs
59
+
60
+ step = Mock()
61
+ step.step_type = 'when'
62
+ step.name = 'just a test step'
63
+
64
+ assert registry.find_match(step) is None
65
+
66
+ def test_find_match_with_a_match_returns_match(self):
67
+ registry = step_registry.StepRegistry()
68
+
69
+ step_defs = [Mock() for x in range(0, 10)]
70
+ for mock in step_defs:
71
+ mock.match.return_value = None
72
+ magic_object = object()
73
+ step_defs[5].match.return_value = magic_object
74
+
75
+ registry.steps['then'] = step_defs
76
+
77
+ step = Mock()
78
+ step.step_type = 'then'
79
+ step.name = 'just a test step'
80
+
81
+ assert registry.find_match(step) is magic_object
82
+ for mock in step_defs[6:]:
83
+ eq_(mock.match.call_count, 0)
84
+
85
+ # pylint: disable=line-too-long
86
+ @patch.object(step_registry.registry, 'add_step_definition')
87
+ def test_make_step_decorator_ends_up_adding_a_step_definition(self, add_step_definition):
88
+ step_type = object()
89
+ string = object()
90
+ func = object()
91
+
92
+ decorator = step_registry.registry.make_decorator(step_type)
93
+ wrapper = decorator(string)
94
+ assert wrapper(func) is func
95
+ add_step_definition.assert_called_with(step_type, string, func)
96
+
@@ -0,0 +1,506 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from __future__ import absolute_import
4
+ from behave.tag_expression import TagExpression
5
+ from nose import tools
6
+ import unittest
7
+
8
+
9
+ # ----------------------------------------------------------------------------
10
+ # BASIC TESTS: 0..1 tags, not @tag
11
+ # ----------------------------------------------------------------------------
12
+ class TestTagExpressionNoTags(unittest.TestCase):
13
+ def setUp(self):
14
+ self.e = TagExpression([])
15
+
16
+ def test_should_match_empty_tags(self):
17
+ assert self.e.check([])
18
+
19
+ def test_should_match_foo(self):
20
+ assert self.e.check(['foo'])
21
+
22
+
23
+ class TestTagExpressionFoo(unittest.TestCase):
24
+ def setUp(self):
25
+ self.e = TagExpression(['foo'])
26
+
27
+ def test_should_not_match_no_tags(self):
28
+ assert not self.e.check([])
29
+
30
+ def test_should_match_foo(self):
31
+ assert self.e.check(['foo'])
32
+
33
+ def test_should_not_match_bar(self):
34
+ assert not self.e.check(['bar'])
35
+
36
+
37
+ class TestTagExpressionNotFoo(unittest.TestCase):
38
+ def setUp(self):
39
+ self.e = TagExpression(['-foo'])
40
+
41
+ def test_should_match_no_tags(self):
42
+ assert self.e.check([])
43
+
44
+ def test_should_not_match_foo(self):
45
+ assert not self.e.check(['foo'])
46
+
47
+ def test_should_match_bar(self):
48
+ assert self.e.check(['bar'])
49
+
50
+
51
+ # ----------------------------------------------------------------------------
52
+ # LOGICAL-AND TESTS: With @foo, @bar (2 tags)
53
+ # ----------------------------------------------------------------------------
54
+ class TestTagExpressionFooAndBar(unittest.TestCase):
55
+ # -- LOGIC: @foo and @bar
56
+
57
+ def setUp(self):
58
+ self.e = TagExpression(['foo', 'bar'])
59
+
60
+ def test_should_not_match_no_tags(self):
61
+ assert not self.e.check([])
62
+
63
+ def test_should_not_match_foo(self):
64
+ assert not self.e.check(['foo'])
65
+
66
+ def test_should_not_match_bar(self):
67
+ assert not self.e.check(['bar'])
68
+
69
+ def test_should_not_match_other(self):
70
+ assert not self.e.check(['other'])
71
+
72
+ def test_should_match_foo_bar(self):
73
+ assert self.e.check(['foo', 'bar'])
74
+ assert self.e.check(['bar', 'foo'])
75
+
76
+ def test_should_not_match_foo_other(self):
77
+ assert not self.e.check(['foo', 'other'])
78
+ assert not self.e.check(['other', 'foo'])
79
+
80
+ def test_should_not_match_bar_other(self):
81
+ assert not self.e.check(['bar', 'other'])
82
+ assert not self.e.check(['other', 'bar'])
83
+
84
+ def test_should_not_match_zap_other(self):
85
+ assert not self.e.check(['zap', 'other'])
86
+ assert not self.e.check(['other', 'zap'])
87
+
88
+ def test_should_match_foo_bar_other(self):
89
+ assert self.e.check(['foo', 'bar', 'other'])
90
+ assert self.e.check(['bar', 'other', 'foo'])
91
+ assert self.e.check(['other', 'bar', 'foo'])
92
+
93
+ def test_should_not_match_foo_zap_other(self):
94
+ assert not self.e.check(['foo', 'zap', 'other'])
95
+ assert not self.e.check(['other', 'zap', 'foo'])
96
+
97
+ def test_should_not_match_bar_zap_other(self):
98
+ assert not self.e.check(['bar', 'zap', 'other'])
99
+ assert not self.e.check(['other', 'bar', 'zap'])
100
+
101
+ def test_should_not_match_zap_baz_other(self):
102
+ assert not self.e.check(['zap', 'baz', 'other'])
103
+ assert not self.e.check(['baz', 'other', 'baz'])
104
+ assert not self.e.check(['other', 'baz', 'zap'])
105
+
106
+
107
+ class TestTagExpressionFooAndNotBar(unittest.TestCase):
108
+ # -- LOGIC: @foo and not @bar
109
+
110
+ def setUp(self):
111
+ self.e = TagExpression(['foo', '-bar'])
112
+
113
+ def test_should_not_match_no_tags(self):
114
+ assert not self.e.check([])
115
+
116
+ def test_should_match_foo(self):
117
+ assert self.e.check(['foo'])
118
+
119
+ def test_should_not_match_bar(self):
120
+ assert not self.e.check(['bar'])
121
+
122
+ def test_should_not_match_other(self):
123
+ assert not self.e.check(['other'])
124
+
125
+ def test_should_not_match_foo_bar(self):
126
+ assert not self.e.check(['foo', 'bar'])
127
+ assert not self.e.check(['bar', 'foo'])
128
+
129
+ def test_should_match_foo_other(self):
130
+ assert self.e.check(['foo', 'other'])
131
+ assert self.e.check(['other', 'foo'])
132
+
133
+ def test_should_not_match_bar_other(self):
134
+ assert not self.e.check(['bar', 'other'])
135
+ assert not self.e.check(['other', 'bar'])
136
+
137
+ def test_should_not_match_zap_other(self):
138
+ assert not self.e.check(['bar', 'other'])
139
+ assert not self.e.check(['other', 'bar'])
140
+
141
+ def test_should_not_match_foo_bar_other(self):
142
+ assert not self.e.check(['foo', 'bar', 'other'])
143
+ assert not self.e.check(['bar', 'other', 'foo'])
144
+ assert not self.e.check(['other', 'bar', 'foo'])
145
+
146
+ def test_should_match_foo_zap_other(self):
147
+ assert self.e.check(['foo', 'zap', 'other'])
148
+ assert self.e.check(['other', 'zap', 'foo'])
149
+
150
+ def test_should_not_match_bar_zap_other(self):
151
+ assert not self.e.check(['bar', 'zap', 'other'])
152
+ assert not self.e.check(['other', 'bar', 'zap'])
153
+
154
+ def test_should_not_match_zap_baz_other(self):
155
+ assert not self.e.check(['zap', 'baz', 'other'])
156
+ assert not self.e.check(['baz', 'other', 'baz'])
157
+ assert not self.e.check(['other', 'baz', 'zap'])
158
+
159
+
160
+ class TestTagExpressionNotBarAndFoo(TestTagExpressionFooAndNotBar):
161
+ # -- REUSE: Test suite due to symmetry in reversed expression
162
+ # LOGIC: not @bar and @foo == @foo and not @bar
163
+
164
+ def setUp(self):
165
+ self.e = TagExpression(['-bar', 'foo'])
166
+
167
+
168
+ class TestTagExpressionNotFooAndNotBar(unittest.TestCase):
169
+ # -- LOGIC: not @bar and not @foo
170
+
171
+ def setUp(self):
172
+ self.e = TagExpression(['-foo', '-bar'])
173
+
174
+ def test_should_match_no_tags(self):
175
+ assert self.e.check([])
176
+
177
+ def test_should_not_match_foo(self):
178
+ assert not self.e.check(['foo'])
179
+
180
+ def test_should_not_match_bar(self):
181
+ assert not self.e.check(['bar'])
182
+
183
+ def test_should_match_other(self):
184
+ assert self.e.check(['other'])
185
+
186
+ def test_should_not_match_foo_bar(self):
187
+ assert not self.e.check(['foo', 'bar'])
188
+ assert not self.e.check(['bar', 'foo'])
189
+
190
+ def test_should_not_match_foo_other(self):
191
+ assert not self.e.check(['foo', 'other'])
192
+ assert not self.e.check(['other', 'foo'])
193
+
194
+ def test_should_not_match_bar_other(self):
195
+ assert not self.e.check(['bar', 'other'])
196
+ assert not self.e.check(['other', 'bar'])
197
+
198
+ def test_should_match_zap_other(self):
199
+ assert self.e.check(['zap', 'other'])
200
+ assert self.e.check(['other', 'zap'])
201
+
202
+ def test_should_not_match_foo_bar_other(self):
203
+ assert not self.e.check(['foo', 'bar', 'other'])
204
+ assert not self.e.check(['bar', 'other', 'foo'])
205
+ assert not self.e.check(['other', 'bar', 'foo'])
206
+
207
+ def test_should_not_match_foo_zap_other(self):
208
+ assert not self.e.check(['foo', 'zap', 'other'])
209
+ assert not self.e.check(['other', 'zap', 'foo'])
210
+
211
+ def test_should_not_match_bar_zap_other(self):
212
+ assert not self.e.check(['bar', 'zap', 'other'])
213
+ assert not self.e.check(['other', 'bar', 'zap'])
214
+
215
+ def test_should_match_zap_baz_other(self):
216
+ assert self.e.check(['zap', 'baz', 'other'])
217
+ assert self.e.check(['baz', 'other', 'baz'])
218
+ assert self.e.check(['other', 'baz', 'zap'])
219
+
220
+
221
+ class TestTagExpressionNotBarAndNotFoo(TestTagExpressionNotFooAndNotBar):
222
+ # -- REUSE: Test suite due to symmetry in reversed expression
223
+ # LOGIC: not @bar and not @foo == not @foo and not @bar
224
+
225
+ def setUp(self):
226
+ self.e = TagExpression(['-bar', '-foo'])
227
+
228
+
229
+ # ----------------------------------------------------------------------------
230
+ # LOGICAL-OR TESTS: With @foo, @bar (2 tags)
231
+ # ----------------------------------------------------------------------------
232
+ class TestTagExpressionFooOrBar(unittest.TestCase):
233
+ def setUp(self):
234
+ self.e = TagExpression(['foo,bar'])
235
+
236
+ def test_should_not_match_no_tags(self):
237
+ assert not self.e.check([])
238
+
239
+ def test_should_match_foo(self):
240
+ assert self.e.check(['foo'])
241
+
242
+ def test_should_match_bar(self):
243
+ assert self.e.check(['bar'])
244
+
245
+ def test_should_not_match_other(self):
246
+ assert not self.e.check(['other'])
247
+
248
+ def test_should_match_foo_bar(self):
249
+ assert self.e.check(['foo', 'bar'])
250
+ assert self.e.check(['bar', 'foo'])
251
+
252
+ def test_should_match_foo_other(self):
253
+ assert self.e.check(['foo', 'other'])
254
+ assert self.e.check(['other', 'foo'])
255
+
256
+ def test_should_match_bar_other(self):
257
+ assert self.e.check(['bar', 'other'])
258
+ assert self.e.check(['other', 'bar'])
259
+
260
+ def test_should_not_match_zap_other(self):
261
+ assert not self.e.check(['zap', 'other'])
262
+ assert not self.e.check(['other', 'zap'])
263
+
264
+ def test_should_match_foo_bar_other(self):
265
+ assert self.e.check(['foo', 'bar', 'other'])
266
+ assert self.e.check(['bar', 'other', 'foo'])
267
+ assert self.e.check(['other', 'bar', 'foo'])
268
+
269
+ def test_should_match_foo_zap_other(self):
270
+ assert self.e.check(['foo', 'zap', 'other'])
271
+ assert self.e.check(['other', 'zap', 'foo'])
272
+
273
+ def test_should_match_bar_zap_other(self):
274
+ assert self.e.check(['bar', 'zap', 'other'])
275
+ assert self.e.check(['other', 'bar', 'zap'])
276
+
277
+ def test_should_not_match_zap_baz_other(self):
278
+ assert not self.e.check(['zap', 'baz', 'other'])
279
+ assert not self.e.check(['baz', 'other', 'baz'])
280
+ assert not self.e.check(['other', 'baz', 'zap'])
281
+
282
+
283
+ class TestTagExpressionBarOrFoo(TestTagExpressionFooOrBar):
284
+ # -- REUSE: Test suite due to symmetry in reversed expression
285
+ # LOGIC: @bar or @foo == @foo or @bar
286
+ def setUp(self):
287
+ self.e = TagExpression(['bar,foo'])
288
+
289
+
290
+ class TestTagExpressionFooOrNotBar(unittest.TestCase):
291
+ def setUp(self):
292
+ self.e = TagExpression(['foo,-bar'])
293
+
294
+ def test_should_match_no_tags(self):
295
+ assert self.e.check([])
296
+
297
+ def test_should_match_foo(self):
298
+ assert self.e.check(['foo'])
299
+
300
+ def test_should_not_match_bar(self):
301
+ assert not self.e.check(['bar'])
302
+
303
+ def test_should_match_other(self):
304
+ assert self.e.check(['other'])
305
+
306
+ def test_should_match_foo_bar(self):
307
+ assert self.e.check(['foo', 'bar'])
308
+ assert self.e.check(['bar', 'foo'])
309
+
310
+ def test_should_match_foo_other(self):
311
+ assert self.e.check(['foo', 'other'])
312
+ assert self.e.check(['other', 'foo'])
313
+
314
+ def test_should_not_match_bar_other(self):
315
+ assert not self.e.check(['bar', 'other'])
316
+ assert not self.e.check(['other', 'bar'])
317
+
318
+ def test_should_match_zap_other(self):
319
+ assert self.e.check(['zap', 'other'])
320
+ assert self.e.check(['other', 'zap'])
321
+
322
+ def test_should_match_foo_bar_other(self):
323
+ assert self.e.check(['foo', 'bar', 'other'])
324
+ assert self.e.check(['bar', 'other', 'foo'])
325
+ assert self.e.check(['other', 'bar', 'foo'])
326
+
327
+ def test_should_match_foo_zap_other(self):
328
+ assert self.e.check(['foo', 'zap', 'other'])
329
+ assert self.e.check(['other', 'zap', 'foo'])
330
+
331
+ def test_should_not_match_bar_zap_other(self):
332
+ assert not self.e.check(['bar', 'zap', 'other'])
333
+ assert not self.e.check(['other', 'bar', 'zap'])
334
+
335
+ def test_should_match_zap_baz_other(self):
336
+ assert self.e.check(['zap', 'baz', 'other'])
337
+ assert self.e.check(['baz', 'other', 'baz'])
338
+ assert self.e.check(['other', 'baz', 'zap'])
339
+
340
+
341
+ class TestTagExpressionNotBarOrFoo(TestTagExpressionFooOrNotBar):
342
+ # -- REUSE: Test suite due to symmetry in reversed expression
343
+ # LOGIC: not @bar or @foo == @foo or not @bar
344
+ def setUp(self):
345
+ self.e = TagExpression(['-bar,foo'])
346
+
347
+
348
+ class TestTagExpressionNotFooOrNotBar(unittest.TestCase):
349
+ def setUp(self):
350
+ self.e = TagExpression(['-foo,-bar'])
351
+
352
+ def test_should_match_no_tags(self):
353
+ assert self.e.check([])
354
+
355
+ def test_should_match_foo(self):
356
+ assert self.e.check(['foo'])
357
+
358
+ def test_should_match_bar(self):
359
+ assert self.e.check(['bar'])
360
+
361
+ def test_should_match_other(self):
362
+ assert self.e.check(['other'])
363
+
364
+ def test_should_not_match_foo_bar(self):
365
+ assert not self.e.check(['foo', 'bar'])
366
+ assert not self.e.check(['bar', 'foo'])
367
+
368
+ def test_should_match_foo_other(self):
369
+ assert self.e.check(['foo', 'other'])
370
+ assert self.e.check(['other', 'foo'])
371
+
372
+ def test_should_match_bar_other(self):
373
+ assert self.e.check(['bar', 'other'])
374
+ assert self.e.check(['other', 'bar'])
375
+
376
+ def test_should_match_zap_other(self):
377
+ assert self.e.check(['zap', 'other'])
378
+ assert self.e.check(['other', 'zap'])
379
+
380
+ def test_should_not_match_foo_bar_other(self):
381
+ assert not self.e.check(['foo', 'bar', 'other'])
382
+ assert not self.e.check(['bar', 'other', 'foo'])
383
+ assert not self.e.check(['other', 'bar', 'foo'])
384
+
385
+ def test_should_match_foo_zap_other(self):
386
+ assert self.e.check(['foo', 'zap', 'other'])
387
+ assert self.e.check(['other', 'zap', 'foo'])
388
+
389
+ def test_should_match_bar_zap_other(self):
390
+ assert self.e.check(['bar', 'zap', 'other'])
391
+ assert self.e.check(['other', 'bar', 'zap'])
392
+
393
+ def test_should_match_zap_baz_other(self):
394
+ assert self.e.check(['zap', 'baz', 'other'])
395
+ assert self.e.check(['baz', 'other', 'baz'])
396
+ assert self.e.check(['other', 'baz', 'zap'])
397
+
398
+
399
+ class TestTagExpressionNotBarOrNotFoo(TestTagExpressionNotFooOrNotBar):
400
+ # -- REUSE: Test suite due to symmetry in reversed expression
401
+ # LOGIC: not @bar or @foo == @foo or not @bar
402
+ def setUp(self):
403
+ self.e = TagExpression(['-bar,-foo'])
404
+
405
+
406
+ # ----------------------------------------------------------------------------
407
+ # MORE TESTS: With 3 tags
408
+ # ----------------------------------------------------------------------------
409
+ class TestTagExpressionFooOrBarAndNotZap(unittest.TestCase):
410
+ def setUp(self):
411
+ self.e = TagExpression(['foo,bar', '-zap'])
412
+
413
+ def test_should_match_foo(self):
414
+ assert self.e.check(['foo'])
415
+
416
+ def test_should_not_match_foo_zap(self):
417
+ assert not self.e.check(['foo', 'zap'])
418
+
419
+ def test_should_not_match_tags(self):
420
+ assert not self.e.check([])
421
+
422
+ def test_should_match_foo(self):
423
+ assert self.e.check(['foo'])
424
+
425
+ def test_should_match_bar(self):
426
+ assert self.e.check(['bar'])
427
+
428
+ def test_should_not_match_other(self):
429
+ assert not self.e.check(['other'])
430
+
431
+ def test_should_match_foo_bar(self):
432
+ assert self.e.check(['foo', 'bar'])
433
+ assert self.e.check(['bar', 'foo'])
434
+
435
+ def test_should_match_foo_other(self):
436
+ assert self.e.check(['foo', 'other'])
437
+ assert self.e.check(['other', 'foo'])
438
+
439
+ def test_should_match_bar_other(self):
440
+ assert self.e.check(['bar', 'other'])
441
+ assert self.e.check(['other', 'bar'])
442
+
443
+ def test_should_not_match_zap_other(self):
444
+ assert not self.e.check(['zap', 'other'])
445
+ assert not self.e.check(['other', 'zap'])
446
+
447
+ def test_should_match_foo_bar_other(self):
448
+ assert self.e.check(['foo', 'bar', 'other'])
449
+ assert self.e.check(['bar', 'other', 'foo'])
450
+ assert self.e.check(['other', 'bar', 'foo'])
451
+
452
+ def test_should_not_match_foo_bar_zap(self):
453
+ assert not self.e.check(['foo', 'bar', 'zap'])
454
+ assert not self.e.check(['bar', 'zap', 'foo'])
455
+ assert not self.e.check(['zap', 'bar', 'foo'])
456
+
457
+ def test_should_not_match_foo_zap_other(self):
458
+ assert not self.e.check(['foo', 'zap', 'other'])
459
+ assert not self.e.check(['other', 'zap', 'foo'])
460
+
461
+ def test_should_not_match_bar_zap_other(self):
462
+ assert not self.e.check(['bar', 'zap', 'other'])
463
+ assert not self.e.check(['other', 'bar', 'zap'])
464
+
465
+ def test_should_not_match_zap_baz_other(self):
466
+ assert not self.e.check(['zap', 'baz', 'other'])
467
+ assert not self.e.check(['baz', 'other', 'baz'])
468
+ assert not self.e.check(['other', 'baz', 'zap'])
469
+
470
+
471
+ # ----------------------------------------------------------------------------
472
+ # TESTS WITH LIMIT
473
+ # ----------------------------------------------------------------------------
474
+ class TestTagExpressionFoo3OrNotBar4AndZap5(unittest.TestCase):
475
+ def setUp(self):
476
+ self.e = TagExpression(['foo:3,-bar', 'zap:5'])
477
+
478
+ def test_should_count_tags_for_positive_tags(self):
479
+ tools.eq_(self.e.limits, {'foo': 3, 'zap': 5})
480
+
481
+ def test_should_match_foo_zap(self):
482
+ assert self.e.check(['foo', 'zap'])
483
+
484
+ class TestTagExpressionParsing(unittest.TestCase):
485
+ def setUp(self):
486
+ self.e = TagExpression([' foo:3 , -bar ', ' zap:5 '])
487
+
488
+ def test_should_have_limits(self):
489
+ tools.eq_(self.e.limits, {'zap': 5, 'foo': 3})
490
+
491
+ class TestTagExpressionTagLimits(unittest.TestCase):
492
+ def test_should_be_counted_for_negative_tags(self):
493
+ e = TagExpression(['-todo:3'])
494
+ tools.eq_(e.limits, {'todo': 3})
495
+
496
+ def test_should_be_counted_for_positive_tags(self):
497
+ e = TagExpression(['todo:3'])
498
+ tools.eq_(e.limits, {'todo': 3})
499
+
500
+ def test_should_raise_an_error_for_inconsistent_limits(self):
501
+ tools.assert_raises(Exception, TagExpression, ['todo:3', '-todo:4'])
502
+
503
+ def test_should_allow_duplicate_consistent_limits(self):
504
+ e = TagExpression(['todo:3', '-todo:3'])
505
+ tools.eq_(e.limits, {'todo': 3})
506
+