use std::time::Duration;
use vyre_driver_wgpu::{megakernel::WgpuMegakernelDispatcher, WgpuBackend};
use vyre_runtime::megakernel::protocol::opcode;
use vyre_runtime::megakernel::{MegakernelConfig, MegakernelDispatch, MegakernelWorkItem};
#[test]
fn dispatch_megakernel_runs_shutdown_item_and_reports() {
let backend = WgpuBackend::acquire().expect(
"Fix: GPU adapter required for dispatch_megakernel end-to-end; missing adapter is a configuration bug, not graceful fallback.",
);
let items = vec![MegakernelWorkItem {
op_handle: opcode::SHUTDOWN,
input_handle: 0,
output_handle: 0,
param: 0,
}];
let config = MegakernelConfig {
worker_count: 64,
max_wall_time: Duration::from_secs(10),
expected_items_per_worker: 1,
..MegakernelConfig::default()
};
let dispatcher = WgpuMegakernelDispatcher::new(&backend);
let report = MegakernelDispatch::dispatch_megakernel(&dispatcher, &items, &config)
.expect("Fix: dispatch_megakernel must run a single SHUTDOWN work item end to end");
let cached_report = MegakernelDispatch::dispatch_megakernel(&dispatcher, &items, &config)
.expect("Fix: repeated dispatch_megakernel must reuse the compiled hot path");
assert!(
report.items_processed >= 1,
"expected the SHUTDOWN item to be claimed & counted; got items_processed={}",
report.items_processed
);
assert!(
report.wall_time > Duration::ZERO,
"wall_time must be non-zero; got {:?}",
report.wall_time
);
assert!(
!report.telemetry.compiled_pipeline_cache_hit,
"first direct megakernel dispatch should compile the initial geometry, not report a cache hit"
);
assert!(
cached_report.telemetry.compiled_pipeline_cache_hit,
"Fix: repeated direct megakernel dispatch must report compiled-pipeline cache reuse."
);
assert_eq!(
cached_report.telemetry.kernel_launches, 1,
"Fix: compiled-cache reuse must not add extra logical kernel launches."
);
}
#[test]
fn dispatch_megakernel_rejects_misaligned_queue() {
let backend = WgpuBackend::acquire().expect("Fix: GPU adapter required.");
let bytes = vec![0u8; 15];
let config = MegakernelConfig::default();
let err = WgpuMegakernelDispatcher::new(&backend)
.dispatch_megakernel_bytes(&bytes, &config)
.expect_err("misaligned work_queue must reject");
assert!(
format!("{err}").contains("sizeof(MegakernelWorkItem)"),
"error must mention MegakernelWorkItem size; got: {err}"
);
}