add test for eval

This commit is contained in:
Charlie Root 2025-03-29 11:35:58 +01:00
commit ba6f572d6b
Signed by: faukah
SSH key fingerprint: SHA256:Uj2AXqvtdCA4hn5Hq0ZonhIAyUqI1q4w2sMG3Z1TH7E

View file

@ -1,4 +1,4 @@
use std::{error::Error, io}; use std::io;
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
enum Symbol { enum Symbol {
@ -20,6 +20,21 @@ enum Node {
Number { value: u64 }, Number { value: u64 },
} }
#[test]
fn test_eval() {
let node_to_eval = Node::Add {
left: Box::new(Node::Add {
left: Box::new(Node::Number { value: 1 }),
right: Box::new(Node::Number { value: 1 }),
}),
right: Box::new(Node::Number { value: 3 }),
};
let result = eval(&node_to_eval);
assert!(result == 5_i64);
}
fn eval(expr: &Node) -> i64 { fn eval(expr: &Node) -> i64 {
match expr { match expr {
Node::Add { left, right } => eval(left) + eval(right), Node::Add { left, right } => eval(left) + eval(right),
@ -158,13 +173,10 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
let mut i = 0; let mut i = 0;
while i < length { while i < length {
// println!("Count: {}", i);
let s = &input[i]; let s = &input[i];
// println!("Symbol: {:?}", s);
match s { match s {
Symbol::Number { value } => { Symbol::Number { value } => {
stack.push(Node::Number { value: *value }); stack.push(Node::Number { value: *value });
// println!("pushed {value}")
} }
Symbol::Add => { Symbol::Add => {
let left = stack.pop(); let left = stack.pop();
@ -199,8 +211,6 @@ fn ast(input: Vec<Symbol>) -> Result<Node, ParseError> {
} }
i += 1; i += 1;
} }
// println!("Stack length: {}", stack.len());
// println!("Stack: {:?}", stack);
if stack.len() != 1 { if stack.len() != 1 {
return Err(ParseError::WrongTokenError { pos: 1 }); return Err(ParseError::WrongTokenError { pos: 1 });
} }