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 {
Expr::Func(Box::new(func))
pub fn func(args: Vec<Arg>, body: Expr) -> Expr {
Expr::Func(Box::new(Fn { args, body }))
}

View file

@ -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",
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,29 +285,22 @@ 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",
helpers::func(
vec![],
ast::Expr::If {
condition: Box::new(false.into()),
then: Box::new(0.into()),
@ -312,22 +310,22 @@ mod tests {
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())));
}
}
*/