use mathhook_core::prelude::*;
#[test]
fn test_simplify_integer_addition() {
let expr = expr!(2 + 3);
let result = expr.simplify();
assert_eq!(result, expr!(5));
}
#[test]
fn test_simplify_integer_multiplication() {
let expr = expr!(2 * 3);
let result = expr.simplify();
assert_eq!(result, expr!(6));
}
#[test]
fn test_simplify_integer_power() {
let expr = expr!(2 ^ 3);
let result = expr.simplify();
assert_eq!(result, expr!(8));
}
#[test]
fn test_simplify_power_of_one() {
let expr = expr!(x ^ 1);
let result = expr.simplify();
assert_eq!(result, expr!(x));
}
#[test]
fn test_simplify_power_of_zero() {
let expr = expr!(x ^ 0);
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_simplify_zero_multiplication() {
let expr = expr!(0 * x);
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_one_multiplication() {
let expr = expr!(1 * x);
let result = expr.simplify();
assert_eq!(result, expr!(x));
}
#[test]
fn test_simplify_zero_addition() {
let expr = expr!(x + 0);
let result = expr.simplify();
assert_eq!(result, expr!(x));
}
#[test]
fn test_simplify_like_terms() {
let expr = expr!((2 * x) + (3 * x));
let result = expr.simplify();
let expected = expr!(5 * x);
assert_eq!(result, expected);
}
#[test]
fn test_simplify_nested_addition() {
let expr = expr!(1 + 2 + 3 + 4);
let result = expr.simplify();
assert_eq!(result, expr!(10));
}
#[test]
fn test_simplify_nested_multiplication() {
let expr = expr!(2 * 3 * 4);
let result = expr.simplify();
assert_eq!(result, expr!(24));
}
#[test]
fn test_simplify_double_negation() {
let x = symbol!(x);
let expr = Expression::mul(vec![
Expression::integer(-1),
Expression::mul(vec![Expression::integer(-1), Expression::symbol(x.clone())]),
]);
let result = expr.simplify();
assert_eq!(result, expr!(x));
}
#[test]
fn test_simplify_sin_zero() {
let expr = function!(sin, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_cos_zero() {
let expr = function!(cos, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_simplify_exp_zero() {
let expr = function!(exp, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_simplify_log_one() {
let expr = function!(log, expr!(1));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_sqrt_zero() {
let expr = function!(sqrt, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_sqrt_one() {
let expr = function!(sqrt, expr!(1));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_simplify_sqrt_four() {
let expr = function!(sqrt, expr!(4));
let result = expr.simplify();
assert_eq!(result, expr!(2));
}
#[test]
fn test_simplify_abs_positive() {
let expr = function!(abs, expr!(5));
let result = expr.simplify();
assert_eq!(result, expr!(5));
}
#[test]
fn test_simplify_abs_negative() {
let expr = function!(abs, Expression::integer(-5));
let result = expr.simplify();
assert_eq!(result, expr!(5));
}
#[test]
fn test_simplify_abs_zero() {
let expr = function!(abs, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_distributive_property() {
let expr = expr!(2 * (x + 3));
let result = expr.expand();
let expected = expr!((2 * x) + 6);
assert_eq!(result, expected);
}
#[test]
fn test_simplify_negative_times_positive() {
let expr = Expression::mul(vec![Expression::integer(-2), Expression::integer(3)]);
let result = expr.simplify();
assert_eq!(result, Expression::integer(-6));
}
#[test]
fn test_simplify_negative_times_negative() {
let expr = Expression::mul(vec![Expression::integer(-2), Expression::integer(-3)]);
let result = expr.simplify();
assert_eq!(result, expr!(6));
}
#[test]
fn test_simplify_power_rule_multiplication() {
let expr = expr!((x ^ 2) * (x ^ 3));
let result = expr.simplify();
let expected = expr!(x ^ 5);
assert_eq!(result, expected);
}
#[test]
fn test_simplify_power_of_power() {
let expr = expr!((x ^ 2) ^ 3);
let result = expr.simplify();
let expected = expr!(x ^ 6);
assert_eq!(result, expected);
}
#[test]
fn test_simplify_complex_nested() {
let expr = Expression::add(vec![
Expression::integer(1),
Expression::integer(2),
Expression::add(vec![Expression::integer(3), Expression::integer(4)]),
]);
let result = expr.simplify();
assert_eq!(result, expr!(10));
}
#[test]
fn test_simplify_zero_power() {
let expr = expr!(0 ^ 2);
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_simplify_one_power() {
let expr = expr!(1 ^ 5);
let result = expr.simplify();
assert_eq!(result, expr!(1));
}