magi-code 0.64.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;
use crate::output::{
    ActivityEvent, ActivityId, ActivityKind, ActivityMetadata, ActivityStatus, OutputEvent,
    ToolDisplaySummary, ToolStatus,
};
use ratatui::{backend::TestBackend, buffer::Buffer, style::Modifier};

use super::test_support::{find_text, find_text_in_area};

const TEST_PICKER_VISIBLE_ROWS: usize = crate::tui::input::DEFAULT_PICKER_VISIBLE_ROWS as usize;

fn rendered_text_in_area(buffer: &Buffer, area: Rect) -> String {
    let mut rendered = String::new();
    for y in area.y..area.y + area.height {
        for x in area.x..area.x + area.width {
            rendered.push_str(buffer[(x, y)].symbol());
        }
        rendered.push('\n');
    }
    rendered
}

fn assert_square_corners(buffer: &Buffer, area: Rect) {
    assert_eq!(buffer[(area.x, area.y)].symbol(), "");
    assert_eq!(buffer[(area.x + area.width - 1, area.y)].symbol(), "");
    assert_eq!(buffer[(area.x, area.y + area.height - 1)].symbol(), "");
    assert_eq!(
        buffer[(area.x + area.width - 1, area.y + area.height - 1)].symbol(),
        ""
    );
}

fn state_with_autocomplete() -> MissionControlState {
    let mut state = MissionControlState {
        input: "/n".to_string(),
        prompt_cursor: 2,
        focus_pane: crate::tui::state::TuiFocusPane::Prompt,
        ..Default::default()
    };
    state.recompute_autocomplete(&[
        crate::tui::state::AutocompleteCandidate::slash_command("new", "start a new session"),
        crate::tui::state::AutocompleteCandidate::slash_command("quit", "exit magi-code"),
    ]);
    state
}

mod activity;
mod help;
mod layout;
mod misc;
mod modals;
mod prompt;
mod transcript;

#[test]
fn production_scroll_view_keeps_invariant_gutter_with_always_vertical_bar() {
    use ratatui::{Terminal, widgets::Paragraph};
    use std::cell::RefCell;

    fn render(content_height: u16) -> Buffer {
        let backend = TestBackend::new(6, 3);
        let mut terminal = Terminal::new(backend).unwrap();
        let scroll_state = RefCell::new(tui_scrollview::ScrollViewState::default());
        terminal
            .draw(|frame| {
                render_scroll_view_persistent(
                    frame,
                    frame.area(),
                    0,
                    content_height,
                    Paragraph::new("one\ntwo\nthree\nfour"),
                    &scroll_state,
                );
            })
            .unwrap();
        terminal.backend().buffer().clone()
    }

    let without_overflow = render(3);
    let with_overflow = render(4);

    assert_eq!(without_overflow[(5, 1)].symbol(), "");
    assert_eq!(without_overflow[(5, 1)].fg, MATRIX_GREEN.green_bright);
    assert_eq!(without_overflow[(5, 1)].bg, ratatui::style::Color::Reset);
    assert_eq!(with_overflow[(5, 1)].symbol(), "");
    assert_eq!(with_overflow[(5, 1)].fg, MATRIX_GREEN.green_bright);
    assert_eq!(with_overflow[(5, 1)].bg, ratatui::style::Color::Reset);
    assert_eq!(with_overflow[(2, 2)].symbol(), "r");
}
#[test]
fn invariant_scroll_view_width_reserves_gutter_for_all_heights() {
    let area = Rect::new(0, 0, 20, 4);
    assert_eq!(scroll_view_content_width(area), 19);
    assert_eq!(scroll_view_content_width(Rect::new(0, 0, 1, 4)), 0);
    assert_eq!(scroll_view_content_width(Rect::new(0, 0, 0, 4)), 0);
}