commit c3bc4fb27054eb6a7aaa7e75ab6285f47d44a6c5
parent 72042b42bdfe41c1170914d5bcdcf801c40a85f1
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 12:56:19 +0000
core: preserve approximation through normalization
Diffstat:
2 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/src/hyf_core/domain/units.mojo b/src/hyf_core/domain/units.mojo
@@ -71,3 +71,12 @@ def apply_conversion(quantity: Quantity, rule: ConversionRule) raises -> Quantit
result.unit = String(rule.to_unit)
result.dimension = String(unit_dimension(rule.to_unit))
return result^
+
+
+def normalize_quantity_with_rule(
+ quantity: Quantity, rule: ConversionRule
+) raises -> Quantity:
+ var result = apply_conversion(quantity, rule)
+ if result.qualifier != quantity.qualifier:
+ raise Error("normalization must preserve the approximation qualifier")
+ return result^
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -184,3 +184,16 @@ def test_pack_conversion_known_and_rejections() raises:
)
with assert_raises():
_ = pack_rule("tomato.roma", "box", "mystery", 5, 0, "pack-1")
+
+
+from hyf_core.domain.units import normalize_quantity_with_rule
+
+
+def test_normalization_preserves_approximation() raises:
+ var approximate = new_quantity(80, 0, "lb", "mass", "approximate")
+ var rule = conversion_rule("lb", "kg", 45359237, 100000000, "test-1")
+ var normalized = normalize_quantity_with_rule(approximate, rule)
+ assert_equal(normalized.qualifier, "approximate")
+ assert_equal(normalized.unit, "kg")
+ var exact = new_quantity(80, 0, "lb", "mass", "exact")
+ assert_equal(normalize_quantity_with_rule(exact, rule).qualifier, "exact")