weirflow 0.1.0

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

// ------------------------------------------------------------------
// 4. Upload success
// ------------------------------------------------------------------

#[test]
fn ifds_vyre_resident_upload_resident_success() {
    let b = backend();
    let a = adapter(&b);
    let res = a.allocate_resident(64).unwrap();
    a.upload_resident(&res, &[1u8; 32]).unwrap();
    assert_eq!(b.upload_count(), 1);
    let uploads = b.take_uploads();
    assert_eq!(uploads[0].byte_len, 32);
    assert_eq!(uploads[0].offset, None);
}

#[test]
fn ifds_vyre_resident_upload_resident_empty_bytes() {
    let b = backend();
    let a = adapter(&b);
    let res = a.allocate_resident(64).unwrap();
    a.upload_resident(&res, &[]).unwrap();
    assert_eq!(b.upload_count(), 1);
}

#[test]
fn ifds_vyre_resident_upload_resident_many_empty() {
    let b = backend();
    let a = adapter(&b);
    a.upload_resident_many(&[]).unwrap();
    assert_eq!(b.upload_count(), 0);
}

#[test]
fn ifds_vyre_resident_upload_resident_many_single() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    a.upload_resident_many(&[(&r, &[2u8; 16])]).unwrap();
    assert_eq!(b.upload_count(), 1);
}

#[test]
fn ifds_vyre_resident_upload_resident_many_three() {
    let b = backend();
    let a = adapter(&b);
    let r1 = a.allocate_resident(64).unwrap();
    let r2 = a.allocate_resident(64).unwrap();
    let r3 = a.allocate_resident(64).unwrap();
    a.upload_resident_many(&[(&r1, &[1u8; 8]), (&r2, &[2u8; 16]), (&r3, &[3u8; 24])])
        .unwrap();
    assert_eq!(b.upload_count(), 3);
    let uploads = b.take_uploads();
    assert_eq!(
        uploads.iter().map(|u| u.byte_len).sum::<usize>(),
        8 + 16 + 24
    );
}

#[test]
fn ifds_vyre_resident_upload_resident_at_many_empty() {
    let b = backend();
    let a = adapter(&b);
    a.upload_resident_at_many(&[]).unwrap();
    assert_eq!(b.upload_count(), 0);
}

#[test]
fn ifds_vyre_resident_upload_resident_at_many_zero_offset() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    a.upload_resident_at_many(&[(&r, 0, &[5u8; 10])]).unwrap();
    assert_eq!(b.upload_count(), 1);
    assert_eq!(b.take_uploads()[0].offset, Some(0));
}

#[test]
fn ifds_vyre_resident_upload_resident_at_many_nonzero_offset() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    a.upload_resident_at_many(&[(&r, 32, &[6u8; 8])]).unwrap();
    assert_eq!(b.upload_count(), 1);
    assert_eq!(b.take_uploads()[0].offset, Some(32));
}

#[test]
fn ifds_vyre_resident_upload_resident_at_many_three_offsets() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(128).unwrap();
    a.upload_resident_at_many(&[(&r, 0, &[1u8; 4]), (&r, 16, &[2u8; 4]), (&r, 32, &[3u8; 4])])
        .unwrap();
    assert_eq!(b.upload_count(), 3);
}

#[test]
fn ifds_vyre_resident_upload_resident_at_many_boundary_exact() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    a.upload_resident_at_many(&[(&r, 56, &[0u8; 8])]).unwrap();
}

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

// ------------------------------------------------------------------
// 5. Upload error mapping
// ------------------------------------------------------------------

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

#[test]
fn ifds_vyre_resident_upload_many_err_propagates() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    b.inject_next_upload(InjectedFailure::DispatchFailed {
        code: None,
        message: "upload batch failed".into(),
    });
    let err = a.upload_resident_many(&[(&r, &[1u8; 8])]).unwrap_err();
    assert!(err.contains("upload batch failed"));
}

#[test]
fn ifds_vyre_resident_upload_at_many_err_propagates() {
    let b = backend();
    let a = adapter(&b);
    let r = a.allocate_resident(64).unwrap();
    b.inject_next_upload(InjectedFailure::PoisonedLock {
        lock_error: "upload_at lock".into(),
    });
    let err = a
        .upload_resident_at_many(&[(&r, 0, &[1u8; 8])])
        .unwrap_err();
    assert!(err.contains("upload_at lock"));
}