malvin 0.2.6

Non-interactive research and coding agent
use super::map_event::map_npm_pi_event;
use super::session_turn::TurnState;

#[test]
fn maps_text_and_thinking_deltas() {
    let mut state = TurnState::default();
    let text = serde_json::json!({
        "type": "message_update",
        "assistantMessageEvent": {"type": "text_delta", "delta": "Hi"}
    });
    let evs = map_npm_pi_event(&text, &mut state);
    assert_eq!(evs.len(), 1);
    assert_eq!(state.response_text, "Hi");
    let think = serde_json::json!({
        "type": "message_update",
        "assistantMessageEvent": {"type": "thinking_delta", "delta": "hmm"}
    });
    assert_eq!(map_npm_pi_event(&think, &mut state).len(), 1);
}

#[test]
fn maps_tools_and_settled() {
    let mut state = TurnState::default();
    let start = serde_json::json!({
        "type": "tool_execution_start",
        "toolCallId": "t1",
        "toolName": "bash"
    });
    assert_eq!(map_npm_pi_event(&start, &mut state).len(), 1);
    let settled = serde_json::json!({"type": "agent_settled"});
    assert!(map_npm_pi_event(&settled, &mut state).is_empty());
    assert!(state.settled);
}

#[test]
fn agent_end_fills_text_when_empty() {
    let mut state = TurnState::default();
    let end = serde_json::json!({
        "type": "agent_end",
        "messages": [{
            "role": "assistant",
            "content": [{"type": "text", "text": "done"}]
        }]
    });
    assert!(map_npm_pi_event(&end, &mut state).is_empty());
    assert_eq!(state.response_text, "done");
}