test: add tests for RPN
This commit is contained in:
+158
@@ -43,3 +43,161 @@ pub fn to_rpn(tokens: Vec<Token>) -> Vec<Token> {
|
|||||||
|
|
||||||
return out_buf;
|
return out_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use crate::tokenizer::Token;
|
||||||
|
|
||||||
|
fn num(n: i32) -> Token { Token::Number(n) }
|
||||||
|
fn add() -> Token { Token::Addition }
|
||||||
|
fn sub() -> Token { Token::Substruction }
|
||||||
|
fn mul() -> Token { Token::Multiplication }
|
||||||
|
fn div() -> Token { Token::Division }
|
||||||
|
fn br_open() -> Token { Token::BracketOpen }
|
||||||
|
fn br_close() -> Token { Token::BracketClose }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_single_number() {
|
||||||
|
let input = vec![num(42)];
|
||||||
|
let expected = vec![num(42)];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty() {
|
||||||
|
let input = vec![];
|
||||||
|
let expected = vec![];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_addition() {
|
||||||
|
let input = vec![num(2), add(), num(3)];
|
||||||
|
let expected = vec![num(2), num(3), add()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_priority() {
|
||||||
|
let input = vec![num(2), add(), num(3), mul(), num(4)];
|
||||||
|
let expected = vec![num(2), num(3), num(4), mul(), add()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_left_associativity() {
|
||||||
|
let input = vec![num(1), sub(), num(2), sub(), num(3)];
|
||||||
|
let expected = vec![num(1), num(2), sub(), num(3), sub()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_left_associativity_division() {
|
||||||
|
let input = vec![num(100), div(), num(5), div(), num(2)];
|
||||||
|
let expected = vec![num(100), num(5), div(), num(2), div()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_brackets_basic() {
|
||||||
|
let input = vec![
|
||||||
|
br_open(), num(2), add(), num(3), br_close(), mul(), num(4)
|
||||||
|
];
|
||||||
|
let expected = vec![num(2), num(3), add(), num(4), mul()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_nested_brackets() {
|
||||||
|
let input = vec![
|
||||||
|
br_open(), num(2), add(), num(3), br_close(),
|
||||||
|
mul(),
|
||||||
|
br_open(), num(4), sub(), num(1), br_close()
|
||||||
|
];
|
||||||
|
let expected = vec![
|
||||||
|
num(2), num(3), add(),
|
||||||
|
num(4), num(1), sub(),
|
||||||
|
mul()
|
||||||
|
];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deeply_nested() {
|
||||||
|
let input = vec![
|
||||||
|
br_open(), br_open(), num(1), add(), num(2), br_close(),
|
||||||
|
mul(),
|
||||||
|
br_open(), num(3), add(), num(4), br_close(),
|
||||||
|
br_close()
|
||||||
|
];
|
||||||
|
let expected = vec![
|
||||||
|
num(1), num(2), add(),
|
||||||
|
num(3), num(4), add(),
|
||||||
|
mul()
|
||||||
|
];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_complex_expression() {
|
||||||
|
let input = vec![
|
||||||
|
num(12), add(), num(34), mul(),
|
||||||
|
br_open(), num(56), sub(), num(78), br_close(),
|
||||||
|
div(), num(90)
|
||||||
|
];
|
||||||
|
let expected = vec![
|
||||||
|
num(12), num(34), num(56), num(78), sub(), mul(), num(90), div(), add()
|
||||||
|
];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_consecutive_operators() {
|
||||||
|
let input = vec![num(5), mul(), sub(), num(3)];
|
||||||
|
let expected_current = vec![num(5), num(3), mul(), sub()];
|
||||||
|
assert_eq!(to_rpn(input), expected_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_unary_minus() {
|
||||||
|
let input = vec![sub(), num(5)];
|
||||||
|
let expected = vec![num(5), sub()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_only_operators() {
|
||||||
|
let input = vec![add(), mul(), sub()];
|
||||||
|
let expected = vec![sub(), mul(), add()];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty_brackets() {
|
||||||
|
let input = vec![br_open(), br_close()];
|
||||||
|
let expected: Vec<Token> = vec![];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_brackets_single_number() {
|
||||||
|
let input = vec![br_open(), num(42), br_close()];
|
||||||
|
let expected = vec![num(42)];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_equal_priority_with_brackets() {
|
||||||
|
let input = vec![
|
||||||
|
num(1), add(),
|
||||||
|
br_open(), num(2), sub(), num(3), br_close(),
|
||||||
|
add(), num(4)
|
||||||
|
];
|
||||||
|
let expected = vec![
|
||||||
|
num(1), num(2), num(3), sub(), add(), num(4), add()
|
||||||
|
];
|
||||||
|
assert_eq!(to_rpn(input), expected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user