You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.5 KiB

use crate::{
PrimitiveType, Type,
parse::{
Ast, Constant,
sexpr::{Sexpr, parse_string},
},
};
use super::{parse, parse_type};
#[test]
fn parse_to_sexpr() {
let input = "((\\x:Nat.x) (5))";
let parsed = parse_string(input).unwrap();
assert_eq!(
parsed,
Sexpr::List(vec![
Sexpr::List(vec![Sexpr::Symbol("\\x:Nat.x".to_string())]),
Sexpr::List(vec![Sexpr::Symbol("5".to_string())])
])
);
}
#[test]
fn parse_prim_type() {
let input = Sexpr::Symbol("Nat".to_string());
let parsed = parse_type(&input).unwrap();
assert_eq!(parsed, Type::Primitive(PrimitiveType::Nat))
}
#[test]
fn parse_simpl_arr_type() {
let input = Sexpr::List(vec![
Sexpr::Symbol("Nat".to_string()),
Sexpr::Symbol("->".to_string()),
Sexpr::Symbol("Nat".to_string()),
]);
let parsed = parse_type(&input).unwrap();
assert_eq!(parsed, Type::arrow(PrimitiveType::Nat, PrimitiveType::Nat))
}
#[test]
fn parse_apply_arr_type() {
let input = Sexpr::List(vec![
Sexpr::List(vec![
Sexpr::Symbol("Nat".to_string()),
Sexpr::Symbol("->".to_string()),
Sexpr::Symbol("Nat".to_string()),
]),
Sexpr::Symbol("->".to_string()),
Sexpr::Symbol("Nat".to_string()),
Sexpr::Symbol("->".to_string()),
Sexpr::Symbol("Nat".to_string()),
]);
let parsed = parse_type(&input).unwrap();
assert_eq!(
parsed,
Type::arrow(
Type::arrow(PrimitiveType::Nat, PrimitiveType::Nat),
Type::arrow(PrimitiveType::Nat, PrimitiveType::Nat)
)
)
}
#[test]
fn parse_abstraction() {
let input = "(\\ (x (Nat -> Nat)) (x 5))";
let parsed = parse(input).unwrap();
assert_eq!(
parsed,
Ast::Abstraction(
"x".to_string(),
Type::arrow(PrimitiveType::Nat, PrimitiveType::Nat),
Box::new(Ast::Application(
Box::new(Ast::Variable("x".to_string())),
Box::new(Ast::Constant(Constant::Nat(5)))
))
)
)
}
#[test]
fn parse_application() {
let input = "((add 5) 6)";
let parsed = parse(input).unwrap();
assert_eq!(
parsed,
Ast::Application(
Box::new(Ast::Application(
Box::new(Ast::Variable("add".to_string())),
Box::new(Ast::Constant(Constant::Nat(5)))
)),
Box::new(Ast::Constant(Constant::Nat(6)))
)
)
}