test: add tests for RPN

This commit is contained in:
2026-06-14 03:25:10 +03:00
parent 7f5c21e2cd
commit 8508f9e8a8
+158
View File
@@ -43,3 +43,161 @@ pub fn to_rpn(tokens: Vec<Token>) -> Vec<Token> {
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);
}
}