codetwin 0.1.10

A code to diagram/documentation generator.
Documentation
use std::collections::HashMap;
use std::path::PathBuf;

use codetwin::config::Config;
use codetwin::ir::{
    Blueprint, Class, Documentation, Element, Method, Parameter, Signature, Visibility,
};
use codetwin::layouts::get_layout;

fn sample_blueprint(path: &str) -> Blueprint {
    Blueprint {
        source_path: PathBuf::from(path),
        language: "rust".to_string(),
        elements: vec![Element::Class(Class {
            name: "Widget".to_string(),
            visibility: Visibility::Public,
            methods: vec![Method {
                name: "new".to_string(),
                visibility: Visibility::Public,
                is_static: true,
                signature: Signature {
                    parameters: vec![Parameter {
                        name: "name".to_string(),
                        type_annotation: Some("String".to_string()),
                        default_value: None,
                    }],
                    return_type: Some("Self".to_string()),
                },
                documentation: Documentation {
                    summary: Some("Creates a widget".to_string()),
                    description: None,
                    examples: vec![],
                },
            }],
            properties: vec![],
            documentation: Documentation {
                summary: Some("A test widget".to_string()),
                description: None,
                examples: vec![],
            },
        })],
        dependencies: vec![],
    }
}

#[test]
fn folder_markdown_layout_outputs_folder_and_index() {
    let config = Config {
        layout: "folder_markdown".to_string(),
        ..Config::defaults()
    };

    let layout = get_layout(&config).expect("layout lookup");
    let blueprints = vec![sample_blueprint("src/example.rs")];

    let outputs = layout.format(&blueprints).expect("format ok");
    let map: HashMap<String, String> = outputs.into_iter().collect();

    assert!(map.contains_key("src.md"), "should emit folder markdown");

    let folder_content = map.get("src.md").unwrap();
    assert!(folder_content.contains("# src"));
    assert!(folder_content.contains("classDiagram"));
}

#[test]
fn one_per_file_layout_emits_one_file_per_blueprint() {
    let config = Config {
        layout: "one_per_file".to_string(),
        ..Config::defaults()
    };

    let layout = get_layout(&config).expect("layout lookup");
    let blueprints = vec![
        sample_blueprint("src/foo.rs"),
        sample_blueprint("src/bar.rs"),
    ];

    let outputs = layout.format(&blueprints).expect("format ok");
    let map: HashMap<String, String> = outputs.into_iter().collect();

    assert!(map.contains_key("foo.md"));
    assert!(map.contains_key("bar.md"));

    for content in map.values() {
        assert!(!content.trim().is_empty(), "content should not be empty");
    }
}