from crossvenue_arbx.bridge import EnergiBridge from crossvenue_arbx.core import LocalArbProblem, SharedSignals, PlanDelta def test_to_catopt_basic_structure(): problem = LocalArbProblem( id="venue1-p1", venue="Venue1", assets=["AAPL", "MSFT"], target_misprice=0.001, max_exposure=100000.0, latency_budget=0.1, ) signals = SharedSignals( version=1, price_delta_by_asset={"AAPL": 0.001, "MSFT": -0.0007}, cross_corr={("AAPL", "MSFT"): 0.8}, liquidity_estimates={"AAPL": 1.0, "MSFT": 1.2}, ) bridge = EnergiBridge() catopt = bridge.to_catopt(problem, signals) # Basic structure checks assert isinstance(catopt, dict) assert "version" in catopt assert catopt["version"] >= 1 assert "objects" in catopt objs = catopt["objects"] assert "LocalArbProblem" in objs assert objs["LocalArbProblem"]["venue"] == "Venue1" assert "SharedSignals" in objs assert objs["SharedSignals"]["version"] == 1 def test_to_catopt_with_plan_delta_round_trip(): problem = LocalArbProblem( id="venue1-p1", venue="Venue1", assets=["AAPL"], target_misprice=0.001, max_exposure=100000.0, latency_budget=0.1, ) signals = SharedSignals(version=2, price_delta_by_asset={"AAPL": 0.001}) plan = PlanDelta( delta_actions=[{"from_venue": "Venue1", "to_venue": "Venue2", "asset": "AAPL", "size": 1.0, "time": 2.0}], timestamp=2.0, contract_id=problem.fingerprint(), ) catopt = EnergiBridge.to_catopt(problem, signals, plan) decoded = EnergiBridge.from_catopt(catopt) assert decoded["plan_delta_ref"]["contract_id"] == problem.fingerprint()