selfware 0.6.0

Your personal AI workshop — software you own, software that lasts
Documentation
use super::*;
use crate::swl::parser::ast::{
    AgentDefinition, CodeBlock, CodeLanguage, MapStage, ModelSpec, ReduceStage, SwlDocument,
    WorkflowDefinition,
};
use std::collections::BTreeMap;

fn valid_doc() -> SwlDocument {
    let mut agents = BTreeMap::new();
    agents.insert(
        "architect".to_string(),
        AgentDefinition {
            model: ModelSpec::Simple("mock-model".to_string()),
            role: Some("Review architecture".to_string()),
            instruction: None,
            tools: vec![],
            output_key: None,
            sub_agents: vec![],
        },
    );

    let mut workflows = BTreeMap::new();
    workflows.insert(
        "review".to_string(),
        WorkflowDefinition {
            workflow_type: WorkflowType::MapReduce,
            description: None,
            steps: vec![],
            map: Some(MapStage {
                targets: vec!["architect".to_string()],
                input: None,
                parallel: None,
            }),
            reduce: Some(ReduceStage::Code(CodeBlock {
                language: CodeLanguage::Rust,
                code: "fn merge() {}".to_string(),
            })),
            merge: None,
        },
    );

    SwlDocument {
        version: "2.0".to_string(),
        name: "code_review".to_string(),
        description: None,
        metadata: None,
        agents,
        workflows,
        guardrails: Vec::new(),
        telemetry: None,
        dashboard: None,
        state: None,
    }
}

#[test]
fn validate_document_accepts_minimal_valid_doc() {
    assert!(validate_document(&valid_doc()).is_empty());
}

#[test]
fn validate_document_rejects_unknown_map_targets() {
    let mut doc = valid_doc();
    doc.workflows
        .get_mut("review")
        .unwrap()
        .map
        .as_mut()
        .unwrap()
        .targets = vec!["missing".to_string()];

    let issues = validate_document(&doc);
    assert!(issues
        .iter()
        .any(|issue| issue.message.contains("unknown agent")));
}

#[test]
fn validate_document_accepts_object_model_specs() {
    let source = r#"
version: "1.0"
name: review
agents:
  architect:
    model:
      provider: openai
      name: txn545/Qwen3.5-122B-A10B-NVFP4
      temperature: 0.2
workflows:
  quick_review:
    type: sequential
    steps:
      - delegate: architect
"#;

    let doc = crate::swl::parser::parse_document(source).unwrap();
    assert!(validate_document(&doc).is_empty());
}