use super::*;
#[test]
fn ifds_vyre_resident_sequence_zero_steps_zero_ranges() {
let b = backend();
let a = adapter(&b);
a.dispatch_resident_sequence_read_ranges_into(&[], &[], &mut [])
.unwrap();
assert_eq!(b.dispatch_count(), 0);
}
#[test]
fn ifds_vyre_resident_sequence_one_step_zero_ranges() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let p = program();
a.dispatch_resident_sequence_read_ranges_into(&[(&p, &[r], None)], &[], &mut [])
.unwrap();
assert_eq!(b.dispatch_count(), 1);
}
#[test]
fn ifds_vyre_resident_sequence_zero_steps_one_range() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let mut out = Vec::new();
a.dispatch_resident_sequence_read_ranges_into(&[], &[(&r, 0, 8)], &mut [&mut out])
.unwrap();
assert_eq!(b.dispatch_count(), 0);
assert_eq!(out.len(), 8);
}
#[test]
fn ifds_vyre_resident_sequence_one_step_one_range() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let p = program();
let mut out = Vec::new();
a.dispatch_resident_sequence_read_ranges_into(
&[(&p, &[r.clone()], None)],
&[(&r, 0, 8)],
&mut [&mut out],
)
.unwrap();
assert_eq!(b.dispatch_count(), 1);
assert_eq!(out.len(), 8);
}
#[test]
fn ifds_vyre_resident_sequence_three_steps_two_ranges() {
let b = backend();
let a = adapter(&b);
let r1 = a.allocate_resident(64).unwrap();
let r2 = a.allocate_resident(64).unwrap();
let p = program();
let mut out1 = Vec::new();
let mut out2 = Vec::new();
a.dispatch_resident_sequence_read_ranges_into(
&[
(&p, &[r1.clone()], Some([4, 1, 1])),
(&p, &[r2.clone()], Some([8, 1, 1])),
(&p, &[r1.clone(), r2.clone()], None),
],
&[(&r1, 0, 8), (&r2, 16, 8)],
&mut [&mut out1, &mut out2],
)
.unwrap();
assert_eq!(b.dispatch_count(), 3);
let dispatches = b.take_dispatches();
assert_eq!(dispatches[0].grid_override, Some([4, 1, 1]));
assert_eq!(dispatches[1].grid_override, Some([8, 1, 1]));
assert_eq!(dispatches[2].grid_override, None);
}
#[test]
fn ifds_vyre_resident_sequence_err_in_step() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let p = program();
b.inject_next_dispatch(InjectedFailure::DispatchFailed {
code: None,
message: "seq step fail".into(),
});
let mut out = Vec::new();
let err = a
.dispatch_resident_sequence_read_ranges_into(
&[(&p, &[r.clone()], None)],
&[(&r, 0, 8)],
&mut [&mut out],
)
.unwrap_err();
assert!(err.contains("seq step fail"));
}
#[test]
fn ifds_vyre_resident_sequence_err_in_readback() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let p = program();
b.inject_next_download(InjectedFailure::InvalidProgram {
fix: "Fix: bad range".into(),
});
let mut out = Vec::new();
let err = a
.dispatch_resident_sequence_read_ranges_into(
&[(&p, &[r.clone()], None)],
&[(&r, 0, 8)],
&mut [&mut out],
)
.unwrap_err();
assert!(err.contains("Fix: bad range"));
}
#[test]
fn ifds_vyre_resident_sequence_empty_ranges_no_outputs() {
let b = backend();
let a = adapter(&b);
let r = a.allocate_resident(64).unwrap();
let p = program();
a.dispatch_resident_sequence_read_ranges_into(&[(&p, &[r], None)], &[], &mut [])
.unwrap();
assert_eq!(b.dispatch_count(), 1);
}