]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tests/Cube.hs
Add tests for some functions used in the new 'find_containing_tetrahedron'.
[spline3.git] / src / Tests / Cube.hs
index dac4f80749f019b0f76dd2f29e77b235eeeea82e..0a1cc504179e9e0c7a79dae01c8ced961ac8b434 100644 (file)
@@ -2,112 +2,57 @@ module Tests.Cube
 where
 
 import Prelude hiding (LT)
 where
 
 import Prelude hiding (LT)
-import Test.QuickCheck
 
 import Cardinal
 import Comparisons
 
 import Cardinal
 import Comparisons
-import Cube
+import Cube hiding (i, j, k)
 import FunctionValues
 import FunctionValues
-import Misc (all_equal)
+import Misc (all_equal, disjoint)
 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)
 
-instance Arbitrary Cube where
-    arbitrary = do
-      (Positive h') <- arbitrary :: Gen (Positive Double)
-      i' <- choose (coordmin, coordmax)
-      j' <- choose (coordmin, coordmax)
-      k' <- choose (coordmin, coordmax)
-      fv' <- arbitrary :: Gen FunctionValues
-      return (Cube h' i' j' k' fv')
-        where
-          coordmin = -268435456 -- -(2^29 / 2)
-          coordmax = 268435456  -- +(2^29 / 2)
-
 
 -- Quickcheck tests.
 
 
 -- Quickcheck tests.
 
--- | Since the grid size is necessarily positive, all tetrahedrons
+-- | The 'front_half_tetrahedra' and 'back_half_tetrahedra' should
+--   have no tetrahedra in common.
+prop_front_back_tetrahedra_disjoint :: Cube -> Bool
+prop_front_back_tetrahedra_disjoint c =
+    disjoint (front_half_tetrahedra c) (back_half_tetrahedra c)
+
+
+-- | The 'top_half_tetrahedra' and 'down_half_tetrahedra' should
+--   have no tetrahedra in common.
+prop_top_down_tetrahedra_disjoint :: Cube -> Bool
+prop_top_down_tetrahedra_disjoint c =
+    disjoint (top_half_tetrahedra c) (down_half_tetrahedra c)
+
+
+-- | The 'left_half_tetrahedra' and 'right_half_tetrahedra' should
+--   have no tetrahedra in common.
+prop_left_right_tetrahedra_disjoint :: Cube -> Bool
+prop_left_right_tetrahedra_disjoint c =
+    disjoint (left_half_tetrahedra c) (right_half_tetrahedra c)
+
+
+-- | Since the grid size is necessarily positive, all tetrahedra
 --   (which comprise cubes of positive volume) must have positive volume
 --   as well.
 prop_all_volumes_positive :: Cube -> Bool
 prop_all_volumes_positive cube =
     null nonpositive_volumes
     where
 --   (which comprise cubes of positive volume) must have positive volume
 --   as well.
 prop_all_volumes_positive :: Cube -> Bool
 prop_all_volumes_positive cube =
     null nonpositive_volumes
     where
-      ts = tetrahedrons cube
+      ts = tetrahedra cube
       volumes = map volume ts
       nonpositive_volumes = filter (<= 0) volumes
 
 -- | 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.
       volumes = map volume ts
       nonpositive_volumes = filter (<= 0) volumes
 
 -- | 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_tetrahedron0_volumes_exact :: Cube -> Bool
-prop_tetrahedron0_volumes_exact cube =
-    volume (tetrahedron0 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_tetrahedron1_volumes_exact :: Cube -> Bool
-prop_tetrahedron1_volumes_exact cube =
-    volume (tetrahedron1 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_tetrahedron2_volumes_exact :: Cube -> Bool
-prop_tetrahedron2_volumes_exact cube =
-    volume (tetrahedron2 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_tetrahedron3_volumes_exact :: Cube -> Bool
-prop_tetrahedron3_volumes_exact cube =
-    volume (tetrahedron3 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_tetrahedron4_volumes_exact :: Cube -> Bool
-prop_tetrahedron4_volumes_exact cube =
-    volume (tetrahedron4 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_tetrahedron5_volumes_exact :: Cube -> Bool
-prop_tetrahedron5_volumes_exact cube =
-    volume (tetrahedron5 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_tetrahedron6_volumes_exact :: Cube -> Bool
-prop_tetrahedron6_volumes_exact cube =
-    volume (tetrahedron6 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_tetrahedron7_volumes_exact :: Cube -> Bool
-prop_tetrahedron7_volumes_exact cube =
-    volume (tetrahedron7 cube) ~= (1/24)*(delta^(3::Int))
+prop_all_volumes_exact :: Cube -> Bool
+prop_all_volumes_exact cube =
+    and [volume t ~~= (1/24)*(delta^(3::Int)) | t <- tetrahedra cube]
     where
       delta = h cube
 
     where
       delta = h cube
 
@@ -115,158 +60,13 @@ prop_tetrahedron7_volumes_exact cube =
 prop_v0_all_equal :: Cube -> Bool
 prop_v0_all_equal cube = (v0 t0) == (v0 t1)
     where
 prop_v0_all_equal :: Cube -> Bool
 prop_v0_all_equal cube = (v0 t0) == (v0 t1)
     where
-      t0 = head (tetrahedrons cube) -- Doesn't matter which two we choose.
-      t1 = head $ tail (tetrahedrons cube)
-
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron0_volumes_positive :: Cube -> Bool
-prop_tetrahedron0_volumes_positive cube =
-    volume (tetrahedron0 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron1_volumes_positive :: Cube -> Bool
-prop_tetrahedron1_volumes_positive cube =
-    volume (tetrahedron1 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron2_volumes_positive :: Cube -> Bool
-prop_tetrahedron2_volumes_positive cube =
-    volume (tetrahedron2 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron3_volumes_positive :: Cube -> Bool
-prop_tetrahedron3_volumes_positive cube =
-    volume (tetrahedron3 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron4_volumes_positive :: Cube -> Bool
-prop_tetrahedron4_volumes_positive cube =
-    volume (tetrahedron4 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron5_volumes_positive :: Cube -> Bool
-prop_tetrahedron5_volumes_positive cube =
-    volume (tetrahedron5 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron6_volumes_positive :: Cube -> Bool
-prop_tetrahedron6_volumes_positive cube =
-    volume (tetrahedron6 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron7_volumes_positive :: Cube -> Bool
-prop_tetrahedron7_volumes_positive cube =
-    volume (tetrahedron7 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron8_volumes_positive :: Cube -> Bool
-prop_tetrahedron8_volumes_positive cube =
-    volume (tetrahedron8 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron9_volumes_positive :: Cube -> Bool
-prop_tetrahedron9_volumes_positive cube =
-    volume (tetrahedron9 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron10_volumes_positive :: Cube -> Bool
-prop_tetrahedron10_volumes_positive cube =
-    volume (tetrahedron10 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron11_volumes_positive :: Cube -> Bool
-prop_tetrahedron11_volumes_positive cube =
-    volume (tetrahedron11 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron12_volumes_positive :: Cube -> Bool
-prop_tetrahedron12_volumes_positive cube =
-    volume (tetrahedron12 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron13_volumes_positive :: Cube -> Bool
-prop_tetrahedron13_volumes_positive cube =
-    volume (tetrahedron13 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron14_volumes_positive :: Cube -> Bool
-prop_tetrahedron14_volumes_positive cube =
-    volume (tetrahedron14 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron15_volumes_positive :: Cube -> Bool
-prop_tetrahedron15_volumes_positive cube =
-    volume (tetrahedron15 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron16_volumes_positive :: Cube -> Bool
-prop_tetrahedron16_volumes_positive cube =
-    volume (tetrahedron16 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron17_volumes_positive :: Cube -> Bool
-prop_tetrahedron17_volumes_positive cube =
-    volume (tetrahedron17 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron18_volumes_positive :: Cube -> Bool
-prop_tetrahedron18_volumes_positive cube =
-    volume (tetrahedron18 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron19_volumes_positive :: Cube -> Bool
-prop_tetrahedron19_volumes_positive cube =
-    volume (tetrahedron19 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron20_volumes_positive :: Cube -> Bool
-prop_tetrahedron20_volumes_positive cube =
-    volume (tetrahedron20 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron21_volumes_positive :: Cube -> Bool
-prop_tetrahedron21_volumes_positive cube =
-    volume (tetrahedron21 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron22_volumes_positive :: Cube -> Bool
-prop_tetrahedron22_volumes_positive cube =
-    volume (tetrahedron22 cube) > 0
-
--- | This pretty much repeats the prop_all_volumes_positive property,
---   but will let me know which tetrahedrons's vertices are disoriented.
-prop_tetrahedron23_volumes_positive :: Cube -> Bool
-prop_tetrahedron23_volumes_positive cube =
-    volume (tetrahedron23 cube) > 0
-
-
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
+      t0 = head (tetrahedra cube) -- Doesn't matter which two we choose.
+      t1 = head $ tail (tetrahedra cube)
+
+
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Note that the
+--   third and fourth indices of c-t1 have been switched. This is
+--   because we store the triangles oriented such that their volume is
 --   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
 --   in opposite directions, one of them has to have negative volume!
 prop_c0120_identity1 :: Cube -> Bool
 --   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
 --   in opposite directions, one of them has to have negative volume!
 prop_c0120_identity1 :: Cube -> Bool
@@ -277,60 +77,65 @@ prop_c0120_identity1 cube =
        t3 = tetrahedron3 cube
 
 
        t3 = tetrahedron3 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity2 with tetrahedrons 3 and 2.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 1 and 2.
 prop_c0120_identity2 :: Cube -> Bool
 prop_c0120_identity2 cube =
 prop_c0120_identity2 :: Cube -> Bool
 prop_c0120_identity2 cube =
-   c t3 0 1 2 0 ~= (c t3 0 0 2 1 + c t2 0 0 1 2) / 2
+   c t1 0 1 2 0 ~= (c t1 0 0 2 1 + c t0 0 0 1 2) / 2
      where
      where
-       t3 = tetrahedron3 cube
-       t2 = tetrahedron2 cube
-
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 2 and 1.
+       t0 = tetrahedron0 cube
+       t1 = tetrahedron1 cube
+            
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 1 and 2.
 prop_c0120_identity3 :: Cube -> Bool
 prop_c0120_identity3 cube =
    c t2 0 1 2 0 ~= (c t2 0 0 2 1 + c t1 0 0 1 2) / 2
      where
 prop_c0120_identity3 :: Cube -> Bool
 prop_c0120_identity3 cube =
    c t2 0 1 2 0 ~= (c t2 0 0 2 1 + c t1 0 0 1 2) / 2
      where
-       t2 = tetrahedron2 cube
        t1 = tetrahedron1 cube
        t1 = tetrahedron1 cube
+       t2 = tetrahedron2 cube
 
 
-
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 4 and 7.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 2 and 3.
 prop_c0120_identity4 :: Cube -> Bool
 prop_c0120_identity4 cube =
 prop_c0120_identity4 :: Cube -> Bool
 prop_c0120_identity4 cube =
-   c t4 0 1 2 0 ~= (c t4 0 0 2 1 + c t7 0 0 1 2) / 2
+   c t3 0 1 2 0 ~= (c t3 0 0 2 1 + c t2 0 0 1 2) / 2
      where
      where
-       t4 = tetrahedron4 cube
-       t7 = tetrahedron7 cube
+       t2 = tetrahedron2 cube
+       t3 = tetrahedron3 cube
 
 
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 7 and 6.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 4 and 5.
 prop_c0120_identity5 :: Cube -> Bool
 prop_c0120_identity5 cube =
 prop_c0120_identity5 :: Cube -> Bool
 prop_c0120_identity5 cube =
-   c t7 0 1 2 0 ~= (c t7 0 0 2 1 + c t6 0 0 1 2) / 2
-     where
-       t7 = tetrahedron7 cube
-       t6 = tetrahedron6 cube
-
+    c t5 0 1 2 0 ~= (c t5 0 0 2 1 + c t4 0 0 1 2) / 2
+    where
+      t4 = tetrahedron4 cube
+      t5 = tetrahedron5 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 6 and 5.
+-- -- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+-- --   'prop_c0120_identity1' with tetrahedrons 5 and 6.
 prop_c0120_identity6 :: Cube -> Bool
 prop_c0120_identity6 cube =
    c t6 0 1 2 0 ~= (c t6 0 0 2 1 + c t5 0 0 1 2) / 2
      where
 prop_c0120_identity6 :: Cube -> Bool
 prop_c0120_identity6 cube =
    c t6 0 1 2 0 ~= (c t6 0 0 2 1 + c t5 0 0 1 2) / 2
      where
-       t6 = tetrahedron6 cube
        t5 = tetrahedron5 cube
        t5 = tetrahedron5 cube
+       t6 = tetrahedron6 cube
 
 
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- -- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+-- --   'prop_c0120_identity1' with tetrahedrons 6 and 7.
+prop_c0120_identity7 :: Cube -> Bool
+prop_c0120_identity7 cube =
+   c t7 0 1 2 0 ~= (c t7 0 0 2 1 + c t6 0 0 1 2) / 2
+     where
+       t6 = tetrahedron6 cube
+       t7 = tetrahedron7 cube
+
+
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). See
+--   'prop_c0120_identity1'.
 prop_c0210_identity1 :: Cube -> Bool
 prop_c0210_identity1 cube =
     c t0 0 2 1 0 ~= (c t0 0 1 1 1 + c t3 0 1 1 1) / 2
 prop_c0210_identity1 :: Cube -> Bool
 prop_c0210_identity1 cube =
     c t0 0 2 1 0 ~= (c t0 0 1 1 1 + c t3 0 1 1 1) / 2
@@ -339,11 +144,8 @@ prop_c0210_identity1 cube =
         t3 = tetrahedron3 cube
 
 
         t3 = tetrahedron3 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). See
+--   'prop_c0120_identity1'.
 prop_c0300_identity1 :: Cube -> Bool
 prop_c0300_identity1 cube =
     c t0 0 3 0 0 ~= (c t0 0 2 0 1 + c t3 0 2 1 0) / 2
 prop_c0300_identity1 :: Cube -> Bool
 prop_c0300_identity1 cube =
     c t0 0 3 0 0 ~= (c t0 0 2 0 1 + c t3 0 2 1 0) / 2
@@ -352,11 +154,8 @@ prop_c0300_identity1 cube =
         t3 = tetrahedron3 cube
 
 
         t3 = tetrahedron3 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). See
+--   'prop_c0120_identity1'.
 prop_c1110_identity :: Cube -> Bool
 prop_c1110_identity cube =
     c t0 1 1 1 0 ~= (c t0 1 0 1 1 + c t3 1 0 1 1) / 2
 prop_c1110_identity :: Cube -> Bool
 prop_c1110_identity cube =
     c t0 1 1 1 0 ~= (c t0 1 0 1 1 + c t3 1 0 1 1) / 2
@@ -365,11 +164,8 @@ prop_c1110_identity cube =
         t3 = tetrahedron3 cube
 
 
         t3 = tetrahedron3 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). See
+--   'prop_c0120_identity1'.
 prop_c1200_identity1 :: Cube -> Bool
 prop_c1200_identity1 cube =
     c t0 1 2 0 0 ~= (c t0 1 1 0 1 + c t3 1 1 1 0) / 2
 prop_c1200_identity1 :: Cube -> Bool
 prop_c1200_identity1 cube =
     c t0 1 2 0 0 ~= (c t0 1 1 0 1 + c t3 1 1 1 0) / 2
@@ -378,11 +174,8 @@ prop_c1200_identity1 cube =
         t3 = tetrahedron3 cube
 
 
         t3 = tetrahedron3 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t3 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). See
+--   'prop_c0120_identity1'.
 prop_c2100_identity1 :: Cube -> Bool
 prop_c2100_identity1 cube =
     c t0 2 1 0 0 ~= (c t0 2 0 0 1 + c t3 2 0 1 0) / 2
 prop_c2100_identity1 :: Cube -> Bool
 prop_c2100_identity1 cube =
     c t0 2 1 0 0 ~= (c t0 2 0 0 1 + c t3 2 0 1 0) / 2
@@ -392,11 +185,12 @@ prop_c2100_identity1 cube =
 
 
 
 
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). Note that the
+--   third and fourth indices of c-t3 have been switched. This is
+--   because we store the triangles oriented such that their volume is
+--   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde
+--   point in opposite directions, one of them has to have negative
+--   volume!
 prop_c0102_identity1 :: Cube -> Bool
 prop_c0102_identity1 cube =
     c t0 0 1 0 2 ~= (c t0 0 0 1 2 + c t1 0 0 2 1) / 2
 prop_c0102_identity1 :: Cube -> Bool
 prop_c0102_identity1 cube =
     c t0 0 1 0 2 ~= (c t0 0 0 1 2 + c t1 0 0 2 1) / 2
@@ -405,11 +199,8 @@ prop_c0102_identity1 cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). See
+--   'prop_c0102_identity1'.
 prop_c0201_identity1 :: Cube -> Bool
 prop_c0201_identity1 cube =
     c t0 0 2 0 1 ~= (c t0 0 1 1 1 + c t1 0 1 1 1) / 2
 prop_c0201_identity1 :: Cube -> Bool
 prop_c0201_identity1 cube =
     c t0 0 2 0 1 ~= (c t0 0 1 1 1 + c t1 0 1 1 1) / 2
@@ -418,11 +209,8 @@ prop_c0201_identity1 cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). See
+--   'prop_c0102_identity1'.
 prop_c0300_identity2 :: Cube -> Bool
 prop_c0300_identity2 cube =
     c t0 0 3 0 0 ~= (c t0 0 2 1 0 + c t1 0 2 0 1) / 2
 prop_c0300_identity2 :: Cube -> Bool
 prop_c0300_identity2 cube =
     c t0 0 3 0 0 ~= (c t0 0 2 1 0 + c t1 0 2 0 1) / 2
@@ -431,11 +219,8 @@ prop_c0300_identity2 cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). See
+--   'prop_c0102_identity1'.
 prop_c1101_identity :: Cube -> Bool
 prop_c1101_identity cube =
     c t0 1 1 0 1 ~= (c t0 1 0 1 1 + c t1 1 0 1 1) / 2
 prop_c1101_identity :: Cube -> Bool
 prop_c1101_identity cube =
     c t0 1 1 0 1 ~= (c t0 1 0 1 1 + c t1 1 0 1 1) / 2
@@ -444,11 +229,8 @@ prop_c1101_identity cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). See
+--   'prop_c0102_identity1'.
 prop_c1200_identity2 :: Cube -> Bool
 prop_c1200_identity2 cube =
     c t0 1 2 0 0 ~= (c t0 1 1 1 0 + c t1 1 1 0 1) / 2
 prop_c1200_identity2 :: Cube -> Bool
 prop_c1200_identity2 cube =
     c t0 1 2 0 0 ~= (c t0 1 1 1 0 + c t1 1 1 0 1) / 2
@@ -457,11 +239,8 @@ prop_c1200_identity2 cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79. Note that the third and
---   fourth indices of c-t1 have been switched. This is because we
---   store the triangles oriented such that their volume is
---   positive. If T and T-tilde share \<v0,v1,v3\> and v2,v2-tilde point
---   in opposite directions, one of them has to have negative volume!
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.7). See
+--   'prop_c0102_identity1'.
 prop_c2100_identity2 :: Cube -> Bool
 prop_c2100_identity2 cube =
     c t0 2 1 0 0 ~= (c t0 2 0 1 0 + c t1 2 0 0 1) / 2
 prop_c2100_identity2 :: Cube -> Bool
 prop_c2100_identity2 cube =
     c t0 2 1 0 0 ~= (c t0 2 0 1 0 + c t1 2 0 0 1) / 2
@@ -470,54 +249,71 @@ prop_c2100_identity2 cube =
         t1 = tetrahedron1 cube
 
 
         t1 = tetrahedron1 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). The third and
+--   fourth indices of c-t6 have been switched. This is because we
+--   store the triangles oriented such that their volume is
+--   positive. If T and T-tilde share \<v0,v1,v2\> and v3,v3-tilde
+--   point in opposite directions, one of them has to have negative
+--   volume!
 prop_c3000_identity :: Cube -> Bool
 prop_c3000_identity cube =
 prop_c3000_identity :: Cube -> Bool
 prop_c3000_identity cube =
-    c t0 3 0 0 0 ~= c t0 2 1 0 0 + c t6 2 1 0 0 - ((c t0 2 0 1 0 + c t0 2 0 0 1)/ 2)
+    c t0 3 0 0 0 ~= c t0 2 1 0 0 + c t6 2 1 0 0
+                    - ((c t0 2 0 1 0 + c t0 2 0 0 1)/ 2)
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t6 = (tetrahedron6 cube) { v2 = (v3 t6), v3 = (v2 t6) }
+        t6 = tetrahedron6 cube
 
 
 
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). See
+--   'prop_c3000_identity'.
 prop_c2010_identity :: Cube -> Bool
 prop_c2010_identity cube =
 prop_c2010_identity :: Cube -> Bool
 prop_c2010_identity cube =
-    c t0 2 0 1 0 ~= c t0 1 1 1 0 + c t6 1 1 1 0 - ((c t0 1 0 2 0 + c t0 1 0 1 1)/ 2)
+    c t0 2 0 1 0 ~= c t0 1 1 1 0 + c t6 1 1 0 1
+                    - ((c t0 1 0 2 0 + c t0 1 0 1 1)/ 2)
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). See
+--   'prop_c3000_identity'.
 prop_c2001_identity :: Cube -> Bool
 prop_c2001_identity cube =
 prop_c2001_identity :: Cube -> Bool
 prop_c2001_identity cube =
-    c t0 2 0 0 1 ~= c t0 1 1 0 1 + c t6 1 1 0 1 - ((c t0 1 0 0 2 + c t0 1 0 1 1)/ 2)
+    c t0 2 0 0 1 ~= c t0 1 1 0 1 + c t6 1 1 1 0
+                    - ((c t0 1 0 0 2 + c t0 1 0 1 1)/ 2)
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). See
+--   'prop_c3000_identity'.
 prop_c1020_identity :: Cube -> Bool
 prop_c1020_identity cube =
 prop_c1020_identity :: Cube -> Bool
 prop_c1020_identity cube =
-    c t0 1 0 2 0 ~= c t0 0 1 2 0 + c t6 0 1 2 0 - ((c t0 0 0 3 0 + c t0 0 0 2 1)/ 2)
+    c t0 1 0 2 0 ~= c t0 0 1 2 0 + c t6 0 1 0 2
+                    - ((c t0 0 0 3 0 + c t0 0 0 2 1)/ 2)
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). See
+--   'prop_c3000_identity'.
 prop_c1002_identity :: Cube -> Bool
 prop_c1002_identity cube =
 prop_c1002_identity :: Cube -> Bool
 prop_c1002_identity cube =
-    c t0 1 0 0 2 ~= c t0 0 1 0 2 + c t6 0 1 0 2 - ((c t0 0 0 0 3 + c t0 0 0 1 2)/ 2)
+    c t0 1 0 0 2 ~= c t0 0 1 0 2 + c t6 0 1 2 0
+                    - ((c t0 0 0 0 3 + c t0 0 0 1 2)/ 2)
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
 
 
--- | Given in Sorokina and Zeilfelder, p. 79.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.8). See
+--   'prop_c3000_identity'.
 prop_c1011_identity :: Cube -> Bool
 prop_c1011_identity cube =
 prop_c1011_identity :: Cube -> Bool
 prop_c1011_identity cube =
-    c t0 1 0 1 1 ~= c t0 0 1 1 1 + c t6 0 1 1 1 - ((c t0 0 0 1 2 + c t0 0 0 2 1)/ 2)
+    c t0 1 0 1 1 ~= c t0 0 1 1 1 + c t6 0 1 1 1 -
+                    ((c t0 0 0 1 2 + c t0 0 0 2 1)/ 2)
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
       where
         t0 = tetrahedron0 cube
         t6 = tetrahedron6 cube
@@ -525,20 +321,19 @@ prop_c1011_identity cube =
 
 
 -- | Given in Sorokina and Zeilfelder, p. 78.
 
 
 -- | Given in Sorokina and Zeilfelder, p. 78.
--- prop_cijk1_identity :: Cube -> Bool
--- prop_cijk1_identity cube =
---      and [ c t0 i j k 1 ~=
---                  (c t1 (i+1) j k 0) * ((b0 t0) (v3 t1)) +
---                  (c t1 i (j+1) k 0) * ((b1 t0) (v3 t1)) +
---                  (c t1 i j (k+1) 0) * ((b2 t0) (v3 t1)) +
---                  (c t1 i j k 1) * ((b3 t0) (v3 t1)) | i <- [0..2],
---                                                       j <- [0..2],
---                                                       k <- [0..2],
---                                                       i + j + k == 2]
---       where
---         t0 = tetrahedron0 cube
---         t1 = tetrahedron1 cube
-
+prop_cijk1_identity :: Cube -> Bool
+prop_cijk1_identity cube =
+     and [ c t0 i j k 1 ~=
+                 (c t1 (i+1) j k 0) * ((b0 t0) (v3 t1)) +
+                 (c t1 i (j+1) k 0) * ((b1 t0) (v3 t1)) +
+                 (c t1 i j (k+1) 0) * ((b2 t0) (v3 t1)) +
+                 (c t1 i j k 1) * ((b3 t0) (v3 t1)) | i <- [0..2],
+                                                      j <- [0..2],
+                                                      k <- [0..2],
+                                                      i + j + k == 2]
+      where
+        t0 = tetrahedron0 cube
+        t1 = tetrahedron1 cube
 
 
 -- | The function values at the interior should be the same for all tetrahedra.
 
 
 -- | The function values at the interior should be the same for all tetrahedra.
@@ -548,30 +343,30 @@ prop_interior_values_all_identical cube =
                i9, i10, i11, i12, i13, i14, i15, i16,
                i17, i18, i19, i20, i21, i22, i23]
     where
                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
+      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.
 
 
 -- | We know what (c t6 2 1 0 0) should be from Sorokina and Zeilfelder, p. 87.
@@ -608,9 +403,11 @@ prop_c_tilde_2100_rotation_correct cube =
 --   This test checks the actual value based on the FunctionValues of the cube.
 prop_c_tilde_2100_correct :: Cube -> Bool
 prop_c_tilde_2100_correct cube =
 --   This test checks the actual value based on the FunctionValues of the cube.
 prop_c_tilde_2100_correct :: Cube -> Bool
 prop_c_tilde_2100_correct cube =
-    c t6 2 1 0 0 == (3/8)*int + (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)
+    c t6 2 1 0 0 == (3/8)*int
+                    + (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)
     where
       t0 = tetrahedron0 cube
       t6 = tetrahedron6 cube
     where
       t0 = tetrahedron0 cube
       t6 = tetrahedron6 cube