zahirscan 0.3.2

Token-efficient content compression for AI analysis using probabilistic template mining
Documentation
//! End-to-end integration tests for code/script metadata: file on disk → extract_zahir → Output/JSON.

use std::fs;
use zahirscan::{OutputMode, OutputSink, extract_zahir};

#[test]
fn code_file_type_detection_py() {
    let dir = tempfile::tempdir().expect("temp dir");
    let path = dir.path().join("script.py");
    let content = "print(1)\n";
    fs::write(&path, content).expect("write");
    let path_str = path.to_string_lossy();
    let result = extract_zahir::<&str>(
        path_str.as_ref(),
        OutputMode::Full,
        None,
        None,
        &OutputSink::Collect,
    )
    .expect("extract_zahir");
    assert_eq!(result.outputs.len(), 1);
    assert_eq!(result.outputs[0].file_type.as_deref(), Some("Code"));
    let meta = result.outputs[0]
        .code_metadata
        .as_ref()
        .expect("code_metadata");
    assert_eq!(meta.script_type, "python");
    assert_eq!(meta.byte_count, content.len());
    assert_eq!(meta.line_count, 1);
}

#[test]
fn code_e2e_full_mode() {
    let dir = tempfile::tempdir().expect("temp dir");
    let path = dir.path().join("main.rs");
    let content = "fn main() {\n    println!(\"hi\");\n}\n";
    fs::write(&path, content).expect("write");
    let path_str = path.to_string_lossy();
    let result = extract_zahir::<&str>(
        path_str.as_ref(),
        OutputMode::Full,
        None,
        None,
        &OutputSink::Collect,
    )
    .expect("extract_zahir");
    assert_eq!(result.outputs.len(), 1);
    assert_eq!(result.outputs[0].file_type.as_deref(), Some("Code"));
    let meta = result.outputs[0]
        .code_metadata
        .as_ref()
        .expect("code_metadata");
    assert_eq!(meta.script_type, "rust");
    assert_eq!(meta.byte_count, content.len());
    assert_eq!(meta.line_count, 3);
}

#[test]
fn code_e2e_templates_mode() {
    let dir = tempfile::tempdir().expect("temp dir");
    let path = dir.path().join("app.js");
    fs::write(&path, "console.log('hello');\n").expect("write");
    let path_str = path.to_string_lossy();
    let result = extract_zahir::<&str>(
        path_str.as_ref(),
        OutputMode::Templates,
        None,
        None,
        &OutputSink::Collect,
    )
    .expect("extract_zahir");
    assert_eq!(result.outputs.len(), 1);
    assert_eq!(result.outputs[0].file_type.as_deref(), Some("Code"));
    assert!(result.outputs[0].templates.is_empty());
    assert!(result.outputs[0].code_metadata.is_some());
}

#[test]
fn code_e2e_json_contains_code_metadata() {
    let dir = tempfile::tempdir().expect("temp dir");
    let path = dir.path().join("script.py");
    fs::write(&path, "x = 1\n").expect("write");
    let path_str = path.to_string_lossy();
    let result = extract_zahir::<&str>(
        path_str.as_ref(),
        OutputMode::Full,
        None,
        None,
        &OutputSink::Collect,
    )
    .expect("extract_zahir");
    let json = serde_json::to_value(&result.outputs[0]).expect("serialize");
    assert!(json.get("code_metadata").is_some());
    let meta = json.get("code_metadata").unwrap();
    assert_eq!(
        meta.get("script_type").and_then(|v| v.as_str()),
        Some("python")
    );
    assert!(meta.get("byte_count").is_some());
    assert!(meta.get("line_count").is_some());
}