use freya::prelude::*;
use freya_core::prelude::Label;
use freya_testing::prelude::*;
#[test]
pub fn virtual_scroll_view_wheel() {
fn virtual_scroll_view_wheel_app() -> impl IntoElement {
VirtualScrollView::new(|i, _| {
label()
.key(i)
.height(Size::px(50.))
.text(format!("{i} Hello, World!"))
.into()
})
.length(30)
.item_size(50.)
}
let mut test = launch_test(virtual_scroll_view_wheel_app);
test.sync_and_update();
let scrollview = test
.find(|node, element| {
Rect::try_downcast(element)
.filter(|rect| rect.accessibility.builder.role() == AccessibilityRole::ScrollView)
.map(move |_| node)
})
.unwrap();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
for (n, i) in (0..11).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
test.scroll((5., 5.), (0., -300.));
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
for (n, i) in (6..17).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
}
#[test]
pub fn virtual_scroll_view_scrollbar() {
fn virtual_scroll_view_scrollbar_app() -> impl IntoElement {
VirtualScrollView::new(|i, _| {
label()
.key(i)
.height(Size::px(50.))
.text(format!("{i} Hello, World!"))
.into()
})
.length(30)
.item_size(50.)
}
let mut test = launch_test(virtual_scroll_view_scrollbar_app);
test.sync_and_update();
let scrollview = test
.find(|node, element| {
Rect::try_downcast(element)
.filter(|rect| rect.accessibility.builder.role() == AccessibilityRole::ScrollView)
.map(move |_| node)
})
.unwrap();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
for (n, i) in (0..11).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
test.move_cursor((495., 20.));
test.sync_and_update();
test.press_cursor((495., 20.));
test.sync_and_update();
test.move_cursor((495., 320.));
test.sync_and_update();
test.release_cursor((495., 320.));
test.sync_and_update();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
for (n, i) in (18..29).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
for _ in 0..11 {
test.press_key(Key::ArrowUp);
}
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
for (n, i) in (0..11).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
test.press_key(Key::End);
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 10);
for (n, i) in (20..30).enumerate() {
let child = &content[n];
assert_eq!(
Label::try_downcast(&*child.element()).unwrap().text,
format!("{i} Hello, World!").as_str()
);
}
}
#[test]
pub fn virtual_scroll_view_controlled() {
fn virtual_scroll_view_controlled_app() -> impl IntoElement {
let scroll_controller = use_scroll_controller(ScrollConfig::default);
rect()
.horizontal()
.content(Content::Flex)
.child(
VirtualScrollView::new_controlled(
|i, _| {
label()
.key(i)
.height(Size::px(50.))
.text(format!("{i} Hello, World!"))
.into()
},
scroll_controller,
)
.length(30)
.item_size(50.)
.width(Size::flex(1.)),
)
.child(
VirtualScrollView::new_controlled(
|i, _| {
label()
.key(i)
.height(Size::px(50.))
.text(format!("{i} Second View"))
.into()
},
scroll_controller,
)
.length(30)
.item_size(50.)
.width(Size::flex(1.)),
)
}
let mut test = launch_test(virtual_scroll_view_controlled_app);
test.sync_and_update();
let scrollviews = test.find_many(|node, element| {
Rect::try_downcast(element)
.filter(|rect| rect.accessibility.builder.role() == AccessibilityRole::ScrollView)
.map(move |_| node)
});
let scrollview1 = &scrollviews[0];
let scrollview2 = &scrollviews[1];
let content1 = scrollview1.children()[0].children()[0].children();
let content2 = scrollview2.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content1[0].element()).unwrap().text,
"0 Hello, World!"
);
assert_eq!(
Label::try_downcast(&*content2[0].element()).unwrap().text,
"0 Second View"
);
test.scroll((100., 100.), (0., -300.));
let content1 = scrollview1.children()[0].children()[0].children();
let content2 = scrollview2.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content1[0].element()).unwrap().text,
"6 Hello, World!"
);
assert_eq!(
Label::try_downcast(&*content2[0].element()).unwrap().text,
"6 Second View"
);
test.scroll((400., 100.), (0., -150.));
let content1 = scrollview1.children()[0].children()[0].children();
let content2 = scrollview2.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content1[0].element()).unwrap().text,
"9 Hello, World!"
);
assert_eq!(
Label::try_downcast(&*content2[0].element()).unwrap().text,
"9 Second View"
);
}
#[test]
pub fn virtual_scroll_view_keyboard_navigation() {
fn virtual_scroll_view_keyboard_app() -> impl IntoElement {
VirtualScrollView::new(|i, _| {
label()
.key(i)
.height(Size::px(50.))
.text(format!("{i} Hello, World!"))
.into()
})
.length(30)
.item_size(50.)
}
let mut test = launch_test(virtual_scroll_view_keyboard_app);
test.sync_and_update();
let scrollview = test
.find(|node, element| {
Rect::try_downcast(element)
.filter(|rect| rect.accessibility.builder.role() == AccessibilityRole::ScrollView)
.map(move |_| node)
})
.unwrap();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0 Hello, World!"
);
test.move_cursor((495., 20.));
test.sync_and_update();
test.press_cursor((495., 20.));
test.sync_and_update();
test.move_cursor((495., 25.));
test.sync_and_update();
test.move_cursor((495., 20.));
test.sync_and_update();
test.release_cursor((495., 20.));
test.sync_and_update();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0 Hello, World!"
);
for _ in 0..5 {
test.press_key(Key::ArrowDown);
}
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"10 Hello, World!"
);
for _ in 0..3 {
test.press_key(Key::ArrowUp);
}
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"4 Hello, World!"
);
test.press_key(Key::End);
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[content.len() - 1].element())
.unwrap()
.text,
"29 Hello, World!"
);
test.press_key(Key::Home);
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0 Hello, World!"
);
}
#[test]
pub fn virtual_scroll_view_keyboard_navigation_horizontal() {
fn virtual_scroll_view_horizontal_app() -> impl IntoElement {
VirtualScrollView::new(|i, _| {
label()
.key(i)
.width(Size::px(50.))
.text(format!("{i}"))
.into()
})
.length(30)
.item_size(50.)
.direction(Direction::Horizontal)
}
let mut test = launch_test(virtual_scroll_view_horizontal_app);
test.sync_and_update();
let scrollview = test
.find(|node, element| {
Rect::try_downcast(element)
.filter(|rect| rect.accessibility.builder.role() == AccessibilityRole::ScrollView)
.map(move |_| node)
})
.unwrap();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(content.len(), 11);
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0"
);
test.move_cursor((20., 495.));
test.sync_and_update();
test.press_cursor((20., 495.));
test.sync_and_update();
test.move_cursor((25., 495.));
test.sync_and_update();
test.move_cursor((20., 495.));
test.sync_and_update();
test.release_cursor((20., 495.));
test.sync_and_update();
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0"
);
for _ in 0..5 {
test.press_key(Key::ArrowRight);
}
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"10"
);
for _ in 0..3 {
test.press_key(Key::ArrowLeft);
}
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"4"
);
test.press_key(Key::End);
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[content.len() - 1].element())
.unwrap()
.text,
"29"
);
test.press_key(Key::Home);
let content = scrollview.children()[0].children()[0].children();
assert_eq!(
Label::try_downcast(&*content[0].element()).unwrap().text,
"0"
);
}