theway-core 0.1.22

theway core — stateful agent runtime + harness (Agent loop, skills, prompt templates, sessions, compaction) on top of theway-llm-provider.
Documentation
use super::*;

#[test]
fn validate_catches_dup_ids() {
    let nodes = vec![node_def("a", "x", "t", &[]), node_def("a", "x", "t", &[])];
    let errors = validate_graph(&nodes, None);
    assert!(errors.iter().any(|e| e.contains("重复的节点 id")));
}

#[test]
fn validate_catches_self_dependency() {
    let nodes = vec![node_def("a", "x", "t", &["a"])];
    let errors = validate_graph(&nodes, None);
    assert!(errors.iter().any(|e| e.contains("不能依赖自己")));
}

#[test]
fn validate_catches_unknown_dependency() {
    let nodes = vec![node_def("a", "x", "t", &["nope"])];
    let errors = validate_graph(&nodes, None);
    assert!(
        errors
            .iter()
            .any(|e| e.contains("依赖了不存在的节点 \"nope\""))
    );
}

#[test]
fn validate_catches_cycle() {
    let nodes = vec![
        node_def("a", "x", "t", &["c"]),
        node_def("b", "x", "t", &["a"]),
        node_def("c", "x", "t", &["b"]),
    ];
    let errors = validate_graph(&nodes, None);
    assert!(errors.iter().any(|e| e.contains("检测到依赖环")));
}

#[test]
fn validate_catches_unknown_agent() {
    let nodes = vec![node_def("a", "bogus", "t", &[])];
    let known = vec!["explorer".to_string(), "planner".to_string()];
    let errors = validate_graph(&nodes, Some(&known));
    assert!(
        errors
            .iter()
            .any(|e| e.contains("引用了未知 subagent \"bogus\""))
    );
    let ok = validate_graph(&nodes, None);
    assert!(ok.is_empty());
}

#[test]
fn validate_empty_known_agents_accepts_unknown_agent() {
    let nodes = vec![node_def("a", "bogus", "t", &[])];
    let errors = validate_graph(&nodes, Some(&[]));
    assert!(errors.is_empty());
}

#[test]
fn validate_catches_invalid_id_missing_agent_and_empty_task() {
    let nodes = vec![
        DagNodeDef {
            id: "bad id!".into(),
            agent: "x".into(),
            task: "t".into(),
            depends_on: None,
            timeout: None,
            cwd: None,
            provider: None,
            model: None,
            thinking: None,
            max_iterations: None,
            tools: None,
        },
        DagNodeDef {
            id: "ok".into(),
            agent: String::new(),
            task: "   ".into(),
            depends_on: None,
            timeout: None,
            cwd: None,
            provider: None,
            model: None,
            thinking: None,
            max_iterations: None,
            tools: None,
        },
    ];
    let errors = validate_graph(&nodes, None);
    assert!(errors.iter().any(|e| e.contains("非法")));
    assert!(errors.iter().any(|e| e.contains("缺少 agent")));
    assert!(errors.iter().any(|e| e.contains("缺少 task")));
}

#[test]
fn validate_accepts_agent_listed_in_known_agents() {
    let nodes = vec![node_def("a", "explorer", "t", &[])];
    let known = vec!["explorer".to_string(), "planner".to_string()];
    let errors = validate_graph(&nodes, Some(&known));
    assert!(errors.is_empty(), "{errors:?}");
}