Introducing columns formulas

This commit is contained in:
2026-02-13 21:38:00 +01:00
parent 0df78c0513
commit e8443f07f9
29 changed files with 3889 additions and 15 deletions

View File

@@ -243,7 +243,7 @@ class TestConflictResolution:
css, formatted = engine.apply_format(rules, cell_value=150, row_data=row_data)
assert isinstance(css, StyleContainer)
assert "var(--color-secondary)" in css.css # Style from Rule 2
assert css.cls == "mf-formatting-secondary" # Style from Rule 2
assert formatted == "150.00 €" # Formatter from Rule 1
# Case 2: Condition not met (value <= budget)
@@ -282,7 +282,7 @@ class TestConflictResolution:
css, formatted = engine.apply_format(rules, cell_value=-5.67)
assert "var(--color-error)" in css.css # Rule 3 wins for style
assert css.cls == "mf-formatting-error" # Rule 3 wins for style
assert formatted == "-6 €" # Rule 4 wins for formatter (precision=0)
@@ -316,7 +316,7 @@ class TestWithRowData:
css, _ = engine.apply_format(rules, cell_value=42, row_data=row_data)
assert isinstance(css, StyleContainer)
assert "background-color" in css.css
assert css.cls == "mf-formatting-error"
class TestPresets:
@@ -327,7 +327,7 @@ class TestPresets:
css, _ = engine.apply_format(rules, cell_value=42)
assert "var(--color-success)" in css.css
assert css.cls == "mf-formatting-success"
def test_formatter_preset(self):
"""Formatter preset is resolved correctly."""

View File

@@ -16,9 +16,14 @@ class TestResolve:
assert result["font-weight"] == "bold"
def test_resolve_preset_with_override(self):
"""Preset properties can be overridden by explicit values."""
resolver = StyleResolver()
# "success" preset has background and color defined
"""Preset CSS properties can be overridden by explicit values."""
custom_presets = {
"success": {
"background-color": "var(--color-success)",
"color": "var(--color-success-content)",
}
}
resolver = StyleResolver(style_presets=custom_presets)
style = Style(preset="success", color="black")
result = resolver.resolve(style)
@@ -66,6 +71,16 @@ class TestResolve:
assert result == {}
def test_i_can_resolve_class_only_preset(self):
"""Default preset with __class__ only is included as-is in resolve result."""
resolver = StyleResolver()
style = Style(preset="success")
result = resolver.resolve(style)
assert result["__class__"] == "mf-formatting-success"
assert "background-color" not in result
assert "color" not in result
def test_resolve_converts_property_names(self):
"""Python attribute names are converted to CSS property names."""
resolver = StyleResolver()
@@ -151,11 +166,11 @@ class TestToStyleContainer:
None,
["background-color: red", "color: white"]
),
# Class only via preset
# Class only via preset (default presets use __class__, no inline CSS)
(
Style(preset="success"),
None, # Default presets don't have __class__
["background-color: var(--color-success)", "color: var(--color-success-content)"]
"mf-formatting-success",
[]
),
# Empty style
(
@@ -246,3 +261,12 @@ class TestToStyleContainer:
assert isinstance(result, StyleContainer)
assert result.cls is None
assert result.css == ""
def test_i_can_resolve_default_preset_to_container(self):
"""Default preset with __class__ only generates cls but no css."""
resolver = StyleResolver()
style = Style(preset="error")
result = resolver.to_style_container(style)
assert result.cls == "mf-formatting-error"
assert result.css == ""