weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
use super::*;

// ------------------------------------------------------------------
// 6. Download success
// ------------------------------------------------------------------

#[test]
fn ifds_vyre_resident_download_resident_success() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let data = a.download_resident(&r).unwrap();
    assert_eq!(data.len(), 64);
}

#[test]
fn ifds_vyre_resident_download_resident_into_success() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = vec![99u8; 128];
    a.download_resident_into(&r, &mut out).unwrap();
    assert_eq!(out.len(), 64);
}

#[test]
fn ifds_vyre_resident_download_resident_range_success() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let data = a.download_resident_range(&r, 16, 8).unwrap();
    assert_eq!(data.len(), 8);
}

#[test]
fn ifds_vyre_resident_download_resident_range_into_success() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = Vec::new();
    a.download_resident_range_into(&r, 8, 4, &mut out).unwrap();
    assert_eq!(out.len(), 4);
}

#[test]
fn ifds_vyre_resident_download_resident_range_zero_len() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let data = a.download_resident_range(&r, 64, 0).unwrap();
    assert_eq!(data.len(), 0);
}

#[test]
fn ifds_vyre_resident_download_resident_range_at_end() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let data = a.download_resident_range(&r, 56, 8).unwrap();
    assert_eq!(data.len(), 8);
}

#[test]
fn ifds_vyre_resident_download_resident_ranges_into_empty() {
    let b = backend();
    let a = adapter(&b);
    let mut outputs: Vec<&mut Vec<u8>> = vec![];
    a.download_resident_ranges_into(&[], &mut outputs).unwrap();
}

#[test]
fn ifds_vyre_resident_download_resident_ranges_into_single() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = Vec::new();
    a.download_resident_ranges_into(&[(&r, 0, 8)], &mut [&mut out])
        .unwrap();
    assert_eq!(out.len(), 8);
}

#[test]
fn ifds_vyre_resident_download_resident_ranges_into_three() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out1 = Vec::new();
    let mut out2 = Vec::new();
    let mut out3 = Vec::new();
    a.download_resident_ranges_into(
        &[(&r, 0, 8), (&r, 16, 8), (&r, 32, 8)],
        &mut [&mut out1, &mut out2, &mut out3],
    )
    .unwrap();
    assert_eq!(out1.len(), 8);
    assert_eq!(out2.len(), 8);
    assert_eq!(out3.len(), 8);
}

#[test]
fn ifds_vyre_resident_download_resident_ranges_into_mismatch_count() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = Vec::new();
    let err = a
        .download_resident_ranges_into(&[(&r, 0, 8), (&r, 8, 8)], &mut [&mut out])
        .unwrap_err();
    assert!(err.contains("2 range(s) and 1 output(s)"));
}

// ------------------------------------------------------------------
// 7. Download error mapping & boundary checks
// ------------------------------------------------------------------

#[test]
fn ifds_vyre_resident_download_err_device_oom() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    b.inject_next_download(InjectedFailure::DeviceOutOfMemory {
        requested: 64,
        available: 32,
    });
    let err = a.download_resident(&r).unwrap_err();
    assert!(err.contains("device out of memory"));
}

#[test]
fn ifds_vyre_resident_download_range_overflow_rejected() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let err = a.download_resident_range(&r, 60, 8).unwrap_err();
    assert!(err.contains("exceeds allocation"));
}

#[test]
fn ifds_vyre_resident_download_range_into_overflow_rejected() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    let mut out = Vec::new();
    let err = a
        .download_resident_range_into(&r, 60, 8, &mut out)
        .unwrap_err();
    assert!(err.contains("exceeds allocation"));
}

#[test]
fn ifds_vyre_resident_download_ranges_into_err_propagates() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    b.inject_next_download(InjectedFailure::UnsupportedFeature {
        name: "multi_range".into(),
    });
    let mut out = Vec::new();
    let err = a
        .download_resident_ranges_into(&[(&r, 0, 8)], &mut [&mut out])
        .unwrap_err();
    assert!(err.contains("multi_range"));
}