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 {
|
pub fn func(args: Vec<Arg>, body: Expr) -> Expr {
|
||||||
Expr::Func(Box::new(func))
|
Expr::Func(Box::new(Fn { args, body }))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
vec![
|
helpers::func(
|
||||||
helpers::assign("zero", 0.into()),
|
vec![],
|
||||||
helpers::stmt_expr("zero".into()),
|
vec![
|
||||||
]
|
helpers::assign("zero", 0.into()),
|
||||||
.into(),
|
helpers::stmt_expr("zero".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,54 +285,47 @@ 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",
|
||||||
ast::Expr::If {
|
helpers::func(
|
||||||
condition: Box::new(false.into()),
|
vec![],
|
||||||
then: Box::new(0.into()),
|
ast::Expr::If {
|
||||||
r#else: Box::new(ast::Expr::If {
|
condition: Box::new(false.into()),
|
||||||
condition: Box::new(true.into()),
|
then: Box::new(0.into()),
|
||||||
then: Box::new(1.into()),
|
r#else: Box::new(ast::Expr::If {
|
||||||
r#else: Box::new(2.into()),
|
condition: Box::new(true.into()),
|
||||||
}),
|
then: Box::new(1.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())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue