use anyhow::Result;
use ruchy::runtime::repl::Repl;
#[test]
fn test_01_basic_arithmetic_001() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("2 + 3");
assert!(result.is_ok() && result.unwrap() == r"5");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_002() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("6 * 7");
assert!(result.is_ok() && result.unwrap() == r"42");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_003() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("20 / 4");
assert!(result.is_ok() && result.unwrap() == r"5");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_004() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("2 + 3 * 4");
assert!(result.is_ok() && result.unwrap() == r"14");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_005() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("(2 + 3) * 4");
assert!(result.is_ok() && result.unwrap() == r"20");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_006() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("17 % 5");
assert!(result.is_ok() && result.unwrap() == r"2");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_007() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("3.14 * 2.0");
assert!(result.is_ok() && result.unwrap() == r"6.28");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_008() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("10.0 / 3.0");
assert!(result.is_ok() && result.unwrap() == r"3.3333333333333335");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_009() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("5 + 2");
assert!(result.is_ok() && result.unwrap() == r"7");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_010() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result = repl.eval("(10 + 5) * 3 - 8 / 2");
assert!(result.is_ok() && result.unwrap() == r"41");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_session_integration() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let _deadline = Some(std::time::Instant::now() + std::time::Duration::from_millis(5000));
let result_0 = repl.eval("2 + 3");
let result_2 = repl.eval("6 * 7");
let result_4 = repl.eval("20 / 4");
let result_6 = repl.eval("2 + 3 * 4");
let result_8 = repl.eval("(2 + 3) * 4");
let result_10 = repl.eval("17 % 5");
let result_12 = repl.eval("3.14 * 2.0");
let result_14 = repl.eval("10.0 / 3.0");
let result_16 = repl.eval("5 + 2");
let result_18 = repl.eval("(10 + 5) * 3 - 8 / 2");
assert!(result_0.is_ok() && result_0.unwrap() == r"5");
assert!(result_2.is_ok() && result_2.unwrap() == r"42");
assert!(result_4.is_ok() && result_4.unwrap() == r"5");
assert!(result_6.is_ok() && result_6.unwrap() == r"14");
assert!(result_8.is_ok() && result_8.unwrap() == r"20");
assert!(result_10.is_ok() && result_10.unwrap() == r"2");
assert!(result_12.is_ok() && result_12.unwrap() == r"6.28");
assert!(result_14.is_ok() && result_14.unwrap() == r"3.3333333333333335");
assert!(result_16.is_ok() && result_16.unwrap() == r"7");
assert!(result_18.is_ok() && result_18.unwrap() == r"41");
Ok(())
}
#[test]
fn test_01_basic_arithmetic_determinism_property() -> Result<()> {
let mut repl1 = Repl::new(std::env::temp_dir())?;
let mut repl2 = Repl::new(std::env::temp_dir())?;
let inputs = ["2 + 3", "6 * 7"];
for input in inputs {
let result1 = repl1.eval(input);
let result2 = repl2.eval(input);
match (result1, result2) {
(Ok(out1), Ok(out2)) => assert_eq!(out1, out2),
(Err(_), Err(_)) => {} _ => panic!("Inconsistent REPL behavior: {input} vs {input}"),
}
}
Ok(())
}
#[test]
fn test_01_basic_arithmetic_memory_bounds() -> Result<()> {
let mut repl = Repl::new(std::env::temp_dir())?;
let initial_memory = repl.memory_used();
repl.eval("2 + 3")?;
repl.eval("6 * 7")?;
let final_memory = repl.memory_used();
assert!(
final_memory < 100 * 1024 * 1024,
"Memory usage exceeded bounds: {final_memory} bytes"
);
Ok(())
}