use gpui::{
AppContext as _, Context, Entity, IntoElement, ParentElement as _, Render, ScrollDelta,
ScrollWheelEvent, Styled as _, TestAppContext, VisualTestContext, Window, div, point, px,
};
use super::{Diff, DiffState, document::fixture};
const LINES: usize = 300;
struct Host {
state: Entity<DiffState>,
}
impl Render for Host {
fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
div()
.w(px(400.))
.h(px(200.))
.child(Diff::new(&self.state).size_full())
}
}
fn draw(cx: &mut VisualTestContext) {
cx.run_until_parked();
cx.update(|window, cx| {
_ = window.draw(cx);
});
}
fn long_patch(cx: &mut TestAppContext) -> (Entity<DiffState>, &mut VisualTestContext) {
cx.update(crate::init);
let original = (0..LINES)
.map(|ix| format!("old {ix}\n"))
.collect::<String>();
let modified = (0..LINES)
.map(|ix| format!("new {ix}\n"))
.collect::<String>();
let state =
cx.new(|cx| DiffState::new([fixture::modified("long.txt", &original, &modified)], cx));
let (_, cx) = cx.add_window_view({
let state = state.clone();
move |_, _| Host { state }
});
for _ in 0..3 {
draw(cx);
}
(state, cx)
}
#[gpui::test]
fn the_whole_patch_keeps_its_height_after_the_first_layout(cx: &mut TestAppContext) {
let (state, cx) = long_patch(cx);
let (max, viewport) = cx.update(|_, cx| {
let list = state.read(cx).list();
(
list.max_offset_for_scrollbar().y,
list.viewport_bounds().size.height,
)
});
assert!(
max > viewport * 10.,
"max offset {max:?} for a {viewport:?} viewport"
);
}
#[gpui::test]
fn the_wheel_scrolls_past_the_rows_rendered_so_far(cx: &mut TestAppContext) {
let (state, cx) = long_patch(cx);
for _ in 0..50 {
cx.simulate_event(ScrollWheelEvent {
position: point(px(100.), px(120.)),
delta: ScrollDelta::Pixels(point(px(0.), px(-40.))),
..Default::default()
});
draw(cx);
}
let top = cx.update(|_, cx| state.read(cx).list().logical_scroll_top().item_ix);
assert!(top > 40, "scrolled to row {top}");
}