add panels

This commit is contained in:
2026-10-30 01:02:48 +03:00
parent e00f63e5da
commit 56115302df
7 changed files with 421 additions and 5 deletions
+105
View File
@@ -184,6 +184,90 @@ fn window_commands_are_queued_for_the_view() {
assert!(drain_window_commands().is_empty());
}
#[test]
fn panel_api_opens_closes_and_toggles_the_same_panel_state() {
let workspace = Rc::new(RefCell::new(Workspace::default()));
let (api, _keymap) = install_api(workspace);
let right = api.right_panel_handle();
let bottom = api.bottom_panel_handle();
let left = api.left_panel_handle();
assert!(!left.borrow().is_open());
assert!(!right.borrow().is_open());
assert!(!bottom.borrow().is_open());
api.left_panel().open();
assert!(left.borrow().is_open());
assert!(api.left_panel().is_open());
api.left_panel().close();
assert!(!left.borrow().is_open());
api.right_panel().open();
assert!(right.borrow().is_open());
assert!(api.right_panel().is_open());
// toggle возвращает новое состояние и не трогает вторую панель.
assert!(!api.right_panel().toggle());
assert!(!right.borrow().is_open());
assert!(api.right_panel().toggle());
assert!(right.borrow().is_open());
api.right_panel().close();
assert!(!right.borrow().is_open());
api.bottom_panel().open();
assert!(bottom.borrow().is_open());
assert!(!right.borrow().is_open());
}
#[test]
fn lua_script_can_control_panels() {
let workspace = Rc::new(RefCell::new(Workspace::default()));
let (api, _keymap) = install_api(workspace);
let right = api.right_panel_handle();
let bottom = api.bottom_panel_handle();
let left = api.left_panel_handle();
let dir = temp_script_dir("panels");
let script = dir.join("panels.lua");
std::fs::write(
&script,
r#"
app.left_panel:open()
assert(app.left_panel:is_open())
app.left_panel:close()
assert(not app.left_panel:is_open())
assert(app.left_panel:toggle() == true)
app.right_panel:open()
assert(app.right_panel:is_open())
assert(not app.bottom_panel:is_open())
app.bottom_panel:open()
app.right_panel:toggle()
assert(not app.right_panel:is_open())
assert(app.bottom_panel:toggle() == false)
app.bottom_panel:close()
assert(not app.bottom_panel:is_open())
assert(app.right_panel:toggle() == true)
"#,
)
.expect("panels.lua");
let engine = ScriptEngine::new(api).expect("движок Lua");
engine
.run_file(&script)
.expect("панели должны управляться из Lua");
assert!(left.borrow().is_open());
assert!(right.borrow().is_open());
assert!(!bottom.borrow().is_open());
let _ = std::fs::remove_dir_all(&dir);
}
/// Временный каталог с уникальным именем для Lua-сценариев.
fn temp_script_dir(prefix: &str) -> std::path::PathBuf {
let dir = std::env::temp_dir().join(format!(
@@ -461,6 +545,27 @@ fn lua_key_bindings_receive_keys_while_editor_is_focused(cx: &mut TestAppContext
let _ = std::fs::remove_dir_all(&dir);
}
#[gpui_kit::test]
fn opened_panels_render_without_panicking(cx: &mut TestAppContext) {
cx.update(gpui_kit::init);
let (app, visual) = cx.add_window_view(|window, cx| MyApp::new(window, cx));
let api = AppApi::global();
api.left_panel().open();
api.right_panel().open();
api.bottom_panel().open();
visual.update(|_window, cx| {
app.update(cx, |_, cx| cx.notify());
});
visual.run_until_parked();
// Состояние осталось у панелей, которые видит вид.
assert!(api.left_panel_handle().borrow().is_open());
assert!(api.right_panel_handle().borrow().is_open());
assert!(api.bottom_panel_handle().borrow().is_open());
}
#[gpui_kit::test]
fn typing_into_editor_updates_active_document(cx: &mut TestAppContext) {
cx.update(gpui_kit::init);