mirror of
https://github.com/PaddiM8/kalker.git
synced 2025-06-26 04:31:49 +02:00
Added test_fn and test_sum_fn for the interpreter.
This commit is contained in:
parent
b3e07b710e
commit
4e2fe9eb3b
@ -246,6 +246,7 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use crate::lexer::TokenKind::*;
|
use crate::lexer::TokenKind::*;
|
||||||
use crate::test_helpers::*;
|
use crate::test_helpers::*;
|
||||||
|
use test_case::test_case;
|
||||||
|
|
||||||
const PRECISION: u32 = 53;
|
const PRECISION: u32 = 53;
|
||||||
|
|
||||||
@ -299,19 +300,19 @@ mod tests {
|
|||||||
let deg = Stmt::Expr(Box::new(Expr::Unit(literal("1"), Deg)));
|
let deg = Stmt::Expr(Box::new(Expr::Unit(literal("1"), Deg)));
|
||||||
|
|
||||||
assert_eq!(interpret(rad).unwrap().unwrap(), 1);
|
assert_eq!(interpret(rad).unwrap().unwrap(), 1);
|
||||||
assert_eq!(
|
assert!(
|
||||||
interpret(deg).unwrap().unwrap(),
|
(interpret(deg).unwrap().unwrap() - Float::with_val(PRECISION, 0.017456)).abs()
|
||||||
Float::with_val(10, 0.017456)
|
< Float::with_val(PRECISION, 0.0001)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_var() {
|
fn test_var() {
|
||||||
let stmt = Stmt::Expr(Box::new(Expr::Var(String::from("x"))));
|
let stmt = Stmt::Expr(var("x"));
|
||||||
|
|
||||||
// Prepare by inserting a variable declaration in the symbol table.
|
// Prepare by inserting a variable declaration in the symbol table.
|
||||||
let mut symbol_table = SymbolTable::new();
|
let mut symbol_table = SymbolTable::new();
|
||||||
symbol_table.insert("x", Stmt::VarDecl(String::from("x"), literal("1")));
|
symbol_table.insert("x", var_decl("x", literal("1")));
|
||||||
|
|
||||||
let mut context = Context::new(&mut symbol_table, &Unit::Radians, PRECISION);
|
let mut context = Context::new(&mut symbol_table, &Unit::Radians, PRECISION);
|
||||||
assert_eq!(context.interpret(vec![stmt]).unwrap().unwrap(), 1);
|
assert_eq!(context.interpret(vec![stmt]).unwrap().unwrap(), 1);
|
||||||
@ -319,7 +320,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_undefined_var() {
|
fn test_undefined_var() {
|
||||||
let stmt = Stmt::Expr(Box::new(Expr::Var(String::from("x"))));
|
let stmt = Stmt::Expr(var("x"));
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
interpret(stmt),
|
interpret(stmt),
|
||||||
@ -329,7 +330,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_var_decl() {
|
fn test_var_decl() {
|
||||||
let stmt = Stmt::VarDecl(String::from("x"), literal("1"));
|
let stmt = var_decl("x", literal("1"));
|
||||||
let mut symbol_table = SymbolTable::new();
|
let mut symbol_table = SymbolTable::new();
|
||||||
Context::new(&mut symbol_table, &Unit::Radians, PRECISION)
|
Context::new(&mut symbol_table, &Unit::Radians, PRECISION)
|
||||||
.interpret(vec![stmt])
|
.interpret(vec![stmt])
|
||||||
@ -337,4 +338,38 @@ mod tests {
|
|||||||
|
|
||||||
assert!(symbol_table.contains_var("x"));
|
assert!(symbol_table.contains_var("x"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_fn() {
|
||||||
|
let stmt = Stmt::Expr(fn_call("f", vec![*literal("1")]));
|
||||||
|
|
||||||
|
// Prepare by inserting a variable declaration in the symbol table.
|
||||||
|
let mut symbol_table = SymbolTable::new();
|
||||||
|
symbol_table.insert(
|
||||||
|
"f()",
|
||||||
|
fn_decl(
|
||||||
|
"f",
|
||||||
|
vec![String::from("x")],
|
||||||
|
binary(var("x"), TokenKind::Plus, literal("2")),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut context = Context::new(&mut symbol_table, &Unit::Radians, PRECISION);
|
||||||
|
assert_eq!(context.interpret(vec![stmt]).unwrap().unwrap(), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test_case("1", "2", 9f64)]
|
||||||
|
#[test_case("1.2", "2.3", 9f64)]
|
||||||
|
fn test_sum_fn(start: &str, to: &str, result: f64) {
|
||||||
|
let stmt = Stmt::Expr(fn_call(
|
||||||
|
"sum",
|
||||||
|
vec![
|
||||||
|
*literal(start),
|
||||||
|
*literal(to),
|
||||||
|
*binary(var("n"), TokenKind::Plus, literal("3")),
|
||||||
|
],
|
||||||
|
));
|
||||||
|
|
||||||
|
assert_eq!(interpret(stmt).unwrap().unwrap(), result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
use crate::ast::Expr;
|
use crate::ast::Expr;
|
||||||
|
use crate::ast::Stmt;
|
||||||
use crate::lexer::Token;
|
use crate::lexer::Token;
|
||||||
use crate::lexer::TokenKind;
|
use crate::lexer::TokenKind;
|
||||||
|
|
||||||
@ -19,6 +20,10 @@ pub fn var(identifier: &str) -> Box<Expr> {
|
|||||||
Box::new(Expr::Var(identifier.into()))
|
Box::new(Expr::Var(identifier.into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn fn_call(identifier: &str, arguments: Vec<Expr>) -> Box<Expr> {
|
||||||
|
Box::new(Expr::FnCall(identifier.into(), arguments))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn binary(left: Box<Expr>, op: TokenKind, right: Box<Expr>) -> Box<Expr> {
|
pub fn binary(left: Box<Expr>, op: TokenKind, right: Box<Expr>) -> Box<Expr> {
|
||||||
Box::new(Expr::Binary(left, op, right))
|
Box::new(Expr::Binary(left, op, right))
|
||||||
}
|
}
|
||||||
@ -30,3 +35,11 @@ pub fn unary(op: TokenKind, expr: Box<Expr>) -> Box<Expr> {
|
|||||||
pub fn group(expr: Box<Expr>) -> Box<Expr> {
|
pub fn group(expr: Box<Expr>) -> Box<Expr> {
|
||||||
Box::new(Expr::Group(expr))
|
Box::new(Expr::Group(expr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn var_decl(identifier: &str, value: Box<Expr>) -> Stmt {
|
||||||
|
Stmt::VarDecl(identifier.into(), value)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn fn_decl(identifier: &str, parameters: Vec<String>, value: Box<Expr>) -> Stmt {
|
||||||
|
Stmt::FnDecl(identifier.into(), parameters, value)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user