diff --git a/tests/test_lib_funcs.rs b/tests/test_lib_funcs.rs new file mode 100644 index 0000000..8eacede --- /dev/null +++ b/tests/test_lib_funcs.rs @@ -0,0 +1,94 @@ +mod lib_func_tests { + use relish::stdlib::{get_stdlib}; + use relish::ast::{lex, eval, VTable, FTable, Ctr}; + use std::rc::Rc; + use std::cell::RefCell; + + #[test] + fn test_simple_echo() { + let document = "(echo 'test')"; + let result = "test\n"; + let vt = Rc::new(RefCell::new(VTable::new())); + let ft: Rc>; + match get_stdlib() { + Ok(f) => ft = f, + Err(s) => { + ft = Rc::new(RefCell::new(FTable::new())); + println!("Couldnt get stdlib: {}!", s); + assert!(false) + } + } + + match lex(document.to_string()) { + Err(s) => { + println!("Couldnt lex {}: {}\n", document, s); + assert!(false); + }, + + Ok(tree) => { + match eval(tree, vt.clone(), ft.clone(), false) { + Err(s) => { + println!("Couldnt eval {}: {}\n", document, s); + assert!(false); + }, + + Ok(ctr) => { + match ctr { + Ctr::Symbol(_) => assert!(false), + Ctr::String(s) => assert_eq!(s, result), + Ctr::Integer(_) => assert!(false), + Ctr::Float(_) => assert!(false), + Ctr::Bool(_) => assert!(false), + Ctr::Seg(_) => assert!(false), + Ctr::None => assert!(false) + } + } + } + } + } + } + + #[test] + fn test_poly_echo() { + let document = "(echo 'test' 1 2 3)"; + let result = "test\n1\n2\n3\n"; + let vt = Rc::new(RefCell::new(VTable::new())); + let ft: Rc>; + match get_stdlib() { + Ok(f) => ft = f, + Err(s) => { + ft = Rc::new(RefCell::new(FTable::new())); + println!("Couldnt get stdlib: {}!", s); + assert!(false) + } + } + + match lex(document.to_string()) { + Err(s) => { + println!("Couldnt lex {}: {}\n", document, s); + assert!(false); + }, + + Ok(tree) => { + match eval(tree, vt.clone(), ft.clone(), false) { + Err(s) => { + println!("Couldnt eval {}: {}\n", document, s); + assert!(false); + }, + + Ok(ctr) => { + match ctr { + Ctr::Symbol(_) => assert!(false), + Ctr::String(s) => assert_eq!(s, result), + Ctr::Integer(_) => assert!(false), + Ctr::Float(_) => assert!(false), + Ctr::Bool(_) => assert!(false), + Ctr::Seg(_) => assert!(false), + Ctr::None => assert!(false) + } + } + } + } + } + } +}