mirror of
https://github.com/Noratrieb/dilaria.git
synced 2026-01-14 17:35:03 +01:00
test calls
This commit is contained in:
parent
031217f6c6
commit
63c9d5300c
2 changed files with 151 additions and 28 deletions
|
|
@ -4,7 +4,7 @@ use prelude::*;
|
||||||
|
|
||||||
mod prelude {
|
mod prelude {
|
||||||
pub(super) use super::{
|
pub(super) use super::{
|
||||||
empty_block, num_lit, parser, test_literal_bin_op, test_number_literal, token,
|
empty_block, ident, num_lit, parser, test_literal_bin_op, test_number_literal, token,
|
||||||
};
|
};
|
||||||
pub(super) use crate::ast::*;
|
pub(super) use crate::ast::*;
|
||||||
pub(super) use crate::errors::Span;
|
pub(super) use crate::errors::Span;
|
||||||
|
|
@ -25,6 +25,13 @@ fn num_lit(number: f64) -> Expr {
|
||||||
Expr::Literal(Literal::Number(number, Span::dummy()))
|
Expr::Literal(Literal::Number(number, Span::dummy()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ident(name: &str) -> Ident {
|
||||||
|
Ident {
|
||||||
|
name: name.to_string(),
|
||||||
|
span: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn empty_block() -> Block {
|
fn empty_block() -> Block {
|
||||||
Block {
|
Block {
|
||||||
stmts: vec![],
|
stmts: vec![],
|
||||||
|
|
@ -83,10 +90,7 @@ mod r#fn {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Stmt::FnDecl(FnDecl {
|
Stmt::FnDecl(FnDecl {
|
||||||
span: Span::dummy(),
|
span: Span::dummy(),
|
||||||
name: Ident {
|
name: ident("empty"),
|
||||||
name: "empty".to_string(),
|
|
||||||
span: Default::default()
|
|
||||||
},
|
|
||||||
params: vec![],
|
params: vec![],
|
||||||
body: Block {
|
body: Block {
|
||||||
stmts: vec![],
|
stmts: vec![],
|
||||||
|
|
@ -120,20 +124,8 @@ mod r#fn {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Stmt::FnDecl(FnDecl {
|
Stmt::FnDecl(FnDecl {
|
||||||
span: Span::dummy(),
|
span: Span::dummy(),
|
||||||
name: Ident {
|
name: ident("empty"),
|
||||||
name: "empty".to_string(),
|
params: vec![ident("a"), ident("b")],
|
||||||
span: Default::default()
|
|
||||||
},
|
|
||||||
params: vec![
|
|
||||||
Ident {
|
|
||||||
name: "a".to_string(),
|
|
||||||
span: Default::default()
|
|
||||||
},
|
|
||||||
Ident {
|
|
||||||
name: "b".to_string(),
|
|
||||||
span: Default::default()
|
|
||||||
}
|
|
||||||
],
|
|
||||||
body: Block {
|
body: Block {
|
||||||
stmts: vec![Stmt::Expr(Expr::BinaryOp(Box::new(BinaryOp {
|
stmts: vec![Stmt::Expr(Expr::BinaryOp(Box::new(BinaryOp {
|
||||||
span: Default::default(),
|
span: Default::default(),
|
||||||
|
|
@ -670,6 +662,142 @@ mod unary {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod call {
|
||||||
|
use super::prelude::*;
|
||||||
|
|
||||||
|
fn parse_call(tokens: Vec<Token>) -> Expr {
|
||||||
|
let mut parser = parser(tokens);
|
||||||
|
parser.call().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn field_simple() {
|
||||||
|
let tokens = [Ident("hugo"), Dot, Ident("name")].map(token).into();
|
||||||
|
let literal = parse_call(tokens);
|
||||||
|
assert_eq!(
|
||||||
|
Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Ident(ident("hugo")),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Field(ident("name"))
|
||||||
|
})),
|
||||||
|
literal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple() {
|
||||||
|
let tokens = [Ident("print"), ParenO, ParenC].map(token).into();
|
||||||
|
let literal = parse_call(tokens);
|
||||||
|
assert_eq!(
|
||||||
|
Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Ident(ident("print")),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Fn(Vec::new())
|
||||||
|
})),
|
||||||
|
literal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn fn_args() {
|
||||||
|
let tokens = [
|
||||||
|
Ident("print"),
|
||||||
|
ParenO,
|
||||||
|
Number(10.0),
|
||||||
|
Comma,
|
||||||
|
Number(5.0),
|
||||||
|
Comma,
|
||||||
|
ParenC,
|
||||||
|
]
|
||||||
|
.map(token)
|
||||||
|
.into();
|
||||||
|
let literal = parse_call(tokens);
|
||||||
|
assert_eq!(
|
||||||
|
Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Ident(ident("print")),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Fn(vec![num_lit(10.0), num_lit(5.0)])
|
||||||
|
})),
|
||||||
|
literal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn nested() {
|
||||||
|
let tokens = [
|
||||||
|
Ident("hugo"),
|
||||||
|
Dot,
|
||||||
|
Ident("name"),
|
||||||
|
Dot,
|
||||||
|
Ident("print"),
|
||||||
|
ParenO,
|
||||||
|
ParenC,
|
||||||
|
]
|
||||||
|
.map(token)
|
||||||
|
.into();
|
||||||
|
let literal = parse_call(tokens);
|
||||||
|
assert_eq!(
|
||||||
|
Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Ident(ident("hugo")),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Field(ident("name"))
|
||||||
|
})),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Field(ident("print"))
|
||||||
|
})),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Fn(vec![])
|
||||||
|
})),
|
||||||
|
literal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn with_exprs() {
|
||||||
|
// print((10 + 5).abs())
|
||||||
|
let tokens = [
|
||||||
|
Ident("print"),
|
||||||
|
ParenO,
|
||||||
|
ParenO,
|
||||||
|
Number(10.0),
|
||||||
|
Plus,
|
||||||
|
Number(5.0),
|
||||||
|
ParenC,
|
||||||
|
Dot,
|
||||||
|
Ident("abs"),
|
||||||
|
ParenO,
|
||||||
|
ParenC,
|
||||||
|
ParenC,
|
||||||
|
]
|
||||||
|
.map(token)
|
||||||
|
.into();
|
||||||
|
let literal = parse_call(tokens);
|
||||||
|
assert_eq!(
|
||||||
|
Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Ident(ident("print")),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Fn(vec![Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::Call(Box::new(Call {
|
||||||
|
callee: Expr::BinaryOp(Box::new(BinaryOp {
|
||||||
|
span: Default::default(),
|
||||||
|
lhs: num_lit(10.0),
|
||||||
|
rhs: num_lit(5.0),
|
||||||
|
kind: BinaryOpKind::Add
|
||||||
|
})),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Field(ident("abs"))
|
||||||
|
})),
|
||||||
|
span: Default::default(),
|
||||||
|
kind: CallKind::Fn(vec![])
|
||||||
|
})),])
|
||||||
|
})),
|
||||||
|
literal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mod primary {
|
mod primary {
|
||||||
use super::prelude::*;
|
use super::prelude::*;
|
||||||
|
|
||||||
|
|
@ -679,16 +807,10 @@ mod primary {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ident() {
|
fn ident_test() {
|
||||||
let tokens = [Ident("tokens")].map(token).into();
|
let tokens = [Ident("tokens")].map(token).into();
|
||||||
let literal = parse_primary(tokens);
|
let literal = parse_primary(tokens);
|
||||||
assert_eq!(
|
assert_eq!(Expr::Ident(ident("tokens")), literal);
|
||||||
Expr::Ident(Ident {
|
|
||||||
name: "tokens".to_string(),
|
|
||||||
span: Span::dummy()
|
|
||||||
}),
|
|
||||||
literal
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
3
test.sl
3
test.sl
|
|
@ -1,7 +1,8 @@
|
||||||
fn fizzbuzz() {
|
fn fizzbuzz() {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
while i < 100 {
|
while i < 100 {
|
||||||
# don't have function calls yet :(
|
let out = single_fizzbuzz(i);
|
||||||
|
print(out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue