aboutsummaryrefslogtreecommitdiff
path: root/src/tests.rs
diff options
context:
space:
mode:
authorCharlotte Pabst <charlotte.pabst@stud.tu-darmstadt.de>2024-03-11 22:47:36 +0100
committerCharlotte Pabst <charlotte.pabst@stud.tu-darmstadt.de>2024-03-24 17:20:03 +0100
commitc7be7ca0188e8edd19afd880f393d5622451fef5 (patch)
treeca737d8dfd55aec8878e2ef093f933da67877c40 /src/tests.rs
parentd54c146ef57c28e5db8631fc48e59a64c826f86f (diff)
downloaddcel-c7be7ca0188e8edd19afd880f393d5622451fef5.tar.xz
Diffstat (limited to 'src/tests.rs')
-rw-r--r--src/tests.rs144
1 files changed, 117 insertions, 27 deletions
diff --git a/src/tests.rs b/src/tests.rs
index a1ad5a4..52ec2cd 100644
--- a/src/tests.rs
+++ b/src/tests.rs
@@ -23,6 +23,60 @@ fn mev_cycle() {
})
}
+/*
+
+makes this shape:
+
+ O O
+ |\ /|
+ | \__/ |
+ | O__O |
+ | / \ |
+ |/ \|
+ O O
+
+*/
+fn make_hourglass<'brand, 'arena, V>(
+ dcel: &mut Dcel<'brand, 'arena, V>,
+ data: [V; 6],
+) -> (own!(Shell), [own!(Loop); 3], own!(Edge), [own!(Vertex); 6]) {
+ let [d0, d1, d2, d3, d4, d5] = data;
+
+ let body = dcel.new_body();
+ let Kevvlfs {
+ shell,
+ loop_: loop_0,
+ vertices: [inner_0, inner_1],
+ ..
+ } = dcel.mevvlfs(*body, [d0, d1]).unwrap();
+
+ let inner_2 = dcel.mev(*shell, *loop_0, *inner_1, d2).new_vertex;
+ let mut outer_loop = dcel.melf(*shell, [*inner_0, *inner_2], *loop_0).new_loop;
+
+ let Mev {
+ new_vertex: outer_0,
+ edge,
+ ..
+ } = dcel.mev(*shell, *outer_loop, *inner_0, d3);
+
+ let outer_1 = dcel.mev(*shell, *outer_loop, *outer_0, d4).new_vertex;
+ let outer_2 = dcel.mev(*shell, *outer_loop, *outer_1, d5).new_vertex;
+
+ let mut loop_2 = dcel
+ .melf(*shell, [*outer_0, *outer_2], *outer_loop)
+ .new_loop;
+ if edge.lens(dcel).half_edges()[0].loop_().eq(*loop_2) {
+ [outer_loop, loop_2] = [loop_2, outer_loop];
+ }
+
+ (
+ shell,
+ [outer_loop, loop_0, loop_2],
+ edge,
+ [inner_0, inner_1, inner_2, outer_0, outer_1, outer_2],
+ )
+}
+
#[test]
fn kemh_mekh() {
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
@@ -56,33 +110,10 @@ fn kemh_mekh() {
}
Dcel::<Vert>::new(|mut dcel| {
- let body = dcel.new_body();
- let Kevvlfs {
- shell,
- loop_: loop_0,
- vertices: [inner_0, inner_1],
- ..
- } = dcel.mevvlfs(*body, [Inner(0), Inner(1)]).unwrap();
-
- let inner_2 = dcel.mev(*shell, *loop_0, *inner_1, Inner(2)).new_vertex;
- let mut outer_loop = dcel.melf(*shell, [*inner_0, *inner_2], *loop_0).new_loop;
-
- let Mev {
- new_vertex: outer_0,
- edge,
- ..
- } = dcel.mev(*shell, *outer_loop, *inner_0, Outer(0));
-
- let outer_1 = dcel.mev(*shell, *outer_loop, *outer_0, Outer(1)).new_vertex;
- let outer_2 = dcel.mev(*shell, *outer_loop, *outer_1, Outer(2)).new_vertex;
-
- let loop_2 = dcel
- .melf(*shell, [*outer_0, *outer_2], *outer_loop)
- .new_loop;
- if edge.lens(&dcel).half_edges()[0].loop_().eq(*loop_2) {
- outer_loop = loop_2;
- }
-
+ let (shell, [outer_loop, ..], edge, [inner_0, ..]) = make_hourglass(
+ &mut dcel,
+ [Inner(0), Inner(1), Inner(2), Outer(0), Outer(1), Outer(2)],
+ );
let mut kemh = Kemh::new(*shell, edge, *outer_loop, *inner_0);
for _ in 0..3 {
@@ -234,3 +265,62 @@ fn msev_ksev() {
}
})
}
+
+#[test]
+fn mpkh_kpmh() {
+ Dcel::<()>::new(|mut dcel| {
+ let (shell, [outer_0, inner_1, outer_1], edge, [vert, ..]) =
+ make_hourglass(&mut dcel, [(); 6]);
+ let inner_0 = dcel.kemh(*shell, edge, *outer_0, *vert).unwrap().hole_loop;
+
+ let mut mpkh = Mpkh::new(*inner_0);
+
+ for _ in 0..4 {
+ use std::collections::HashSet;
+
+ {
+ mklens!(&dcel, shell, outer_0, outer_1, inner_0, inner_1);
+
+ assert_eq!(
+ shell.iter_faces().collect::<HashSet<_>>(),
+ HashSet::from([outer_0, outer_1, inner_0, inner_1].map(Lens::face))
+ );
+
+ assert_eq!(outer_0.face(), inner_0.face());
+ assert_eq!(outer_0.face().outer_loop(), outer_0);
+ assert_eq!(outer_0.face().inner_loops(), inner_0);
+ assert_eq!(inner_0.next(), inner_0);
+ }
+
+ let kpmh = mpkh.apply(&mut dcel).unwrap();
+
+ {
+ let new_face = &kpmh.new_face;
+ let new_shell = kpmh.new_shell.as_ref().unwrap();
+
+ mklens!(&dcel, shell, new_shell, new_face, outer_0, outer_1, inner_0, inner_1);
+
+ assert_eq!(new_face, inner_0.face());
+ assert_eq!(new_face.outer_loop(), inner_0);
+ assert!(new_face.iter_inner_loops().next().is_none());
+
+ assert_eq!(
+ shell.body().iter_shells().collect::<HashSet<_>>(),
+ HashSet::from([new_shell, shell])
+ );
+
+ assert_eq!(
+ shell.iter_faces().collect::<HashSet<_>>(),
+ HashSet::from([outer_0.face(), outer_1.face()])
+ );
+
+ assert_eq!(
+ new_shell.iter_faces().collect::<HashSet<_>>(),
+ HashSet::from([inner_0.face(), inner_1.face()])
+ );
+ }
+
+ mpkh = kpmh.apply(&mut dcel).unwrap();
+ }
+ })
+}