#[test]
fn test_REPL_008_004_finish_nested_functions() {
let script = "echo line1\necho line2\necho line3\necho line4";
let mut session = DebugSession::new(script);
session.push_frame("outer_function", 1);
session.push_frame("inner_function", 2);
assert_eq!(session.call_depth(), 3);
let result = session.finish();
assert!(
matches!(result, ContinueResult::Finished)
|| matches!(result, ContinueResult::BreakpointHit(_))
);
}
#[test]
fn test_REPL_008_004_finish_when_already_finished() {
let script = "echo done";
let mut session = DebugSession::new(script);
session.step();
session.step();
assert!(session.is_finished());
let result = session.finish();
assert!(matches!(result, ContinueResult::Finished));
assert!(session.is_finished());
}
#[test]
fn test_REPL_009_001_print_variable() {
let script = "echo hello";
let mut session = DebugSession::new(script);
session.set_variable("USER", "alice");
session.set_variable("HOME", "/home/alice");
assert_eq!(session.get_variable("USER"), Some("alice"));
assert_eq!(session.get_variable("HOME"), Some("/home/alice"));
assert_eq!(session.variable_count(), 2);
}
#[test]
fn test_REPL_009_001_print_array() {
let script = "echo test";
let mut session = DebugSession::new(script);
session.set_variable("ARRAY", "item1,item2,item3");
let array_value = session.get_variable("ARRAY");
assert_eq!(array_value, Some("item1,item2,item3"));
let items: Vec<&str> = array_value.unwrap().split(',').collect();
assert_eq!(items, vec!["item1", "item2", "item3"]);
}
#[test]
fn test_REPL_009_001_print_nonexistent() {
let script = "echo test";
let session = DebugSession::new(script);
assert_eq!(session.get_variable("DOES_NOT_EXIST"), None);
assert_eq!(session.get_variable(""), None);
}
#[test]
fn test_REPL_009_001_list_variables() {
let script = "echo test";
let mut session = DebugSession::new(script);
assert_eq!(session.list_variables(), vec![]);
session.set_variable("PATH", "/usr/bin");
session.set_variable("USER", "bob");
session.set_variable("HOME", "/home/bob");
let vars = session.list_variables();
assert_eq!(vars.len(), 3);
assert_eq!(vars[0], ("HOME", "/home/bob"));
assert_eq!(vars[1], ("PATH", "/usr/bin"));
assert_eq!(vars[2], ("USER", "bob"));
}
#[test]
fn test_REPL_009_001_variable_update() {
let script = "echo test";
let mut session = DebugSession::new(script);
session.set_variable("VERSION", "1.0");
assert_eq!(session.get_variable("VERSION"), Some("1.0"));
session.set_variable("VERSION", "2.0");
assert_eq!(session.get_variable("VERSION"), Some("2.0"));
assert_eq!(session.variable_count(), 1);
}
#[test]
fn test_REPL_009_001_clear_variables() {
let script = "echo test";
let mut session = DebugSession::new(script);
session.set_variable("A", "1");
session.set_variable("B", "2");
session.set_variable("C", "3");
assert_eq!(session.variable_count(), 3);
session.clear_variables();
assert_eq!(session.variable_count(), 0);
assert_eq!(session.list_variables(), vec![]);
assert_eq!(session.get_variable("A"), None);
}
#[test]
fn test_REPL_009_001_variables_persist_across_steps() {
let script = "echo line1\necho line2\necho line3";
let mut session = DebugSession::new(script);
session.set_variable("COUNTER", "0");
session.step();
assert_eq!(session.get_variable("COUNTER"), Some("0"));
session.step();
assert_eq!(session.get_variable("COUNTER"), Some("0"));
session.set_variable("COUNTER", "2");
session.step();
assert_eq!(session.get_variable("COUNTER"), Some("2"));
}
#[test]
fn test_REPL_009_002_env_display() {
let script = "echo test";
let session = DebugSession::new(script);
let path = session.get_env("PATH");
assert!(path.is_some(), "PATH environment variable should exist");
let nonexistent = session.get_env("BASHRS_NONEXISTENT_VAR_12345");
assert_eq!(nonexistent, None);
let env_vars = session.list_env();
assert!(!env_vars.is_empty(), "Should have at least one env var");
let mut sorted = env_vars.clone();
sorted.sort_by_key(|(name, _)| name.clone());
assert_eq!(env_vars, sorted, "Environment variables should be sorted");
}
include!("debugger_tests_extracted_cont_cont_REPL.rs");