use super::prelude::*;
#[test]
fn apply_region_data_sector_fully_inside() {
let mut sectors = HashMap::new();
sectors.insert(0x1000, vec![0xAAu8; 4096]);
let overlay = ReplayOverlay::from_raw(sectors, vec![]);
let mut region = vec![0xFFu8; 0x3000]; overlay.apply_to_region(&mut region, 0);
assert!(region[0x1000..0x2000].iter().all(|&b| b == 0xAA));
assert!(region[0..0x1000].iter().all(|&b| b == 0xFF));
assert!(region[0x2000..0x3000].iter().all(|&b| b == 0xFF));
}
#[test]
fn apply_region_data_sector_partial_overlap() {
let mut sectors = HashMap::new();
sectors.insert(0x0000, vec![0xBBu8; 4096]); let overlay = ReplayOverlay::from_raw(sectors, vec![]);
let mut region = vec![0xFFu8; 0x800]; overlay.apply_to_region(&mut region, 0x800);
assert!(region.iter().all(|&b| b == 0xBB));
}
#[test]
fn apply_region_data_sector_outside() {
let mut sectors = HashMap::new();
sectors.insert(0x5000, vec![0xCCu8; 4096]);
let overlay = ReplayOverlay::from_raw(sectors, vec![]);
let mut region = vec![0xFFu8; 0x1000]; overlay.apply_to_region(&mut region, 0);
assert!(region.iter().all(|&b| b == 0xFF));
}
#[test]
fn apply_region_zero_fills_zeros() {
let overlay = ReplayOverlay::from_raw(HashMap::new(), vec![(0x2000, 0x1000)]);
let mut region = vec![0xFFu8; 0x5000]; overlay.apply_to_region(&mut region, 0);
assert!(region[0x2000..0x3000].iter().all(|&b| b == 0));
assert!(region[0..0x2000].iter().all(|&b| b == 0xFF));
assert!(region[0x3000..0x5000].iter().all(|&b| b == 0xFF));
}
#[test]
fn apply_region_data_priority_over_zero() {
let mut sectors = HashMap::new();
sectors.insert(0x1000, vec![0xDDu8; 4096]);
let overlay = ReplayOverlay::from_raw(sectors, vec![(0x1000, 0x1000)]);
let mut region = vec![0xFFu8; 0x3000]; overlay.apply_to_region(&mut region, 0);
assert!(region[0x1000..0x2000].iter().all(|&b| b == 0xDD));
assert_eq!(region[0x2000], 0xFF);
}
#[test]
fn apply_region_multiple_overlapping_entries() {
let mut sectors = HashMap::new();
sectors.insert(0x1000, vec![0x11u8; 4096]);
sectors.insert(0x3000, vec![0x22u8; 4096]);
let overlay = ReplayOverlay::from_raw(
sectors,
vec![(0x2000, 0x2000)], );
let mut region = vec![0xFFu8; 0x5000]; overlay.apply_to_region(&mut region, 0);
assert!(region[0x1000..0x2000].iter().all(|&b| b == 0x11));
assert!(region[0x2000..0x3000].iter().all(|&b| b == 0));
assert!(region[0x3000..0x4000].iter().all(|&b| b == 0x22));
assert!(region[0x4000..0x5000].iter().all(|&b| b == 0xFF));
}
#[test]
fn apply_region_empty_overlay() {
let overlay = ReplayOverlay::from_raw(HashMap::new(), vec![]);
let mut region = vec![0xFFu8; 0x1000];
overlay.apply_to_region(&mut region, 0);
assert!(region.iter().all(|&b| b == 0xFF));
}
#[test]
fn apply_region_single_byte_overlap() {
let mut sectors = HashMap::new();
sectors.insert(0x1000, vec![0xEEu8; 4096]);
let overlay = ReplayOverlay::from_raw(sectors, vec![]);
let mut region = vec![0xFFu8; 2]; overlay.apply_to_region(&mut region, 0xFFF);
assert_eq!(region[0], 0xFF);
assert_eq!(region[1], 0xEE);
}
#[test]
fn apply_region_offset_at_sector_boundary() {
let mut sectors = HashMap::new();
sectors.insert(0x1000, vec![0x77u8; 4096]);
let overlay = ReplayOverlay::from_raw(sectors, vec![]);
let mut region = vec![0xFFu8; 0x1000]; overlay.apply_to_region(&mut region, 0x1000);
assert!(region.iter().all(|&b| b == 0x77));
}