kr580 2.0.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use crate::app::messages::SpeedTier;
use crate::app::settings_modal::SettingsDialog;
use crate::app::{DesktopApp, Message};
use crate::i18n::Lang;
use crate::persistence::{
    ColorScheme, NetworkSettings, ShortcutAction, ShortcutBinding, ShortcutKey, ShortcutSettings,
};

#[test]
fn dialog_copies_shortcut_settings() {
    let mut shortcuts = ShortcutSettings::default();
    shortcuts.assign(
        ShortcutAction::OpenMonitor,
        ShortcutBinding::new(true, true, true, ShortcutKey::M),
    );

    let dialog = SettingsDialog::new_with_shortcuts(
        Lang::Ru,
        SpeedTier::Medium,
        ColorScheme::DEFAULT,
        true,
        true,
        None,
        None,
        NetworkSettings::default(),
        shortcuts.clone(),
    );

    assert_eq!(dialog.draft_shortcuts, shortcuts);
    assert_eq!(dialog.original_shortcuts, shortcuts);
}

#[test]
fn shortcut_capture_updates_live_preview_and_draft() {
    let (mut app, _task) = DesktopApp::with_initial_path(None);
    app.shortcut_settings = ShortcutSettings::default();
    app.settings_dialog = Some(SettingsDialog::new_with_shortcuts(
        app.lang,
        app.default_speed,
        ColorScheme::DEFAULT,
        true,
        true,
        None,
        None,
        NetworkSettings::default(),
        app.shortcut_settings.clone(),
    ));

    let _ = app.update(Message::SettingsShortcutCaptureStarted(
        ShortcutAction::OpenMonitor,
    ));
    let _ = app.update(Message::SettingsShortcutCaptured(ShortcutBinding::new(
        true,
        true,
        true,
        ShortcutKey::M,
    )));

    let dialog = app.settings_dialog.as_ref().unwrap();
    assert_eq!(
        dialog.draft_shortcuts.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, true, true, ShortcutKey::M))
    );
    assert_eq!(
        app.shortcut_settings.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, true, true, ShortcutKey::M))
    );
    assert_eq!(dialog.recording_shortcut, None);

    let _ = app.update(Message::CloseSettings);

    assert_eq!(
        app.shortcut_settings.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, false, false, ShortcutKey::M))
    );
    assert!(app.settings_dialog.is_none());
}

#[test]
fn shortcut_reset_updates_live_preview_and_rolls_back_on_cancel() {
    let (mut app, _task) = DesktopApp::with_initial_path(None);
    let mut live_shortcuts = ShortcutSettings::default();
    live_shortcuts.assign(
        ShortcutAction::OpenMonitor,
        ShortcutBinding::new(true, true, true, ShortcutKey::M),
    );
    app.shortcut_settings = live_shortcuts.clone();
    app.settings_dialog = Some(SettingsDialog::new_with_shortcuts(
        app.lang,
        app.default_speed,
        ColorScheme::DEFAULT,
        true,
        true,
        None,
        None,
        NetworkSettings::default(),
        live_shortcuts,
    ));

    let _ = app.update(Message::SettingsShortcutsReset);

    let dialog = app.settings_dialog.as_ref().unwrap();
    assert_eq!(
        dialog.draft_shortcuts.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, false, false, ShortcutKey::M))
    );
    assert_eq!(
        app.shortcut_settings.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, false, false, ShortcutKey::M))
    );
    assert_eq!(dialog.recording_shortcut, None);

    let _ = app.update(Message::CloseSettings);

    assert_eq!(
        app.shortcut_settings.binding(ShortcutAction::OpenMonitor),
        Some(ShortcutBinding::new(true, true, true, ShortcutKey::M))
    );
    assert!(app.settings_dialog.is_none());
}