rmcl 0.4.0

A fully featured Minecraft TUI launcher
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use ratatui::{Terminal, backend::TestBackend};

use super::*;

fn key(code: KeyCode, modifiers: KeyModifiers) -> KeyEvent {
    KeyEvent::new(code, modifiers)
}

fn entry(name: &str) -> ScreenshotEntry {
    ScreenshotEntry {
        name: name.to_owned(),
        path: name.into(),
        width: 1920,
        height: 1080,
    }
}

#[test]
fn grid_navigation_and_search_clamp_the_selection() {
    let mut state = ScreenshotsState {
        entries: vec![entry("one.png"), entry("two.png"), entry("three.png")],
        cols: 2,
        ..Default::default()
    };

    assert!(handle_key(
        &key(KeyCode::Right, KeyModifiers::SHIFT),
        &mut state
    ));
    assert_eq!(state.selected, 1);

    assert!(handle_key(
        &key(KeyCode::Down, KeyModifiers::SHIFT),
        &mut state
    ));
    assert_eq!(state.selected, 1);

    assert!(handle_key(
        &key(KeyCode::Char('/'), KeyModifiers::NONE),
        &mut state
    ));
    assert!(handle_key(
        &key(KeyCode::Char('t'), KeyModifiers::NONE),
        &mut state
    ));
    assert_eq!(state.selected, 0);
    assert_eq!(state.search.query, "t");
}

#[test]
fn unicode_filename_truncation_renders_without_panicking() {
    let mut state = ScreenshotsState {
        entries: vec![entry(&format!("{}é.png", "a".repeat(23)))],
        ..Default::default()
    };
    let backend = TestBackend::new(24, 8);
    let mut terminal = Terminal::new(backend).unwrap();

    terminal
        .draw(|frame| render(frame, frame.area(), &mut state, true))
        .unwrap();

    assert!(terminal.backend().to_string().contains("aaaa"));
}