use synth_backend::{LinkerScriptGenerator, MemoryRegion};
#[test]
fn test_stm32f4_linker_script() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains("FLASH (rx): ORIGIN = 0x08000000, LENGTH = 0x80000"));
assert!(script.contains("RAM (rwx): ORIGIN = 0x20000000, LENGTH = 0x20000"));
assert!(script.contains("ENTRY(Reset_Handler)"));
assert!(script.contains(".isr_vector"));
assert!(script.contains(".text"));
assert!(script.contains(".rodata"));
assert!(script.contains(".data"));
assert!(script.contains(".bss"));
assert!(script.contains("_sdata"));
assert!(script.contains("_edata"));
assert!(script.contains("_sbss"));
assert!(script.contains("_ebss"));
assert!(script.contains("_estack"));
println!("Generated STM32F4 linker script:");
println!("{}", script);
}
#[test]
fn test_stm32f1_linker_script() {
let mut generator = LinkerScriptGenerator::new();
generator.add_region(MemoryRegion {
name: "FLASH".to_string(),
origin: 0x08000000,
length: 64 * 1024,
attributes: "rx".to_string(),
});
generator.add_region(MemoryRegion {
name: "RAM".to_string(),
origin: 0x20000000,
length: 20 * 1024,
attributes: "rwx".to_string(),
});
let script = generator
.with_entry_point("Reset_Handler".to_string())
.with_stack_size(2048)
.with_heap_size(0)
.generate()
.expect("Failed to generate");
assert!(script.contains("LENGTH = 0x10000")); assert!(script.contains("LENGTH = 0x5000")); assert!(script.contains("_stack_size = 0x800")); }
#[test]
fn test_rp2040_linker_script() {
let mut generator = LinkerScriptGenerator::new();
generator.add_region(MemoryRegion {
name: "FLASH".to_string(),
origin: 0x10000000, length: 2 * 1024 * 1024,
attributes: "rx".to_string(),
});
generator.add_region(MemoryRegion {
name: "RAM".to_string(),
origin: 0x20000000,
length: 264 * 1024,
attributes: "rwx".to_string(),
});
let script = generator
.with_entry_point("_entry".to_string())
.with_stack_size(8192)
.with_heap_size(32768)
.generate()
.expect("Failed to generate");
assert!(script.contains("0x10000000")); assert!(script.contains("ENTRY(_entry)"));
assert!(script.contains("_heap_size = 0x8000")); }
#[test]
fn test_nordic_nrf52_linker_script() {
let mut generator = LinkerScriptGenerator::new();
generator.add_region(MemoryRegion {
name: "FLASH".to_string(),
origin: 0x00000000, length: 512 * 1024,
attributes: "rx".to_string(),
});
generator.add_region(MemoryRegion {
name: "RAM".to_string(),
origin: 0x20000000,
length: 64 * 1024,
attributes: "rwx".to_string(),
});
let script = generator.generate().expect("Failed to generate");
assert!(script.contains("0x00000000")); assert!(script.contains("0x80000")); }
#[test]
fn test_linker_script_file_generation() {
let generator = LinkerScriptGenerator::new_stm32();
let temp_file = "/tmp/test_linker.ld";
generator
.generate_to_file(temp_file)
.expect("Failed to write");
let contents = std::fs::read_to_string(temp_file).expect("Failed to read");
assert!(contents.contains("MEMORY"));
assert!(contents.contains("SECTIONS"));
std::fs::remove_file(temp_file).ok();
}
#[test]
fn test_alignment_requirements() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains("ALIGN(256)"));
let align_4_count = script.matches("ALIGN(4)").count();
assert!(align_4_count > 5);
assert!(script.contains("ALIGN(8)"));
}
#[test]
fn test_section_placement() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains(".isr_vector :") && script.contains("} >FLASH"));
assert!(script.contains(".text :") && script.contains("} >FLASH"));
assert!(script.contains(".data :") && script.contains(">RAM AT> FLASH"));
assert!(script.contains(".bss :") && script.contains("} >RAM"));
}
#[test]
fn test_startup_symbols() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains("_sidata")); assert!(script.contains("_sdata")); assert!(script.contains("_edata"));
assert!(script.contains("_sbss"));
assert!(script.contains("_ebss"));
assert!(script.contains("__bss_start__"));
assert!(script.contains("__bss_end__"));
assert!(script.contains("_estack"));
}
#[test]
fn test_cpp_support() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains(".preinit_array"));
assert!(script.contains(".init_array"));
assert!(script.contains(".fini_array"));
assert!(script.contains("__preinit_array_start"));
assert!(script.contains("__init_array_start"));
assert!(script.contains("__fini_array_start"));
}
#[test]
fn test_exception_handling() {
let generator = LinkerScriptGenerator::new_stm32();
let script = generator.generate().expect("Failed to generate");
assert!(script.contains(".ARM.extab"));
assert!(script.contains(".ARM.exidx"));
assert!(script.contains("__exidx_start"));
assert!(script.contains("__exidx_end"));
}