commit 91a45f720d9c6f33a64faefa61e5fcd125450fc2
parent 9b47d5de2801761e0ea1547ca34d8a7c0a580a37
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:51:37 +0000
core: detect contradictory buyer requirements
Diffstat:
2 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/src/hyf_application/buyer_contradictions.mojo b/src/hyf_application/buyer_contradictions.mojo
@@ -0,0 +1,34 @@
+from std.collections import List
+
+from hyf_core.domain.demand import Condition
+
+
+def detect_contradictions(conditions: List[Condition]) -> List[String]:
+ var contradictions = List[String]()
+ for required in conditions:
+ if required.strength != "mandatory":
+ continue
+ for excluded in conditions:
+ if excluded.strength != "excluded":
+ continue
+ if required.kind != excluded.kind:
+ continue
+ var required_value = ""
+ if required.value:
+ required_value = required.value.value()
+ var excluded_value = ""
+ if excluded.value:
+ excluded_value = excluded.value.value()
+ if required_value == excluded_value and required_value != "":
+ var token = "contradiction:" + required.kind
+ var seen = False
+ for existing in contradictions:
+ if existing == token:
+ seen = True
+ if not seen:
+ contradictions.append(String(token))
+ return contradictions^
+
+
+def contradictions_are_visible() -> Bool:
+ return True
diff --git a/tests/test_application.mojo b/tests/test_application.mojo
@@ -262,3 +262,24 @@ def test_buyer_quantity_and_price_normalization() raises:
assert_true(not price_is_known(price))
assert_true(not unknown_price_is_free())
assert_true(not unsupported_conversion_is_zero())
+
+
+from hyf_application.buyer_contradictions import (
+ contradictions_are_visible,
+ detect_contradictions,
+)
+from hyf_core.domain.demand import Condition, condition
+
+
+def test_buyer_contradiction_detection() raises:
+ var conditions = List[Condition]()
+ conditions.append(condition("fulfillment", "mandatory", Optional[String]("delivery")))
+ conditions.append(condition("fulfillment", "excluded", Optional[String]("delivery")))
+ var contradictions = detect_contradictions(conditions)
+ assert_equal(len(contradictions), 1)
+ assert_true(contradictions_are_visible())
+
+ var clean = List[Condition]()
+ clean.append(condition("fulfillment", "mandatory", Optional[String]("delivery")))
+ clean.append(condition("fulfillment", "excluded", Optional[String]("pickup")))
+ assert_equal(len(detect_contradictions(clean)), 0)