use expectrl::{spawn, Expect, Regex};
#[test]
fn integration_repl_echo_and_exit() {
let bin = std::env::var("CARGO_BIN_EXE_pmsh").unwrap_or_else(|_| {
let manifest = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
format!("{}/target/debug/pmsh", manifest)
});
let mut p = spawn(&bin).expect("failed to spawn pmsh");
p.expect(Regex("\\$ ")).expect("did not see prompt");
p.send_line("echo hello").expect("failed to send line");
p.expect(Regex("hello")).expect("did not see echo output");
p.send_line("exit").expect("failed to send exit");
p.expect(Regex("Exiting."))
.expect("did not see exiting message");
}
#[test]
fn integration_repl_subshell_env_isolation() {
let bin = std::env::var("CARGO_BIN_EXE_pmsh").unwrap_or_else(|_| {
let manifest = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
format!("{}/target/debug/pmsh", manifest)
});
let mut p = spawn(&bin).expect("failed to spawn pmsh");
p.expect(Regex("\\$ ")).expect("did not see prompt");
p.send_line("(SUBSHELL_TEST=123)")
.expect("failed to send line");
p.expect(Regex("\\$ ")).expect("did not see prompt");
p.send_line("echo Value: $SUBSHELL_TEST")
.expect("failed to send echo");
p.expect(Regex("Value: ")).expect("Output mismatch");
p.expect(Regex("\\$ ")).expect("did not see prompt");
}
#[test]
fn integration_repl_subshell_cd_isolation() {
let bin = std::env::var("CARGO_BIN_EXE_pmsh").unwrap_or_else(|_| {
let manifest = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set");
format!("{}/target/debug/pmsh", manifest)
});
let mut p = spawn(&bin).expect("failed to spawn pmsh");
p.expect(Regex("\\$ ")).expect("did not see prompt");
let current_dir = std::env::current_dir().unwrap();
let current_dir_str = current_dir.to_str().unwrap();
p.send_line("(cd /tmp)").expect("failed to send line");
p.expect(Regex("\\$ ")).expect("did not see prompt");
p.send_line("pwd").expect("failed to send pwd");
p.expect(Regex(regex::escape(current_dir_str).as_str()))
.expect("CD leaked!");
}