from arbsphere.primitives import LocalArbProblem, SharedSignals, DualVariables, AuditLog, AuditLogEntry, PrivacyBudget from arbsphere.ir import map_to_full_ir def test_full_ir_mapping_includes_optional_components(): lp = LocalArbProblem(asset_pair=("AAPL", "USD"), target_mispricing=0.5, liquidity_budget=100000.0, latency_budget=0.2) shared = SharedSignals( deltas=[0.1, -0.05], cross_venue_corr=0.8, liquidity_availability={"venue-1": 100000.0, "venue-2": 90000.0}, latency_proxy=0.6, ) dual = DualVariables(shadow_prices={"AAPL/USD": 1.0}) privacy = PrivacyBudget(budgets={"signals": 0.5}) audit = AuditLog(entries=[AuditLogEntry(ts=1.0, event="dept", details={"ok": True}, signature="sig")]) ir = map_to_full_ir(lp, shared=shared, dual=dual, privacy=privacy, audit=audit) # Basic structure checks assert ir.get("type") == "LocalArbProblem" or ir.get("asset_pair") is not None assert "asset_pair" in ir and ir["asset_pair"] == ["AAPL", "USD"] assert "shared_signals" in ir assert ir["shared_signals"]["cross_venue_corr"] == 0.8 assert "dual_variables" in ir assert ir["dual_variables"]["shadow_prices"]["AAPL/USD"] == 1.0 assert "privacy_budget" in ir assert ir["privacy_budget"]["budgets"]["signals"] == 0.5 assert "audit_log" in ir assert isinstance(ir["audit_log"]["entries"], list)