aboutsummaryrefslogtreecommitdiff
path: root/src/tests.rs
diff options
context:
space:
mode:
authorCharlotte Pabst <charlotte.pabst@stud.tu-darmstadt.de>2024-03-07 21:52:30 +0100
committerCharlotte Pabst <charlotte.pabst@stud.tu-darmstadt.de>2024-03-24 17:20:01 +0100
commit219261b7042fba1a54ecd478b56e902d9ca8787b (patch)
treeedbf297706624f2983e8f73c5e39d831c90ef65a /src/tests.rs
parent35cddacd85c61fd56032899d68b1c1c885377dda (diff)
downloaddcel-219261b7042fba1a54ecd478b56e902d9ca8787b.tar.xz
Diffstat (limited to 'src/tests.rs')
-rw-r--r--src/tests.rs147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/tests.rs b/src/tests.rs
new file mode 100644
index 0000000..5132223
--- /dev/null
+++ b/src/tests.rs
@@ -0,0 +1,147 @@
+use crate::*;
+
+#[test]
+fn mev_cycle() {
+ Dcel::<u32>::new(|mut dcel| {
+ let body = dcel.new_body();
+ let op = dcel.mevvlfs(*body, [0, 1]).unwrap();
+ let op2 = dcel.mev(*op.shell, *op.loop_, *op.vertices[1], 2);
+ let op3 = dcel.mev(*op.shell, *op.loop_, *op2.new_vertex, 3);
+ dcel.melf(*op.shell, [*op3.new_vertex, *op.vertices[0]], *op.loop_);
+
+ let mut vertices = op
+ .loop_
+ .iter_half_edges(&dcel)
+ .map(|x| *x.origin().data())
+ .peekable();
+
+ assert!((0..4)
+ .cycle()
+ .skip(*vertices.peek().unwrap() as _)
+ .take(4)
+ .eq(vertices));
+ })
+}
+
+#[test]
+fn kemh_mekh() {
+ #[derive(Copy, Clone, Debug, Eq, PartialEq)]
+ enum Vert {
+ Inner(u8),
+ Outer(u8),
+ }
+ use Vert::*;
+
+ impl Vert {
+ fn flip(self) -> Self {
+ match self {
+ Outer(x) => Inner(x),
+ Inner(x) => Outer(x),
+ }
+ }
+
+ fn is_outer(self) -> bool {
+ match self {
+ Outer(_) => true,
+ Inner(_) => false,
+ }
+ }
+
+ fn either(self) -> u8 {
+ match self {
+ Outer(x) => x,
+ Inner(x) => x,
+ }
+ }
+ }
+
+ 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 mut kemh = Kemh::new(*shell, edge, *outer_loop, *inner_0);
+
+ for i in 0..10 {
+ struct State {
+ seen: u8,
+ last: Option<Vert>,
+ }
+
+ let mut st = State {
+ seen: 0,
+ last: None,
+ };
+
+ for v in outer_loop
+ .iter_half_edges(&dcel)
+ .map(|x| *x.origin().data())
+ {
+ let mut s = 1u8 << v.either();
+ if v.is_outer() {
+ s <<= 4;
+ }
+ if st.seen & s == 0 {
+ st.seen |= s;
+ } else {
+ assert_eq!(v.either(), 0);
+ assert_eq!(st.seen & (s << 3), 0);
+ st.seen |= s << 3;
+ }
+
+ if let Some(last) = st.last {
+ if v.either() == 0 {
+ assert!(
+ last == v.flip()
+ || (last.is_outer() == v.is_outer() && last.either() != 0)
+ );
+ } else {
+ assert_eq!(last.is_outer(), v.is_outer());
+ }
+ }
+
+ st.last = Some(v);
+ }
+
+ assert_eq!(st.seen, 255);
+
+ let mekh = kemh.apply(&mut dcel).unwrap();
+
+ for (loop_, outer) in [(*outer_loop, true), (*mekh.hole_loop, false)] {
+ let mut seen = 0;
+ for v in loop_.iter_half_edges(&dcel).map(|x| *x.origin().data()) {
+ let s = 1 << v.either();
+ assert_eq!(v.is_outer(), outer);
+ assert_eq!(seen & s, 0);
+ seen |= s;
+ }
+ assert_eq!(seen, 7);
+ }
+
+ kemh = mekh.apply(&mut dcel).unwrap();
+ }
+ })
+}