#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;
fn bashrs_repl() -> Command {
let mut cmd = assert_cmd::cargo_bin_cmd!("bashrs");
cmd.arg("repl");
cmd
}
fn create_test_script(dir: &TempDir, name: &str, content: &str) -> std::path::PathBuf {
let file_path = dir.path().join(name);
fs::write(&file_path, content).expect("Failed to write test file");
file_path
}
#[test]
fn test_repl_009_001_load_simple_script() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"test.sh",
r#"#!/bin/bash
# Simple test script
echo "Hello from script"
"#,
);
bashrs_repl()
.write_stdin(format!(":load {}\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Loaded"));
}
#[test]
fn test_repl_009_001_load_script_with_functions() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"functions.sh",
r#"#!/bin/bash
greet() {
echo "Hello, $1"
}
farewell() {
echo "Goodbye, $1"
}
"#,
);
bashrs_repl()
.write_stdin(format!(":load {}\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Loaded"))
.stdout(predicate::str::contains("function").or(predicate::str::contains("greet")));
}
#[test]
fn test_repl_009_001_load_nonexistent_file() {
bashrs_repl()
.write_stdin(":load /nonexistent/file.sh\nquit\n")
.assert()
.success() .stdout(predicate::str::contains("Error").or(predicate::str::contains("not found")));
}
#[test]
#[ignore] fn test_repl_009_001_load_invalid_syntax() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"invalid.sh",
r#"#!/bin/bash
if then fi # Invalid syntax
"#,
);
bashrs_repl()
.write_stdin(format!(":load {}\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Error").or(predicate::str::contains("parse")));
}
#[test]
fn test_repl_009_001_source_script() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"source.sh",
r#"#!/bin/bash
export VAR=test_value
echo "Script sourced"
"#,
);
bashrs_repl()
.write_stdin(format!(":source {}\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Sourced").or(predicate::str::contains("Script sourced")));
}
#[test]
fn test_repl_009_001_source_adds_functions() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"lib.sh",
r#"#!/bin/bash
helper() {
echo "Helper function"
}
"#,
);
bashrs_repl()
.write_stdin(format!(":source {}\n:functions\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Sourced"))
.stdout(predicate::str::contains("function").or(predicate::str::contains("helper")));
}
#[test]
fn test_repl_009_001_functions_empty() {
bashrs_repl()
.write_stdin(":functions\nquit\n")
.assert()
.success()
.stdout(
predicate::str::contains("No functions").or(predicate::str::contains("0 functions")),
);
}
#[test]
fn test_repl_009_001_functions_after_load() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"funcs.sh",
r#"#!/bin/bash
func1() { echo "1"; }
func2() { echo "2"; }
func3() { echo "3"; }
"#,
);
bashrs_repl()
.write_stdin(format!(":load {}\n:functions\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("function"));
}
#[test]
fn test_repl_009_001_reload_script() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"reload.sh",
r#"#!/bin/bash
echo "Original version"
"#,
);
bashrs_repl()
.write_stdin(format!(":load {}\n:reload\nquit\n", script.display()))
.assert()
.success()
.stdout(
predicate::str::contains("Loaded")
.count(2)
.or(predicate::str::contains("Reloaded")),
);
}
#[test]
fn test_repl_009_001_reload_without_load() {
bashrs_repl()
.write_stdin(":reload\nquit\n")
.assert()
.success()
.stdout(
predicate::str::contains("No script").or(predicate::str::contains("nothing to reload")),
);
}
#[test]
fn test_repl_009_001_load_reload_workflow() {
let temp_dir = TempDir::new().unwrap();
let script_path = temp_dir.path().join("workflow.sh");
fs::write(&script_path, "#!/bin/bash\necho 'Version 1'\n").unwrap();
bashrs_repl()
.write_stdin(format!(":load {}\n:reload\nquit\n", script_path.display()))
.assert()
.success()
.stdout(predicate::str::contains("Loaded"));
}
#[test]
#[ignore] fn test_repl_009_001_load_then_execute() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"exec.sh",
r#"#!/bin/bash
test_func() {
echo "Function executed"
}
"#,
);
bashrs_repl()
.write_stdin(format!(":source {}\ntest_func\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Sourced"))
.stdout(predicate::str::contains("Function executed"));
}
#[test]
#[ignore] fn test_repl_009_001_load_multiple_scripts() {
let temp_dir = TempDir::new().unwrap();
let script1 = create_test_script(&temp_dir, "s1.sh", "#!/bin/bash\nfunc1() { :; }\n");
let script2 = create_test_script(&temp_dir, "s2.sh", "#!/bin/bash\nfunc2() { :; }\n");
bashrs_repl()
.write_stdin(format!(
":load {}\n:load {}\n:functions\nquit\n",
script1.display(),
script2.display()
))
.assert()
.success()
.stdout(predicate::str::contains("Loaded").count(2));
}
#[test]
fn test_repl_009_001_load_with_variables() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"vars.sh",
r#"#!/bin/bash
SCRIPT_VAR=from_script
echo "Script variable: $SCRIPT_VAR"
"#,
);
bashrs_repl()
.write_stdin(format!(":source {}\n:vars\nquit\n", script.display()))
.assert()
.success()
.stdout(predicate::str::contains("Sourced"));
}
#[test]
fn test_repl_009_001_load_in_modes() {
let temp_dir = TempDir::new().unwrap();
let script = create_test_script(
&temp_dir,
"modes.sh",
r#"#!/bin/bash
mode_test() {
echo "Testing modes"
}
"#,
);
bashrs_repl()
.write_stdin(format!(
":mode normal\n:load {}\n:mode purify\n:reload\nquit\n",
script.display()
))
.assert()
.success()
.stdout(predicate::str::contains("Loaded"));
}