mod common;
use grift_eval::*;
use common::{eval_to_num, eval_is_true, eval_is_false};
fn temp_path(name: &str) -> String {
let dir = std::env::temp_dir();
dir.join(name).to_string_lossy().into_owned()
}
#[test]
fn test_file_exists_true() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_true(&lisp, &mut eval, "(file-exists? \"Cargo.toml\")"));
}
#[test]
fn test_file_exists_false() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_false(&lisp, &mut eval, "(file-exists? \"nonexistent_file_12345.txt\")"));
}
#[test]
fn test_delete_file() {
use std::fs;
use std::io::Write;
let path = temp_path("grift_test_delete_file.txt");
{
let mut f = fs::File::create(&path).unwrap();
f.write_all(b"test").unwrap();
}
assert!(std::path::Path::new(&path).exists());
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
let expr = format!("(delete-file \"{}\")", path);
eval.eval_str(&expr).unwrap();
assert!(!std::path::Path::new(&path).exists());
}
#[test]
fn test_delete_file_nonexistent_raises_error() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
let result = eval.eval_str("(delete-file \"nonexistent_file_xyz_12345.txt\")");
assert!(result.is_err());
}
#[test]
fn test_load_file() {
use std::fs;
use std::io::Write;
let path = temp_path("grift_test_load.scm");
{
let mut f = fs::File::create(&path).unwrap();
f.write_all(b"(define grift-load-test-var 42)").unwrap();
}
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
let expr = format!("(load \"{}\")", path);
eval.eval_str(&expr).unwrap();
assert_eq!(eval_to_num(&lisp, &mut eval, "grift-load-test-var"), 42);
let _ = fs::remove_file(&path);
}
#[test]
fn test_load_file_multiple_expressions() {
use std::fs;
use std::io::Write;
let path = temp_path("grift_test_load_multi.scm");
{
let mut f = fs::File::create(&path).unwrap();
f.write_all(b"(define x-load-test 10)\n(define y-load-test 20)\n(define z-load-test (+ x-load-test y-load-test))").unwrap();
}
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
let expr = format!("(load \"{}\")", path);
eval.eval_str(&expr).unwrap();
assert_eq!(eval_to_num(&lisp, &mut eval, "z-load-test"), 30);
let _ = fs::remove_file(&path);
}
#[test]
fn test_load_nonexistent_file_raises_error() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
let result = eval.eval_str("(load \"nonexistent_file_xyz_12345.scm\")");
assert!(result.is_err());
}
#[test]
fn test_command_line_returns_list() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_true(&lisp, &mut eval, "(pair? (command-line))"));
assert!(eval_is_true(&lisp, &mut eval, "(string? (car (command-line)))"));
}
#[test]
fn test_get_environment_variable_exists() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_true(&lisp, &mut eval, "(string? (get-environment-variable \"PATH\"))"));
}
#[test]
fn test_get_environment_variable_not_exists() {
let lisp: Lisp<20000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_false(&lisp, &mut eval, "(get-environment-variable \"GRIFT_NONEXISTENT_VAR_XYZ_12345\")"));
}
#[test]
fn test_get_environment_variables_returns_list() {
let lisp: Lisp<50000> = Lisp::new();
let mut io = grift_std::StdIoProvider::new();
let mut eval = Evaluator::new(&lisp).unwrap();
eval.set_io_provider(&mut io);
assert!(eval_is_true(&lisp, &mut eval, "(pair? (get-environment-variables))"));
assert!(eval_is_true(&lisp, &mut eval, "(pair? (car (get-environment-variables)))"));
assert!(eval_is_true(&lisp, &mut eval, "(string? (car (car (get-environment-variables))))"));
assert!(eval_is_true(&lisp, &mut eval, "(string? (cdr (car (get-environment-variables))))"));
}