#[test]
fn test_hybrid_scheduler_m1_forces_cpu_deep_gcov() {
let scheduler = HybridScheduler::with_threshold(1).expect("test");
assert!(!scheduler.should_use_gpu(1, 1000, 1000));
assert!(!scheduler.should_use_gpu(1, 10000, 10000));
}
#[test]
fn test_hybrid_scheduler_transpose_b_small_deep_gcov() {
let mut scheduler = HybridScheduler::with_threshold(1_000_000).expect("test");
let q = vec![1.0, 2.0, 3.0, 4.0]; let k = vec![1.0, 0.0, 0.0, 1.0];
let result = scheduler.matmul_transpose_b(&q, &k, 2, 2, 2);
assert!(result.is_ok());
let scores = result.expect("GPU operation failed");
assert_eq!(scores.len(), 4);
}
#[test]
fn test_streaming_kv_cache_wraparound_deep_gcov() {
let mut cache = StreamingKVCache::new(2, 3, 2, 4); let kv_dim = 2 * 4;
for i in 0..5 {
let k = vec![i as f32; kv_dim];
let v = vec![i as f32 * 10.0; kv_dim];
for layer in 0..2 {
cache.append(layer, &k, &v);
}
}
assert_eq!(cache.len(), 3);
assert!(!cache.is_empty());
}
#[test]
fn test_streaming_kv_cache_memory_calculation_deep_gcov() {
let cache = StreamingKVCache::new(4, 100, 8, 64);
let expected = 4 * 100 * 8 * 64 * 2 * 4;
assert_eq!(cache.memory_bytes(), expected);
let expected_mb = expected as f64 / (1024.0 * 1024.0);
assert!((cache.memory_mb() - expected_mb).abs() < 0.001);
}
#[test]
fn test_tensor_pool_capacity_limit_deep_gcov() {
let mut pool = TensorPool::new(2);
assert_eq!(pool.capacity(), 2);
let b1 = pool.acquire(100);
let b2 = pool.acquire(200);
let b3 = pool.acquire(300);
pool.release(b1);
pool.release(b2);
pool.release(b3);
assert_eq!(pool.available(), 2);
}
#[test]
fn test_tensor_pool_size_matching_deep_gcov() {
let mut pool = TensorPool::new(10);
let large = vec![0.0f32; 1000];
pool.release(large);
let buf = pool.acquire(500);
assert!(buf.capacity() >= 500);
}
#[test]
fn test_forward_arena_insufficient_capacity_deep_gcov() {
let mut arena = ForwardArena::new(100);
let _ = arena.alloc(50);
assert_eq!(arena.used(), 50);
let _ = arena.alloc(49);
assert_eq!(arena.used(), 99);
arena.reset();
assert_eq!(arena.used(), 0);
}
#[test]
fn test_scratch_buffer_layer_access_deep_gcov() {
let mut scratch = ScratchBuffer::new(4, 128);
assert_eq!(scratch.num_layers(), 4);
assert_eq!(scratch.layer_size(), 128);
assert_eq!(scratch.total_size(), 512);
for i in 0..4 {
let layer = scratch.get_layer_mut(i);
layer.fill(i as f32);
}
for i in 0..4 {
let layer = scratch.get_layer(i);
assert!(layer.iter().all(|&x| (x - i as f32).abs() < 1e-5));
}
scratch.reset();
for i in 0..4 {
assert!(scratch.get_layer(i).iter().all(|&x| x == 0.0));
}
}
#[test]
fn test_quantized_dot_q4_short_blocks_deep_gcov() {
let short_a: [u8; 10] = [0; 10]; let short_b: [u8; 10] = [0; 10];
let result = quantized_dot_q4(&short_a, &short_b);
assert_eq!(result, 0.0); }
#[test]
fn test_quantized_dot_q8_short_blocks_deep_gcov() {
let short_a: [u8; 20] = [0; 20]; let short_b: [u8; 20] = [0; 20];
let result = quantized_dot_q8(&short_a, &short_b);
assert_eq!(result, 0.0); }
#[test]
fn test_quantized_accumulator_operations_deep_gcov() {
let mut acc = QuantizedAccumulator::new();
assert_eq!(acc.sum(), 0.0);
acc.add_scaled(2.0, 3.0);
assert!((acc.sum() - 6.0).abs() < 1e-5);
acc.add_block(4.0, 0.5);
assert!((acc.sum() - 8.0).abs() < 1e-5);
acc.reset();
assert_eq!(acc.sum(), 0.0);
}
#[test]
fn test_double_buffer_operations_deep_gcov() {
let mut db: DoubleBuffer<f32> = DoubleBuffer::new(100);
assert_eq!(db.capacity(), 100);
db.back_mut().fill(1.0);
assert!(db.front().iter().all(|&x| x == 0.0));
db.swap();
assert!(db.front().iter().all(|&x| x == 1.0));
}
#[test]
fn test_chunked_processor_empty_data_deep_gcov() {
let processor = ChunkedProcessor::new(64);
assert_eq!(processor.num_chunks(0), 0);
let empty: Vec<f32> = vec![];
let result = processor.process_chunks(&empty, |_chunk| 0.0);
assert_eq!(result, 0.0);
}
#[test]
fn test_chunked_processor_exact_chunks_deep_gcov() {
let processor = ChunkedProcessor::new(4);
let _data = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]; assert_eq!(processor.num_chunks(8), 2);
let (start, end) = processor.chunk_bounds(0, 8);
assert_eq!((start, end), (0, 4));
let (start, end) = processor.chunk_bounds(1, 8);
assert_eq!((start, end), (4, 8));
}
#[test]
fn test_chunked_processor_partial_chunk_deep_gcov() {
let processor = ChunkedProcessor::new(4);
let _data = vec![1.0, 2.0, 3.0, 4.0, 5.0]; assert_eq!(processor.num_chunks(5), 2);
let (start, end) = processor.chunk_bounds(1, 5);
assert_eq!((start, end), (4, 5)); }
#[test]
fn test_inference_pipeline_stage_tracking_deep_gcov() {
let mut pipeline = InferencePipeline::new(4);
assert_eq!(pipeline.num_stages(), 4);
assert_eq!(pipeline.total_latency(), 0.0);
pipeline.record_stage_time(GpuPipelineStage::Embed, 1.5);
pipeline.record_stage_time(GpuPipelineStage::Attention, 3.0);
pipeline.record_stage_time(GpuPipelineStage::FFN, 2.5);
pipeline.record_stage_time(GpuPipelineStage::Output, 0.5);
assert!((pipeline.total_latency() - 7.5).abs() < 1e-5);
let breakdown = pipeline.stage_breakdown();
assert_eq!(breakdown.len(), 4);
pipeline.reset();
assert_eq!(pipeline.total_latency(), 0.0);
}
#[test]
fn test_token_batch_push_and_flush_deep_gcov() {
let mut batch = TokenBatch::new(3);
assert_eq!(batch.capacity(), 3);
assert!(batch.is_empty());
assert!(!batch.is_full());
assert!(batch.push(1).is_none());
assert!(batch.push(2).is_none());
let result = batch.push(3);
assert!(result.is_some());
assert_eq!(result.expect("index out of bounds"), vec![1, 2, 3]);
assert!(batch.is_empty());
}
#[test]
fn test_speculative_buffer_verify_all_match_deep_gcov() {
let mut buffer = SpeculativeBuffer::new(5);
buffer.add_candidate(10, 0.9);
buffer.add_candidate(20, 0.8);
buffer.add_candidate(30, 0.7);
let (accepted, rejection_idx) = buffer.verify(&[10, 20, 30]);
assert_eq!(accepted, 3);
assert!(rejection_idx.is_none());
}
#[test]
fn test_speculative_buffer_verify_partial_match_deep_gcov() {
let mut buffer = SpeculativeBuffer::new(5);
buffer.add_candidate(10, 0.9);
buffer.add_candidate(20, 0.8);
buffer.add_candidate(30, 0.7);
let (accepted, rejection_idx) = buffer.verify(&[10, 20, 99]); assert_eq!(accepted, 2);
assert_eq!(rejection_idx, Some(2));
}
#[test]
fn test_speculative_buffer_accept_reject_deep_gcov() {
let mut buffer = SpeculativeBuffer::new(5);
buffer.add_candidate(10, 0.9);
buffer.add_candidate(20, 0.8);
buffer.add_candidate(30, 0.7);
buffer.accept(2);
assert_eq!(buffer.len(), 1);
buffer.reject();
assert!(buffer.is_empty());
}
#[test]
fn test_inference_batch_scheduler_workflow_deep_gcov() {
let mut scheduler = InferenceBatchScheduler::new();
let id1 = scheduler.submit(vec![1, 2, 3]);
let id2 = scheduler.submit(vec![4, 5, 6]);
assert_eq!(scheduler.pending_count(), 2);
assert_eq!(scheduler.completed_count(), 0);
scheduler.complete(id1, vec![10, 11, 12]);
assert_eq!(scheduler.pending_count(), 1);
assert_eq!(scheduler.completed_count(), 1);
let result = scheduler.poll();
assert!(result.is_some());
let (batch_id, tokens) = result.expect("GPU operation failed");
assert_eq!(batch_id, id1);
assert_eq!(tokens, vec![10, 11, 12]);
scheduler.complete(id2, vec![40, 50, 60]);
let drained = scheduler.drain();
assert_eq!(drained.len(), 1);
}
#[test]
fn test_async_request_queue_backpressure_deep_gcov() {
let mut queue: AsyncRequestQueue<u32> = AsyncRequestQueue::new(3);
assert!(queue.try_push(1));
assert!(queue.try_push(2));
assert!(queue.try_push(3));
assert!(queue.is_full());
assert!(!queue.try_push(4));
assert_eq!(queue.try_pop(), Some(1));
assert!(queue.try_push(4)); }
#[test]
fn test_inference_event_notifier_multiple_handlers_deep_gcov() {
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
let mut notifier = InferenceEventNotifier::new();
let count = Arc::new(AtomicUsize::new(0));
for _ in 0..3 {
let count_clone = Arc::clone(&count);
notifier.register(Box::new(move |_id, _tokens| {
count_clone.fetch_add(1, Ordering::SeqCst);
}));
}
assert_eq!(notifier.handler_count(), 3);
notifier.notify(42, &[1, 2, 3]);
assert_eq!(count.load(Ordering::SeqCst), 3);
notifier.clear();
assert_eq!(notifier.handler_count(), 0);
}
#[test]
fn test_timeout_manager_check_expired_deep_gcov() {
use std::time::{Duration, Instant};
let mut manager = TimeoutManager::new();
let now = Instant::now();
manager.register(1, now); manager.register(2, now + Duration::from_secs(3600));
assert_eq!(manager.active_count(), 2);
let expired = manager.check_expired();
assert!(expired.contains(&1));
assert!(!expired.contains(&2));
assert_eq!(manager.active_count(), 1);
manager.remove(2);
assert_eq!(manager.active_count(), 0);
}
#[test]
fn test_priority_request_queue_ordering_deep_gcov() {
let mut queue: PriorityRequestQueue<&str> = PriorityRequestQueue::new();
queue.enqueue(PriorityRequest::new(1, "low"));
queue.enqueue(PriorityRequest::new(10, "high"));
queue.enqueue(PriorityRequest::new(5, "medium"));
let item = queue.dequeue_highest();
assert!(item.is_some());
assert_eq!(item.expect("GPU operation failed").into_data(), "high");
let item = queue.dequeue_highest();
assert_eq!(item.expect("GPU operation failed").into_data(), "medium");
let item = queue.dequeue_highest();
assert_eq!(item.expect("GPU operation failed").into_data(), "low");
assert!(queue.is_empty());
}