use javascript::Repl;
#[test]
fn repl_persists_values_between_calls() {
let mut repl = Repl::new();
let r1 = repl.eval("let x = 42;").unwrap();
assert_eq!(r1, "undefined");
let r2 = repl.eval("x").unwrap();
assert_eq!(r2, "42");
}
#[test]
fn repl_allows_function_persistence() {
let mut repl = Repl::new();
let r1 = repl.eval("function add(a,b){ return a + b; }").unwrap();
assert_eq!(r1, "undefined");
let r = repl.eval("add(2,3)").unwrap();
assert_eq!(r, "5");
}
#[cfg(test)]
mod tests {
use javascript::Repl;
#[test]
fn test_balanced_simple() {
assert!(Repl::is_complete_input("1 + 1"));
assert!(Repl::is_complete_input("let a = 10;"));
}
#[test]
fn test_unbalanced_brackets() {
assert!(!Repl::is_complete_input("(1 + 2"));
assert!(!Repl::is_complete_input("function f() {"));
assert!(!Repl::is_complete_input("[1, 2"));
}
#[test]
fn test_strings_and_comments() {
assert!(Repl::is_complete_input("let s = '\\'not a bracket\\'';"));
assert!(Repl::is_complete_input("// comment with { [ ( "));
assert!(Repl::is_complete_input("/* block comment with { [ ( */"));
assert!(Repl::is_complete_input("'a string with } inside'"));
}
#[test]
fn test_template_literals() {
assert!(!Repl::is_complete_input("`unterminated template"));
assert!(Repl::is_complete_input("`unterminated template`"));
assert!(Repl::is_complete_input("`simple`"));
assert!(Repl::is_complete_input("`a ${1 + 2} b`"));
assert!(!Repl::is_complete_input("`x ${ {`"));
}
#[test]
fn test_regex_handling() {
assert!(Repl::is_complete_input("/abc/.test('x')"));
assert!(Repl::is_complete_input("/([a-z]{2})/g"));
assert!(!Repl::is_complete_input("(a / 1"));
}
}