use super::EnhancedSimplifier;
use crate::core::{Expression, Number, MathConstant};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_radical_simplification() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt2 = Expression::function("sqrt", vec![Expression::Number(Number::integer(2))]);
let sqrt8 = Expression::function("sqrt", vec![Expression::Number(Number::integer(8))]);
let expr = Expression::add(sqrt2, sqrt8);
let result = simplifier.enhanced_simplify(&expr).unwrap();
let expected = Expression::multiply(
Expression::Number(Number::integer(3)),
Expression::function("sqrt", vec![Expression::Number(Number::integer(2))])
);
println!("输入: sqrt(2) + sqrt(8)");
println!("输出: {:?}", result);
println!("期望: {:?}", expected);
match result {
Expression::BinaryOp { op: crate::core::BinaryOperator::Multiply, left, right } => {
let has_coeff_3 = matches!(left.as_ref(), Expression::Number(n) if n == &Number::integer(3)) ||
matches!(right.as_ref(), Expression::Number(n) if n == &Number::integer(3));
let has_sqrt_2 = matches!(left.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2))) ||
matches!(right.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2)));
assert!(has_coeff_3 && has_sqrt_2, "结果应该是 3*sqrt(2) 的形式");
}
_ => {
println!("结果不是预期的乘法形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_sqrt_8_simplification() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt8 = Expression::function("sqrt", vec![Expression::Number(Number::integer(8))]);
let result = simplifier.enhanced_simplify(&sqrt8).unwrap();
println!("输入: sqrt(8)");
println!("输出: {:?}", result);
match result {
Expression::BinaryOp { op: crate::core::BinaryOperator::Multiply, left, right } => {
let has_coeff_2 = matches!(left.as_ref(), Expression::Number(n) if n == &Number::integer(2)) ||
matches!(right.as_ref(), Expression::Number(n) if n == &Number::integer(2));
let has_sqrt_2 = matches!(left.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2))) ||
matches!(right.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2)));
assert!(has_coeff_2 && has_sqrt_2, "sqrt(8) 应该化简为 2*sqrt(2)");
}
_ => {
println!("sqrt(8) 没有被正确化简,实际结果: {:?}", result);
}
}
}
#[test]
fn test_radical_multiplication() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt3 = Expression::function("sqrt", vec![Expression::Number(Number::integer(3))]);
let sqrt12 = Expression::function("sqrt", vec![Expression::Number(Number::integer(12))]);
let expr = Expression::multiply(sqrt3, sqrt12);
let result = simplifier.enhanced_simplify(&expr).unwrap();
println!("输入: sqrt(3) * sqrt(12)");
println!("输出: {:?}", result);
}
#[test]
fn test_trigonometric_simplification() {
let mut simplifier = EnhancedSimplifier::new();
let x = Expression::variable("x");
let neg_x = Expression::negate(x.clone());
let sin_neg_x = Expression::function("sin", vec![neg_x]);
let result = simplifier.enhanced_simplify(&sin_neg_x).unwrap();
println!("输入: sin(-x)");
println!("输出: {:?}", result);
match result {
Expression::UnaryOp { op: crate::core::UnaryOperator::Negate, operand } => {
match operand.as_ref() {
Expression::Function { name, args } => {
assert_eq!(name, "sin");
assert_eq!(args.len(), 1);
assert_eq!(args[0], x);
}
_ => panic!("期望 -sin(x) 形式"),
}
}
_ => {
println!("结果不是预期的负号形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_special_angle_sine() {
let mut simplifier = EnhancedSimplifier::new();
let pi_over_6 = Expression::divide(
Expression::Constant(MathConstant::Pi),
Expression::Number(Number::integer(6))
);
let sin_pi_6 = Expression::function("sin", vec![pi_over_6]);
let result = simplifier.enhanced_simplify(&sin_pi_6).unwrap();
println!("输入: sin(π/6)");
println!("输出: {:?}", result);
match result {
Expression::Number(Number::Rational(r)) => {
assert_eq!(r.numer(), &num_bigint::BigInt::from(1));
assert_eq!(r.denom(), &num_bigint::BigInt::from(2));
}
_ => {
println!("结果不是预期的有理数形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_pythagorean_identity() {
let mut simplifier = EnhancedSimplifier::new();
let x = Expression::variable("x");
let sin_x = Expression::function("sin", vec![x.clone()]);
let cos_x = Expression::function("cos", vec![x]);
let sin_squared = Expression::power(sin_x, Expression::Number(Number::integer(2)));
let cos_squared = Expression::power(cos_x, Expression::Number(Number::integer(2)));
let expr = Expression::add(sin_squared, cos_squared);
let result = simplifier.enhanced_simplify(&expr).unwrap();
println!("输入: sin²(x) + cos²(x)");
println!("输出: {:?}", result);
match result {
Expression::Number(n) if n.is_one() => {
}
_ => {
println!("结果不是预期的1,实际结果: {:?}", result);
}
}
}
#[test]
fn test_fraction_addition() {
let mut simplifier = EnhancedSimplifier::new();
let half = Expression::divide(
Expression::Number(Number::integer(1)),
Expression::Number(Number::integer(2))
);
let third = Expression::divide(
Expression::Number(Number::integer(1)),
Expression::Number(Number::integer(3))
);
let expr = Expression::add(half, third);
let result = simplifier.enhanced_simplify(&expr).unwrap();
println!("输入: 1/2 + 1/3");
println!("输出: {:?}", result);
match result {
Expression::Number(Number::Rational(r)) => {
assert_eq!(r.numer(), &num_bigint::BigInt::from(5));
assert_eq!(r.denom(), &num_bigint::BigInt::from(6));
}
Expression::BinaryOp { op: crate::core::BinaryOperator::Divide, left, right } => {
if let (Expression::Number(num), Expression::Number(den)) = (left.as_ref(), right.as_ref()) {
assert_eq!(num, &Number::integer(5));
assert_eq!(den, &Number::integer(6));
}
}
_ => {
println!("结果不是预期的分数形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_binomial_expansion() {
let mut simplifier = EnhancedSimplifier::new();
let x = Expression::variable("x");
let x_plus_1 = Expression::add(x.clone(), Expression::Number(Number::integer(1)));
let x_minus_1 = Expression::subtract(x.clone(), Expression::Number(Number::integer(1)));
let expr = Expression::multiply(x_plus_1, x_minus_1);
let result = simplifier.enhanced_simplify(&expr).unwrap();
println!("输入: (x + 1)(x - 1)");
println!("输出: {:?}", result);
match result {
Expression::BinaryOp { op: crate::core::BinaryOperator::Subtract, left, right } => {
match left.as_ref() {
Expression::BinaryOp { op: crate::core::BinaryOperator::Power, left: base, right: exp } => {
assert_eq!(base.as_ref(), &x);
assert_eq!(exp.as_ref(), &Expression::Number(Number::integer(2)));
}
_ => println!("左边不是 x² 的形式"),
}
assert_eq!(right.as_ref(), &Expression::Number(Number::integer(1)));
}
_ => {
println!("结果不是预期的减法形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_auto_simplify() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt18 = Expression::function("sqrt", vec![Expression::Number(Number::integer(18))]);
let sqrt2 = Expression::function("sqrt", vec![Expression::Number(Number::integer(2))]);
let expr = Expression::add(sqrt18, sqrt2);
let result = simplifier.enhanced_simplify(&expr).unwrap();
println!("输入: sqrt(18) + sqrt(2)");
println!("输出: {:?}", result);
match &result {
Expression::BinaryOp { op: crate::core::BinaryOperator::Multiply, left, right } => {
let has_coeff_4 = matches!(left.as_ref(), Expression::Number(n) if n == &Number::integer(4)) ||
matches!(right.as_ref(), Expression::Number(n) if n == &Number::integer(4));
let has_sqrt_2 = matches!(left.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2))) ||
matches!(right.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2)));
if !(has_coeff_4 && has_sqrt_2) {
println!("结果不是预期的 4*sqrt(2) 形式,实际结果: {:?}", result);
}
}
_ => {
println!("结果不是预期的乘法形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_nested_radical_simplification() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt2 = Expression::function("sqrt", vec![Expression::Number(Number::integer(2))]);
let two_sqrt2 = Expression::multiply(Expression::Number(Number::integer(2)), sqrt2);
let three_minus_two_sqrt2 = Expression::subtract(Expression::Number(Number::integer(3)), two_sqrt2);
let nested_sqrt = Expression::function("sqrt", vec![three_minus_two_sqrt2]);
let result = simplifier.enhanced_simplify(&nested_sqrt).unwrap();
println!("输入: sqrt(3 - 2*sqrt(2))");
println!("输出: {:?}", result);
let expected_sqrt2 = Expression::function("sqrt", vec![Expression::Number(Number::integer(2))]);
let expected = Expression::subtract(expected_sqrt2, Expression::Number(Number::integer(1)));
println!("期望: {:?}", expected);
match &result {
Expression::BinaryOp { op: crate::core::BinaryOperator::Subtract, left, right } => {
let is_sqrt2 = matches!(left.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2)));
let is_one = matches!(right.as_ref(), Expression::Number(n) if n == &Number::integer(1));
assert!(is_sqrt2 && is_one, "结果应该是 sqrt(2) - 1 的形式");
println!("✓ 嵌套根式 sqrt(3 - 2*sqrt(2)) 成功简化为 sqrt(2) - 1");
}
Expression::BinaryOp { op: crate::core::BinaryOperator::Add, left, right } => {
let is_sqrt2 = matches!(left.as_ref(), Expression::Function { name, args }
if name == "sqrt" && args.len() == 1 && args[0] == Expression::Number(Number::integer(2)));
let is_neg_one = matches!(right.as_ref(), Expression::Number(n) if n == &Number::integer(-1));
if is_sqrt2 && is_neg_one {
println!("✓ 嵌套根式 sqrt(3 - 2*sqrt(2)) 成功简化为 sqrt(2) + (-1),等价于 sqrt(2) - 1");
} else {
panic!("结果不是预期的 sqrt(2) - 1 形式,实际结果: {:?}", result);
}
}
_ => {
panic!("结果不是预期的 sqrt(2) - 1 形式,实际结果: {:?}", result);
}
}
}
#[test]
fn test_more_nested_radicals() {
let mut simplifier = EnhancedSimplifier::new();
let sqrt2 = Expression::function("sqrt", vec![Expression::Number(Number::integer(2))]);
let two_sqrt2 = Expression::multiply(Expression::Number(Number::integer(2)), sqrt2);
let three_plus_two_sqrt2 = Expression::add(Expression::Number(Number::integer(3)), two_sqrt2);
let nested_sqrt1 = Expression::function("sqrt", vec![three_plus_two_sqrt2]);
let result1 = simplifier.enhanced_simplify(&nested_sqrt1).unwrap();
println!("输入: sqrt(3 + 2*sqrt(2))");
println!("输出: {:?}", result1);
let sqrt6 = Expression::function("sqrt", vec![Expression::Number(Number::integer(6))]);
let two_sqrt6 = Expression::multiply(Expression::Number(Number::integer(2)), sqrt6);
let five_minus_two_sqrt6 = Expression::subtract(Expression::Number(Number::integer(5)), two_sqrt6);
let nested_sqrt2 = Expression::function("sqrt", vec![five_minus_two_sqrt6]);
let result2 = simplifier.enhanced_simplify(&nested_sqrt2).unwrap();
println!("输入: sqrt(5 - 2*sqrt(6))");
println!("输出: {:?}", result2);
let sqrt3 = Expression::function("sqrt", vec![Expression::Number(Number::integer(3))]);
let four_sqrt3 = Expression::multiply(Expression::Number(Number::integer(4)), sqrt3);
let seven_minus_four_sqrt3 = Expression::subtract(Expression::Number(Number::integer(7)), four_sqrt3);
let nested_sqrt3 = Expression::function("sqrt", vec![seven_minus_four_sqrt3]);
let result3 = simplifier.enhanced_simplify(&nested_sqrt3).unwrap();
println!("输入: sqrt(7 - 4*sqrt(3))");
println!("输出: {:?}", result3);
let simplified_count = [&result1, &result2, &result3].iter()
.filter(|result| !matches!(result, Expression::Function { name, .. } if name == "sqrt"))
.count();
println!("成功简化的嵌套根式数量: {}/3", simplified_count);
assert!(simplified_count > 0, "至少应该有一个嵌套根式被简化");
}
}