From eb886688ad3200dde2ba88b1d221d687de78169a Mon Sep 17 00:00:00 2001 From: me Date: Fri, 19 Dec 2025 10:15:19 +0200 Subject: [PATCH] interpret tests --- src/ast/helpers.rs | 4 +- src/interpret/interpret.rs | 78 ++++++++++++++++++-------------------- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/ast/helpers.rs b/src/ast/helpers.rs index 5aaed4e..03da907 100644 --- a/src/ast/helpers.rs +++ b/src/ast/helpers.rs @@ -36,6 +36,6 @@ pub fn define_expr(name: &str, expr: Expr) -> Definition { } } -pub fn func(func: Fn) -> Expr { - Expr::Func(Box::new(func)) +pub fn func(args: Vec, body: Expr) -> Expr { + Expr::Func(Box::new(Fn { args, body })) } diff --git a/src/interpret/interpret.rs b/src/interpret/interpret.rs index 10cdfd9..e98e323 100644 --- a/src/interpret/interpret.rs +++ b/src/interpret/interpret.rs @@ -230,7 +230,6 @@ fn defs_to_env( Ok(()) } -/* #[cfg(test)] mod tests { use super::*; @@ -238,14 +237,18 @@ mod tests { #[test] fn main_0() { - let program = vec![helpers::define_expr("main", 0.into())].into(); + let program = vec![helpers::define_expr( + "main", + helpers::func(vec![], 0.into()), + )] + .into(); let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(0.into())); } #[test] fn var_lookup() { let program = vec![ - helpers::define_expr("main", "lit".into()), + helpers::define_expr("main", helpers::func(vec![], "lit".into())), helpers::define_expr("lit", 0.into()), ] .into(); @@ -256,21 +259,23 @@ mod tests { fn var_assign_and_lookup() { let program = vec![helpers::define_expr( "main", - vec![ - helpers::assign("zero", 0.into()), - helpers::stmt_expr("zero".into()), - ] - .into(), + helpers::func( + vec![], + vec![ + helpers::assign("zero", 0.into()), + helpers::stmt_expr("zero".into()), + ] + .into(), + ), )] .into(); let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(0.into())); } - #[test] fn field_access() { let program = vec![ - helpers::define_expr("main", "record".into()), + helpers::define_expr("main", helpers::func(vec![], "record".into())), helpers::define_expr( "record", ast::Expr::from(vec![("my_field", 0.into())]).field("my_field"), @@ -280,54 +285,47 @@ mod tests { let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(0.into())); } - #[test] fn fun_call() { let program = vec![ - helpers::define_expr("main", "zero".into()), - helpers::define_expr( - "zero", - helpers::func(ast::Fn { - args: vec![], - body: 0.into(), - }) - .call(vec![]), - ), + helpers::define_expr("main", helpers::func(vec![], "zero".into())), + helpers::define_expr("zero", helpers::func(vec![], 0.into()).call(vec![])), ] .into(); let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(0.into())); } - #[test] fn if_then_else() { let program = vec![helpers::define_expr( "main", - ast::Expr::If { - condition: Box::new(false.into()), - then: Box::new(0.into()), - r#else: Box::new(ast::Expr::If { - condition: Box::new(true.into()), - then: Box::new(1.into()), - r#else: Box::new(2.into()), - }), - }, + helpers::func( + vec![], + ast::Expr::If { + condition: Box::new(false.into()), + then: Box::new(0.into()), + r#else: Box::new(ast::Expr::If { + condition: Box::new(true.into()), + then: Box::new(1.into()), + r#else: Box::new(2.into()), + }), + }, + ), )] .into(); let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(1.into())); } - #[test] fn fun_call_args() { let program = vec![ - helpers::define_expr("main", "zero".into()), + helpers::define_expr("main", helpers::func(vec![], "zero".into())), helpers::define_expr( "zero", - helpers::func(ast::Fn { - args: vec![ast::Arg { name: "a".into() }, ast::Arg { name: "b".into() }], - body: "b".into(), - }) + helpers::func( + vec![ast::Arg { name: "a".into() }, ast::Arg { name: "b".into() }], + "b".into(), + ) .call(vec![1.into(), 0.into()]), ), ] @@ -335,13 +333,12 @@ mod tests { let result = run(program, "main".into(), vec![]); assert_eq!(result, Ok(0.into())); } - // Errors #[test] fn duplicate_toplevel_defs() { let program = vec![ - helpers::define_expr("main", "record".into()), + helpers::define_expr("main", helpers::func(vec![], "record".into())), helpers::define_expr("main", 0.into()), ] .into(); @@ -352,7 +349,7 @@ mod tests { #[test] fn field_access_not_a_record() { let program = vec![ - helpers::define_expr("main", "record".into()), + helpers::define_expr("main", helpers::func(vec![], "record".into())), helpers::define_expr("record", ast::Expr::from(0).field("my_field")), ] .into(); @@ -362,7 +359,7 @@ mod tests { #[test] fn fun_call_not_a_function() { let program = vec![ - helpers::define_expr("main", "zero".into()), + helpers::define_expr("main", helpers::func(vec![], "zero".into())), helpers::define_expr("zero", ast::Expr::from(0).call(vec![1.into()])), ] .into(); @@ -370,4 +367,3 @@ mod tests { assert_eq!(result, Err(Error::NotAFunction(0.into()))); } } -*/