1
//! Tests for the focus resolver and overlay key policies.
2

            
3
use super::*;
4
use crate::app::App;
5
use crate::form::Form;
6
use crate::modal::{KeyPolicy, Modal};
7
use crate::view::Tab;
8
use crate::widgets::EditMode;
9
use sqlx::types::Uuid;
10

            
11
10
fn app() -> App {
12
10
    App::new(Uuid::new_v4(), EditMode::Emacs)
13
10
}
14

            
15
// ── current_focus precedence ────────────────────────────────────────────────
16

            
17
#[test]
18
1
fn default_focus_is_view_pane() {
19
1
    assert_eq!(current_focus(&app()), FocusTarget::ViewPane);
20
1
}
21

            
22
#[test]
23
1
fn cmdline_active_yields_cmdline_focus() {
24
1
    let mut a = app();
25
1
    a.open_command_line();
26
1
    assert_eq!(current_focus(&a), FocusTarget::CmdLine);
27
1
}
28

            
29
#[test]
30
1
fn console_focused_yields_console_input_focus() {
31
1
    let mut a = app();
32
1
    a.console_focused = true;
33
1
    assert_eq!(current_focus(&a), FocusTarget::ConsoleInput);
34
1
}
35

            
36
#[test]
37
1
fn overlay_non_empty_yields_overlay_focus() {
38
1
    let mut a = app();
39
1
    a.overlays.push(Modal::Help);
40
1
    assert_eq!(current_focus(&a), FocusTarget::Overlay);
41
1
}
42

            
43
#[test]
44
1
fn overlay_takes_precedence_over_cmdline() {
45
1
    let mut a = app();
46
1
    a.open_command_line();
47
1
    a.overlays.push(Modal::Help);
48
1
    assert_eq!(current_focus(&a), FocusTarget::Overlay);
49
1
}
50

            
51
#[test]
52
1
fn overlay_takes_precedence_over_console_focused() {
53
1
    let mut a = app();
54
1
    a.console_focused = true;
55
1
    a.overlays.push(Modal::Help);
56
1
    assert_eq!(current_focus(&a), FocusTarget::Overlay);
57
1
}
58

            
59
#[test]
60
1
fn cmdline_takes_precedence_over_console_focused() {
61
1
    let mut a = app();
62
1
    a.console_focused = true;
63
1
    a.open_command_line();
64
1
    assert_eq!(current_focus(&a), FocusTarget::CmdLine);
65
1
}
66

            
67
// ── overlay key policy ──────────────────────────────────────────────────────
68

            
69
#[test]
70
1
fn help_overlay_has_display_policy() {
71
1
    assert_eq!(Modal::Help.key_policy(), KeyPolicy::Display);
72
1
}
73

            
74
#[test]
75
1
fn config_set_overlay_has_input_policy() {
76
1
    let m = Modal::Form(Form::config_set(
77
1
        crate::widgets::Editor::new(EditMode::Emacs),
78
1
        crate::widgets::Editor::new(EditMode::Emacs),
79
1
    ));
80
1
    assert_eq!(m.key_policy(), KeyPolicy::Input);
81
1
}
82

            
83
// ── console emacs-pinned ────────────────────────────────────────────────────
84

            
85
#[test]
86
1
fn console_input_is_emacs_pinned_even_in_vim_mode() {
87
1
    let mut a = app();
88
1
    a.set_edit_mode(EditMode::Vim);
89
1
    a.console_focused = true;
90
    // The console input editor is always Emacs.
91
1
    assert_eq!(a.console.input.mode(), EditMode::Emacs);
92
    // current_focus is ConsoleInput, not overridden by vim edit_mode.
93
1
    assert_eq!(current_focus(&a), FocusTarget::ConsoleInput);
94
1
}
95

            
96
// ── ConsoleFocus only effective on Console tab ──────────────────────────────
97

            
98
#[test]
99
1
fn console_focus_only_set_on_console_tab() {
100
    use crate::event::{Intent, apply};
101
1
    let mut a = app();
102
1
    a.active_tab = Tab::Accounts;
103
    // ConsoleFocus on non-Console tab is absorbed by handle_tab but has no effect.
104
1
    apply(&mut a, Intent::ConsoleFocus);
105
1
    assert!(
106
1
        !a.console_focused,
107
        "ConsoleFocus on Accounts tab must not set console_focused"
108
    );
109

            
110
1
    let mut b = app();
111
1
    b.active_tab = Tab::Console;
112
1
    apply(&mut b, Intent::ConsoleFocus);
113
1
    assert!(
114
1
        b.console_focused,
115
        "ConsoleFocus on Console tab must set console_focused"
116
    );
117
1
}