tests.rs raw

use super::*;
use crate::clipboard::NoClipboard;
use crate::event::Modifiers;

fn press(combo: &mut ComboBox, key: Key) -> bool {
    combo.on_key(
        &KeyInput {
            key,
            modifiers: Modifiers::default(),
            pressed: true,
        },
        &mut TextContext::hermetic([]),
        &mut NoClipboard,
    )
}

/// It is a text field first, and the field is the real one: the value goes
/// through to it rather than into a copy.
///
/// The *editing* is not re-tested here — it is `TextInput`'s, exercised by
/// `TextInput`'s own tests and end to end by the `.gdc` differential. What
/// this asserts is that a combo box holds no second buffer to drift from it.
#[test]
fn the_field_is_the_real_one() {
    let mut combo = ComboBox::new(14.0);
    combo.set_text("hello");
    assert_eq!(combo.text(), "hello");
    // An ordinary editing key reaches the field rather than being swallowed.
    assert!(press(&mut combo, Key::End), "the field took it");
}

/// Down opens the list — the one key it takes that a plain field does not.
/// Checked before delegating, or the field would consume it as caret movement.
#[test]
fn down_asks_for_the_list_only_while_it_is_closed() {
    let mut combo = ComboBox::new(14.0);
    assert!(press(&mut combo, Key::Down));
    assert_eq!(combo.take_emitted(), vec![EventData::MenuOpen]);

    // With the list up, Down belongs to the list's own navigation.
    combo.set_menu_open(true);
    press(&mut combo, Key::Down);
    assert!(
        !combo.take_emitted().contains(&EventData::MenuOpen),
        "an open list keeps its arrows"
    );
}

/// The popup is described by the widget rather than discovered by the tree
/// downcasting to it — which is what lets a combo box host one at all.
#[test]
fn it_describes_its_own_popup() {
    let combo = ComboBox::new(14.0);
    let popup = combo.popup().expect("a combo box hosts a popup");
    assert!(!popup.beside, "the list drops below the field");
    assert!(popup.match_width, "and is as wide as it");
    assert!(combo.defers_content(), "its rows are built when it opens");
}

#[test]
fn it_announces_itself_and_whether_it_is_open() {
    let mut combo = ComboBox::new(14.0);
    assert_eq!(combo.role(), accesskit::Role::ComboBox);
    combo.set_menu_open(true);
    let mut node = accesskit::Node::new(accesskit::Role::ComboBox);
    combo.accessibility(&mut node);
    assert!(node.is_expanded().unwrap_or(false));
}