use std::collections::HashMap;
use pretty_assertions::assert_eq;
use expression_parser::{parse_formula, eval};
#[test]
fn test_whitespace() {
let expr = parse_formula(" 1 + 2 ");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 3.0);
}
#[test]
fn test_file_rule() {
let expr = parse_formula("1 + 2");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 3.0);
}
#[test]
fn test_expr_rule() {
let expr_assign = parse_formula("result = 2 + 3");
let vars = HashMap::new();
let result_assign = eval(&expr_assign, &vars);
assert_eq!(result_assign, 5.0);
let expr_sum = parse_formula("4 + 6 / 2");
let vars = HashMap::new();
let result_sum = eval(&expr_sum, &vars);
assert_eq!(result_sum, 7.0);
}
#[test]
fn test_assign_rule() {
let expr = parse_formula("ROI = (R - C) / C * 100");
let mut vars = HashMap::new();
vars.insert("R".into(), 1500.0);
vars.insert("C".into(), 1000.0);
let result = eval(&expr, &vars);
assert_eq!(result, 50.0);
}
#[test]
fn test_sum_rule() {
let expr = parse_formula("2 + 3 - 1");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 4.0);
}
#[test]
fn test_product_rule() {
let expr = parse_formula("4 * 3 / 2");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 6.0);
}
#[test]
fn test_power_operation() {
let expr = parse_formula("2 ^ 3");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 8.0);
}
#[test]
fn test_atom_rule() {
let mut vars = HashMap::new();
vars.insert("x".into(), 2.0);
vars.insert("y".into(), 3.0);
let expr = parse_formula("5 + (x + y) * 3 + Σi=1to2(i)");
let result = eval(&expr, &vars);
assert_eq!(result, 23.0);
}
#[test]
fn test_summation_basic() {
let expr = parse_formula("Σk=1to3(k^2)");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 14.0);
}
#[test]
fn test_summation_with_expression() {
let expr = parse_formula("Σi=1to4(i^2 + 1)");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 34.0);
}
#[test]
fn test_ident_rule() {
let mut vars = HashMap::new();
vars.insert("x".into(), 2.0);
vars.insert("ROI".into(), 50.0);
vars.insert("Revenue_2025".into(), 1000.0);
let expr = parse_formula("x + ROI + Revenue_2025");
let result = eval(&expr, &vars);
assert_eq!(result, 1052.0);
}
#[test]
fn test_number_rule() {
let expr = parse_formula("5 + (-3) + 2.5");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 4.5);
}
#[test]
fn test_simple_addition() {
let expr = parse_formula("1 + 2 * 3");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 7.0);
}
#[test]
fn test_parentheses_precedence() {
let expr = parse_formula("(1 + 2) * 3");
let vars = HashMap::new();
let result = eval(&expr, &vars);
assert_eq!(result, 9.0);
}
#[test]
fn test_variables_usage() {
let expr = parse_formula("A + B * 2");
let mut vars = HashMap::new();
vars.insert("A".into(), 3.0);
vars.insert("B".into(), 4.0);
let result = eval(&expr, &vars);
assert_eq!(result, 11.0);
}