use crate::domain::chip::{ChipCapabilities, ChipLayout, ChipSpec};
use crate::domain::types::{Capacity, FlashType, JedecId};
use crate::infrastructure::flash_protocol::nand::SpiNand;
use crate::infrastructure::programmer::mock::MockProgrammer;
use crate::infrastructure::programmer::Programmer;
fn create_test_nand_spec() -> ChipSpec {
ChipSpec {
name: "W25N01GV".to_string(),
manufacturer: "Winbond".to_string(),
jedec_id: JedecId::new([0xEF, 0xAA, 0x21]),
flash_type: FlashType::Nand,
capacity: Capacity::megabytes(128),
layout: ChipLayout {
page_size: 2048,
block_size: 128 * 1024, oob_size: Some(64),
is_dataflash: false,
},
capabilities: ChipCapabilities {
supports_ecc_control: true,
..Default::default()
},
otp: None,
}
}
#[test]
fn test_nand_spec_access() {
let mock = MockProgrammer::new();
let spec = create_test_nand_spec();
let nand = SpiNand::new(mock, spec);
assert_eq!(nand.spec().name, "W25N01GV");
assert_eq!(nand.spec().flash_type, FlashType::Nand);
assert_eq!(nand.spec().capacity.as_megabytes(), 128);
assert_eq!(nand.spec().layout.page_size, 2048);
assert_eq!(nand.spec().layout.oob_size, Some(64));
}
#[test]
fn test_nand_layout_calculations() {
let spec = create_test_nand_spec();
let pages_per_block = spec.layout.pages_per_block();
assert_eq!(pages_per_block, 64);
let total_pages = spec.layout.total_pages(spec.capacity);
assert_eq!(total_pages, 65536); }
#[test]
fn test_mock_programmer_spi_read_bulk() {
let mut mock = MockProgrammer::new();
let test_data = vec![0xAA; 4096];
mock.expect_read(test_data.clone());
let result = mock.spi_read_bulk(4096).unwrap();
assert_eq!(result.len(), 4096);
assert!(result.iter().all(|&b| b == 0xAA));
}
#[test]
fn test_mock_programmer_max_bulk_size() {
let mock = MockProgrammer::new();
assert_eq!(mock.max_bulk_transfer_size(), 4096);
}