wgsldoc 1.0.1

Documentation generator for WGSL shaders
Documentation
use fs_err as fs;
use std::path::PathBuf;
use tempfile::TempDir;
use wgsldoc::Document;

#[test]
fn test_document_new_empty() {
    let result = Document::new("test_project", &[] as &[PathBuf]);
    assert!(result.is_ok());
    let doc = result.unwrap();
    assert_eq!(doc.pkg_name(), "test_project");
    assert_eq!(doc.shaders().len(), 0);
}

#[test]
fn test_document_with_test_shaders() {
    let paths = vec![PathBuf::from("test_shaders/ray.wgsl")];

    let result = Document::new("test_project", &paths);
    if let Ok(doc) = result {
        assert_eq!(doc.pkg_name(), "test_project");
        assert!(!doc.shaders().is_empty());
    }
}

#[test]
fn test_document_open_directory() {
    let temp_dir = TempDir::new().unwrap();
    let shader_path = temp_dir.path().join("test.wgsl");

    fs::write(&shader_path, "fn test() {}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert_eq!(doc.pkg_name(), "test_project");
    assert_eq!(doc.shaders().len(), 1);
    assert_eq!(doc.shaders()[0].module_name, "test");
}

#[test]
fn test_document_ignores_non_wgsl_files() {
    let temp_dir = TempDir::new().unwrap();

    fs::write(temp_dir.path().join("shader.wgsl"), "fn test() {}").unwrap();
    fs::write(temp_dir.path().join("readme.txt"), "readme").unwrap();
    fs::write(temp_dir.path().join("data.json"), "{}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert_eq!(doc.shaders().len(), 1);
}

#[test]
fn test_document_with_readme() {
    let temp_dir = TempDir::new().unwrap();
    let readme_path = temp_dir.path().join("README.md");
    let shader_path = temp_dir.path().join("test.wgsl");

    fs::write(&readme_path, "# Test Project\n\nThis is a test.").unwrap();
    fs::write(&shader_path, "fn test() {}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert!(doc.readme().is_some());
    assert!(doc.readme().unwrap().contains("Test Project"));
}

#[test]
fn test_document_with_favicon() {
    let temp_dir = TempDir::new().unwrap();
    let favicon_path = temp_dir.path().join("favicon.png");
    let shader_path = temp_dir.path().join("test.wgsl");

    let png_data = vec![0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
    fs::write(&favicon_path, png_data).unwrap();
    fs::write(&shader_path, "fn test() {}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert!(!doc.favicon().is_empty());
}

#[test]
fn test_document_ignores_hidden_files() {
    let temp_dir = TempDir::new().unwrap();

    fs::write(temp_dir.path().join(".hidden.wgsl"), "fn hidden() {}").unwrap();
    fs::write(temp_dir.path().join("visible.wgsl"), "fn visible() {}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert_eq!(doc.shaders().len(), 1);
    assert_eq!(doc.shaders()[0].module_name, "visible");
}

#[test]
fn test_document_register() {
    let temp_dir = TempDir::new().unwrap();
    let shader_path = temp_dir.path().join("test.wgsl");

    fs::write(&shader_path, "fn test() {}").unwrap();

    let doc = Document::open("test_project", temp_dir.path()).unwrap();
    let registered = doc.register();

    assert_eq!(registered.pkg_name(), "test_project");
    assert_eq!(registered.shaders().len(), 1);
}

#[test]
fn test_document_multiple_shaders() {
    let temp_dir = TempDir::new().unwrap();

    fs::write(temp_dir.path().join("shader1.wgsl"), "fn func1() {}").unwrap();
    fs::write(temp_dir.path().join("shader2.wgsl"), "fn func2() {}").unwrap();
    fs::write(temp_dir.path().join("shader3.wgsl"), "fn func3() {}").unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert_eq!(doc.shaders().len(), 3);
}

#[test]
fn test_document_file_registry() {
    let temp_dir = TempDir::new().unwrap();
    let shader_path = temp_dir.path().join("test.wgsl");

    fs::write(&shader_path, "fn test() {}").unwrap();

    let doc = Document::open("test_project", temp_dir.path()).unwrap();

    assert_eq!(doc.file_registry().len(), 1);
    assert!(doc.file_registry().iter().any(|p| p.ends_with("test.wgsl")));
}

#[test]
fn test_document_with_complex_shader() {
    let temp_dir = TempDir::new().unwrap();
    let shader_path = temp_dir.path().join("complex.wgsl");

    let shader_code = r#"
//! Module documentation

struct Point {
    x: f32,
    y: f32,
}

fn distance(a: Point, b: Point) -> f32 {
    let dx = a.x - b.x;
    let dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}
"#;

    fs::write(&shader_path, shader_code).unwrap();

    let result = Document::open("test_project", temp_dir.path());
    assert!(result.is_ok());

    let doc = result.unwrap();
    assert_eq!(doc.shaders().len(), 1);

    let shader = &doc.shaders()[0];
    assert!(shader.global_docs.is_some());
    assert_eq!(shader.structures.len(), 1);
    assert_eq!(shader.functions.len(), 1);
}

#[test]
fn test_registered_document_accessors() {
    let temp_dir = TempDir::new().unwrap();
    let shader_path = temp_dir.path().join("test.wgsl");

    fs::write(&shader_path, "fn test() {}").unwrap();

    let doc = Document::open("test_project", temp_dir.path()).unwrap();
    let registered = doc.register();

    assert_eq!(registered.pkg_name(), "test_project");
    assert!(!registered.shaders().is_empty());
    assert!(!registered.file_registry().is_empty());
    assert!(registered.readme().is_none());
    assert!(!registered.favicon().is_empty());
}