pub fn banked_data(bank_size: usize, num_banks: usize) -> Vec<u8> {
let mut data = vec![0u8; bank_size * num_banks];
for bank in 0..num_banks {
let start = bank * bank_size;
let end = start + bank_size;
data[start..end].fill(bank as u8);
}
data
}
pub fn banked_data_with_upper_marker(bank_size: usize, num_banks: usize) -> Vec<u8> {
let mut data = vec![0u8; bank_size * num_banks];
for bank in 0..num_banks {
let start = bank * bank_size;
let end = start + bank_size;
data[start..end].fill((bank >> 8) as u8);
}
data
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_banked_data_creates_distinct_banks() {
let rom = banked_data(1024, 4);
assert_eq!(rom.len(), 4096);
assert_eq!(rom[0], 0);
assert_eq!(rom[1023], 0);
assert_eq!(rom[1024], 1);
assert_eq!(rom[2047], 1);
assert_eq!(rom[2048], 2);
assert_eq!(rom[3071], 2);
assert_eq!(rom[3072], 3);
assert_eq!(rom[4095], 3);
}
#[test]
fn test_banked_data_single_bank() {
let rom = banked_data(100, 1);
assert_eq!(rom.len(), 100);
assert!(rom.iter().all(|&b| b == 0));
}
#[test]
fn test_banked_data_empty() {
let rom = banked_data(100, 0);
assert_eq!(rom.len(), 0);
}
#[test]
fn test_banked_data_with_upper_marker_basic() {
let rom = banked_data_with_upper_marker(1024, 4);
assert_eq!(rom.len(), 4096);
assert!(rom.iter().all(|&b| b == 0));
}
#[test]
fn test_banked_data_with_upper_marker_large_banks() {
let rom = banked_data_with_upper_marker(1024, 512);
assert_eq!(rom.len(), 512 * 1024);
assert_eq!(rom[0], 0);
assert_eq!(rom[255 * 1024], 0);
assert_eq!(rom[256 * 1024], 1);
assert_eq!(rom[511 * 1024], 1);
}
#[test]
fn test_banked_data_with_upper_marker_boundary() {
let rom = banked_data_with_upper_marker(10, 260);
assert_eq!(rom[255 * 10], 0);
assert_eq!(rom[256 * 10], 1);
assert_eq!(rom[259 * 10], 1);
}
}