## Coverage Report

#### Created: 2026-01-25 15:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)

    /home/noah/src/realizar/src/api/test_helpers.rs

    Line
    Count
    Source
    1
    //! Test helper functions for api tests
    2
    //!
    3
    //! This module contains shared test utilities used across multiple test parts.
    4
    //! Separated for PMAT compliance (<2000 lines per file).
    5
    6
    use super::*;
    7
    use axum::Router;
    8
    9
    /// Create a test application with demo state
    10
    84
    pub fn create_test_app() -> Router {
    11
    84
        let state = AppState::demo().expect("test");
    12
    84
        create_router(state)
    13
    84
    }
    14
    15
    /// Helper to create test quantized model for IMP-116 tests
    16
    #[cfg(feature = "gpu")]
    17
    27
    pub fn create_test_quantized_model(
    18
    27
        config: &crate::gguf::GGUFConfig,
    19
    27
    ) -> crate::gguf::OwnedQuantizedModel {
    20
        use crate::gguf::{
    21
            OwnedQKVWeights, OwnedQuantizedLayer, OwnedQuantizedModel, OwnedQuantizedTensor,
    22
            GGUF_TYPE_Q4_K,
    23
        };
    24
    25
    27
        let hidden_dim = config.hidden_dim;
    26
    27
        let intermediate_dim = config.intermediate_dim;
    27
    27
        let vocab_size = config.vocab_size;
    28
    29
        // Create Q4_K tensor data helper
    30
        // Q4_K uses row-major storage where each row has ceil(in_dim/256) super-blocks.
    31
        // Each super-block is 144 bytes and covers 256 values.
    32
    139
        fn create_q4k_data(in_dim: usize, out_dim: usize) -> OwnedQuantizedTensor {
    33
    139
            let super_blocks_per_row = in_dim.div_ceil(256);
    34
    139
            let bytes_per_row = super_blocks_per_row * 144;
    35
    139
            let data_size = out_dim * bytes_per_row;
    36
    139
            OwnedQuantizedTensor {
    37
    139
                data: vec![0u8; data_size],
    38
    139
                qtype: GGUF_TYPE_Q4_K,
    39
    139
                in_dim,
    40
    139
                out_dim,
    41
    139
            }
    42
    139
        }
    43
    44
    27
        let layers = (0..config.num_layers)
    45
    27
            .map(|_| OwnedQuantizedLayer {
    46
    28
                attn_norm_weight: vec![1.0f32; hidden_dim],
    47
    28
                attn_norm_bias: None,
    48
    28
                qkv_weight: OwnedQKVWeights::Fused(create_q4k_data(hidden_dim, hidden_dim * 3)),
    49
    28
                qkv_bias: None,
    50
    28
                attn_output_weight: create_q4k_data(hidden_dim, hidden_dim),
    51
    28
                attn_output_bias: None,
    52
    28
                ffn_up_weight: create_q4k_data(hidden_dim, intermediate_dim),
    53
    28
                ffn_up_bias: None,
    54
    28
                ffn_down_weight: create_q4k_data(intermediate_dim, hidden_dim),
    55
    28
                ffn_down_bias: None,
    56
    28
                ffn_gate_weight: None,
    57
    28
                ffn_gate_bias: None,
    58
    28
                ffn_norm_weight: None,
    59
    28
                ffn_norm_bias: None,
    60
    28
            })
    61
    27
            .collect();
    62
    63
    27
        OwnedQuantizedModel {
    64
    27
            config: config.clone(),
    65
    27
            token_embedding: vec![0.1f32; vocab_size * hidden_dim],
    66
    27
            layers,
    67
    27
            output_norm_weight: vec![1.0f32; hidden_dim],
    68
    27
            output_norm_bias: None,
    69
    27
            lm_head_weight: create_q4k_data(hidden_dim, vocab_size),
    70
    27
            lm_head_bias: None,
    71
    27
            #[cfg(feature = "cuda")]
    72
    27
            cuda_executor: None,
    73
    27
            #[cfg(feature = "cuda")]
    74
    27
            cuda_kernel_count: std::sync::atomic::AtomicU64::new(0),
    75
    27
            #[cfg(feature = "cuda")]
    76
    27
            cached_weight_names: std::sync::Mutex::new(std::collections::HashSet::new()),
    77
    27
        }
    78
    27
    }