diff --git a/mercurymesh_federated_reproducible_marke/adapters.py b/mercurymesh_federated_reproducible_marke/adapters.py index 73b7134..6ba333b 100644 --- a/mercurymesh_federated_reproducible_marke/adapters.py +++ b/mercurymesh_federated_reproducible_marke/adapters.py @@ -63,3 +63,6 @@ def phase0_demo(adapter_a: ExchangeDataFeedAdapter, adapter_b: ExchangeDataFeedA delta = FederatedCoordinator.aggregate_signals(signals) return delta + +# Public API surface for MVP wiring exploration +__all__ = ["ExchangeDataFeedAdapter", "VenueBrokerAdapter", "phase0_demo"] diff --git a/mercurymesh_federated_reproducible_marke/tests/test_adapters_phase0.py b/mercurymesh_federated_reproducible_marke/tests/test_adapters_phase0.py new file mode 100644 index 0000000..5305ce0 --- /dev/null +++ b/mercurymesh_federated_reproducible_marke/tests/test_adapters_phase0.py @@ -0,0 +1,20 @@ +import pytest + +from mercurymesh_federated_reproducible_marke.adapters import ExchangeDataFeedAdapter, phase0_demo +from mercurymesh_federated_reproducible_marke.core import PlanDelta + + +def test_phase0_demo_end_to_end_basic_signals_aggregation(): + a = ExchangeDataFeedAdapter("exchangeA") + b = ExchangeDataFeedAdapter("exchangeB") + + # Monkeypatch fetch_signals to return deterministic signals for test + a.fetch_signals = lambda: [{"A": 1.0}] + b.fetch_signals = lambda: [{"A": -0.5}, {"B": 2.0}] + + delta = phase0_demo(a, b) + + assert isinstance(delta, PlanDelta) + # Expect averaged delta across three signals: A: (1.0-0.5)/3, B: 2.0/3 + assert pytest.approx(delta.delta.get("A", 0.0), rel=1e-9) == pytest.approx(0.5/3, rel=1e-9) + assert pytest.approx(delta.delta.get("B", 0.0), rel=1e-9) == pytest.approx(2.0/3, rel=1e-9)