X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FTests%2FTetrahedron.hs;h=bafb7fe2e5a9afdb793df41930d84cd4cd21f566;hb=6753d25156abb39ec68b715782b49f525e70b991;hp=98edf63b782af79552d76935552694ec1498590d;hpb=89b8b6e94fcc944a1f4611811265f3c6217af850;p=spline3.git diff --git a/src/Tests/Tetrahedron.hs b/src/Tests/Tetrahedron.hs index 98edf63..bafb7fe 100644 --- a/src/Tests/Tetrahedron.hs +++ b/src/Tests/Tetrahedron.hs @@ -4,32 +4,28 @@ where import Test.HUnit import Test.QuickCheck -import Cube +import Comparisons import Point -import Tests.Cube() +import FunctionValues +import Tests.FunctionValues() import Tetrahedron import ThreeDimensional instance Arbitrary Tetrahedron where arbitrary = do - rnd_c0 <- arbitrary :: Gen Cube rnd_v0 <- arbitrary :: Gen Point rnd_v1 <- arbitrary :: Gen Point rnd_v2 <- arbitrary :: Gen Point rnd_v3 <- arbitrary :: Gen Point - return (Tetrahedron rnd_c0 rnd_v0 rnd_v1 rnd_v2 rnd_v3) - -almost_equals :: Double -> Double -> Bool -almost_equals x y = (abs (x - y)) < 0.0001 - -(~=) :: Double -> Double -> Bool -(~=) = almost_equals - + rnd_fv <- arbitrary :: Gen FunctionValues + return (Tetrahedron rnd_fv rnd_v0 rnd_v1 rnd_v2 rnd_v3) -- HUnit Tests --- Since p0, p1, p2 are in clockwise order, we expect the volume here --- to be negative. + +-- | Check the volume of a particular tetrahedron against the value +-- computed by hand. Its vertices are in clockwise order, so the +-- volume should be negative. test_volume1 :: Test test_volume1 = TestCase $ assertEqual "volume is correct" True (vol ~= (-1/3)) @@ -38,16 +34,17 @@ test_volume1 = p1 = (0, 0.5, 0) p2 = (2, 0, 0) p3 = (1, 0, 1) - t = Tetrahedron { cube = empty_cube, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } vol = volume t --- Now, p0, p1, and p2 are in counter-clockwise order. The volume --- should therefore be positive. +-- | Check the volume of a particular tetrahedron against the value +-- computed by hand. Its vertices are in counter-clockwise order, so +-- the volume should be positive. test_volume2 :: Test test_volume2 = TestCase $ assertEqual "volume is correct" True (vol ~= (1/3)) @@ -56,13 +53,16 @@ test_volume2 = p1 = (2, 0, 0) p2 = (0, 0.5, 0) p3 = (1, 0, 1) - t = Tetrahedron { cube = empty_cube, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } vol = volume t + +-- | Ensure that a tetrahedron contains a particular point chosen to +-- be inside of it. test_contains_point1 :: Test test_contains_point1 = TestCase $ assertEqual "contains an inner point" True (contains_point t inner_point) @@ -72,13 +72,15 @@ test_contains_point1 = p2 = (2, 0, 0) p3 = (1, 0, 1) inner_point = (1, 0, 0.5) - t = Tetrahedron { cube = empty_cube, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } +-- | Ensure that a tetrahedron does not contain a particular point chosen to +-- be outside of it (first test). test_doesnt_contain_point1 :: Test test_doesnt_contain_point1 = TestCase $ assertEqual "doesn't contain an exterior point" False (contains_point t exterior_point) @@ -88,14 +90,15 @@ test_doesnt_contain_point1 = p2 = (2, 0, 0) p3 = (1, 0, 1) exterior_point = (5, 2, -9.0212) - c_empty = empty_cube - t = Tetrahedron { cube = c_empty, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } +-- | Ensure that a tetrahedron does not contain a particular point chosen to +-- be outside of it (second test). test_doesnt_contain_point2 :: Test test_doesnt_contain_point2 = TestCase $ assertEqual "doesn't contain an exterior point" False (contains_point t exterior_point) @@ -105,13 +108,15 @@ test_doesnt_contain_point2 = p2 = (0.5, 0.5, 1) p3 = (0.5, 0.5, 0.5) exterior_point = (0, 0, 0) - c_empty = empty_cube - t = Tetrahedron { cube = c_empty, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } + +-- | Ensure that a tetrahedron does not contain a particular point chosen to +-- be outside of it (third test). test_doesnt_contain_point3 :: Test test_doesnt_contain_point3 = TestCase $ assertEqual "doesn't contain an exterior point" False (contains_point t exterior_point) @@ -121,13 +126,15 @@ test_doesnt_contain_point3 = p2 = (0.5, 0.5, 1) p3 = (0.5, 0.5, 0.5) exterior_point = (0, 0, 0) - c_empty = empty_cube - t = Tetrahedron { cube = c_empty, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } + +-- | Ensure that a tetrahedron does not contain a particular point chosen to +-- be outside of it (fourth test). test_doesnt_contain_point4 :: Test test_doesnt_contain_point4 = TestCase $ assertEqual "doesn't contain an exterior point" False (contains_point t exterior_point) @@ -137,13 +144,15 @@ test_doesnt_contain_point4 = p2 = (0.5, 0.5, 1) p3 = (0.5, 0.5, 0.5) exterior_point = (0, 0, 0) - c_empty = empty_cube - t = Tetrahedron { cube = c_empty, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } + +-- | Ensure that a tetrahedron does not contain a particular point chosen to +-- be outside of it (fifth test). test_doesnt_contain_point5 :: Test test_doesnt_contain_point5 = TestCase $ assertEqual "doesn't contain an exterior point" False (contains_point t exterior_point) @@ -153,13 +162,13 @@ test_doesnt_contain_point5 = p2 = (0.5, 0.5, 1) p3 = (0.5, 0.5, 0.5) exterior_point = (0, 0, 0) - c_empty = empty_cube - t = Tetrahedron { cube = c_empty, - v0 = p0, + t = Tetrahedron { v0 = p0, v1 = p1, v2 = p2, - v3 = p3 } + v3 = p3, + fv = empty_values } +-- | A list of all HUnit tests defined in this module. tetrahedron_tests :: [Test] tetrahedron_tests = [test_volume1, test_volume2, @@ -170,72 +179,105 @@ tetrahedron_tests = [test_volume1, test_doesnt_contain_point4, test_doesnt_contain_point5 ] + +-- | The barycentric coordinate of v0 with respect to itself should +-- be one. prop_b0_v0_always_unity :: Tetrahedron -> Property prop_b0_v0_always_unity t = (volume t) > 0 ==> (b0 t) (v0 t) ~= 1.0 +-- | The barycentric coordinate of v1 with respect to v0 should +-- be zero. prop_b0_v1_always_zero :: Tetrahedron -> Property prop_b0_v1_always_zero t = (volume t) > 0 ==> (b0 t) (v1 t) ~= 0 +-- | The barycentric coordinate of v2 with respect to v0 should +-- be zero. prop_b0_v2_always_zero :: Tetrahedron -> Property prop_b0_v2_always_zero t = (volume t) > 0 ==> (b0 t) (v2 t) ~= 0 +-- | The barycentric coordinate of v3 with respect to v0 should +-- be zero. prop_b0_v3_always_zero :: Tetrahedron -> Property prop_b0_v3_always_zero t = (volume t) > 0 ==> (b0 t) (v3 t) ~= 0 +-- | The barycentric coordinate of v1 with respect to itself should +-- be one. prop_b1_v1_always_unity :: Tetrahedron -> Property prop_b1_v1_always_unity t = (volume t) > 0 ==> (b1 t) (v1 t) ~= 1.0 +-- | The barycentric coordinate of v0 with respect to v1 should +-- be zero. prop_b1_v0_always_zero :: Tetrahedron -> Property prop_b1_v0_always_zero t = (volume t) > 0 ==> (b1 t) (v0 t) ~= 0 +-- | The barycentric coordinate of v2 with respect to v1 should +-- be zero. prop_b1_v2_always_zero :: Tetrahedron -> Property prop_b1_v2_always_zero t = (volume t) > 0 ==> (b1 t) (v2 t) ~= 0 +-- | The barycentric coordinate of v3 with respect to v1 should +-- be zero. prop_b1_v3_always_zero :: Tetrahedron -> Property prop_b1_v3_always_zero t = (volume t) > 0 ==> (b1 t) (v3 t) ~= 0 +-- | The barycentric coordinate of v2 with respect to itself should +-- be one. prop_b2_v2_always_unity :: Tetrahedron -> Property prop_b2_v2_always_unity t = (volume t) > 0 ==> (b2 t) (v2 t) ~= 1.0 +-- | The barycentric coordinate of v0 with respect to v2 should +-- be zero. prop_b2_v0_always_zero :: Tetrahedron -> Property prop_b2_v0_always_zero t = (volume t) > 0 ==> (b2 t) (v0 t) ~= 0 +-- | The barycentric coordinate of v1 with respect to v2 should +-- be zero. prop_b2_v1_always_zero :: Tetrahedron -> Property prop_b2_v1_always_zero t = (volume t) > 0 ==> (b2 t) (v1 t) ~= 0 +-- | The barycentric coordinate of v3 with respect to v2 should +-- be zero. prop_b2_v3_always_zero :: Tetrahedron -> Property prop_b2_v3_always_zero t = (volume t) > 0 ==> (b2 t) (v3 t) ~= 0 +-- | The barycentric coordinate of v3 with respect to itself should +-- be one. prop_b3_v3_always_unity :: Tetrahedron -> Property prop_b3_v3_always_unity t = (volume t) > 0 ==> (b3 t) (v3 t) ~= 1.0 +-- | The barycentric coordinate of v0 with respect to v3 should +-- be zero. prop_b3_v0_always_zero :: Tetrahedron -> Property prop_b3_v0_always_zero t = (volume t) > 0 ==> (b3 t) (v0 t) ~= 0 +-- | The barycentric coordinate of v1 with respect to v3 should +-- be zero. prop_b3_v1_always_zero :: Tetrahedron -> Property prop_b3_v1_always_zero t = (volume t) > 0 ==> (b3 t) (v1 t) ~= 0 +-- | The barycentric coordinate of v2 with respect to v3 should +-- be zero. prop_b3_v2_always_zero :: Tetrahedron -> Property prop_b3_v2_always_zero t = (volume t) > 0 ==> (b3 t) (v2 t) ~= 0 --- Used for convenience in the next few tests. +-- | Used for convenience in the next few tests; not a test itself. p :: Tetrahedron -> Int -> Int -> Int -> Int -> Double p t i j k l = (polynomial t) (xi t i j k l)