module Tests.Cube where import Test.QuickCheck import Cube import FunctionValues (FunctionValues(FunctionValues)) import Tests.FunctionValues import Tetrahedron (v0, 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. -- | 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