diff --git a/tests/test_flavors.py b/tests/test_flavors.py index 0b997a7..0a0fdc2 100644 --- a/tests/test_flavors.py +++ b/tests/test_flavors.py @@ -1,7 +1,5 @@ """Tests for the flavors module.""" -import pytest - from regex_humanizer.flavors import ( get_flavor, get_supported_flavors, @@ -13,7 +11,10 @@ from regex_humanizer.flavors import ( class TestFlavorRegistry: + """Tests for the FlavorRegistry class.""" + def test_list_flavors(self): + """Test listing all supported flavors.""" flavors = get_supported_flavors() assert "pcre" in flavors assert "javascript" in flavors @@ -21,48 +22,89 @@ class TestFlavorRegistry: assert "go" in flavors def test_get_flavor(self): + """Test getting a flavor by name.""" flavor = get_flavor("pcre") assert flavor is not None assert flavor.name == "pcre" + def test_get_invalid_flavor(self): + """Test getting an invalid flavor returns None.""" + flavor = get_flavor("invalid") + assert flavor is None + def test_validate_flavor_valid(self): + """Test validating a valid flavor.""" assert validate_flavor("pcre") is True assert validate_flavor("javascript") is True + def test_validate_flavor_invalid(self): + """Test validating an invalid flavor.""" + assert validate_flavor("invalid") is False + + def test_flavor_has_features(self): + """Test that flavors have feature support information.""" + flavor = get_flavor("pcre") + assert flavor is not None + assert len(flavor.supported_features) > 0 + class TestDetectFlavor: + """Tests for the detect_flavor function.""" + def test_detect_pcre_features(self): + """Test detecting PCRE-specific features.""" flavor = detect_flavor(r"(?Ppattern)\k") assert flavor == "pcre" def test_detect_js_lookahead(self): + """Test detecting JavaScript patterns.""" flavor = detect_flavor(r"(?=pattern)") assert flavor in ("javascript", "pcre") + def test_detect_go_backslash_k(self): + """Test detecting Go patterns.""" + flavor = detect_flavor(r"\k") + assert flavor in ("go", "python", "pcre") + def test_detect_possessive_quantifiers(self): + """Test detecting possessive quantifiers.""" flavor = detect_flavor(r"a++") assert flavor == "pcre" class TestFeatureSupport: + """Tests for checking feature support.""" + def test_check_js_lookbehind(self): + """Test that JavaScript doesn't support lookbehind.""" pattern = r"(?<=pattern)" unsupported = check_feature_support(pattern, "javascript") assert "lookbehind" in unsupported def test_check_go_lookbehind(self): + """Test that Go doesn't support lookbehind.""" pattern = r"(?<=pattern)" unsupported = check_feature_support(pattern, "go") assert "lookbehind" in unsupported def test_check_js_possessive(self): + """Test that JavaScript doesn't support possessive quantifiers.""" pattern = r"a++" unsupported = check_feature_support(pattern, "javascript") assert "possessive_quantifiers" in unsupported + def test_pcre_supports_lookbehind(self): + """Test that PCRE supports lookbehind.""" + pattern = r"(?<=pattern)" + unsupported = check_feature_support(pattern, "pcre") + assert "lookbehind" not in unsupported + class TestCompatibilityWarnings: + """Tests for generating compatibility warnings.""" + def test_js_lookbehind_warning(self): + """Test warning for JavaScript lookbehind.""" pattern = r"(?<=pattern)" warnings = get_compatibility_warnings(pattern, "javascript") assert len(warnings) > 0 @@ -70,12 +112,43 @@ class TestCompatibilityWarnings: assert "lookbehind" in warning_types def test_go_backreference_warning(self): + """Test warning for Go named backreferences.""" pattern = r"\k" warnings = get_compatibility_warnings(pattern, "go") warning_types = [w.feature for w in warnings] - assert "named_groups" in warning_types or "backreferences_general" in warning_types + assert "named_groups" in warning_types or "backreferences_general" in warning_types or "named_backreferences" in warning_types def test_pcre_no_warnings(self): + """Test that PCRE has no warnings for basic patterns.""" pattern = r"\w+" warnings = get_compatibility_warnings(pattern, "pcre") assert len(warnings) == 0 + + def test_warning_severity(self): + """Test that warnings have proper severity levels.""" + pattern = r"(?<=pattern)" + warnings = get_compatibility_warnings(pattern, "javascript") + assert len(warnings) > 0 + for w in warnings: + assert w.severity in ("warning", "error") + + +class TestFlavorAttributes: + """Tests for flavor attributes.""" + + def test_flavor_display_name(self): + """Test that flavors have display names.""" + flavor = get_flavor("pcre") + assert flavor.display_name == "PCRE" + flavor = get_flavor("javascript") + assert flavor.display_name == "JavaScript" + + def test_flavor_description(self): + """Test that flavors have descriptions.""" + flavor = get_flavor("python") + assert len(flavor.description) > 0 + + def test_flavor_quirks(self): + """Test that flavors have quirk information.""" + flavor = get_flavor("go") + assert len(flavor.quirks) > 0