extern crate risp;
use risp::*;
use risp::types::RispType::*;
use risp::types::*;
use risp::types::error_result;
use risp::core::create_core_environment;
#[test]
fn test_sum() {
assert_eq!(eval_risp(r"
(+ 1
(* 2 3)
)
"), Ok(Int(7)));
}
#[test]
fn test_def() {
let mut env = create_core_environment();
assert_eq!(eval_risp_for_env(r"
(def variable
(* 2 3)
)
", &mut env), Ok(Int(6)));
assert_eq!(env.get("variable"), Some(Int(6)));
}
#[test]
fn test_parsing_errors() {
assert!(eval_risp("(").is_err());
assert!(eval_risp(")").is_err());
assert!(eval_risp("").is_err());
}
#[test]
fn test_eval_errors() {
assert!(eval_risp("()").is_err());
assert!(eval_risp("(1 2)").is_err());
assert!(eval_risp("(a 2)").is_err());
assert!(eval_risp("(def)").is_err());
assert!(eval_risp("(def a)").is_err());
assert!(eval_risp("(def 1 2)").is_err());
}
#[test]
fn test_eval_error_expected_function() {
let mut env = create_core_environment();
env.set("var", Int(1));
let result = eval_risp_for_env("(var 1 2 3)", &mut env);
assert_eq!(result, error_result("Expected function but got Int(1)"));
}
#[test]
fn test_eval_vector() {
let mut env = create_core_environment();
env.set("var", Int(1));
let result = eval_risp_for_env("[var 2 (+ 3 4)]", &mut env);
assert_eq!(result, Ok(Vector(vec![Int(1), Int(2), Int(7)])));
}
#[test]
fn test_eval_map() {
let mut env = create_core_environment();
env.set("var", Int(1));
let result = eval_risp_for_env("{:key1 var :key2 (+ var 4)}", &mut env);
assert_eq!(result, Ok(map(vec![
("key1", Int(1)),
("key2", Int(5))
])));
}
#[test]
fn test_eval_do() {
let mut env = create_core_environment();
let result = eval_risp_for_env(r"
(do
(def var 23)
{:key var}
)
", &mut env);
assert_eq!(result, Ok(map(vec![
("key", Int(23)),
])));
}
#[test]
fn test_eval_do_empty() {
let result = eval_risp("(do)");
assert_eq!(result, error_result("Empty do block"));
}