use yufmath::core::{Expression, Number};
use yufmath::engine::{ComputeEngine, compute::BasicComputeEngine};
#[test]
fn test_polynomial_expand_integration() {
let engine = BasicComputeEngine::new();
let expr = Expression::power(
Expression::add(
Expression::variable("x"),
Expression::number(Number::integer(1))
),
Expression::number(Number::integer(2))
);
let expanded = engine.expand(&expr).unwrap();
let expanded_str = format!("{}", expanded);
println!("Expanded result: {}", expanded_str);
assert!(expanded_str.contains("x²") || expanded_str.contains("x^2") || expanded_str.contains("x"));
assert!(expanded_str.contains("2"));
assert!(expanded_str.contains("1"));
}
#[test]
fn test_polynomial_factor_integration() {
let engine = BasicComputeEngine::new();
let expr = Expression::add(
Expression::multiply(
Expression::number(Number::integer(6)),
Expression::power(
Expression::variable("x"),
Expression::number(Number::integer(2))
)
),
Expression::multiply(
Expression::number(Number::integer(9)),
Expression::variable("x")
)
);
let factored = engine.factor(&expr).unwrap();
match factored {
Expression::BinaryOp { op, .. } => {
assert_eq!(op, yufmath::core::BinaryOperator::Multiply);
}
_ => panic!("因式分解结果应该是乘法表达式"),
}
}
#[test]
fn test_polynomial_collect_integration() {
let engine = BasicComputeEngine::new();
let expr = Expression::add(
Expression::multiply(
Expression::number(Number::integer(2)),
Expression::variable("x")
),
Expression::multiply(
Expression::number(Number::integer(3)),
Expression::variable("x")
)
);
let collected = engine.collect(&expr, "x").unwrap();
let collected_str = format!("{}", collected);
assert!(collected_str.contains("5") && collected_str.contains("x"));
}
#[test]
fn test_polynomial_divide_integration() {
let engine = BasicComputeEngine::new();
let dividend = Expression::add(
Expression::add(
Expression::power(
Expression::variable("x"),
Expression::number(Number::integer(2))
),
Expression::multiply(
Expression::number(Number::integer(3)),
Expression::variable("x")
)
),
Expression::number(Number::integer(2))
);
let divisor = Expression::add(
Expression::variable("x"),
Expression::number(Number::integer(1))
);
let (quotient, remainder) = engine.polynomial_divide(÷nd, &divisor).unwrap();
let quotient_str = format!("{}", quotient);
assert!(quotient_str.contains("x"));
let remainder_str = format!("{}", remainder);
assert!(remainder_str == "0" || !remainder_str.contains("x"));
}
#[test]
fn test_polynomial_gcd_integration() {
let engine = BasicComputeEngine::new();
let poly1 = Expression::subtract(
Expression::power(
Expression::variable("x"),
Expression::number(Number::integer(2))
),
Expression::number(Number::integer(1))
);
let poly2 = Expression::add(
Expression::add(
Expression::power(
Expression::variable("x"),
Expression::number(Number::integer(2))
),
Expression::multiply(
Expression::number(Number::integer(2)),
Expression::variable("x")
)
),
Expression::number(Number::integer(1))
);
let gcd = engine.polynomial_gcd(&poly1, &poly2).unwrap();
let gcd_str = format!("{}", gcd);
assert!(gcd_str.contains("x"));
assert!(gcd_str.contains("1"));
}
#[test]
fn test_multivariate_polynomial_operations() {
let engine = BasicComputeEngine::new();
let expr = Expression::power(
Expression::add(
Expression::variable("x"),
Expression::variable("y")
),
Expression::number(Number::integer(2))
);
let expanded = engine.expand(&expr).unwrap();
let expanded_str = format!("{}", expanded);
assert!(expanded_str.contains("x"));
assert!(expanded_str.contains("y"));
assert!(expanded_str.contains("2"));
}
#[test]
fn test_polynomial_simplify_integration() {
let engine = BasicComputeEngine::new();
let expr = Expression::multiply(
Expression::add(
Expression::variable("x"),
Expression::number(Number::integer(1))
),
Expression::subtract(
Expression::variable("x"),
Expression::number(Number::integer(1))
)
);
let expanded = engine.expand(&expr).unwrap();
let simplified = engine.simplify(&expanded).unwrap();
let result_str = format!("{}", simplified);
assert!(result_str.contains("x"));
assert!(result_str.contains("1"));
}
#[test]
fn test_polynomial_error_handling() {
let engine = BasicComputeEngine::new();
let dividend = Expression::variable("x");
let divisor = Expression::number(Number::zero());
let result = engine.polynomial_divide(÷nd, &divisor);
assert!(result.is_err());
let unsupported_expr = Expression::sin(Expression::variable("x"));
let result = engine.expand(&unsupported_expr);
assert!(result.is_err());
}
#[test]
fn test_polynomial_precision_preservation() {
let engine = BasicComputeEngine::new();
let expr = Expression::add(
Expression::multiply(
Expression::number(Number::rational(1, 3)),
Expression::variable("x")
),
Expression::multiply(
Expression::number(Number::rational(2, 3)),
Expression::variable("x")
)
);
let collected = engine.collect(&expr, "x").unwrap();
let result_str = format!("{}", collected);
assert!(result_str.contains("x"));
}