mod common;
use common::*;
use std::sync::Arc;
#[tokio::test]
async fn test_scroll_live_to_oldest_and_back() -> Result<(), anyhow::Error> {
let ctx = durable_sled_setup().await?;
create_messages(&ctx, (0..60).map(|i| (1000 + i, 50))).await?;
let sm = Arc::new(ScrollManager::<TestMessageView>::new(
&ctx,
"true",
"timestamp DESC",
50, 2.0, 500, )?);
let mut r = MockRenderer::new(sm.clone(), 500);
tokio::spawn({
let sm = sm.clone();
async move { sm.start().await }
});
let vs = r.next_render().await?;
r.assert(&vs, 30, 1030..=1059, None, true, false, true, 1050, 1059);
assert_eq!(r.scroll_offset, 1000);
r.up_no_render(400, 1042, 1051).await;
r.scroll_up_and_expect(
100, 40, 1020..=1059, Some(1049),
true, true, false, 1040, 1049, 1000,
"TRUE AND \"timestamp\" <= 1059 ORDER BY timestamp DESC LIMIT 41",
).await?;
r.up_no_render(400, 1032, 1041).await;
r.scroll_up_and_expect(
100, 50, 1010..=1059, Some(1039),
true, true, false, 1030, 1039, 1000,
"TRUE AND \"timestamp\" <= 1059 ORDER BY timestamp DESC LIMIT 51",
).await?;
r.up_no_render(400, 1022, 1031).await;
r.scroll_up_and_expect(
100, 50, 1000..=1049, Some(1029),
false, true, false, 1020, 1029, 1000,
"TRUE AND \"timestamp\" <= 1049 ORDER BY timestamp DESC LIMIT 51",
).await?;
r.up_no_render(400, 1012, 1021).await;
r.up_no_render(400, 1004, 1013).await;
r.up_no_render(200, 1000, 1009).await;
assert_eq!(r.scroll_offset, 0);
r.down_no_render(400, 1008, 1017).await;
r.down_no_render(400, 1016, 1025).await;
r.down_no_render(400, 1024, 1033).await;
r.down_no_render(250, 1029, 1038).await;
r.scroll_down_and_expect(
50, 60, 1000..=1059, Some(1030),
false, false, true, 1050, 1059, 2500,
"TRUE AND \"timestamp\" >= 1000 ORDER BY timestamp ASC LIMIT 61",
).await?;
assert_eq!(r.scroll_offset, 2500);
assert_eq!(sm.mode(), ankurah_virtual_scroll::ScrollMode::Live);
Ok(())
}
#[tokio::test]
async fn test_direction_reversal() -> Result<(), anyhow::Error> {
let ctx = durable_sled_setup().await?;
create_messages(&ctx, (0..60).map(|i| (1000 + i, 50))).await?;
let sm = Arc::new(ScrollManager::<TestMessageView>::new(
&ctx,
"true",
"timestamp DESC",
50, 2.0, 500, )?);
let mut r = MockRenderer::new(sm.clone(), 500);
tokio::spawn({
let sm = sm.clone();
async move { sm.start().await }
});
let vs = r.next_render().await?;
r.assert(&vs, 30, 1030..=1059, None, true, false, true, 1050, 1059);
assert_eq!(r.scroll_offset, 1000);
r.up_no_render(400, 1042, 1051).await;
r.scroll_up_and_expect(
100, 40, 1020..=1059, Some(1049),
true, true, false, 1040, 1049, 1000,
"TRUE AND \"timestamp\" <= 1059 ORDER BY timestamp DESC LIMIT 41",
).await?;
r.up_no_render(200, 1036, 1045).await;
r.down_no_render(100, 1038, 1047).await;
r.up_no_render(300, 1032, 1041).await; r.scroll_up_and_expect(
100, 50, 1010..=1059, Some(1039),
true, true, false, 1030, 1039, 1000,
"TRUE AND \"timestamp\" <= 1059 ORDER BY timestamp DESC LIMIT 51",
).await?;
assert_eq!(sm.mode(), ankurah_virtual_scroll::ScrollMode::Backward);
Ok(())
}