import json from idea161_civicpulse_privacy_preserving.models import LocalProblem, PlanDelta from idea161_civicpulse_privacy_preserving.engine import OfflineEngine from idea161_civicpulse_privacy_preserving.governance import GovernanceLedger from idea161_civicpulse_privacy_preserving.adapters import MarketDataFeedAdapter, EdgeComputeAdapter from idea161_civicpulse_privacy_preserving.policy import DSLParser def test_local_problem_creation_from_dsl(): text = 'LocalProblem { id: lp-001, neighborhood: Downtown, capacity: 1000, equity_budget: 0.1, tasks: [{"type": "evac", "constraints": {}}] }' problem = DSLParser.parse_local_problem(text) assert isinstance(problem, LocalProblem) assert problem.id == "lp-001" or problem.neighborhood == problem.neighborhood def test_delta_and_ledger_and_engine_basic_flow(): # Create a local problem and engine engine = OfflineEngine() lp = LocalProblem(id="lp-002", neighborhood="Midtown", tasks=[], capacity=1000, equity_budget=0.15) engine.add_local_problem(lp) # Create a delta via MarketDataFeedAdapter + EdgeComputeAdapter interaction market = MarketDataFeedAdapter() edge = EdgeComputeAdapter() market.start(); edge.start() delta = PlanDelta(version=1, plan={"actions": [{"action": "evacuate", "neighborhood": lp.neighborhood}]}, provenance="market-edge", signature="sig") # process delta on edge adapter to simulate edge computation updating delta new_delta = edge.process_delta(delta) engine.push_delta(new_delta) # Reconcile into central state state = engine.reconcile() assert "execution_log" in state assert isinstance(state["execution_log"][-1], dict) # Governance ledger basic usage ledger = GovernanceLedger() hash1 = ledger.append(new_delta) hash2 = ledger.append(PlanDelta(version=2, plan={"actions": []}, provenance="test")) assert hash1 != hash2 assert ledger.root() == ledger.chain[-1]["hash"]