X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FTests%2FCube.hs;h=3cfefd4abe832747d430f9b70d57c75c7602b5c4;hb=935d8dfb409d7317e833cd5f1e3f80312b9c3fb4;hp=eee54449beaba02a3881f5fe06be2b633abd2cdb;hpb=89b8b6e94fcc944a1f4611811265f3c6217af850;p=spline3.git diff --git a/src/Tests/Cube.hs b/src/Tests/Cube.hs index eee5444..3cfefd4 100644 --- a/src/Tests/Cube.hs +++ b/src/Tests/Cube.hs @@ -4,17 +4,64 @@ where import Test.QuickCheck import Cube -import Grid (Grid) -import Tests.Grid () +import FunctionValues (FunctionValues(FunctionValues)) +import Tests.FunctionValues +import Tetrahedron (v0, volume) instance Arbitrary Cube where arbitrary = do - g' <- arbitrary :: Gen Grid + (Positive h') <- arbitrary :: Gen (Positive Double) i' <- choose (coordmin, coordmax) j' <- choose (coordmin, coordmax) k' <- choose (coordmin, coordmax) - d' <- arbitrary :: Gen Double - return (Cube g' i' j' k' d') + fv' <- arbitrary :: Gen FunctionValues + return (Cube h' i' j' k' fv') where coordmin = -268435456 -- -(2^29 / 2) coordmax = 268435456 -- +(2^29 / 2) + + +-- Quickcheck tests. + +-- | Since the grid size is necessarily positive, all tetrahedrons +-- (which comprise cubes of positive volume) must have positive volume +-- as well. +prop_all_volumes_positive :: Cube -> Property +prop_all_volumes_positive c = + (delta > 0) ==> (null nonpositive_volumes) + where + delta = h c + ts = tetrahedrons c + volumes = map volume ts + nonpositive_volumes = filter (<= 0) volumes + +-- | All tetrahedron should have their v0 located at the center of the cube. +prop_v0_all_equal :: Cube -> Bool +prop_v0_all_equal c = (v0 t0) == (v0 t1) + where + t0 = head (tetrahedrons c) -- Doesn't matter which two we choose. + t1 = head $ tail (tetrahedrons c) + + +-- | This pretty much repeats the prop_all_volumes_positive property, +-- but will let me know which face's vertices are disoriented. +prop_front_face_volumes_positive :: Cube -> Property +prop_front_face_volumes_positive c = + (delta > 0) ==> (null nonpositive_volumes) + where + delta = h c + ts = [tetrahedron0 c, tetrahedron1 c, tetrahedron2 c, tetrahedron3 c] + volumes = map volume ts + nonpositive_volumes = filter (<= 0) volumes + + +-- | This pretty much repeats the prop_all_volumes_positive property, +-- but will let me know which face's vertices are disoriented. +prop_top_face_volumes_positive :: Cube -> Property +prop_top_face_volumes_positive c = + (delta > 0) ==> (null nonpositive_volumes) + where + delta = h c + ts = [tetrahedron4 c, tetrahedron5 c, tetrahedron6 c, tetrahedron7 c] + volumes = map volume ts + nonpositive_volumes = filter (<= 0) volumes