#![cfg(any(unix, windows))]
use std::path::PathBuf;
use anyhow::{ensure, Result};
use rho_tui_pty::{
ArtifactWriter, IsolatedHome, Key, PtyHarness, PtySize, RhoLaunchPlan, WaitTimeout,
};
const STARTUP: WaitTimeout = WaitTimeout::secs(20, "native PTY startup");
const RESPONSE: WaitTimeout = WaitTimeout::secs(20, "native PTY paste response");
const EXIT: WaitTimeout = WaitTimeout::secs(10, "native PTY exit");
#[test]
fn native_pty_startup_multiline_paste_exit() -> Result<()> {
let home = IsolatedHome::new()?;
let plan = RhoLaunchPlan::matrix(
PathBuf::from(env!("CARGO_BIN_EXE_rho")),
&home,
PtySize::new(28, 100),
);
let mut harness = PtyHarness::spawn_named(&plan, "native_startup_multiline_paste_exit")?;
let artifacts = std::env::var_os("RHO_PTY_ARTIFACTS")
.map(PathBuf::from)
.unwrap_or_else(|| std::env::temp_dir().join("rho-pty-native-artifacts"));
harness.set_artifact_writer(ArtifactWriter::new(artifacts));
harness.wait_for_text("gpt-5.5", STARTUP)?;
harness.paste("café first line\n/not-a-command\nlast λ line")?;
harness.wait_for_text("last λ line", RESPONSE)?;
harness.wait_for_text("/not-a-command", RESPONSE)?;
ensure!(
!harness.screen().contains_text("fixture response:"),
"embedded paste Enter submitted a turn:\n{}",
harness.screen().contents()
);
harness.inject_key(&Key::Home)?;
harness.paste("edited ")?;
harness.wait_for_text("edited café first line", RESPONSE)?;
harness.inject_key(&Key::Enter)?;
harness.wait_for_text("fixture response: edited café first line", RESPONSE)?;
harness.paste("/exit")?;
harness.wait_for_text("/exit", EXIT)?;
harness.inject_key(&Key::Enter)?;
let code = harness.wait_for_exit(EXIT)?;
ensure!(code == 0, "native PTY Rho exited with code {code}");
drop(harness);
Ok(())
}