/tests/api/testing_support.py

https://github.com/behave/behave · Python · 94 lines · 61 code · 19 blank · 14 comment · 4 complexity · 0f9ff903d88289608ab174c8bdc12e86 MD5 · raw file

  1. # -*- coding: UTF-8 -*-
  2. """
  3. Test support functionality for other tests.
  4. """
  5. # -- IMPORTS:
  6. from __future__ import absolute_import
  7. from behave.step_registry import StepRegistry
  8. from behave.matchers import ParseMatcher, CFParseMatcher, RegexMatcher
  9. import time
  10. # -----------------------------------------------------------------------------
  11. # TEST SUPPORT:
  12. # -----------------------------------------------------------------------------
  13. class StopWatch(object):
  14. def __init__(self):
  15. self.start_time = None
  16. self.duration = None
  17. def start(self):
  18. self.start_time = self.now()
  19. self.duration = None
  20. def stop(self):
  21. self.duration = self.now() - self.start_time
  22. @staticmethod
  23. def now():
  24. return time.time()
  25. @property
  26. def elapsed(self):
  27. assert self.start_time is not None
  28. return self.now() - self.start_time
  29. def __enter__(self):
  30. self.start()
  31. return self
  32. def __exit__(self, exc_type, exc_val, exc_tb):
  33. self.stop()
  34. # -- NEEDED-UNTIL: stepimport functionality is completly provided.
  35. class MatcherFactory(object):
  36. matcher_mapping = {
  37. "parse": ParseMatcher,
  38. "cfparse": CFParseMatcher,
  39. "re": RegexMatcher,
  40. }
  41. default_matcher = ParseMatcher
  42. def __init__(self, matcher_mapping=None, default_matcher=None):
  43. self.matcher_mapping = matcher_mapping or self.matcher_mapping
  44. self.default_matcher = default_matcher or self.default_matcher
  45. self.current_matcher = self.default_matcher
  46. self.type_registry = {}
  47. # self.type_registry = ParseMatcher.custom_types.copy()
  48. def register_type(self, **kwargs):
  49. self.type_registry.update(**kwargs)
  50. def use_step_matcher(self, name):
  51. self.current_matcher = self.matcher_mapping[name]
  52. def use_default_step_matcher(self, name=None):
  53. if name:
  54. self.default_matcher = self.matcher_mapping[name]
  55. self.current_matcher = self.default_matcher
  56. def make_matcher(self, func, step_text, step_type=None):
  57. return self.current_matcher(func, step_text, step_type=step_type,
  58. custom_types=self.type_registry)
  59. def step_matcher(self, name):
  60. """
  61. DEPRECATED, use :method:`~MatcherFactory.use_step_matcher()` instead.
  62. """
  63. # -- BACKWARD-COMPATIBLE NAME: Mark as deprecated.
  64. import warnings
  65. warnings.warn("Use 'use_step_matcher()' instead",
  66. PendingDeprecationWarning, stacklevel=2)
  67. self.use_step_matcher(name)
  68. class SimpleStepContainer(object):
  69. def __init__(self, step_registry=None):
  70. if step_registry is None:
  71. step_registry = StepRegistry()
  72. matcher_factory = MatcherFactory()
  73. self.step_registry = step_registry
  74. self.step_registry.matcher_factory = matcher_factory
  75. self.matcher_factory = matcher_factory