psx 0.1.8

Library for developing homebrew for the Sony PlayStation 1
#![cfg(test)]
use crate::gpu::DMAMode;
use crate::hw::gpu::{GP0, GP1};
use crate::hw::{gpu, Register};

fn stat_test(check: fn(&gpu::Status) -> bool, test: fn(&mut dyn FnMut() -> bool)) {
    let mut status = gpu::Status::new();
    let mut reload_and_check = || {
        status.load();
        check(&status)
    };
    test(&mut reload_and_check)
}

#[test_case]
fn reset_gpu() {
    GP1::new().reset_gpu();
    let status = gpu::Status::new().averaged_bits();
    assert!(status == 0x1480_2000);
}

#[test_case]
fn ack_irq() {
    stat_test(gpu::Status::irq_pending, |irq| {
        assert!(!irq());
        GP0::new().interrupt_request();
        assert!(irq());
        GP1::new().ack_irq();
        assert!(!irq());
    });
}

#[test_case]
fn display() {
    stat_test(gpu::Status::display_enabled, |disp| {
        let mut gp1 = GP1::new();

        assert!(!disp());
        gp1.enable_display(true);
        assert!(disp());
        gp1.enable_display(false);
        assert!(!disp());
    });
}

#[test_case]
fn dma_mode() {
    stat_test(gpu::Status::dma_enabled, |dma| {
        let mut gp1 = GP1::new();
        gp1.dma_mode(None);
        assert!(!dma());
        gp1.dma_mode(Some(DMAMode::GP0));
        assert!(dma());
        gp1.dma_mode(Some(DMAMode::GPUREAD));
        assert!(dma());
    });
}