rmcl 0.4.0

A fully featured Minecraft TUI launcher
use super::*;
use crate::tests::TEST_LOCK;

#[test]
fn newest_task_is_visible_and_drop_restores_previous_task() {
    let _guard = TEST_LOCK.lock().unwrap();
    clear();
    let first = ProgressTask::start("first");
    first.set_progress(1, 2);
    {
        let second = ProgressTask::start("second");
        second.set_sub_action("working");
        let state = PROGRESS.lock().unwrap();
        assert_eq!(state.current_action.as_deref(), Some("second"));
        assert_eq!(state.sub_action.as_deref(), Some("working"));
    }
    let state = PROGRESS.lock().unwrap();
    assert_eq!(state.current_action.as_deref(), Some("first"));
    assert_eq!(state.progress, Some((1, 2)));
    drop(state);
    first.finish();
    clear();
}

#[test]
fn changing_phase_resets_progress_to_indeterminate() {
    let _guard = TEST_LOCK.lock().unwrap();
    clear();
    let task = ProgressTask::start("inventory");
    task.set_progress(4, 10);
    task.set_action("provider matching");

    let state = PROGRESS.lock().unwrap();
    assert_eq!(state.current_action.as_deref(), Some("provider matching"));
    assert_eq!(state.progress, None);
    drop(state);

    task.finish();
    assert!(!is_active());
    clear();
}

#[test]
fn clearing_legacy_progress_keeps_owned_tasks() {
    let _guard = TEST_LOCK.lock().unwrap();
    clear();
    let task = ProgressTask::start("indexing");
    set_action("legacy download");
    clear();

    let state = PROGRESS.lock().unwrap();
    assert_eq!(state.current_action.as_deref(), Some("indexing"));
    drop(state);

    task.finish();
    clear();
}

#[test]
fn a_new_legacy_action_does_not_reuse_the_previous_phase_progress() {
    let _guard = TEST_LOCK.lock().unwrap();
    clear();
    set_action("Downloading installer");
    set_progress(1, 1);

    set_action("Running installer");

    let state = PROGRESS.lock().unwrap();
    assert_eq!(state.current_action.as_deref(), Some("Running installer"));
    assert_eq!(state.progress, None);
    drop(state);
    clear();
}