interpret tests

This commit is contained in:
me 2025-12-19 10:15:19 +02:00
parent e8d46772a5
commit eb886688ad
2 changed files with 39 additions and 43 deletions

View file

@ -36,6 +36,6 @@ pub fn define_expr(name: &str, expr: Expr) -> Definition {
} }
} }
pub fn func(func: Fn) -> Expr { pub fn func(args: Vec<Arg>, body: Expr) -> Expr {
Expr::Func(Box::new(func)) Expr::Func(Box::new(Fn { args, body }))
} }

View file

@ -230,7 +230,6 @@ fn defs_to_env(
Ok(()) Ok(())
} }
/*
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
@ -238,14 +237,18 @@ mod tests {
#[test] #[test]
fn main_0() { 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![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(0.into())); assert_eq!(result, Ok(0.into()));
} }
#[test] #[test]
fn var_lookup() { fn var_lookup() {
let program = vec![ let program = vec![
helpers::define_expr("main", "lit".into()), helpers::define_expr("main", helpers::func(vec![], "lit".into())),
helpers::define_expr("lit", 0.into()), helpers::define_expr("lit", 0.into()),
] ]
.into(); .into();
@ -256,21 +259,23 @@ mod tests {
fn var_assign_and_lookup() { fn var_assign_and_lookup() {
let program = vec![helpers::define_expr( let program = vec![helpers::define_expr(
"main", "main",
helpers::func(
vec![],
vec![ vec![
helpers::assign("zero", 0.into()), helpers::assign("zero", 0.into()),
helpers::stmt_expr("zero".into()), helpers::stmt_expr("zero".into()),
] ]
.into(), .into(),
),
)] )]
.into(); .into();
let result = run(program, "main".into(), vec![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(0.into())); assert_eq!(result, Ok(0.into()));
} }
#[test] #[test]
fn field_access() { fn field_access() {
let program = vec![ let program = vec![
helpers::define_expr("main", "record".into()), helpers::define_expr("main", helpers::func(vec![], "record".into())),
helpers::define_expr( helpers::define_expr(
"record", "record",
ast::Expr::from(vec![("my_field", 0.into())]).field("my_field"), ast::Expr::from(vec![("my_field", 0.into())]).field("my_field"),
@ -280,29 +285,22 @@ mod tests {
let result = run(program, "main".into(), vec![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(0.into())); assert_eq!(result, Ok(0.into()));
} }
#[test] #[test]
fn fun_call() { fn fun_call() {
let program = vec![ let program = vec![
helpers::define_expr("main", "zero".into()), helpers::define_expr("main", helpers::func(vec![], "zero".into())),
helpers::define_expr( helpers::define_expr("zero", helpers::func(vec![], 0.into()).call(vec![])),
"zero",
helpers::func(ast::Fn {
args: vec![],
body: 0.into(),
})
.call(vec![]),
),
] ]
.into(); .into();
let result = run(program, "main".into(), vec![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(0.into())); assert_eq!(result, Ok(0.into()));
} }
#[test] #[test]
fn if_then_else() { fn if_then_else() {
let program = vec![helpers::define_expr( let program = vec![helpers::define_expr(
"main", "main",
helpers::func(
vec![],
ast::Expr::If { ast::Expr::If {
condition: Box::new(false.into()), condition: Box::new(false.into()),
then: Box::new(0.into()), then: Box::new(0.into()),
@ -312,22 +310,22 @@ mod tests {
r#else: Box::new(2.into()), r#else: Box::new(2.into()),
}), }),
}, },
),
)] )]
.into(); .into();
let result = run(program, "main".into(), vec![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(1.into())); assert_eq!(result, Ok(1.into()));
} }
#[test] #[test]
fn fun_call_args() { fn fun_call_args() {
let program = vec![ let program = vec![
helpers::define_expr("main", "zero".into()), helpers::define_expr("main", helpers::func(vec![], "zero".into())),
helpers::define_expr( helpers::define_expr(
"zero", "zero",
helpers::func(ast::Fn { helpers::func(
args: vec![ast::Arg { name: "a".into() }, ast::Arg { name: "b".into() }], vec![ast::Arg { name: "a".into() }, ast::Arg { name: "b".into() }],
body: "b".into(), "b".into(),
}) )
.call(vec![1.into(), 0.into()]), .call(vec![1.into(), 0.into()]),
), ),
] ]
@ -335,13 +333,12 @@ mod tests {
let result = run(program, "main".into(), vec![]); let result = run(program, "main".into(), vec![]);
assert_eq!(result, Ok(0.into())); assert_eq!(result, Ok(0.into()));
} }
// Errors // Errors
#[test] #[test]
fn duplicate_toplevel_defs() { fn duplicate_toplevel_defs() {
let program = vec![ let program = vec![
helpers::define_expr("main", "record".into()), helpers::define_expr("main", helpers::func(vec![], "record".into())),
helpers::define_expr("main", 0.into()), helpers::define_expr("main", 0.into()),
] ]
.into(); .into();
@ -352,7 +349,7 @@ mod tests {
#[test] #[test]
fn field_access_not_a_record() { fn field_access_not_a_record() {
let program = vec![ 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")), helpers::define_expr("record", ast::Expr::from(0).field("my_field")),
] ]
.into(); .into();
@ -362,7 +359,7 @@ mod tests {
#[test] #[test]
fn fun_call_not_a_function() { fn fun_call_not_a_function() {
let program = vec![ 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()])), helpers::define_expr("zero", ast::Expr::from(0).call(vec![1.into()])),
] ]
.into(); .into();
@ -370,4 +367,3 @@ mod tests {
assert_eq!(result, Err(Error::NotAFunction(0.into()))); assert_eq!(result, Err(Error::NotAFunction(0.into())));
} }
} }
*/