use symplex::prelude::*;
#[test]
fn residue_simple_pole_1_over_x() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = &ctx.int(1) / &x;
let r = f.residue(&x, &ctx.int(0));
assert_eq!(format!("{r}"), "1", "Res(1/x, 0) = 1");
}
#[test]
fn residue_1_over_x_minus_1() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = &ctx.int(1) / &(&x - 1);
let r = f.residue(&x, &ctx.int(1));
assert_eq!(format!("{r}"), "1", "Res(1/(x-1), 1) = 1");
}
#[test]
fn residue_x_over_x_minus_1() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = &x / &(&x - 1);
let r = f.residue(&x, &ctx.int(1));
assert_eq!(format!("{r}"), "1", "Res(x/(x-1), 1) = 1");
}
#[test]
fn residue_exp_over_x() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = &x.exp() / &x;
let r = f.residue(&x, &ctx.int(0));
assert_eq!(format!("{r}"), "1", "Res(exp(x)/x, 0) = 1");
}
#[test]
fn residue_of_polynomial_is_zero() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = x.powi(2);
let r = f.residue(&x, &ctx.int(0));
assert_eq!(format!("{r}"), "0", "Res(x^2, 0) = 0");
}
#[test]
fn residue_does_not_panic_on_hard_case() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = &ctx.int(1) / &x.powi(2);
let _result = f.residue(&x, &ctx.int(0));
}
#[test]
fn fourier_of_constant() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = ctx.int(1);
let result = f.fourier_series(&x, 3);
if let Ok(v) = result.subs(&x, &ctx.rational(1, 2)).eval_f64() {
assert!(
(v - 1.0).abs() < 0.1,
"Fourier of 1 at x=0.5 should be ≈ 1, got {v}"
);
}
}
#[test]
fn fourier_of_constant_at_zero() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let f = ctx.int(1);
let result = f.fourier_series(&x, 2);
if let Ok(v) = result.subs(&x, &ctx.int(0)).eval_f64() {
assert!(
(v - 1.0).abs() < 0.1,
"Fourier of 1 at x=0 should be ≈ 1, got {v}"
);
}
}
#[test]
fn fourier_series_of_x_does_not_panic() {
let ctx = Context::new();
symplex::syms!(ctx; x);
let result = x.fourier_series(&x, 2);
let s = format!("{result}");
assert!(!s.is_empty(), "Fourier series of x should be non-empty");
assert!(
s.contains("sin") || s.contains("x"),
"Fourier series of x (odd function) should contain sin or x terms, got: {s}"
);
}