]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tests/Cube.hs
Add a blank line to the test output.
[spline3.git] / src / Tests / Cube.hs
index aaafa7ca77a6cad7f9a6afc4cbab1745d120d611..631af5f54545564bf314531cf612d94ac4ef41f3 100644 (file)
@@ -8,6 +8,7 @@ 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)
@@ -43,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
 
@@ -61,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
 
@@ -70,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
 
@@ -79,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
 
@@ -88,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
 
@@ -97,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
 
@@ -106,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
 
@@ -263,260 +409,282 @@ prop_tetrahedron23_volumes_positive cube =
     volume (tetrahedron23 cube) > 0
 
 
     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
---   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). It appears that
+--   the assumptions in sections (2.6) and (2.7) have been
+--   switched. From the description, one would expect 'tetrahedron0'
+--   and 'tetrahedron3' to share face \<v0,v1,v2\>; however, we have
+--   to use 'tetrahedron0' and 'tetahedron1' for all of the tests in
+--   section (2.6). Also 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
 prop_c0120_identity1 cube =
 prop_c0120_identity1 :: Cube -> Bool
 prop_c0120_identity1 cube =
-   c t0 0 1 2 0 ~= (c t0 0 0 2 1 + c t3 0 0 1 2) / 2
+   c t0 0 1 2 0 ~= (c t0 0 0 2 1 + c t1 0 0 1 2) / 2
      where
        t0 = tetrahedron0 cube
      where
        t0 = tetrahedron0 cube
-       t3 = tetrahedron3 cube
+       t1 = tetrahedron1 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 t2 0 0 1 2) / 2
      where
      where
-       t3 = tetrahedron3 cube
+       t1 = tetrahedron1 cube
        t2 = tetrahedron2 cube
 
        t2 = tetrahedron2 cube
 
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 2 and 1.
+-- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 2 and 3.
 prop_c0120_identity3 :: Cube -> Bool
 prop_c0120_identity3 cube =
 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
+   c t2 0 1 2 0 ~= (c t2 0 0 2 1 + c t3 0 0 1 2) / 2
      where
        t2 = tetrahedron2 cube
      where
        t2 = tetrahedron2 cube
