use super::*;
use alloy::primitives::{Address, B256, U256};
fn lane(pool: u8, provider: u8) -> LaneKey {
LaneKey {
pool_id: B256::from([pool; 32]),
signer: Address::from([0x5a; 20]),
provider: Address::from([provider; 20]),
}
}
fn seed_at(amount: u64) -> Cumulative {
Cumulative {
bytes: U256::ZERO,
amount: U256::from(amount),
}
}
#[test]
fn concurrent_pulls_on_one_lane_share_a_ledger() {
let ledgers = BuyerLedgers::default();
let a = ledgers.get_or_seed(lane(9, 1), seed_at(7));
let b = ledgers.get_or_seed(lane(9, 1), seed_at(7));
assert!(
Arc::ptr_eq(&a, &b),
"both pulls must issue through the same ledger, or they sign the same watermark"
);
}
#[test]
fn a_stale_seed_cannot_rewind_a_live_ledger() {
let ledgers = BuyerLedgers::default();
let live = ledgers.get_or_seed(lane(9, 1), seed_at(7));
let rejoined = ledgers.get_or_seed(lane(9, 1), seed_at(7));
assert!(Arc::ptr_eq(&live, &rejoined));
assert_eq!(
rejoined.committed().amount,
U256::from(7u64),
"the live ledger's own watermark stands; the seed is ignored on a hit"
);
}
#[test]
fn a_rotated_pool_gets_a_fresh_ledger() {
let ledgers = BuyerLedgers::default();
let old = ledgers.get_or_seed(lane(9, 1), seed_at(7));
let new = ledgers.get_or_seed(lane(10, 1), seed_at(0));
assert!(!Arc::ptr_eq(&old, &new));
assert_eq!(
new.committed().amount,
U256::ZERO,
"seeded from the new row"
);
}
#[test]
fn forget_drops_only_the_named_lane() {
let ledgers = BuyerLedgers::default();
let first = ledgers.get_or_seed(lane(9, 1), seed_at(7));
let live = ledgers.get_or_seed(lane(10, 1), seed_at(0));
ledgers.forget(lane(9, 1));
let rejoined = ledgers.get_or_seed(lane(10, 1), seed_at(0));
assert!(Arc::ptr_eq(&live, &rejoined), "pool 10's ledger survives");
drop(first);
ledgers.forget(lane(10, 1));
let fresh = ledgers.get_or_seed(lane(10, 1), seed_at(3));
assert!(!Arc::ptr_eq(&live, &fresh), "its own retire does drop it");
}
#[test]
fn a_stale_pool_does_not_evict_the_live_ledger() {
let ledgers = BuyerLedgers::default();
let live = ledgers.get_or_seed(lane(10, 1), seed_at(5));
let _stale = ledgers.get_or_seed(lane(9, 1), seed_at(0));
let rejoined = ledgers.get_or_seed(lane(10, 1), seed_at(0));
assert!(
Arc::ptr_eq(&live, &rejoined),
"a stale pool must not evict the live lane's ledger"
);
assert_eq!(
rejoined.committed().amount,
U256::from(5u64),
"the live ledger's watermark stands; the seed is ignored on a hit"
);
}
#[test]
fn distinct_providers_get_distinct_ledgers() {
let ledgers = BuyerLedgers::default();
let a = ledgers.get_or_seed(lane(9, 1), seed_at(0));
let b = ledgers.get_or_seed(lane(9, 2), seed_at(0));
assert!(!Arc::ptr_eq(&a, &b));
}
#[test]
fn pool_committed_sums_every_providers_lane_in_the_pool() {
let ledgers = BuyerLedgers::default();
let pool_a = lane(1, 1); let pool_b = lane(1, 2); let other = lane(2, 1);
let _run1 = ledgers.get_or_seed(pool_a, seed_at(700));
let _run2 = ledgers.get_or_seed(pool_b, seed_at(0));
let _elsewhere = ledgers.get_or_seed(other, seed_at(999));
assert_eq!(
ledgers.pool_committed(pool_a.pool_id),
U256::from(700u64),
"run 2's gate must see run 1's 700 across the pool, not provider B's own 0",
);
assert_eq!(
ledgers.pool_committed(other.pool_id),
U256::from(999u64),
"a different pool's spend is isolated",
);
assert_eq!(
ledgers.pool_committed(B256::from([7u8; 32])),
U256::ZERO,
"a pool with no live lanes has spent nothing",
);
}