magi-code 0.64.0

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;
use crate::output::{ActivityEvent, ActivityId, ActivityKind, ActivityMetadata, ActivityStatus};

#[test]
fn layout_mode_defaults_and_switches_without_touching_display_state() {
    let mut state = MissionControlState {
        input: "draft".to_string(),
        focus_pane: crate::tui::state::TuiFocusPane::ActivityTree,
        prompt_cursor: 3,
        show_help: true,
        ..Default::default()
    };

    assert_eq!(state.layout_mode, TuiLayoutMode::TranscriptFocused);
    state.focus_activity_layout();
    state.focus_activity_layout();
    assert_eq!(state.layout_mode, TuiLayoutMode::ActivityFocused);
    assert_eq!(state.input, "draft");
    assert!(state.is_activity_tree_focused());
    assert_eq!(state.prompt_cursor, 3);
    assert_eq!(state.transcript_scroll_offset(), 0);
    assert_eq!(state.activity_scroll_offset(), 0);
    assert_eq!(state.detail_offset(), 0);
    assert!(state.show_help);

    state.focus_transcript_layout();
    state.focus_transcript_layout();
    assert_eq!(state.layout_mode, TuiLayoutMode::TranscriptFocused);
    assert_eq!(state.input, "draft");
    assert!(state.is_activity_tree_focused());
    assert_eq!(state.prompt_cursor, 3);
    assert_eq!(state.transcript_scroll_offset(), 0);
    assert_eq!(state.activity_scroll_offset(), 0);
    assert_eq!(state.detail_offset(), 0);
    assert!(state.show_help);
}

#[test]
fn pane_focus_defaults_and_switches_without_touching_display_state() {
    let mut state = MissionControlState {
        input: "draft".to_string(),
        prompt_cursor: 3,
        prompt_cursor_visible: false,
        ..Default::default()
    };

    assert!(state.is_prompt_focused());
    state.focus_pane = TuiFocusPane::Transcript;
    state.prompt_cursor_visible = false;
    assert!(state.is_transcript_focused());
    state.focus_activity_tree();
    assert!(state.is_activity_tree_focused());
    state.focus_activity_detail();
    assert!(state.is_activity_detail_focused());
    state.focus_prompt();
    assert!(state.is_prompt_focused());
    assert!(state.prompt_cursor_visible);
    assert_eq!(state.input, "draft");
    assert_eq!(state.prompt_cursor, 3);
    assert_eq!(state.transcript_scroll_offset(), 0);
    assert_eq!(state.activity_scroll_offset(), 0);
    assert_eq!(state.detail_offset(), 0);
}

#[test]
fn detail_first_scroll_and_window_do_not_build_full_wrap_cache() {
    let mut state = MissionControlState::default();
    let id = ActivityId::new("tool-large-detail");
    state.apply_activity_event(ActivityEvent::Started {
        id: id.clone(),
        parent_id: None,
        kind: ActivityKind::Tool,
        status: ActivityStatus::Running,
        metadata: ActivityMetadata::new("large detail"),
    });
    state.apply_activity_event(ActivityEvent::Delta {
        id,
        preview: (0..200)
            .map(|index| format!("detail line {index}"))
            .collect::<Vec<_>>()
            .join("\n"),
    });

    assert!(state.scroll_detail_down_by(3, 6, 80));
    assert!(state.detail_body_visual_rows(80) > 0);
    let cache = state.activity_render_cache.borrow();
    let detail = cache.selected_detail.as_ref().expect("detail cache");
    assert!(detail.body_wrap_cache.contains_key(&80));
}