]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tests/Cube.hs
Add a bunch more exact volume tests.
[spline3.git] / src / Tests / Cube.hs
index 5a9ca19330465e1e6e9a7b56ab2dfc62405f7060..11df961836d709565cb8f68e3f3b319a09376e4a 100644 (file)
@@ -1,11 +1,14 @@
 module Tests.Cube
 where
 
 module Tests.Cube
 where
 
+import Prelude hiding (LT)
 import Test.QuickCheck
 
 import Test.QuickCheck
 
+import Cardinal
 import Comparisons
 import Cube
 import FunctionValues
 import Comparisons
 import Cube
 import FunctionValues
+import Misc (all_equal)
 import Tests.FunctionValues ()
 import Tetrahedron (b0, b1, b2, b3, c, fv,
                     v0, v1, v2, v3, volume)
 import Tests.FunctionValues ()
 import Tetrahedron (b0, b1, b2, b3, c, fv,
                     v0, v1, v2, v3, volume)
@@ -41,16 +44,17 @@ prop_all_volumes_positive cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron0_volumes_exact :: Cube -> Bool
 prop_tetrahedron0_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron0_volumes_exact :: Cube -> Bool
 prop_tetrahedron0_volumes_exact cube =
-    volume (tetrahedron0 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron0 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
+
 -- | In fact, since all of the tetrahedra are identical, we should
 --   already know their volumes. There's 24 tetrahedra to a cube, so
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron1_volumes_exact :: Cube -> Bool
 prop_tetrahedron1_volumes_exact cube =
 -- | In fact, since all of the tetrahedra are identical, we should
 --   already know their volumes. There's 24 tetrahedra to a cube, so
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron1_volumes_exact :: Cube -> Bool
 prop_tetrahedron1_volumes_exact cube =
-    volume (tetrahedron1 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron1 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -59,7 +63,7 @@ prop_tetrahedron1_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron2_volumes_exact :: Cube -> Bool
 prop_tetrahedron2_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron2_volumes_exact :: Cube -> Bool
 prop_tetrahedron2_volumes_exact cube =
-    volume (tetrahedron2 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron2 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -68,7 +72,7 @@ prop_tetrahedron2_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron3_volumes_exact :: Cube -> Bool
 prop_tetrahedron3_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron3_volumes_exact :: Cube -> Bool
 prop_tetrahedron3_volumes_exact cube =
-    volume (tetrahedron3 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron3 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -77,7 +81,7 @@ prop_tetrahedron3_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron4_volumes_exact :: Cube -> Bool
 prop_tetrahedron4_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron4_volumes_exact :: Cube -> Bool
 prop_tetrahedron4_volumes_exact cube =
-    volume (tetrahedron4 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron4 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -86,7 +90,7 @@ prop_tetrahedron4_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron5_volumes_exact :: Cube -> Bool
 prop_tetrahedron5_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron5_volumes_exact :: Cube -> Bool
 prop_tetrahedron5_volumes_exact cube =
-    volume (tetrahedron5 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron5 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -95,7 +99,7 @@ prop_tetrahedron5_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron6_volumes_exact :: Cube -> Bool
 prop_tetrahedron6_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron6_volumes_exact :: Cube -> Bool
 prop_tetrahedron6_volumes_exact cube =
-    volume (tetrahedron6 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron6 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -104,7 +108,151 @@ prop_tetrahedron6_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron7_volumes_exact :: Cube -> Bool
 prop_tetrahedron7_volumes_exact cube =
 --   we'd expect the volume of each one to be (1/24)*h^3.
 prop_tetrahedron7_volumes_exact :: Cube -> Bool
 prop_tetrahedron7_volumes_exact cube =
-    volume (tetrahedron7 cube) ~= (1/24)*(delta^(3::Int))
+    volume (tetrahedron7 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron8_volumes_exact :: Cube -> Bool
+prop_tetrahedron8_volumes_exact cube =
+    volume (tetrahedron8 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron9_volumes_exact :: Cube -> Bool
+prop_tetrahedron9_volumes_exact cube =
+    volume (tetrahedron9 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron10_volumes_exact :: Cube -> Bool
+prop_tetrahedron10_volumes_exact cube =
+    volume (tetrahedron10 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron11_volumes_exact :: Cube -> Bool
+prop_tetrahedron11_volumes_exact cube =
+    volume (tetrahedron11 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron12_volumes_exact :: Cube -> Bool
+prop_tetrahedron12_volumes_exact cube =
+    volume (tetrahedron12 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron13_volumes_exact :: Cube -> Bool
+prop_tetrahedron13_volumes_exact cube =
+    volume (tetrahedron13 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron14_volumes_exact :: Cube -> Bool
+prop_tetrahedron14_volumes_exact cube =
+    volume (tetrahedron14 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron15_volumes_exact :: Cube -> Bool
+prop_tetrahedron15_volumes_exact cube =
+    volume (tetrahedron15 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron16_volumes_exact :: Cube -> Bool
+prop_tetrahedron16_volumes_exact cube =
+    volume (tetrahedron16 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron17_volumes_exact :: Cube -> Bool
+prop_tetrahedron17_volumes_exact cube =
+    volume (tetrahedron17 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron18_volumes_exact :: Cube -> Bool
+prop_tetrahedron18_volumes_exact cube =
+    volume (tetrahedron18 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron19_volumes_exact :: Cube -> Bool
+prop_tetrahedron19_volumes_exact cube =
+    volume (tetrahedron19 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron20_volumes_exact :: Cube -> Bool
+prop_tetrahedron20_volumes_exact cube =
+    volume (tetrahedron20 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron21_volumes_exact :: Cube -> Bool
+prop_tetrahedron21_volumes_exact cube =
+    volume (tetrahedron21 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron22_volumes_exact :: Cube -> Bool
+prop_tetrahedron22_volumes_exact cube =
+    volume (tetrahedron22 cube) ~~= (1/24)*(delta^(3::Int))
+    where
+      delta = h cube
+
+-- | In fact, since all of the tetrahedra are identical, we should
+--   already know their volumes. There's 24 tetrahedra to a cube, so
+--   we'd expect the volume of each one to be (1/24)*h^3.
+prop_tetrahedron23_volumes_exact :: Cube -> Bool
+prop_tetrahedron23_volumes_exact cube =
+    volume (tetrahedron23 cube) ~~= (1/24)*(delta^(3::Int))
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -538,6 +686,69 @@ prop_c1011_identity cube =
 
 
 
 
 
 
+-- | The function values at the interior should be the same for all tetrahedra.
+prop_interior_values_all_identical :: Cube -> Bool
+prop_interior_values_all_identical cube =
+    all_equal [i0, i1, i2, i3, i4, i5, i6, i7, i8,
+               i9, i10, i11, i12, i13, i14, i15, i16,
+               i17, i18, i19, i20, i21, i22, i23]
+    where
+      i0 = eval (Tetrahedron.fv (tetrahedron0 cube)) $ I
+      i1 = eval (Tetrahedron.fv (tetrahedron1 cube)) $ I
+      i2 = eval (Tetrahedron.fv (tetrahedron2 cube)) $ I
+      i3 = eval (Tetrahedron.fv (tetrahedron3 cube)) $ I
+      i4 = eval (Tetrahedron.fv (tetrahedron4 cube)) $ I
+      i5 = eval (Tetrahedron.fv (tetrahedron5 cube)) $ I
+      i6 = eval (Tetrahedron.fv (tetrahedron6 cube)) $ I
+      i7 = eval (Tetrahedron.fv (tetrahedron7 cube)) $ I
+      i8 = eval (Tetrahedron.fv (tetrahedron8 cube)) $ I
+      i9 = eval (Tetrahedron.fv (tetrahedron9 cube)) $ I
+      i10 = eval (Tetrahedron.fv (tetrahedron10 cube)) $ I
+      i11 = eval (Tetrahedron.fv (tetrahedron11 cube)) $ I
+      i12 = eval (Tetrahedron.fv (tetrahedron12 cube)) $ I
+      i13 = eval (Tetrahedron.fv (tetrahedron13 cube)) $ I
+      i14 = eval (Tetrahedron.fv (tetrahedron14 cube)) $ I
+      i15 = eval (Tetrahedron.fv (tetrahedron15 cube)) $ I
+      i16 = eval (Tetrahedron.fv (tetrahedron16 cube)) $ I
+      i17 = eval (Tetrahedron.fv (tetrahedron17 cube)) $ I
+      i18 = eval (Tetrahedron.fv (tetrahedron18 cube)) $ I
+      i19 = eval (Tetrahedron.fv (tetrahedron19 cube)) $ I
+      i20 = eval (Tetrahedron.fv (tetrahedron20 cube)) $ I
+      i21 = eval (Tetrahedron.fv (tetrahedron21 cube)) $ I
+      i22 = eval (Tetrahedron.fv (tetrahedron22 cube)) $ I
+      i23 = eval (Tetrahedron.fv (tetrahedron23 cube)) $ I
+
+
+-- | We know what (c t6 2 1 0 0) should be from Sorokina and Zeilfelder, p. 87.
+--   This test checks the rotation works as expected.
+prop_c_tilde_2100_rotation_correct :: Cube -> Bool
+prop_c_tilde_2100_rotation_correct cube =
+    expr1 == expr2
+    where
+      t0 = tetrahedron0 cube
+      t6 = tetrahedron6 cube
+
+      -- What gets computed for c2100 of t6.
+      expr1 = eval (Tetrahedron.fv t6) $
+          (3/8)*I +
+          (1/12)*(T + R + L + D) +
+          (1/64)*(FT + FR + FL + FD) +
+          (7/48)*F +
+          (1/48)*B +
+          (1/96)*(RT + LD + LT + RD) +
+          (1/192)*(BT + BR + BL + BD)
+
+      -- What should be computed for c2100 of t6.
+      expr2 = eval (Tetrahedron.fv t0) $
+              (3/8)*I +
+              (1/12)*(F + R + L + B) +
+              (1/64)*(FT + RT + LT + BT) +
+              (7/48)*T +
+              (1/48)*D +
+              (1/96)*(FR + FL + BR + BL) +
+              (1/192)*(FD + RD + LD + BD)
+
+
 -- | We know what (c t6 2 1 0 0) should be from Sorokina and Zeilfelder, p. 87.
 --   This test checks the actual value based on the FunctionValues of the cube.
 prop_c_tilde_2100_correct :: Cube -> Bool
 -- | We know what (c t6 2 1 0 0) should be from Sorokina and Zeilfelder, p. 87.
 --   This test checks the actual value based on the FunctionValues of the cube.
 prop_c_tilde_2100_correct :: Cube -> Bool
@@ -546,8 +757,9 @@ prop_c_tilde_2100_correct cube =
                               + (7/48)*t + (1/48)*d + (1/96)*(fr + fl + br + bl)
                               + (1/192)*(fd + rd + ld + bd)
     where
                               + (7/48)*t + (1/48)*d + (1/96)*(fr + fl + br + bl)
                               + (1/192)*(fd + rd + ld + bd)
     where
+      t0 = tetrahedron0 cube
       t6 = tetrahedron6 cube
       t6 = tetrahedron6 cube
-      fvs = Tetrahedron.fv t6
+      fvs = Tetrahedron.fv t0
       int = interior fvs
       f = front fvs
       r = right fvs
       int = interior fvs
       f = front fvs
       r = right fvs