use gpui::{Entity, TestAppContext}; use super::*; use crate::tests::{blank, docs, settle, settled, text_of, type_into, with_window, written}; /// The open prompt's request and field. fn asked(cx: &TestAppContext, docs: &Entity) -> (Ask, Entity) { // Prompts open once their kernel read comes back. cx.run_until_parked(); cx.update(|app| match &docs.read(app).dialog { Some(Dialog::Ask { ask, field }) => (ask.clone(), field.clone()), _ => panic!("a prompt is open"), }) } fn answer(cx: &mut TestAppContext, docs: &Entity, text: &str) { let (ask, _) = asked(cx, docs); cx.update(|app| docs.update(app, |docs, cx| docs.answer(&ask, text, cx))); settled(cx, docs); } fn graphic(app: &gpui::App, docs: &Entity) -> bool { let tab = docs.read(app).active_tab().expect("a tab"); tab.view.read(app).graphic().is_some() } #[test] fn references_go_in_through_their_dialogs() { let dir = tempfile::tempdir().expect("a temp dir"); let mut cx = TestAppContext::single(); let Some(docs) = docs(&mut cx, dir.path()) else { eprintln!("SKIP: no LOK build"); return; }; let id = blank(&mut cx, &docs); type_into(&mut cx, &docs, "Start"); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_reference(&InsertReference, window, cx) }); cx.run_until_parked(); assert!( cx.update(|app| docs.read(app).dialog.is_none()), "no bookmark, no cross-reference dialog" ); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_bookmark(&InsertBookmark, window, cx) }); answer(&mut cx, &docs, "Here"); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_bookmark(&InsertBookmark, window, cx) }); let (ask, _) = asked(&cx, &docs); assert!( matches!(&ask, Ask::Bookmark(taken) if taken == &["Here"]), "the prompt knows the taken names" ); cx.update(|app| docs.update(app, |docs, _| docs.dialog = None)); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_reference(&InsertReference, window, cx) }); cx.run_until_parked(); cx.update(|app| docs.update(app, |docs, cx| docs.insert_reference(cx))); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_link(&InsertLink, window, cx) }); cx.update(|app| { docs.update(app, |docs, cx| { let Some(Dialog::Link { url, .. }) = &docs.dialog else { panic!("the link dialog is open"); }; url.update(cx, |url, cx| url.set_text("https://example.org/", cx)); docs.insert_link(cx); }) }); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_footnote(&InsertFootnote, window, cx); }); type_into(&mut cx, &docs, "Foot"); cx.update(|app| { let view = docs.read(app).active_tab().expect("a tab").view.clone(); view.update(app, |view, cx| view.reveal((1500, 1500, 0, 0), cx)); }); with_window(&mut cx, &docs, |docs, window, cx| { docs.on_contents(&InsertContents, window, cx); docs.on_update(&UpdateContents, window, cx); }); settled(&cx, &docs); let path = dir.path().join("refs.odt"); with_window(&mut cx, &docs, |docs, window, cx| { docs.write_as(id, path.clone(), None, window, cx) }); written(&cx, &path, None); let text = text_of(&mut cx, &docs, &path); for mark in [ "https://example.org/<", "