add toast and alert overlays to the shell
This commit is contained in:
@@ -235,3 +235,88 @@ fn the_right_seam_grows_the_right_sidebar_leftwards() {
|
||||
let region = bounds(&mut visual, "test-right").expect("right region missing");
|
||||
assert_eq!(region.size.width, grown);
|
||||
}
|
||||
|
||||
/// Toasts and alerts live on the shell's [`LayoutState`]; pushing one must
|
||||
/// show up in the rendered shell with no observing or manual overlay.
|
||||
#[cfg(feature = "toast")]
|
||||
mod toasts {
|
||||
use super::*;
|
||||
use gpui_native_core::toast::{Toast, ToastAction};
|
||||
use std::time::Duration;
|
||||
|
||||
#[test]
|
||||
fn a_pushed_toast_renders_in_the_shell() {
|
||||
let mut cx = TestAppContext::single();
|
||||
let (state, mut visual) = layout_window(&mut cx);
|
||||
|
||||
let id = cx.update(|cx| {
|
||||
state.update(cx, |state, cx| {
|
||||
state.push_toast(
|
||||
Toast::new("Draft deleted").action(ToastAction::new("Undo", |_| {
|
||||
// A real app restores the draft here.
|
||||
})),
|
||||
cx,
|
||||
)
|
||||
})
|
||||
});
|
||||
// No redraw, no observation: the shell repaints its own overlay.
|
||||
cx.run_until_parked();
|
||||
assert!(
|
||||
bounds(&mut visual, "toast-pill").is_some(),
|
||||
"the pushed toast must appear in the shell's overlay"
|
||||
);
|
||||
|
||||
cx.update(|cx| {
|
||||
state.update(cx, |state, cx| state.dismiss_toast(id, cx));
|
||||
});
|
||||
cx.run_until_parked();
|
||||
// The fade-out keeps the pill mounted briefly.
|
||||
assert!(
|
||||
bounds(&mut visual, "toast-pill").is_some(),
|
||||
"the dismissed toast must stay mounted through its fade-out"
|
||||
);
|
||||
cx.executor().advance_clock(Duration::from_secs(2));
|
||||
cx.run_until_parked();
|
||||
assert!(
|
||||
bounds(&mut visual, "toast-pill").is_none(),
|
||||
"the dismissed toast must leave the overlay once faded"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "alert")]
|
||||
mod alerts {
|
||||
use super::*;
|
||||
use gpui_native_core::alert::{Alert, AlertSeverity};
|
||||
|
||||
#[test]
|
||||
fn a_pushed_alert_renders_in_the_shell() {
|
||||
let mut cx = TestAppContext::single();
|
||||
let (state, mut visual) = layout_window(&mut cx);
|
||||
|
||||
cx.update(|cx| {
|
||||
state.update(cx, |state, cx| {
|
||||
state.push_alert(
|
||||
Alert::new("shell-alert")
|
||||
.title("Backed up")
|
||||
.severity(AlertSeverity::Info),
|
||||
cx,
|
||||
);
|
||||
})
|
||||
});
|
||||
cx.run_until_parked();
|
||||
assert!(
|
||||
bounds(&mut visual, "alert-entry").is_some(),
|
||||
"the pushed alert must appear in the shell's overlay"
|
||||
);
|
||||
|
||||
cx.update(|cx| {
|
||||
state.update(cx, |state, cx| state.clear_alerts(cx));
|
||||
});
|
||||
cx.run_until_parked();
|
||||
assert!(
|
||||
bounds(&mut visual, "alert-entry").is_none(),
|
||||
"cleared alerts must leave the overlay"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user