X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FTests%2FTetrahedron.hs;h=0d924527e17f8cc601cc9a045a7bf7134ed54b69;hb=9849853e69c46b46996e8c775d15661b2aba27a8;hp=9c28e590fe33182c83aaedfb8a66441e9c6a7aed;hpb=82a70b916a580e0e2af5c1ef8c790a49dc24381b;p=spline3.git diff --git a/src/Tests/Tetrahedron.hs b/src/Tests/Tetrahedron.hs index 9c28e59..0d92452 100644 --- a/src/Tests/Tetrahedron.hs +++ b/src/Tests/Tetrahedron.hs @@ -9,30 +9,45 @@ import Test.QuickCheck (Property, (==>)) import Cardinal import Comparisons import FunctionValues -import Tests.FunctionValues() import Tetrahedron import ThreeDimensional -- HUnit Tests --- | 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 :: Assertion -test_volume1 = - assertEqual "volume is correct" True (vol ~= (-1/3)) - where - p0 = (0, -0.5, 0) - p1 = (0, 0.5, 0) - p2 = (2, 0, 0) - p3 = (1, 0, 1) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - vol = volume t +-- | Check the volume of a particular tetrahedron (computed by hand) +-- and whether or not it contains a specific point chosen to be +-- outside of it. Its vertices are in clockwise order, so the volume +-- should be negative. +tetrahedron1_geometry_tests :: Test.Framework.Test +tetrahedron1_geometry_tests = + testGroup "tetrahedron1 geometry" + [ testCase "volume1" volume1, + testCase "doesn't contain point1" doesnt_contain_point1] + where + p0 = (0, -0.5, 0) + p1 = (0, 0.5, 0) + p2 = (2, 0, 0) + p3 = (1, 0, 1) + t = Tetrahedron { v0 = p0, + v1 = p1, + v2 = p2, + v3 = p3, + fv = empty_values, + precomputed_volume = 0 } + + volume1 :: Assertion + volume1 = + assertEqual "volume is correct" True (vol ~= (-1/3)) + where + vol = volume t + + doesnt_contain_point1 :: Assertion + doesnt_contain_point1 = + assertEqual "doesn't contain an exterior point" False contained + where + exterior_point = (5, 2, -9.0212) + contained = contains_point t exterior_point -- | Check the volume of a particular tetrahedron (computed by hand) @@ -53,7 +68,8 @@ tetrahedron2_geometry_tests = v1 = p1, v2 = p2, v3 = p3, - fv = empty_values } + fv = empty_values, + precomputed_volume = 0 } volume1 :: Assertion volume1 = assertEqual "volume1 is correct" True (vol ~= (1/3)) @@ -67,99 +83,78 @@ tetrahedron2_geometry_tests = contained = contains_point t inner_point --- | Ensure that a tetrahedron does not contain a particular point chosen to --- be outside of it (first test). -test_doesnt_contain_point1 :: Assertion -test_doesnt_contain_point1 = - assertEqual "doesn't contain an exterior point" False contained - where - p0 = (0, -0.5, 0) - p1 = (0, 0.5, 0) - p2 = (2, 0, 0) - p3 = (1, 0, 1) - exterior_point = (5, 2, -9.0212) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - contained = contains_point t exterior_point - - --- | Ensure that a tetrahedron does not contain a particular point chosen to --- be outside of it (second test). -test_doesnt_contain_point2 :: Assertion -test_doesnt_contain_point2 = - assertEqual "doesn't contain an exterior point" False contained - where - p0 = (0, 1, 1) - p1 = (1, 1, 1) - p2 = (0.5, 0.5, 1) - p3 = (0.5, 0.5, 0.5) - exterior_point = (0, 0, 0) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - contained = contains_point t exterior_point - - --- | Ensure that a tetrahedron does not contain a particular point chosen to --- be outside of it (third test). -test_doesnt_contain_point3 :: Assertion -test_doesnt_contain_point3 = - assertEqual "doesn't contain an exterior point" False contained - where - p0 = (1, 1, 1) - p1 = (1, 0, 1) - p2 = (0.5, 0.5, 1) - p3 = (0.5, 0.5, 0.5) - exterior_point = (0, 0, 0) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - contained = contains_point t exterior_point - - --- | Ensure that a tetrahedron does not contain a particular point chosen to --- be outside of it (fourth test). -test_doesnt_contain_point4 :: Assertion -test_doesnt_contain_point4 = - assertEqual "doesn't contain an exterior point" False contained - where - p0 = (1, 0, 1) - p1 = (0, 0, 1) - p2 = (0.5, 0.5, 1) - p3 = (0.5, 0.5, 0.5) - exterior_point = (0, 0, 0) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - contained = contains_point t exterior_point - - --- | Ensure that a tetrahedron does not contain a particular point chosen to --- be outside of it (fifth test). -test_doesnt_contain_point5 :: Assertion -test_doesnt_contain_point5 = - assertEqual "doesn't contain an exterior point" False contained - where - p0 = (0, 0, 1) - p1 = (0, 1, 1) - p2 = (0.5, 0.5, 1) - p3 = (0.5, 0.5, 0.5) - exterior_point = (0, 0, 0) - t = Tetrahedron { v0 = p0, - v1 = p1, - v2 = p2, - v3 = p3, - fv = empty_values } - contained = contains_point t exterior_point +-- | Ensure that tetrahedra do not contain a particular point chosen to +-- be outside of them. +containment_tests :: Test.Framework.Test +containment_tests = + testGroup "containment tests" + [ testCase "doesn't contain point2" doesnt_contain_point2, + testCase "doesn't contain point3" doesnt_contain_point3, + testCase "doesn't contain point4" doesnt_contain_point4, + testCase "doesn't contain point5" doesnt_contain_point5] + where + p2 = (0.5, 0.5, 1) + p3 = (0.5, 0.5, 0.5) + exterior_point = (0, 0, 0) + + doesnt_contain_point2 :: Assertion + doesnt_contain_point2 = + assertEqual "doesn't contain an exterior point" False contained + where + p0 = (0, 1, 1) + p1 = (1, 1, 1) + t = Tetrahedron { v0 = p0, + v1 = p1, + v2 = p2, + v3 = p3, + fv = empty_values, + precomputed_volume = 0 } + contained = contains_point t exterior_point + + + doesnt_contain_point3 :: Assertion + doesnt_contain_point3 = + assertEqual "doesn't contain an exterior point" False contained + where + p0 = (1, 1, 1) + p1 = (1, 0, 1) + t = Tetrahedron { v0 = p0, + v1 = p1, + v2 = p2, + v3 = p3, + fv = empty_values, + precomputed_volume = 0 } + contained = contains_point t exterior_point + + + doesnt_contain_point4 :: Assertion + doesnt_contain_point4 = + assertEqual "doesn't contain an exterior point" False contained + where + p0 = (1, 0, 1) + p1 = (0, 0, 1) + t = Tetrahedron { v0 = p0, + v1 = p1, + v2 = p2, + v3 = p3, + fv = empty_values, + precomputed_volume = 0 } + contained = contains_point t exterior_point + + + doesnt_contain_point5 :: Assertion + doesnt_contain_point5 = + assertEqual "doesn't contain an exterior point" False contained + where + p0 = (0, 0, 1) + p1 = (0, 1, 1) + t = Tetrahedron { v0 = p0, + v1 = p1, + v2 = p2, + v3 = p3, + fv = empty_values, + precomputed_volume = 0 } + contained = contains_point t exterior_point -- | The barycentric coordinate of v0 with respect to itself should @@ -291,62 +286,6 @@ prop_c1110_identity t = term3 = (3/4)*((p t 2 1 0 0) + (p t 1 2 0 0) + (p t 2 0 1 0)) term4 = (3/4)*((p t 1 0 2 0) + (p t 0 2 1 0) + (p t 0 1 2 0)) -prop_x_rotation_doesnt_affect_front :: Tetrahedron -> Bool -prop_x_rotation_doesnt_affect_front t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwx (Tetrahedron.fv t) - expr1 = front fv0 - expr2 = front fv1 - -prop_x_rotation_doesnt_affect_back :: Tetrahedron -> Bool -prop_x_rotation_doesnt_affect_back t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwx (Tetrahedron.fv t) - expr1 = back fv0 - expr2 = back fv1 - - -prop_y_rotation_doesnt_affect_left :: Tetrahedron -> Bool -prop_y_rotation_doesnt_affect_left t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwy (Tetrahedron.fv t) - expr1 = left fv0 - expr2 = left fv1 - -prop_y_rotation_doesnt_affect_right :: Tetrahedron -> Bool -prop_y_rotation_doesnt_affect_right t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwy (Tetrahedron.fv t) - expr1 = right fv0 - expr2 = right fv1 - - -prop_z_rotation_doesnt_affect_down :: Tetrahedron -> Bool -prop_z_rotation_doesnt_affect_down t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwz (Tetrahedron.fv t) - expr1 = down fv0 - expr2 = down fv1 - - -prop_z_rotation_doesnt_affect_top :: Tetrahedron -> Bool -prop_z_rotation_doesnt_affect_top t = - expr1 == expr2 - where - fv0 = Tetrahedron.fv t - fv1 = rotate cwz (Tetrahedron.fv t) - expr1 = top fv0 - expr2 = top fv1 prop_swapping_vertices_doesnt_affect_coefficients1 :: Tetrahedron -> Bool prop_swapping_vertices_doesnt_affect_coefficients1 t =