use symplex::prelude::*;
fn simplified(ctx: &Context, src: &str) -> String {
ctx.parse(src).unwrap().simplify().to_string()
}
#[test]
fn denominators_zero_by_an_identity_are_nan() {
let ctx = Context::new();
for src in [
"((x+1)^2-x^2-2*x-1)/(tan(x)*cos(x)-sin(x))",
"(x+1)*(sin(2*x)-2*sin(x)*cos(x))/(cosh(x)^2-sinh(x)^2-1)",
"(sin(x)^2+cos(x)^2-1)/(tan(x)*cos(x)-sin(x))",
"(exp(x+y)-exp(x)*exp(y))/(sin(x+y)-sin(x)*cos(y)-cos(x)*sin(y))",
"((x+1)^2-x^2-2*x-1)/sqrt(tan(x)*cos(x)-sin(x))",
"(sin(x)^2+cos(x)^2-1)/(cosh(x)^2-sinh(x)^2-1) + x",
] {
assert_eq!(simplified(&ctx, src), "nan", "{src}");
}
}
#[test]
fn numerators_zero_by_an_identity_are_nan() {
let ctx = Context::new();
let src = "(sin(2*x)-2*sin(x)*cos(x))/((x+1)^2-x^2-2*x-1)";
assert_eq!(simplified(&ctx, src), "nan");
}
#[test]
fn other_vanishing_denominators_unchanged() {
let ctx = Context::new();
let _ = ctx.symbol_with("p", &[Assumption::Positive]).unwrap();
for (src, want) in [
("1/(sin(x)^2+cos(x)^2-1)", "zoo"),
("x/(tan(x)*cos(x)-sin(x))", "zoo"),
("x + 1/(tan(x)*cos(x)-sin(x))", "zoo"),
("x/(1+1/(tan(x)*cos(x)-sin(x)))", "0"),
("1/(log(p^2)-2*log(p))", "zoo"),
("1/((1+sqrt(2))^2-3-2*sqrt(2))", "zoo"),
] {
assert_eq!(simplified(&ctx, src), want, "{src}");
}
let e = ctx.parse("1/(log(x^2)-2*log(x))").unwrap();
let s = e.simplify();
assert!(s.to_string().contains("ln(x^2)"), "{s}");
}
#[test]
fn ordinary_simplifications_unchanged() {
let ctx = Context::new();
for (src, want) in [
("(x^2-1)/(x-1)", "x + 1"),
("sin(x)/x", "sin(x)/x"),
("(sin(x)^2+cos(x)^2)/(x+1)", "1/(x + 1)"),
] {
assert_eq!(simplified(&ctx, src), want, "{src}");
}
}