rmcl 0.4.0

A fully featured Minecraft TUI launcher
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use tui_prompts::{State as PromptState, TextState};

use super::*;
use crate::tests::TEST_LOCK;

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

#[test]
fn vanilla_wizard_reaches_confirm_and_returns_parameters() {
    let _guard = TEST_LOCK.lock().unwrap_or_else(|error| error.into_inner());
    let mut instances = instances::State {
        show_popup: true,
        ..instances::State::default()
    };

    {
        let mut state = WIZARD_STATE.lock().unwrap();
        *state = WizardState::default();
        state.name_state = TextState::new().with_value("Test Instance");
    }
    *WIZARD_RESULT.lock().unwrap() = None;

    handle_key(&key(KeyCode::Enter), &mut instances);
    assert_eq!(WIZARD_STATE.lock().unwrap().step, WizardStep::Loader);

    {
        let mut state = WIZARD_STATE.lock().unwrap();
        state.step = WizardStep::Version;
        state.versions = LoadState::Loaded(vec![GameVersion {
            id: "1.21.1".to_owned(),
            stable: true,
        }]);
    }
    handle_key(&key(KeyCode::Enter), &mut instances);
    assert_eq!(WIZARD_STATE.lock().unwrap().step, WizardStep::Confirm);

    handle_key(&key(KeyCode::Enter), &mut instances);
    let result = take_result().expect("wizard result");
    assert_eq!(result.name, "Test Instance");
    assert_eq!(result.game_version, "1.21.1");
    assert_eq!(result.loader, ModLoader::Vanilla);
    assert_eq!(result.loader_version, None);
    assert!(!instances.show_popup);
}

#[test]
fn version_filter_clamps_a_stale_selection() {
    let mut state = WizardState {
        versions: LoadState::Loaded(vec![
            GameVersion {
                id: "1.21.1".to_owned(),
                stable: true,
            },
            GameVersion {
                id: "25w01a".to_owned(),
                stable: false,
            },
        ]),
        version_idx: 9,
        ..WizardState::default()
    };

    clamp_version_index(&mut state);
    assert_eq!(state.version_idx, 0);
    assert_eq!(visible_versions(&state).len(), 1);

    state.show_snapshots = true;
    assert_eq!(visible_versions(&state).len(), 2);
}

#[test]
fn ctrl_backspace_deletes_the_word_before_the_name_cursor() {
    let _guard = TEST_LOCK.lock().unwrap_or_else(|error| error.into_inner());
    let mut instances = instances::State::default();

    {
        let mut state = WIZARD_STATE.lock().unwrap();
        *state = WizardState::default();
        state.name_state = TextState::new().with_value("hello brave world");
        *state.name_state.position_mut() = "hello brave".chars().count();
    }

    handle_key(
        &KeyEvent::new(KeyCode::Backspace, KeyModifiers::CONTROL),
        &mut instances,
    );

    let state = WIZARD_STATE.lock().unwrap();
    assert_eq!(state.name_state.value(), "hello  world");
    assert_eq!(state.name_state.position(), "hello ".chars().count());
}