import time import os import sys BASE = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) if BASE not in sys.path: sys.path.insert(0, BASE) from crossvenue_arbx.core import LocalArbProblem, SharedSignals, PlanDelta, AuditLog, PrivacyBudget from crossvenue_arbx.governance import GraphOfContracts def test_local_arb_problem_serialization(): p = LocalArbProblem( id="v1-p1", venue="VenueA", assets=["AAPL", "MSFT"], target_misprice=0.001, max_exposure=1000.0, latency_budget=0.1, ) d = p.to_dict() assert d["id"] == "v1-p1" assert d["venue"] == "VenueA" assert d["assets"] == ["AAPL", "MSFT"] def test_shared_signals_merge_basic(): s1 = SharedSignals(version=1, price_delta_by_asset={"AAPL": 0.001, "MSFT": -0.0003}) s2 = SharedSignals(version=2, price_delta_by_asset={"AAPL": 0.0008, "MSFT": -0.0005}) merged = s1.merge(s2) assert merged.version >= 2 assert "AAPL" in merged.price_delta_by_asset assert "MSFT" in merged.price_delta_by_asset def test_plan_delta_signature_is_stable(): plan = PlanDelta( delta_actions=[{"from_venue": "VenueA", "to_venue": "VenueB", "asset": "AAPL", "size": 1.0, "time": 1.0}], timestamp=1.0, contract_id="contract-x", ) assert plan.signature assert plan.signature == plan.fingerprint() def test_audit_log_hash_chain_and_privacy_budget(): log = AuditLog() log.log("first") log.log("second") assert log.root_hash() budget = PrivacyBudget(leakage_budget=1.0) assert budget.can_consume(0.25) budget.consume(0.25) assert budget.remaining() == 0.75 def test_governance_registry_tracks_metadata(): registry = GraphOfContracts() registry.register("contract-x", "1.2.3", "schema-abc") assert registry.get_version("contract-x") == "1.2.3" assert registry.get_record("contract-x")["schema_hash"] == "schema-abc"