use std::cell::RefCell;
use darkly::engine::protocol::{DrainOutcome, Transport};
use darkly::engine::DarklyEngine;
use darkly::gpu::context::GpuContext;
use darkly::gpu::test_utils::test_device;
use serde_json::json;
fn test_engine_cell(width: u32, height: u32) -> RefCell<DarklyEngine> {
let (device, queue) = test_device();
let gpu = GpuContext::new_headless(device, queue);
RefCell::new(DarklyEngine::new(gpu, width, height))
}
#[test]
#[should_panic(expected = "already")]
fn naive_synchronous_access_under_held_borrow_panics() {
let cell = test_engine_cell(64, 64);
let _render_guard = cell.borrow_mut();
let _competing = cell.borrow_mut(); }
#[test]
fn transport_enqueue_under_held_borrow_does_not_panic() {
let cell = test_engine_cell(64, 64);
let transport = Transport::new();
let _render_guard = cell.borrow_mut(); transport.enqueue(1, "add_raster", json!({ "anchor": -1 }), Vec::new());
transport.enqueue(2, "layer_tree", json!(null), Vec::new());
assert_eq!(
transport.pending(),
2,
"requests queued, nothing dispatched yet"
);
}
#[test]
fn transport_try_drain_under_held_borrow_reschedules() {
let cell = test_engine_cell(64, 64);
let transport = Transport::new();
transport.enqueue(1, "add_raster", json!({ "anchor": -1 }), Vec::new());
let render_guard = cell.borrow_mut(); match transport.try_drain(&cell) {
DrainOutcome::Busy => {} DrainOutcome::Drained(_) => panic!("must not drain while engine is borrowed"),
}
assert_eq!(transport.pending(), 1, "busy drain dequeues nothing");
drop(render_guard);
match transport.try_drain(&cell) {
DrainOutcome::Drained(outcomes) => {
assert_eq!(outcomes.len(), 1);
assert!(outcomes[0].result.is_ok());
}
DrainOutcome::Busy => panic!("engine is free; drain should succeed"),
}
assert_eq!(
transport.pending(),
0,
"FIFO emptied after a successful drain"
);
}