diff options
| author | natsuoto <[email protected]> | 2026-07-15 13:51:38 +0530 |
|---|---|---|
| committer | natsuoto <[email protected]> | 2026-07-15 13:51:38 +0530 |
| commit | 34694646345ce2a43c12df6fcb214371f3ee06c0 (patch) | |
| tree | 65614e6da771dce243d16bac7440fa7591d9a1e0 /tests | |
| parent | 414c548570df1c1e19b0982473e59b589802847c (diff) | |
| download | edify-34694646345ce2a43c12df6fcb214371f3ee06c0.tar.xz edify-34694646345ce2a43c12df6fcb214371f3ee06c0.zip | |
feat(engine): route to_regex(engine=re|regex) through a backend layer; regex is a deferred-import extra
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/builder/engine.test.py | 42 | ||||
| -rw-r--r-- | tests/builder/flags.test.py | 45 |
2 files changed, 83 insertions, 4 deletions
diff --git a/tests/builder/engine.test.py b/tests/builder/engine.test.py index e569c71..c6a32d1 100644 --- a/tests/builder/engine.test.py +++ b/tests/builder/engine.test.py @@ -1,19 +1,53 @@ +import sys + import pytest from edify import RegexBuilder -from edify.errors.engine import EngineNotWiredError +from edify.errors.backend import MissingRegexBackendError def test_engine_defaults_to_re_and_compiles(): compiled = RegexBuilder().digit().to_regex() assert compiled.source == "\\d" + assert compiled.engine == "re" -def test_engine_re_explicit_is_accepted(): +def test_engine_re_explicit_compiles_via_stdlib(): compiled = RegexBuilder().digit().to_regex(engine="re") assert compiled.source == "\\d" + assert compiled.engine == "re" + assert compiled.compiled.__class__.__module__ == "re" + + +def test_engine_regex_compiles_via_third_party_module(): + compiled = RegexBuilder().digit().to_regex(engine="regex") + assert compiled.source == "\\d" + assert compiled.engine == "regex" + assert compiled.compiled.__class__.__module__.endswith("regex") + + +def test_engine_regex_and_engine_re_are_not_equal_for_the_same_source(): + left = RegexBuilder().digit().to_regex(engine="re") + right = RegexBuilder().digit().to_regex(engine="regex") + assert left != right -def test_engine_regex_raises_until_wired(): - with pytest.raises(EngineNotWiredError, match="engine='regex'"): +def test_engine_regex_raises_clean_import_error_without_the_extra(monkeypatch): + monkeypatch.setitem(sys.modules, "regex", None) + with pytest.raises(MissingRegexBackendError, match="engine='regex'") as excinfo: RegexBuilder().digit().to_regex(engine="regex") + text = str(excinfo.value) + assert "pip install edify[regex]" in text + assert "= note:" in text + + +def test_missing_regex_backend_error_chains_from_underlying_import_error(monkeypatch): + monkeypatch.setitem(sys.modules, "regex", None) + with pytest.raises(MissingRegexBackendError) as excinfo: + RegexBuilder().digit().to_regex(engine="regex") + assert isinstance(excinfo.value.__cause__, ImportError) + + +def test_regex_engine_flags_propagate(): + compiled = RegexBuilder().string("ABC").to_regex(engine="regex", ignore_case=True) + assert bool(compiled.search("abc")) diff --git a/tests/builder/flags.test.py b/tests/builder/flags.test.py index d35d2ff..02e875e 100644 --- a/tests/builder/flags.test.py +++ b/tests/builder/flags.test.py @@ -70,3 +70,48 @@ def test_multiple_kwargs_combine(): assert compiled.compiled.flags & re.I == re.I assert compiled.compiled.flags & re.M == re.M assert compiled.compiled.flags & re.S == re.S + + +def _regex_module(): + import regex + + return regex + + +def test_regex_engine_ignore_case_kwarg_enables_the_flag(): + regex = _regex_module() + compiled = RegexBuilder().string("hi").to_regex(engine="regex", ignore_case=True) + assert compiled.compiled.flags & regex.I == regex.I + + +def test_regex_engine_multiline_kwarg_enables_the_flag(): + regex = _regex_module() + compiled = RegexBuilder().string("hi").to_regex(engine="regex", multiline=True) + assert compiled.compiled.flags & regex.M == regex.M + + +def test_regex_engine_dotall_kwarg_enables_the_flag(): + regex = _regex_module() + compiled = RegexBuilder().string("hi").to_regex(engine="regex", dotall=True) + assert compiled.compiled.flags & regex.S == regex.S + + +def test_regex_engine_ascii_only_kwarg_enables_the_flag(): + regex = _regex_module() + compiled = RegexBuilder().string("hi").to_regex(engine="regex", ascii_only=True) + assert compiled.compiled.flags & regex.A == regex.A + + +def test_regex_engine_verbose_kwarg_enables_the_flag(): + regex = _regex_module() + compiled = RegexBuilder().string("hi").to_regex(engine="regex", verbose=True) + assert compiled.compiled.flags & regex.X == regex.X + + + _ON_PYPY, + reason="PyPy's regex.DEBUG opcode disassembler shares the same upstream disassembler bug", +) +def test_regex_engine_debug_kwarg_compiles_without_error(): + compiled = RegexBuilder().string("hi").to_regex(engine="regex", debug=True) + assert compiled.source == "hi" |
