interpret tests
This commit is contained in:
parent
e8d46772a5
commit
eb886688ad
2 changed files with 39 additions and 43 deletions
|
|
@ -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 }))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())));
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue