43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
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"]
|