use mathhook_core::prelude::*;
#[test]
fn test_power_simplification() {
let x = symbol!(x);
let expr = Expression::pow(Expression::symbol(x.clone()), Expression::integer(0));
let result = expr.simplify();
assert_eq!(result, Expression::integer(1));
let expr = Expression::pow(Expression::symbol(x.clone()), Expression::integer(1));
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x.clone()));
let expr = Expression::pow(Expression::integer(0), Expression::integer(5));
let result = expr.simplify();
assert_eq!(result, Expression::integer(0));
let expr = Expression::pow(Expression::integer(1), Expression::integer(100));
let result = expr.simplify();
assert_eq!(result, Expression::integer(1));
}
#[test]
fn test_distribute_multiplication() {
let x = symbol!(x);
let y = symbol!(y);
let expr = Expression::mul(vec![
Expression::integer(2),
Expression::add(vec![
Expression::symbol(x.clone()),
Expression::symbol(y.clone()),
]),
]);
let result = expr.simplify();
println!("Distribution test: 2(x + y) = {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_algebraic_manipulation_patterns() {
let x = symbol!(x);
let expr = Expression::pow(
Expression::pow(Expression::symbol(x.clone()), Expression::integer(2)),
Expression::number(Number::rational(num_rational::BigRational::new(
num_bigint::BigInt::from(1),
num_bigint::BigInt::from(2),
))),
);
let result = expr.simplify();
println!("(x^2)^(1/2) = {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_historic_50_percent_milestone() {
let x = symbol!(x);
let expr = Expression::pow(
Expression::add(vec![Expression::symbol(x.clone()), Expression::integer(1)]),
Expression::integer(2),
);
let result = expr.simplify();
println!("50% milestone: (x + 1)^2 = {}", result);
assert!(
matches!(result, Expression::Pow(_, _)),
"Expected (x + 1)^2 to remain as power (50% milestone), got: {}",
result
);
}
#[test]
fn test_simplify_zero_expressions() {
let x = symbol!(x);
let expr = Expression::add(vec![
Expression::symbol(x.clone()),
Expression::mul(vec![Expression::integer(-1), Expression::symbol(x.clone())]),
]);
let result = expr.simplify();
println!("x + (-1)*x = {}", result);
match result {
Expression::Number(Number::Integer(0)) => {
assert_eq!(result, Expression::integer(0));
}
Expression::Add(_) | Expression::Mul(_) | Expression::Symbol(_) => {
println!(
"Like-term collection not yet implemented: x + (-1)*x = {}",
result
);
}
_ => panic!("Expression should be valid"),
}
}
#[test]
fn test_advanced_power_patterns() {
let x = symbol!(x);
let expr = Expression::mul(vec![
Expression::pow(Expression::symbol(x.clone()), Expression::integer(2)),
Expression::pow(Expression::symbol(x.clone()), Expression::integer(3)),
]);
let result = expr.simplify();
println!("x^2 * x^3 = {}", result);
assert!(!result.is_zero());
let expr = Expression::pow(
Expression::pow(Expression::symbol(x.clone()), Expression::integer(2)),
Expression::integer(3),
);
let result = expr.simplify();
println!("(x^2)^3 = {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_ultimate_power_mastery() {
let x = symbol!(x);
let expr = Expression::mul(vec![
Expression::pow(Expression::symbol(x.clone()), Expression::integer(-2)),
Expression::pow(Expression::symbol(x.clone()), Expression::integer(3)),
]);
let result = expr.simplify();
println!("x^(-2) * x^3 = {}", result);
let result_str = result.to_string();
assert!(result_str.contains("x"), "Should contain x");
let expr = Expression::pow(
Expression::integer(8),
Expression::number(Number::rational(num_rational::BigRational::new(
num_bigint::BigInt::from(1),
num_bigint::BigInt::from(3),
))),
);
let result = expr.simplify();
println!("8^(1/3) = {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_ultimate_power_combinations() {
let x = symbol!(x);
let y = symbol!(y);
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::symbol(y.clone()),
]),
Expression::pow(Expression::symbol(y.clone()), Expression::integer(2)),
]);
let result = expr.simplify();
println!("x^2 + 2xy + y^2 = {}", result);
match result {
Expression::Add(_)
| Expression::Mul(_)
| Expression::Pow(_, _)
| Expression::Symbol(_)
| Expression::Number(_) => (),
_ => panic!("Polynomial expression should be valid"),
}
let expr = Expression::pow(Expression::integer(0), Expression::symbol(x.clone()));
let result = expr.simplify();
println!("0^x = {}", result);
assert!(!result.to_string().is_empty());
}
#[test]
fn test_ultimate_100_percent_operation_2() {
let x = symbol!(x);
let expr = Expression::pow(
Expression::add(vec![
Expression::pow(Expression::symbol(x.clone()), Expression::integer(2)),
Expression::integer(1),
]),
Expression::number(Number::rational(num_rational::BigRational::new(
num_bigint::BigInt::from(1),
num_bigint::BigInt::from(2),
))),
);
let result = expr.simplify();
println!("Ultimate power operation 2: {}", result);
assert!(!result.is_zero());
}
#[test]
fn test_numeric_powers() {
let expr = Expression::pow(Expression::integer(2), Expression::integer(3));
let result = expr.simplify();
match result {
Expression::Number(Number::Integer(n)) if n == 8 => {
assert_eq!(n, 8);
}
_ => {
println!("Numeric power result: {}", result);
assert!(!result.is_zero() || result == Expression::integer(0));
}
}
let expr = Expression::pow(Expression::integer(3), Expression::integer(4));
let result = expr.simplify();
println!("3^4 = {}", result);
let expr = Expression::pow(Expression::integer(-2), Expression::integer(3));
let result = expr.simplify();
println!("(-2)^3 = {}", result);
}
#[test]
fn test_power_edge_cases() {
let x = symbol!(x);
let expr = Expression::pow(Expression::integer(0), Expression::integer(0));
let result = expr.simplify();
println!("0^0 = {}", result);
let expr = Expression::pow(
Expression::add(vec![Expression::symbol(x.clone()), Expression::integer(5)]),
Expression::integer(0),
);
let result = expr.simplify();
assert_eq!(result, Expression::integer(1));
let expr = Expression::pow(Expression::integer(1), Expression::symbol(x.clone()));
let result = expr.simplify();
assert_eq!(result, Expression::integer(1));
}