use mathhook_core::prelude::*;
#[test]
fn test_trig_identity_pythagorean() {
let expr = expr!(((sin(x)) ^ 2) + ((cos(x)) ^ 2));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_trig_sin_of_zero() {
let expr = function!(sin, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_trig_cos_of_zero() {
let expr = function!(cos, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_trig_tan_of_zero() {
let expr = function!(tan, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_trig_sin_pi() {
let expr = function!(sin, Expression::constant(MathConstant::Pi));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_trig_cos_pi() {
let expr = function!(cos, Expression::constant(MathConstant::Pi));
let result = expr.simplify();
assert_eq!(result, Expression::integer(-1));
}
#[test]
fn test_trig_sin_pi_over_2() {
let expr = function!(
sin,
Expression::mul(vec![
Expression::constant(MathConstant::Pi),
Expression::rational(1, 2),
])
);
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_trig_cos_pi_over_2() {
let expr = function!(
cos,
Expression::mul(vec![
Expression::constant(MathConstant::Pi),
Expression::rational(1, 2),
])
);
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_trig_tan_pi_over_4() {
let expr = function!(
tan,
Expression::mul(vec![
Expression::constant(MathConstant::Pi),
Expression::rational(1, 4),
])
);
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_exp_of_zero() {
let expr = function!(exp, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
#[ignore = "FIXME: Let's find out why"]
fn test_exp_of_one() {
let expr = function!(exp, expr!(1));
let result = expr.simplify();
assert_eq!(result, Expression::constant(MathConstant::E));
}
#[test]
fn test_log_of_one() {
let expr = function!(log, expr!(1));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
#[ignore = "FIXME: Let's find out why"]
fn test_log_of_e() {
let expr = function!(log, Expression::constant(MathConstant::E));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_log_product_rule() {
let a = symbol!(a);
let b = symbol!(b);
let expr = Expression::add(vec![
function!(log, expr!(a * b)),
Expression::mul(vec![
Expression::integer(-1),
Expression::add(vec![
function!(log, Expression::symbol(a)),
function!(log, Expression::symbol(b)),
]),
]),
]);
let result_str = format!("{:?}", expr);
assert!(result_str.contains("log"));
}
#[test]
fn test_log_power_rule() {
let expr = Expression::add(vec![
function!(log, expr!(x ^ n)),
Expression::mul(vec![Expression::integer(-1), expr!(n * (log(x)))]),
]);
let result_str = format!("{:?}", expr);
assert!(result_str.contains("log"));
}
#[test]
fn test_sqrt_of_zero() {
let expr = function!(sqrt, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_sqrt_of_one() {
let expr = function!(sqrt, expr!(1));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_sqrt_of_four() {
let expr = function!(sqrt, expr!(4));
let result = expr.simplify();
assert_eq!(result, expr!(2));
}
#[test]
fn test_sqrt_of_nine() {
let expr = function!(sqrt, expr!(9));
let result = expr.simplify();
assert_eq!(result, expr!(3));
}
#[test]
fn test_sqrt_of_sixteen() {
let expr = function!(sqrt, expr!(16));
let result = expr.simplify();
assert_eq!(result, expr!(4));
}
#[test]
fn test_abs_of_positive() {
let expr = function!(abs, expr!(5));
let result = expr.simplify();
assert_eq!(result, expr!(5));
}
#[test]
fn test_abs_of_negative() {
let expr = function!(abs, Expression::integer(-5));
let result = expr.simplify();
assert_eq!(result, expr!(5));
}
#[test]
fn test_abs_of_zero() {
let expr = function!(abs, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(0));
}
#[test]
fn test_factorial_zero() {
let expr = function!(factorial, expr!(0));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_factorial_one() {
let expr = function!(factorial, expr!(1));
let result = expr.simplify();
assert_eq!(result, expr!(1));
}
#[test]
fn test_factorial_five() {
let expr = function!(factorial, expr!(5));
let result = expr.simplify();
assert_eq!(result, expr!(120));
}
#[test]
fn test_double_angle_sin() {
let x = symbol!(x);
let expr = Expression::add(vec![
function!(sin, expr!(2 * x)),
Expression::mul(vec![
Expression::integer(-2),
Expression::mul(vec![
function!(sin, Expression::symbol(x.clone())),
function!(cos, Expression::symbol(x)),
]),
]),
]);
let result_str = format!("{:?}", expr);
assert!(result_str.contains("sin"));
}
#[test]
fn test_double_angle_cos() {
let expr = Expression::add(vec![
function!(cos, expr!(2 * x)),
Expression::mul(vec![
Expression::integer(-1),
Expression::add(vec![
expr!((cos(x)) ^ 2),
Expression::mul(vec![Expression::integer(-1), expr!((sin(x)) ^ 2)]),
]),
]),
]);
let result_str = format!("{:?}", expr);
assert!(result_str.contains("cos"));
}
#[test]
fn test_trig_negative_angle() {
let x = symbol!(x);
let expr = function!(
sin,
Expression::mul(vec![Expression::integer(-1), Expression::symbol(x.clone())])
);
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("-") && result_str.contains("sin"));
}
#[test]
fn test_exp_log_inverse() {
let x = symbol!(x);
let expr = function!(exp, function!(log, Expression::symbol(x.clone())));
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x));
}
#[test]
fn test_log_exp_inverse() {
let x = symbol!(x);
let expr = function!(log, function!(exp, Expression::symbol(x.clone())));
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x));
}
#[test]
fn test_sqrt_square() {
let expr = function!(sqrt, expr!(x ^ 2));
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("x"));
}
#[test]
fn test_square_sqrt() {
let x = symbol!(x);
let expr = expr!((sqrt(x)) ^ 2);
let result = expr.simplify();
assert_eq!(result, Expression::symbol(x));
}
#[test]
fn test_tan_definition() {
let x = symbol!(x);
let expr = Expression::add(vec![
function!(tan, Expression::symbol(x.clone())),
Expression::mul(vec![
Expression::integer(-1),
Expression::mul(vec![
function!(sin, Expression::symbol(x.clone())),
Expression::pow(
function!(cos, Expression::symbol(x)),
Expression::integer(-1),
),
]),
]),
]);
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("tan") || result_str.contains("sin") || result == expr!(0));
}
#[test]
fn test_exp_addition_rule() {
let x = symbol!(x);
let y = symbol!(y);
let expr = Expression::add(vec![
function!(exp, expr!(x + y)),
Expression::mul(vec![
Expression::integer(-1),
Expression::mul(vec![
function!(exp, Expression::symbol(x)),
function!(exp, Expression::symbol(y)),
]),
]),
]);
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("exp") || result == expr!(0));
}
#[test]
fn test_log_quotient_rule() {
let a = symbol!(a);
let b = symbol!(b);
let expr = Expression::add(vec![
function!(log, expr!(a / b)),
Expression::mul(vec![
Expression::integer(-1),
Expression::add(vec![
function!(log, Expression::symbol(a)),
Expression::mul(vec![
Expression::integer(-1),
function!(log, Expression::symbol(b)),
]),
]),
]),
]);
let result_str = format!("{:?}", expr);
assert!(result_str.contains("log"));
}
#[test]
fn test_sin_squared_plus_one() {
let expr = expr!(1 - ((sin(x)) ^ 2));
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("sin") || result_str.contains("cos"));
}
#[test]
fn test_cos_squared_plus_one() {
let expr = expr!(1 - ((cos(x)) ^ 2));
let result = expr.simplify();
let result_str = format!("{:?}", result);
assert!(result_str.contains("sin") || result_str.contains("cos"));
}