"""Tests that exercise every element kind through the subexpression merge path. Each subexpression is built with one particular element kind and merged into a parent; the resulting regex string is asserted byte-for-byte so the per-type branches in :mod:`edify.builder.merge` all get exercised. """ from edify import RegexBuilder def _merge(sub: RegexBuilder) -> str: return RegexBuilder().subexpression(sub).to_regex_string() def test_subexpression_with_capture(): sub = RegexBuilder().capture().digit().end() assert _merge(sub) == "(\\d)" def test_subexpression_with_named_capture(): sub = RegexBuilder().named_capture("token").digit().end() assert _merge(sub) == "(?P\\d)" def test_subexpression_with_back_reference(): sub = RegexBuilder().capture().digit().end().back_reference(1) assert _merge(sub) == "(\\d)\\1" def test_subexpression_with_named_back_reference(): sub = RegexBuilder().named_capture("token").digit().end().named_back_reference("token") assert _merge(sub) == "(?P\\d)(?P=token)" def test_subexpression_with_group(): sub = RegexBuilder().group().digit().end() assert _merge(sub) == "(?:\\d)" def test_subexpression_with_any_of(): sub = RegexBuilder().any_of().char("a").char("b").end() assert _merge(sub) == "[ab]" def test_subexpression_with_nested_subexpression(): inner = RegexBuilder().digit() middle = RegexBuilder().subexpression(inner) assert _merge(middle) == "\\d" def test_subexpression_with_assert_ahead(): sub = RegexBuilder().assert_ahead().digit().end() assert _merge(sub) == "(?=\\d)" def test_subexpression_with_assert_not_ahead(): sub = RegexBuilder().assert_not_ahead().digit().end() assert _merge(sub) == "(?!\\d)" def test_subexpression_with_assert_behind(): sub = RegexBuilder().assert_behind().digit().end() assert _merge(sub) == "(?<=\\d)" def test_subexpression_with_assert_not_behind(): sub = RegexBuilder().assert_not_behind().digit().end() assert _merge(sub) == "(?