use freya::prelude::*;
use freya_testing::prelude::*;
#[test]
pub fn input_test() {
fn input_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.spacing(6.)
.child(Input::new(value).placeholder("Type your name"))
.child(format!("Your name is {}", value.read()))
}
let mut test = launch_test(input_app);
let placeholder = test.find(|_, element| {
Paragraph::try_downcast(element)
.filter(|paragraph| paragraph.spans.iter().any(|s| s.text == "Type your name"))
});
assert!(placeholder.is_some());
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "Your name is ")
});
assert!(label.is_some());
test.click_cursor((15.0, 15.0));
test.write_text("Rust");
let text = test.find(|_, element| {
Paragraph::try_downcast(element)
.filter(|paragraph| paragraph.spans.iter().any(|s| s.text == "Rust"))
});
assert!(text.is_some());
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "Your name is Rust")
});
assert!(label.is_some());
}
#[test]
pub fn input_password_mode_test() {
fn password_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.child(Input::new(value).mode(InputMode::new_password()))
.child(format!("value={}", value.read()))
}
let mut test = launch_test(password_app);
test.click_cursor((15.0, 15.0));
test.write_text("secret");
let masked = test.find(|_, element| {
Paragraph::try_downcast(element)
.filter(|paragraph| paragraph.spans.iter().any(|s| s.text == "******"))
});
assert!(masked.is_some());
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=secret")
});
assert!(label.is_some());
}
#[test]
pub fn input_validator_test() {
fn validator_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.child(
Input::new(value).on_validate(move |validator: InputValidator| {
if !validator.text().chars().all(|c| c.is_ascii_digit()) {
validator.set_valid(false);
}
}),
)
.child(format!("value={}", value.read()))
}
let mut test = launch_test(validator_app);
test.click_cursor((15.0, 15.0));
test.write_text("abc");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=")
});
assert!(label.is_some());
test.write_text("123");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=123")
});
assert!(label.is_some());
}
#[test]
pub fn input_submit_test() {
fn submit_app() -> impl IntoElement {
let value = use_state(String::new);
let mut submitted = use_state(String::new);
rect()
.child(Input::new(value).on_submit(move |text: String| {
submitted.set(text);
}))
.child(format!("submitted={}", submitted.read()))
}
let mut test = launch_test(submit_app);
test.click_cursor((15.0, 15.0));
test.write_text("hello");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "submitted=")
});
assert!(label.is_some());
test.press_key(Key::Named(NamedKey::Enter));
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "submitted=hello")
});
assert!(label.is_some());
}
#[test]
pub fn input_disabled_test() {
fn disabled_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.child(Input::new(value).enabled(false))
.child(format!("value={}", value.read()))
}
let mut test = launch_test(disabled_app);
test.click_cursor((15.0, 15.0));
test.write_text("hello");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=")
});
assert!(label.is_some());
}
#[test]
pub fn input_escape_unfocus_test() {
fn escape_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.child(Input::new(value))
.child(format!("value={}", value.read()))
}
let mut test = launch_test(escape_app);
test.click_cursor((15.0, 15.0));
test.write_text("hello");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=hello")
});
assert!(label.is_some());
test.press_key(Key::Named(NamedKey::Escape));
test.sync_and_update();
test.write_text("world");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=hello")
});
assert!(label.is_some());
}
#[test]
pub fn input_shift_wheel_scroll_test() {
fn scroll_app() -> impl IntoElement {
let value = use_state(String::new);
rect().child(Input::new(value).width(Size::px(150.)))
}
let mut test = launch_test(scroll_app);
test.click_cursor((15.0, 15.0));
test.write_text("this is a very long text that overflows the input width");
let paragraph_x = |test: &TestingRunner| {
test.find(|node, element| {
Paragraph::try_downcast(element).map(|_| node.layout().area.min_x())
})
.unwrap()
};
let initial_x = paragraph_x(&test);
test.send_event(PlatformEvent::Keyboard {
name: KeyboardEventName::KeyDown,
key: Key::Named(NamedKey::Shift),
code: Code::ShiftLeft,
modifiers: Modifiers::SHIFT,
});
test.sync_and_update();
test.send_event(PlatformEvent::Wheel {
name: WheelEventName::Wheel,
scroll: (0.0, -50.0).into(),
cursor: (75.0, 15.0).into(),
source: WheelSource::Device,
});
test.sync_and_update();
let scrolled_x = paragraph_x(&test);
assert!(scrolled_x < initial_x);
}
#[test]
pub fn input_auto_focus_test() {
fn auto_focus_app() -> impl IntoElement {
let value = use_state(String::new);
rect()
.child(Input::new(value).auto_focus(true))
.child(format!("value={}", value.read()))
}
let mut test = launch_test(auto_focus_app);
test.sync_and_update();
test.write_text("typed");
let label = test.find(|_, element| {
Label::try_downcast(element).filter(|label| label.text.as_ref() == "value=typed")
});
assert!(label.is_some());
}