Add tests for the metric itself
That wasn’t all that hard like I expected as I actually know what I *want* the metric to do so, can test just that.
This commit is contained in:
parent
0a27fc1f9b
commit
acb4bb75fa
|
|
@ -51,8 +51,12 @@ impl Metric for Tube {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
use approx::assert_abs_diff_eq;
|
||||||
use glam::{Vec2, vec2};
|
use glam::{Vec2, vec2};
|
||||||
|
use itertools_num::linspace;
|
||||||
use crate::riemann::{Decomp2, Metric};
|
use crate::riemann::{Decomp2, Metric};
|
||||||
|
use crate::tube::Space;
|
||||||
|
use crate::types::Ray;
|
||||||
use super::Tube;
|
use super::Tube;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -81,4 +85,118 @@ mod test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_accelerator() {
|
||||||
|
let space = Space {
|
||||||
|
tube: Tube {
|
||||||
|
inner_radius: 30.0,
|
||||||
|
outer_radius: 50.0,
|
||||||
|
internal_halflength: 100.0,
|
||||||
|
external_halflength: 300.0,
|
||||||
|
},
|
||||||
|
objs: vec![],
|
||||||
|
};
|
||||||
|
let ε = 1e-3;
|
||||||
|
let off = 10.0;
|
||||||
|
let steps = 1024;
|
||||||
|
for ax in [-30.0 + ε, -25.0, -3.0, 17.0, 30.0 - ε] {
|
||||||
|
for bx in [0.0, ε, 1.0, 7.0, 30.0 - ε] {
|
||||||
|
let a = vec2(ax, -(space.tube.external_halflength + off));
|
||||||
|
let b = vec2(bx, space.tube.external_halflength + off);
|
||||||
|
let Δ = vec2(bx - ax, 2.0 * (space.tube.internal_halflength + off));
|
||||||
|
let dir = Δ / (steps as f32);
|
||||||
|
let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap();
|
||||||
|
assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e-2);
|
||||||
|
assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e1);
|
||||||
|
assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-3);
|
||||||
|
assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore]
|
||||||
|
fn test_accelerator_slow() {
|
||||||
|
let space = Space {
|
||||||
|
tube: Tube {
|
||||||
|
inner_radius: 30.0,
|
||||||
|
outer_radius: 50.0,
|
||||||
|
internal_halflength: 100.0,
|
||||||
|
external_halflength: 300.0,
|
||||||
|
},
|
||||||
|
objs: vec![],
|
||||||
|
};
|
||||||
|
let ε = 1e-3;
|
||||||
|
let off = 10.0;
|
||||||
|
let steps = 4096;
|
||||||
|
for ax in linspace(-space.tube.inner_radius + ε, space.tube.inner_radius - ε, 20) {
|
||||||
|
for bx in linspace(-space.tube.inner_radius + ε, space.tube.inner_radius - ε, 20) {
|
||||||
|
let a = vec2(ax, -(space.tube.external_halflength + off));
|
||||||
|
let b = vec2(bx, space.tube.external_halflength + off);
|
||||||
|
let Δ = vec2(bx - ax, 2.0 * (space.tube.internal_halflength + off));
|
||||||
|
let dir = Δ / (steps as f32);
|
||||||
|
let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap();
|
||||||
|
assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e-2);
|
||||||
|
assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0);
|
||||||
|
assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-3);
|
||||||
|
assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore] // TODO make the metric smooth so that this passes
|
||||||
|
fn test_accelerator_inner_edge() {
|
||||||
|
let space = Space {
|
||||||
|
tube: Tube {
|
||||||
|
inner_radius: 30.0,
|
||||||
|
outer_radius: 50.0,
|
||||||
|
internal_halflength: 100.0,
|
||||||
|
external_halflength: 300.0,
|
||||||
|
},
|
||||||
|
objs: vec![],
|
||||||
|
};
|
||||||
|
let ε = 1e-3;
|
||||||
|
let off = 10.0;
|
||||||
|
let steps = 4096;
|
||||||
|
for x in [space.tube.inner_radius - ε, space.tube.inner_radius + ε] {
|
||||||
|
let a = vec2(x, -(space.tube.external_halflength + off));
|
||||||
|
let b = vec2(x, space.tube.external_halflength + off);
|
||||||
|
let Δ = vec2(0.0, 2.0 * (space.tube.internal_halflength + off));
|
||||||
|
let dir = Δ / (steps as f32);
|
||||||
|
let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap();
|
||||||
|
assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=1.0e0);
|
||||||
|
assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0);
|
||||||
|
assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-2);
|
||||||
|
assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_accelerator_outer_edge() {
|
||||||
|
let space = Space {
|
||||||
|
tube: Tube {
|
||||||
|
inner_radius: 30.0,
|
||||||
|
outer_radius: 50.0,
|
||||||
|
internal_halflength: 100.0,
|
||||||
|
external_halflength: 300.0,
|
||||||
|
},
|
||||||
|
objs: vec![],
|
||||||
|
};
|
||||||
|
let ε = 1e-3;
|
||||||
|
let off = 10.0;
|
||||||
|
let steps = 4096;
|
||||||
|
for x in [space.tube.outer_radius + ε, space.tube.outer_radius - ε] {
|
||||||
|
let a = vec2(x, -(space.tube.external_halflength + off));
|
||||||
|
let b = vec2(x, space.tube.external_halflength + off);
|
||||||
|
let Δ = vec2(0.0, 2.0 * (space.tube.external_halflength + off));
|
||||||
|
let dir = Δ / (steps as f32);
|
||||||
|
let traced = space.trace_iter(Ray { pos: a, dir }).nth(steps).unwrap();
|
||||||
|
assert_abs_diff_eq!(traced.pos.x, b.x, epsilon=2.0e0);
|
||||||
|
assert_abs_diff_eq!(traced.pos.y, b.y, epsilon=1.0e0);
|
||||||
|
assert_abs_diff_eq!(traced.dir.x, dir.x, epsilon=1.0e-2);
|
||||||
|
assert_abs_diff_eq!(traced.dir.y, dir.y, epsilon=1.0e-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user