-       t1 = tetrahedron1 cube
-
-
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 4 and 7.
-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
-     where
-       t4 = tetrahedron4 cube
-       t7 = tetrahedron7 cube
-
-
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 7 and 6.
-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
-
-
--- | Given in Sorokina and Zeilfelder, p. 79. Repeats
---   prop_c0120_identity1 with tetrahedrons 6 and 5.
-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
+       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). Repeats
+--   'prop_c0120_identity1' with tetrahedrons 4 and 5.
+-- prop_c0120_identity4 :: Cube -> Bool
+-- prop_c0120_identity4 cube =
+--     sum [trace ("c_t4_0120: " ++ (show tmp1)) tmp1,
+--          trace ("c_t5_0012: " ++ (show tmp2)) tmp2,
+--          trace ("c_t5_0102: " ++ (show tmp3)) tmp3,
+--          trace ("c_t5_1002: " ++ (show tmp4)) tmp4,
+--          trace ("c_t5_0120: " ++ (show tmp5)) tmp5,
+--          trace ("c_t5_1020: " ++ (show tmp6)) tmp6,
+--          trace ("c_t5_1200: " ++ (show tmp7)) tmp7,
+--          trace ("c_t5_0021: " ++ (show tmp8)) tmp8,
+--          trace ("c_t5_0201: " ++ (show tmp9)) tmp9,
+--          trace ("c_t5_2001: " ++ (show tmp10)) tmp10,
+--          trace ("c_t5_0210: " ++ (show tmp11)) tmp11,
+--          trace ("c_t5_2010: " ++ (show tmp12)) tmp12,
+--          trace ("c_t5_2100: " ++ (show tmp13)) tmp13] == 10
+-- --   c t4 0 1 2 0 ~= (c t4 0 0 2 1 + c t5 0 0 1 2) / 2
+--      where
+--        t4 = tetrahedron4 cube
+--        t5 = tetrahedron5 cube
+--        tmp1 = c t4 0 1 2 0
+--        tmp2 = (c t4 0 0 2 1 + c t5 0 0 1 2) / 2
+--        tmp3 = (c t4 0 0 2 1 + c t5 0 1 0 2) / 2
+--        tmp4 = (c t4 0 0 2 1 + c t5 1 0 0 2) / 2
+--        tmp5 = (c t4 0 0 2 1 + c t5 0 1 2 0) / 2
+--        tmp6 = (c t4 0 0 2 1 + c t5 1 0 2 0) / 2
+--        tmp7 = (c t4 0 0 2 1 + c t5 1 2 0 0) / 2
+--        tmp8 = (c t4 0 0 2 1 + c t5 0 0 2 1) / 2
+--        tmp9 = (c t4 0 0 2 1 + c t5 0 2 0 1) / 2
+--        tmp10 = (c t4 0 0 2 1 + c t5 2 0 0 1) / 2
+--        tmp11 = (c t4 0 0 2 1 + c t5 0 2 1 0) / 2
+--        tmp12 = (c t4 0 0 2 1 + c t5 2 0 1 0) / 2
+--        tmp13 = (c t4 0 0 2 1 + c t5 2 1 0 0) / 2
+
+-- -- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+-- --   'prop_c0120_identity1' with tetrahedrons 5 and 6.
+-- prop_c0120_identity5 :: Cube -> Bool
+-- prop_c0120_identity5 cube =
+--    c t5 0 1 2 0 ~= (c t5 0 0 2 1 + c t6 0 0 1 2) / 2
+--      where
+--        t5 = tetrahedron5 cube
+--        t6 = tetrahedron6 cube
+
+
+-- -- | Given in Sorokina and Zeilfelder, p. 79, (2.6). Repeats
+-- --   'prop_c0120_identity1' with tetrahedrons 6 and 7.
+-- prop_c0120_identity6 :: Cube -> Bool
+-- prop_c0120_identity6 cube =
+--    c t6 0 1 2 0 ~= (c t6 0 0 2 1 + c t7 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 =
 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
+    c t0 0 2 1 0 ~= (c t0 0 1 1 1 + c t1 0 1 1 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t3 = tetrahedron3 cube
+        t1 = tetrahedron1 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 =
 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
+    c t0 0 3 0 0 ~= (c t0 0 2 0 1 + c t1 0 2 1 0) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t3 = tetrahedron3 cube
+        t1 = tetrahedron1 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 =
 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
+    c t0 1 1 1 0 ~= (c t0 1 0 1 1 + c t1 1 0 1 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t3 = tetrahedron3 cube
+        t1 = tetrahedron1 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 =
 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
+    c t0 1 2 0 0 ~= (c t0 1 1 0 1 + c t1 1 1 1 0) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t3 = tetrahedron3 cube
+        t1 = tetrahedron1 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 =
 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
+    c t0 2 1 0 0 ~= (c t0 2 0 0 1 + c t1 2 0 1 0) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t3 = tetrahedron3 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). It appears that
+--   the assumptions in sections (2.6) and (2.7) have been
+--   switched. From the description, one would expect 'tetrahedron0'
+--   and 'tetrahedron1' to share face \<v0,v1,v3\>; however, we have
+--   to use 'tetrahedron0' and 'tetahedron3' for all of the tests in
+--   section (2.7). Also 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 =
 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
+    c t0 0 1 0 2 ~= (c t0 0 0 1 2 + c t3 0 0 2 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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 =
 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
+    c t0 0 2 0 1 ~= (c t0 0 1 1 1 + c t3 0 1 1 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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 =
 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
+    c t0 0 3 0 0 ~= (c t0 0 2 1 0 + c t3 0 2 0 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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 =
 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
+    c t0 1 1 0 1 ~= (c t0 1 0 1 1 + c t3 1 0 1 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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 =
 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
+    c t0 1 2 0 0 ~= (c t0 1 1 1 0 + c t3 1 1 0 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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 =
 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
+    c t0 2 1 0 0 ~= (c t0 2 0 1 0 + c t3 2 0 0 1) / 2
       where
         t0 = tetrahedron0 cube
       where
         t0 = tetrahedron0 cube
-        t1 = tetrahedron1 cube
+        t3 = tetrahedron3 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
@@ -540,6 +708,39 @@ 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
 -- | 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
@@ -574,9 +775,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