use riscv_h::register::{hgatp, hstatus, vsstatus};
#[test]
fn test_register_independence() {
let mut hstatus_reg = hstatus::Hstatus::from_bits(0);
let mut hgatp_reg = hgatp::Hgatp::from_bits(0);
let mut vsstatus_reg = vsstatus::Vsstatus::from_bits(0);
hstatus_reg.set_vtsr(true);
hstatus_reg.set_vgein(0x15);
hgatp_reg.set_mode(hgatp::HgatpValues::Sv48x4);
hgatp_reg.set_vmid(0x1234);
vsstatus_reg.set_mxr(true);
vsstatus_reg.set_uxl(vsstatus::UxlValues::Uxl64);
assert!(hstatus_reg.vtsr());
assert_eq!(hstatus_reg.vgein(), 0x15);
assert!(matches!(hgatp_reg.mode(), hgatp::HgatpValues::Sv48x4));
assert_eq!(hgatp_reg.vmid(), 0x1234);
assert!(vsstatus_reg.mxr());
assert!(matches!(vsstatus_reg.uxl(), vsstatus::UxlValues::Uxl64));
}
#[test]
fn test_enum_conversions() {
let hgatp_bare = hgatp::HgatpValues::Bare;
let hgatp_sv39 = hgatp::HgatpValues::Sv39x4;
let hgatp_sv48 = hgatp::HgatpValues::Sv48x4;
assert_eq!(hgatp_bare as usize, 0);
assert_eq!(hgatp_sv39 as usize, 8);
assert_eq!(hgatp_sv48 as usize, 9);
let vsxl_32 = hstatus::VsxlValues::Vsxl32;
let vsxl_64 = hstatus::VsxlValues::Vsxl64;
let vsxl_128 = hstatus::VsxlValues::Vsxl128;
assert_eq!(vsxl_32 as usize, 1);
assert_eq!(vsxl_64 as usize, 2);
assert_eq!(vsxl_128 as usize, 3);
let uxl_32 = vsstatus::UxlValues::Uxl32;
let uxl_64 = vsstatus::UxlValues::Uxl64;
let uxl_128 = vsstatus::UxlValues::Uxl128;
assert_eq!(uxl_32 as usize, 1);
assert_eq!(uxl_64 as usize, 2);
assert_eq!(uxl_128 as usize, 3);
}
#[test]
fn test_bit_field_isolation() {
let mut hstatus_reg = hstatus::Hstatus::from_bits(0);
hstatus_reg.set_vsxl(hstatus::VsxlValues::Vsxl64); hstatus_reg.set_vtsr(true); hstatus_reg.set_vgein(0x2A); hstatus_reg.set_hu(true); hstatus_reg.set_gva(true);
assert!(matches!(hstatus_reg.vsxl(), hstatus::VsxlValues::Vsxl64));
assert!(hstatus_reg.vtsr());
assert_eq!(hstatus_reg.vgein(), 0x2A);
assert!(hstatus_reg.hu());
assert!(hstatus_reg.gva());
hstatus_reg.set_vtsr(false);
assert!(matches!(hstatus_reg.vsxl(), hstatus::VsxlValues::Vsxl64));
assert!(!hstatus_reg.vtsr()); assert_eq!(hstatus_reg.vgein(), 0x2A);
assert!(hstatus_reg.hu());
assert!(hstatus_reg.gva());
}
#[test]
fn test_large_bit_patterns() {
let test_pattern = 0xDEADBEEFCAFEBABE_usize;
let hgatp_reg = hgatp::Hgatp::from_bits(test_pattern);
let expected_mode = (test_pattern >> 60) & 0xF;
let expected_vmid = (test_pattern >> 44) & 0x3FFF;
let expected_ppn = test_pattern & 0xFFFFFFFFFFF;
assert_eq!(hgatp_reg.bits() >> 60 & 0xF, expected_mode);
assert_eq!(hgatp_reg.vmid(), expected_vmid);
assert_eq!(hgatp_reg.ppn(), expected_ppn);
}
#[test]
fn test_register_cloning() {
let original = hstatus::Hstatus::from_bits(0x123456789ABCDEF0);
let copied = original;
assert_eq!(original.bits(), copied.bits());
let cloned = original.clone();
assert_eq!(original.bits(), cloned.bits());
let mut modified = original;
let modified_bits = hstatus::Hstatus::from_bits(0);
assert_ne!(original.bits(), modified_bits.bits());
}
#[test]
fn test_boundary_values() {
let mut hgatp_reg = hgatp::Hgatp::from_bits(0);
hgatp_reg.set_vmid(0);
assert_eq!(hgatp_reg.vmid(), 0);
hgatp_reg.set_vmid(0x3FFF); assert_eq!(hgatp_reg.vmid(), 0x3FFF);
hgatp_reg.set_ppn(0);
assert_eq!(hgatp_reg.ppn(), 0);
hgatp_reg.set_ppn(0xFFFFFFFFFFF); assert_eq!(hgatp_reg.ppn(), 0xFFFFFFFFFFF);
}
#[test]
fn test_debug_formatting() {
let hstatus_reg = hstatus::Hstatus::from_bits(0x400);
let debug_str = format!("{:?}", hstatus_reg);
assert!(debug_str.contains("Hstatus"));
assert!(debug_str.contains("1024"));
let vsxl_val = hstatus::VsxlValues::Vsxl64;
let debug_str = format!("{:?}", vsxl_val);
assert!(debug_str.contains("Vsxl64"));
}