#[cfg(test)]
mod tests {
use super::super::region_table::RegionTable;
use crate::record::region::RegionState;
use crate::types::{Budget, Time};
#[test]
fn demonstrate_close_idempotence_no_panic() {
let mut table = RegionTable::new();
let region_id = table.create_root(Budget::default(), Time::ZERO);
let region = table.get(region_id.arena_index()).unwrap();
assert_eq!(table.state(region_id), Some(RegionState::Open));
let _close_result_1 = region.begin_close(None);
assert_eq!(table.state(region_id), Some(RegionState::Closing));
let close_result_2 = region.begin_close(None);
assert!(
!close_result_2,
"Second close should return false - already closing"
);
let close_result_3 = region.begin_close(None);
assert!(
!close_result_3,
"Third close should return false - idempotent"
);
assert_eq!(table.state(region_id), Some(RegionState::Closing));
}
#[test]
fn demonstrate_full_close_sequence_idempotence() {
let mut table = RegionTable::new();
let region_id = table.create_root(Budget::default(), Time::ZERO);
let region = table.get(region_id.arena_index()).unwrap();
let perform_full_close = || {
let begin_result = region.begin_close(None);
let finalize_result = region.begin_finalize();
let complete_result = region.complete_close();
(begin_result, finalize_result, complete_result)
};
let (_begin1, _fin1, _comp1) = perform_full_close();
let _state_after_first = table.state(region_id);
let (begin2, _fin2, comp2) = perform_full_close();
assert!(!begin2, "Second begin_close should return false");
assert!(
!comp2,
"Second complete_close should return false (region may not be ready)"
);
let _state_after_second = table.state(region_id);
let (begin3, _fin3, _comp3) = perform_full_close();
assert!(!begin3, "Third begin_close should return false");
}
#[test]
fn demonstrate_close_idempotence_on_removed_region() {
let mut table = RegionTable::new();
let region_id = table.create_root(Budget::default(), Time::ZERO);
let removed_region = table.remove(region_id.arena_index()).unwrap();
assert_eq!(removed_region.id, region_id);
let _close1 = removed_region.begin_close(None);
let _close2 = removed_region.begin_close(None);
let _close3 = removed_region.begin_close(None);
let _ = removed_region.begin_finalize();
let _ = removed_region.complete_close();
}
}