From c1f76ed64f35aa5c811a9e61f0c1340711274596 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Mar 2021 20:51:29 +0530 Subject: add Debug & PartialEq impls for LispExpr; add eval tests --- src/lisp/eval.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/lisp/eval.rs') diff --git a/src/lisp/eval.rs b/src/lisp/eval.rs index f7f918a..f49efb9 100644 --- a/src/lisp/eval.rs +++ b/src/lisp/eval.rs @@ -222,3 +222,51 @@ pub fn unwrap_ident(i: LispExpr) -> String { _ => panic!("unwrap_ident expected string"), } } + +#[cfg(test)] +mod tests { + use super::*; + + use crate::lisp::{expr::LispExpr, lex::Lexer, number::LispNumber, parse::Parser}; + + fn run(code: &str, app: &mut AppState) -> LispExpr { + let mut parser = Parser::new(Lexer::new(code, 0)); + eval(&parser.parse_single_expr().unwrap(), app).unwrap() + } + + #[test] + fn eval_all() { + let sdl_context = sdl2::init().unwrap(); + let ttf_context = sdl2::ttf::init().unwrap(); + let mut app = AppState::init(100, 100, &sdl_context, &ttf_context, None, None); + eval_arithmetic(&mut app); + eval_logical(&mut app); + } + + fn eval_arithmetic(app: &mut AppState) { + assert_eq!( + run("(+ 1 2 3)", app), + LispExpr::Number(LispNumber::Integer(6)) + ); + assert_eq!( + run("(+ 1.1 2.2 3.3)", app), + LispExpr::Number(LispNumber::Float(6.6)) + ); + assert_eq!( + run("(* 1 2 3 4 5)", app), + LispExpr::Number(LispNumber::Integer(120)) + ); + assert_eq!(run("(< 1 2)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(> 6 5 4 3 2 1)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(< 1 2 3 4 5 6)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(>= 5 5 4 3 2 1)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(<= 2 2 3 4 5 6)", app), LispExpr::BoolLit(true)); + } + + fn eval_logical(app: &mut AppState) { + assert_eq!(run("(and #t #t)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(or #f #t)", app), LispExpr::BoolLit(true)); + assert_eq!(run("(not #t)", app), LispExpr::BoolLit(false)); + assert_eq!(run("(not #f)", app), run("(not (not #t))", app)); + } +} -- cgit v1.2.3