tests.rs
raw
use super::*;
use crate::clipboard::NoClipboard;
use crate::event::{Modifiers, PointerButton};
fn click_at(expander: &mut Expander, y: f64) -> bool {
expander.on_pointer(
EventKind::Click,
&PointerEvent {
window: Point::new(20.0, y),
local: Point::new(20.0, y),
button: Some(PointerButton::Left),
click_count: 1,
},
&mut TextContext::hermetic([]),
&mut NoClipboard,
)
}
/// Controlled: the widget *asks*, and the application's binding is what
/// actually opens it. Without that an accordion — one open at a time — could
/// not be expressed by binding, and the widget would fight the state.
#[test]
fn opening_is_a_request_not_an_action() {
let mut expander = Expander::new();
assert!(
click_at(&mut expander, 10.0),
"the title row took the click"
);
assert!(
!expander.is_open(),
"it did not open itself; the app answers by setting `:open`"
);
assert_eq!(
expander.take_emitted(),
vec![EventData::Toggled(true)],
"it reported which way it was asked to go"
);
expander.set_open(true);
assert!(expander.is_open());
assert!(
expander.take_emitted().is_empty(),
"and a programmatic set is silent, so the binding cannot loop"
);
}
/// A click in the content belongs to the content, not to the disclosure.
#[test]
fn only_the_title_row_toggles() {
let mut expander = Expander::new();
expander.set_open(true);
let _ = expander.take_emitted();
assert!(!click_at(&mut expander, HEADER_H + 20.0));
assert!(expander.take_emitted().is_empty());
}
#[test]
fn enter_and_space_ask_too() {
for key in [Key::Enter, Key::Character(" ".into())] {
let mut expander = Expander::new();
assert!(expander.on_key(
&KeyInput {
key,
modifiers: Modifiers::default(),
pressed: true
},
&mut TextContext::hermetic([]),
&mut NoClipboard,
));
assert_eq!(expander.take_emitted(), vec![EventData::Toggled(true)]);
}
}
#[test]
fn it_announces_a_disclosure() {
let mut expander = Expander::new();
expander.set_title("Details");
expander.set_open(true);
let mut node = accesskit::Node::new(accesskit::Role::Button);
expander.accessibility(&mut node);
assert_eq!(node.label(), Some("Details"));
assert!(node.is_expanded().unwrap_or(false));
}