From 11e48580b9cbde2bbd77f4df65d1c3c7755d977a Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 10 Jun 2024 17:28:33 +0300 Subject: [PATCH] Test that new code --- src/bin/flat/main.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/bin/flat/main.rs b/src/bin/flat/main.rs index ab7ff31..ec693b2 100644 --- a/src/bin/flat/main.rs +++ b/src/bin/flat/main.rs @@ -558,6 +558,9 @@ impl Rect { mod fns { use crate::FloatExt2; + #[cfg(test)] + use approx::abs_diff_eq; + pub struct RectX { pub min: f32, pub max: f32, @@ -594,6 +597,32 @@ mod fns { pub fn du(&self, x: f32) -> f32 { extend_const(x, |x| 1.0 / self.root(x), self.external, 1.0) } pub fn d2u(&self, x: f32) -> f32 { extend_const(x, |x| -2.0 * x.signum() * self.a() * self.root(x).powi(-3), self.external, 0.0) } } + + #[test] + fn test_rect_y() { + let testee = RectY { internal: 100.0, external: 150.0 }; + let ε = 1.0e-4f32; + let δ = 1.0 / 8.0; // Mathematically, you want this to be small. Computationally, you don’t. + let margin = 1.0 / 16.0; + let mul = 1.0 + margin; + for x in itertools_num::linspace(-mul * testee.external, mul * testee.external, 100) { + let u = testee.u(x); + assert!(abs_diff_eq!(x, testee.x(u), epsilon = ε), "At x={}:\nu(x): {}\nx(u(x)): {}\n", x, u, testee.x(u)); + + let du = (testee.u(x + δ) - testee.u(x - δ)) / (2. * δ); + assert!(abs_diff_eq!(du, testee.du(x), epsilon = ε), "At x={}, u':\nexpected: {}\nactual: {}\n", x, du, testee.du(x)); + + let d2u = (testee.du(x + δ) - testee.du(x - δ)) / (2. * δ); + assert!(abs_diff_eq!(d2u, testee.d2u(x), epsilon = ε), "At x={}, u'':\nexpected: {}\nactual: {}\n", x, d2u, testee.d2u(x)); + } + for u in itertools_num::linspace(-mul * testee.internal, mul * testee.internal, 100) { + let x = testee.x(u); + assert!(abs_diff_eq!(x, testee.x(u), epsilon = ε), "At u={}:\nx(u): {}\nu(x(u)): {}\n", u, x, testee.u(x)); + + let dx = (testee.x(u + δ) - testee.x(u - δ)) / (2. * δ); + assert!(abs_diff_eq!(dx, testee.dx(u), epsilon = ε), "At u={}, x':\nexpected: {}\nactual: {}\n", u, dx, testee.dx(u)); + } + } } #[test]