use mathhook_core::calculus::SeriesExpansion;
use mathhook_core::{expr, symbol, Expression, Simplify};
#[test]
fn test_maclaurin_exp() {
let x = symbol!(x);
let f = Expression::function("exp", vec![Expression::symbol(x.clone())]);
let series = f.maclaurin_series(&x, 4);
let simplified = series.simplify();
assert!(
simplified.to_string().contains('x'),
"Maclaurin series of exp(x) should contain x terms"
);
}
#[test]
fn test_maclaurin_sin() {
let x = symbol!(x);
let f = Expression::function("sin", vec![Expression::symbol(x.clone())]);
let series = f.maclaurin_series(&x, 5);
let simplified = series.simplify();
assert!(
simplified.to_string().contains('x'),
"Maclaurin series of sin(x) should contain x terms"
);
}
#[test]
fn test_maclaurin_cos() {
let x = symbol!(x);
let f = Expression::function("cos", vec![Expression::symbol(x.clone())]);
let series = f.maclaurin_series(&x, 4);
let simplified = series.simplify();
let result_str = simplified.to_string();
assert!(
result_str.contains('1') || result_str.contains('x'),
"Maclaurin series of cos(x) should contain constant or x terms"
);
}
#[test]
fn test_maclaurin_ln_one_plus_x() {
let x = symbol!(x);
let f = Expression::function("ln", vec![expr!(1 + x)]);
let _series = f.maclaurin_series(&x, 4);
}
#[test]
fn test_maclaurin_geometric_series() {
let x = symbol!(x);
let f = Expression::div(expr!(1), expr!(1 - x));
let _series = f.maclaurin_series(&x, 4);
}
#[test]
fn test_maclaurin_arctan() {
let x = symbol!(x);
let f = Expression::function("arctan", vec![Expression::symbol(x.clone())]);
let _series = f.maclaurin_series(&x, 5);
}
#[test]
fn test_maclaurin_sinh() {
let x = symbol!(x);
let f = Expression::function("sinh", vec![Expression::symbol(x.clone())]);
let _series = f.maclaurin_series(&x, 5);
}
#[test]
fn test_maclaurin_cosh() {
let x = symbol!(x);
let f = Expression::function("cosh", vec![Expression::symbol(x.clone())]);
let _series = f.maclaurin_series(&x, 4);
}
#[test]
fn test_taylor_exp_at_one() {
let x = symbol!(x);
let f = Expression::function("exp", vec![Expression::symbol(x.clone())]);
let _series = f.taylor_series(&x, &expr!(1), 2);
}
#[test]
fn test_taylor_ln_at_one() {
let x = symbol!(x);
let f = Expression::function("ln", vec![Expression::symbol(x.clone())]);
let series = f.taylor_series(&x, &expr!(1), 3);
let simplified = series.simplify();
let result_str = simplified.to_string();
assert!(
result_str.contains('x') || result_str.contains('1'),
"Taylor series of ln(x) at x=1 should produce valid terms"
);
}
#[test]
fn test_taylor_sqrt_at_one() {
let x = symbol!(x);
let f = Expression::function("sqrt", vec![Expression::symbol(x.clone())]);
let _series = f.taylor_series(&x, &expr!(1), 2);
}
#[test]
fn test_binomial_series_sqrt() {
let x = symbol!(x);
let f = Expression::pow(expr!(1 + x), Expression::rational(1, 2));
let _series = f.maclaurin_series(&x, 3);
}
#[test]
fn test_binomial_series_negative_exponent() {
let x = symbol!(x);
let f = Expression::pow(expr!(1 + x), expr!(-1));
let _series = f.maclaurin_series(&x, 4);
}
#[test]
fn test_series_polynomial_expansion() {
let f = Expression::pow(expr!(1 + x), expr!(2));
let expanded = f.simplify();
let result_str = expanded.to_string();
assert!(
result_str.contains('x') || result_str.contains('1'),
"Polynomial (1+x)^2 should simplify to expression with x terms"
);
}
#[test]
fn test_expression_function_constructor() {
let x = symbol!(x);
let sin_x = Expression::function("sin", vec![Expression::symbol(x.clone())]);
match sin_x {
Expression::Function { name, args } => {
assert_eq!(name.as_ref(), "sin");
assert_eq!(args.len(), 1);
}
_ => panic!("Expected Function expression"),
}
}
#[test]
fn test_derivative_constructor_exists() {
let x = symbol!(x);
let f = expr!(x ^ 2);
let deriv = Expression::derivative(f, x.clone(), 1);
match deriv {
Expression::Calculus(_) => {}
_ => panic!("Expected Calculus expression for derivative"),
}
}
#[test]
fn test_integral_constructor_exists() {
let x = symbol!(x);
let f = expr!(x ^ 2);
let integ = Expression::integral(f, x.clone());
match integ {
Expression::Calculus(_) => {}
_ => panic!("Expected Calculus expression for integral"),
}
}