//! Respaldo de `COMPARISON.md` (T9c): el detector de T8 y el certificador de //! escrow de T9 sobre los mismos escenarios. Los veredictos de la tabla del `.md` //! son exactamente los que asertan estos tests — nada escrito a mano. //! //! Cuenta común: saldo inicial 100, invariante `saldo ≥ 0` (slack 100). use sheafsync::escrow::{Budget, SpendResult}; use sheafsync::invariant::AccountConfig; use sheafsync::oracle::OracleVerdict; /// Veredicto del DETECTOR de T8 (funde estados y comprueba el merge). fn detector(withdrawals: Vec, edges: Vec<(usize, usize)>) -> OracleVerdict { AccountConfig::new("cmp", 100, withdrawals, edges).haz_coordination() } /// ¿El ESCROW de T9 permite todos los gastos localmente (sin coordinar) con el /// reparto dado? `true` = seguro sin coordinación; `false` = alguien pide rebalanceo. fn escrow_todo_local(withdrawals: &[u64], split: Vec) -> bool { let mut budget = Budget::new(split); withdrawals .iter() .enumerate() .all(|(i, &w)| matches!(budget.try_spend(i, w as i64), SpendResult::Local)) } #[test] fn escenarios_de_comparison_md() { // 1) Conectado, retiros que caben (10/10). assert_eq!(detector(vec![10, 10], vec![(0, 1)]), OracleVerdict::CoordinationFree); assert!(escrow_todo_local(&[10, 10], vec![50, 50])); // 2) Conectado, sobregiro (60/60): ambos detectan el problema. assert_eq!(detector(vec![60, 60], vec![(0, 1)]), OracleVerdict::NeedsCoordination); assert!(!escrow_todo_local(&[60, 60], vec![50, 50])); // 3) PARTICIONADO, sobregiro (60/60): el detector da FALSO-VERDE... assert_eq!(detector(vec![60, 60], vec![]), OracleVerdict::CoordinationFree); // ...pero el escrow lo bloquea correctamente (60 > presupuesto de 50). assert!(!escrow_todo_local(&[60, 60], vec![50, 50])); // 4) Particionado, retiros que caben (10/10): ambos ok. assert_eq!(detector(vec![10, 10], vec![]), OracleVerdict::CoordinationFree); assert!(escrow_todo_local(&[10, 10], vec![50, 50])); // 5) Reparto malo [100,0] (R-T9a): retiro 10 en la réplica seca pide // rebalanceo aunque el slack global sobre — es rendimiento, no corrección. assert!(!escrow_todo_local(&[0, 10], vec![100, 0])); // Con un reparto equilibrado [50,50] el mismo gasto es local. assert!(escrow_todo_local(&[0, 10], vec![50, 50])); }