use mathhook_core::prelude::*;
#[test]
fn test_simplify_basic_arithmetic() {
let expr1 = Expression::integer(2) + Expression::integer(3);
let result1 = expr1.simplify();
assert_eq!(result1, Expression::integer(5));
let expr2 = Expression::mul(vec![
Expression::integer(6),
Expression::pow(Expression::integer(3), Expression::integer(-1)),
]);
let result2 = expr2.simplify();
assert_eq!(
result2,
Expression::integer(2),
"6*3^(-1) should simplify to 2, got: {}",
result2
);
}
#[test]
fn test_numeric_simplification() {
let expr = Expression::add(vec![
Expression::integer(1),
Expression::integer(2),
Expression::integer(3),
]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(6));
let expr = Expression::mul(vec![
Expression::integer(2),
Expression::integer(3),
Expression::integer(4),
]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(24));
}
#[test]
fn test_zero_and_one_identities() {
let x = symbol!(x);
let expr = Expression::symbol(x.clone()) + Expression::integer(0);
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x.clone()));
let expr = Expression::symbol(x.clone()) * Expression::integer(1);
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x.clone()));
let expr = Expression::symbol(x.clone()) * Expression::integer(0);
let result = expr.simplify();
assert_eq!(result, Expression::integer(0));
}
#[test]
fn test_mathematical_constants() {
let pi = Expression::symbol(symbol!(pi));
let e = Expression::symbol(symbol!(e));
let expr = pi.clone() + e.clone();
let result = expr.simplify();
match result {
Expression::Add(terms) => {
assert_eq!(terms.len(), 2);
assert!(terms.contains(&pi));
assert!(terms.contains(&e));
}
_ => panic!("Expected addition of pi and e, got: {}", result),
}
}
#[test]
fn test_edge_case_simplification() {
let x = symbol!(x);
let expr = Expression::add(vec![]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(0));
let expr = Expression::mul(vec![]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(1));
let expr = Expression::add(vec![Expression::symbol(x.clone())]);
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x.clone()));
let expr = Expression::mul(vec![Expression::symbol(x.clone())]);
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x.clone()));
}
#[test]
fn test_simplify_float_vs_integer() {
let expr1 = Expression::number(Number::float(2.5)) + Expression::number(Number::float(1.5));
let result1 = expr1.simplify();
match result1 {
Expression::Number(Number::Float(f)) => assert_eq!(f, 4.0),
_ => panic!("Expected float result, got: {}", result1),
}
let expr2 = Expression::integer(3) + Expression::number(Number::float(2.5));
let result2 = expr2.simplify();
println!("Mixed arithmetic result: {}", result2);
}
#[test]
fn test_advanced_algebraic_identities() {
let x = symbol!(x);
let expr = Expression::symbol(x.clone()) + Expression::symbol(x.clone());
let result = expr.simplify();
println!("x + x = {}", result);
let expr = Expression::symbol(x.clone()) * Expression::symbol(x.clone());
let result = expr.simplify();
println!("x * x = {}", result);
}
#[test]
fn test_issue_27380() {
let x = symbol!(x);
let expr = Expression::add(vec![
Expression::integer(1),
Expression::symbol(x.clone()),
Expression::integer(-1),
]);
let result = expr.simplify();
match result {
Expression::Symbol(s) if s.name() == "x" => assert_eq!(s.name(), "x"),
Expression::Add(ref terms) => {
let has_zero = terms.iter().any(|t| t.is_zero());
let has_x = terms
.iter()
.any(|t| matches!(t, Expression::Symbol(s) if s.name() == "x"));
assert!(has_x, "Should contain x");
if has_zero {
println!("Partial simplification: {}", result);
}
}
_ => println!("Different simplification result: {}", result),
}
}
#[test]
fn test_numeric_combination_patterns() {
let expr = Expression::add(vec![
Expression::integer(1),
Expression::integer(2),
Expression::integer(3),
Expression::integer(4),
Expression::integer(5),
]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(15));
let expr = Expression::mul(vec![
Expression::integer(2),
Expression::integer(3),
Expression::integer(5),
]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(30));
let x = symbol!(x);
let expr = Expression::add(vec![
Expression::integer(10),
Expression::symbol(x.clone()),
Expression::integer(5),
Expression::symbol(x.clone()),
Expression::integer(-3),
]);
let result = expr.simplify();
println!("Mixed pattern result: {}", result);
}
#[test]
fn test_advanced_numeric_operations() {
let expr = Expression::integer(1000000) + Expression::integer(2000000);
let result = expr.simplify();
assert_eq!(result, Expression::integer(3000000));
let expr = Expression::integer(-5) + Expression::integer(3);
let result = expr.simplify();
assert_eq!(result, Expression::integer(-2));
let expr = Expression::integer(-2) * Expression::integer(3);
let result = expr.simplify();
assert_eq!(result, Expression::integer(-6));
let x = symbol!(x);
let expr = Expression::mul(vec![
Expression::integer(0),
Expression::symbol(x.clone()),
Expression::integer(100),
]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(0));
}
#[test]
fn test_historic_80_percent_milestone() {
let x = symbol!(x);
let y = symbol!(y);
let expr = Expression::add(vec![
Expression::mul(vec![Expression::integer(2), Expression::symbol(x.clone())]),
Expression::mul(vec![Expression::integer(3), Expression::symbol(y.clone())]),
Expression::integer(5),
]);
let result = expr.simplify();
println!("80% milestone expression: {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_ultimate_100_percent_operation_1() {
let x = symbol!(x);
let expr = Expression::add(vec![
Expression::pow(Expression::symbol(x.clone()), Expression::integer(2)),
Expression::mul(vec![Expression::integer(-2), Expression::symbol(x.clone())]),
Expression::integer(1),
]);
let result = expr.simplify();
println!("Ultimate operation 1: {}", result);
assert!(!result.is_zero());
}