use crate::arch::regs::RegisterFile;
use crate::isa::reg::RegIdx;
#[test]
fn gpr_initial_values_are_zero() {
let regs = RegisterFile::default();
for i in 0u8..32 {
assert_eq!(regs.read(RegIdx::new(i)), 0, "x{} should be 0 initially", i);
}
}
#[test]
fn gpr_write_and_read() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(1), 42);
assert_eq!(regs.read(RegIdx::new(1)), 42);
}
#[test]
fn gpr_x0_always_zero() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(0), 0xDEAD_BEEF);
assert_eq!(regs.read(RegIdx::new(0)), 0, "x0 must always read as 0");
}
#[test]
fn gpr_write_all_registers() {
let mut regs = RegisterFile::default();
for i in 0u8..32 {
regs.write(RegIdx::new(i), i as u64 * 100);
}
assert_eq!(regs.read(RegIdx::new(0)), 0, "x0 must remain 0");
for i in 1u8..32 {
assert_eq!(regs.read(RegIdx::new(i)), i as u64 * 100);
}
}
#[test]
fn gpr_overwrite() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(5), 100);
assert_eq!(regs.read(RegIdx::new(5)), 100);
regs.write(RegIdx::new(5), 200);
assert_eq!(regs.read(RegIdx::new(5)), 200);
}
#[test]
fn gpr_max_value() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(31), u64::MAX);
assert_eq!(regs.read(RegIdx::new(31)), u64::MAX);
}
#[test]
fn fpr_initial_values_are_zero() {
let regs = RegisterFile::default();
for i in 0u8..32 {
assert_eq!(regs.read_f(RegIdx::new(i)), 0, "f{} should be 0 initially", i);
}
}
#[test]
fn fpr_write_and_read() {
let mut regs = RegisterFile::default();
#[allow(clippy::approx_constant)]
let val = f64::to_bits(3.14);
regs.write_f(RegIdx::new(0), val);
assert_eq!(regs.read_f(RegIdx::new(0)), val);
}
#[test]
fn fpr_f0_is_writable() {
let mut regs = RegisterFile::default();
#[allow(clippy::approx_constant)]
let val = f64::to_bits(2.71828);
regs.write_f(RegIdx::new(0), val);
assert_eq!(regs.read_f(RegIdx::new(0)), val);
}
#[test]
fn fpr_write_all_registers() {
let mut regs = RegisterFile::default();
for i in 0u8..32 {
regs.write_f(RegIdx::new(i), (i as u64 + 1) * 1000);
}
for i in 0u8..32 {
assert_eq!(regs.read_f(RegIdx::new(i)), (i as u64 + 1) * 1000);
}
}
#[test]
fn fpr_nan_boxing_bits() {
let mut regs = RegisterFile::default();
let boxed: u64 = 0xFFFF_FFFF_3FC0_0000; regs.write_f(RegIdx::new(10), boxed);
assert_eq!(regs.read_f(RegIdx::new(10)), boxed);
}
#[test]
fn gpr_fpr_independent() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(5), 0xAAAA);
regs.write_f(RegIdx::new(5), 0xBBBB);
assert_eq!(regs.read(RegIdx::new(5)), 0xAAAA);
assert_eq!(regs.read_f(RegIdx::new(5)), 0xBBBB);
}
#[test]
fn registers_display_two_per_line_in_hex() {
let mut regs = RegisterFile::default();
regs.write(RegIdx::new(1), 0x1234_5678_9ABC_DEF0);
regs.write(RegIdx::new(31), 0xDEAD_BEEF);
let text = regs.gpr().to_string();
let lines: Vec<&str> = text.lines().collect();
assert_eq!(lines.len(), 16);
assert_eq!(lines[0], "x0 =0x0000000000000000 x1 =0x123456789abcdef0");
assert_eq!(lines[15], "x30=0x0000000000000000 x31=0x00000000deadbeef");
}