32 lines
1.2 KiB
Python
32 lines
1.2 KiB
Python
from deltax_forge_cross.core.delta_sync import DeltaCRDT, DeltaAction, deterministic_merge, merge_snapshots
|
|
|
|
|
|
def test_gen_and_snapshot_merge():
|
|
a = DeltaCRDT("VENUE_A")
|
|
b = DeltaCRDT("VENUE_B")
|
|
|
|
act_a = a.gen_action(asset="AAPL", delta=5.0)
|
|
act_b = b.gen_action(asset="AAPL", delta=3.0)
|
|
|
|
# Local snapshots
|
|
snap_a = a.snapshot()
|
|
snap_b = b.snapshot()
|
|
|
|
merged = merge_snapshots([snap_a, snap_b])
|
|
assert "AAPL" in merged
|
|
# Conservative policy selects smaller absolute delta (3.0)
|
|
assert merged["AAPL"].delta == 3.0
|
|
# Merged version should include both counters
|
|
assert "VENUE_A" in merged["AAPL"].version and "VENUE_B" in merged["AAPL"].version
|
|
|
|
|
|
def test_deterministic_merge_tie_break():
|
|
# Two equal magnitude deltas: tie breaks by venue id lexicographically
|
|
a1 = DeltaAction(venue="B", asset="MSFT", delta=2.0, version={"B": 1})
|
|
a2 = DeltaAction(venue="A", asset="MSFT", delta=2.0, version={"A": 1})
|
|
merged = deterministic_merge([a1, a2])
|
|
assert merged is not None
|
|
# tie-break picks venue 'A' because ('abs', 'venue') sorts to ('2.0','A') first
|
|
assert merged.venue == "A"
|
|
assert merged.delta == 2.0
|