use std::sync::Arc;
use tensor_wasm_core::types::TenantId;
use tensor_wasm_tenant::{TenantContext, TenantRegistry};
fn make_ctx(id: u64) -> TenantContext {
TenantContext::builder(TenantId(id))
.with_memory_quota_bytes(4096)
.build()
}
#[test]
fn new_returns_a_cap_alongside_the_registry() {
let (reg, cap) = TenantRegistry::new();
assert!(reg.is_empty());
reg.register(make_ctx(1)).unwrap();
assert_eq!(reg.len(&cap), 1);
let found = reg.get(TenantId(1), &cap).expect("just registered");
assert_eq!(found.id(), TenantId(1));
let snapshot = reg.tenants(&cap);
assert_eq!(snapshot.len(), 1);
let removed = reg.unregister(TenantId(1), &cap).unwrap();
assert_eq!(removed.id(), TenantId(1));
}
#[test]
fn independent_constructions_yield_independent_caps() {
let (reg_a, cap_a) = TenantRegistry::new();
let (reg_b, cap_b) = TenantRegistry::new();
assert!(reg_a.is_empty());
assert!(reg_b.is_empty());
reg_a.register(make_ctx(100)).unwrap();
reg_b.register(make_ctx(200)).unwrap();
assert_eq!(reg_a.len(&cap_a), 1);
assert_eq!(reg_b.len(&cap_b), 1);
assert!(reg_a.get(TenantId(200), &cap_a).is_none());
assert!(reg_b.get(TenantId(100), &cap_b).is_none());
assert_eq!(
reg_b.len(&cap_a),
0,
"foreign cap must not unlock registry B's len (H1 binding)"
);
assert!(
reg_b.tenants(&cap_a).is_empty(),
"foreign cap must not enumerate registry B's tenants (H1 binding)"
);
let _ = cap_a;
let snap = reg_b.tenants(&cap_b);
assert_eq!(snap.len(), 1);
assert_eq!(snap[0].id(), TenantId(200));
}
#[test]
fn arc_registry_without_cap_cannot_enumerate_or_evict() {
let (reg, cap) = TenantRegistry::new();
let arc_for_subsystem: Arc<TenantRegistry> = Arc::new(reg.clone());
let _registered = reg.register(make_ctx(7)).unwrap();
let _ = arc_for_subsystem.register(make_ctx(8));
assert!(!arc_for_subsystem.is_empty());
assert_eq!(reg.len(&cap), 2);
assert!(reg.get(TenantId(7), &cap).is_some());
assert!(reg.get(TenantId(8), &cap).is_some());
}