module Tests.Grid where import Data.Maybe (fromJust) import Test.HUnit import Test.QuickCheck import Assertions import Comparisons import Cube import Examples import FunctionValues (value_at) import Grid import Tetrahedron instance Arbitrary Grid where arbitrary = do (Positive h') <- arbitrary :: Gen (Positive Double) fvs <- arbitrary :: Gen [[[Double]]] return (make_grid h' fvs) -- | Check the value of c0030 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0030 :: Test test_trilinear_c0030 = TestCase $ assertAlmostEqual "c0030 is correct" (c t 0 0 3 0) (17/8) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0003 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0003 :: Test test_trilinear_c0003 = TestCase $ assertAlmostEqual "c0003 is correct" (c t 0 0 0 3) (27/8) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0021 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0021 :: Test test_trilinear_c0021 = TestCase $ assertAlmostEqual "c0021 is correct" (c t 0 0 2 1) (61/24) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0012 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0012 :: Test test_trilinear_c0012 = TestCase $ assertAlmostEqual "c0012 is correct" (c t 0 0 1 2) (71/24) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0120 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0120 :: Test test_trilinear_c0120 = TestCase $ assertAlmostEqual "c0120 is correct" (c t 0 1 2 0) (55/24) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0102 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0102 :: Test test_trilinear_c0102 = TestCase $ assertAlmostEqual "c0102 is correct" (c t 0 1 0 2) (73/24) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0111 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0111 :: Test test_trilinear_c0111 = TestCase $ assertAlmostEqual "c0111 is correct" (c t 0 1 1 1) (8/3) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0210 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0210 :: Test test_trilinear_c0210 = TestCase $ assertAlmostEqual "c0210 is correct" (c t 0 2 1 0) (29/12) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0201 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0201 :: Test test_trilinear_c0201 = TestCase $ assertAlmostEqual "c0201 is correct" (c t 0 2 0 1) (11/4) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c0300 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c0300 :: Test test_trilinear_c0300 = TestCase $ assertAlmostEqual "c0300 is correct" (c t 0 3 0 0) (5/2) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1020 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1020 :: Test test_trilinear_c1020 = TestCase $ assertAlmostEqual "c1020 is correct" (c t 1 0 2 0) (8/3) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1002 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1002 :: Test test_trilinear_c1002 = TestCase $ assertAlmostEqual "c1002 is correct" (c t 1 0 0 2) (23/6) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1011 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1011 :: Test test_trilinear_c1011 = TestCase $ assertAlmostEqual "c1011 is correct" (c t 1 0 1 1) (13/4) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1110 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1110 :: Test test_trilinear_c1110 = TestCase $ assertAlmostEqual "c1110 is correct" (c t 1 1 1 0) (23/8) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1101 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1101 :: Test test_trilinear_c1101 = TestCase $ assertAlmostEqual "c1101 is correct" (c t 1 1 0 1) (27/8) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c1200 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c1200 :: Test test_trilinear_c1200 = TestCase $ assertAlmostEqual "c1200 is correct" (c t 1 2 0 0) 3 where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c2010 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c2010 :: Test test_trilinear_c2010 = TestCase $ assertAlmostEqual "c2010 is correct" (c t 2 0 1 0) (10/3) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c2001 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c2001 :: Test test_trilinear_c2001 = TestCase $ assertAlmostEqual "c2001 is correct" (c t 2 0 0 1) 4 where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c2100 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c2100 :: Test test_trilinear_c2100 = TestCase $ assertAlmostEqual "c2100 is correct" (c t 2 1 0 0) (7/2) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Check the value of c3000 for tetrahedron0 belonging to the -- cube centered on (1,1,1) with a grid constructed from the -- trilinear values. See example one in the paper. test_trilinear_c3000 :: Test test_trilinear_c3000 = TestCase $ assertAlmostEqual "c3000 is correct" (c t 3 0 0 0) 4 where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Make sure that v0 of tetrahedron0 belonging to the cube centered -- on (1,1,1) with a grid constructed from the trilinear values -- winds up in the right place. See example one in the paper. test_trilinear_f0_t0_v0 :: Test test_trilinear_f0_t0_v0 = TestCase $ assertEqual "v0 is correct" (v0 t) (1, 1, 1) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Make sure that v1 of tetrahedron0 belonging to the cube centered -- on (1,1,1) with a grid constructed from the trilinear values -- winds up in the right place. See example one in the paper. test_trilinear_f0_t0_v1 :: Test test_trilinear_f0_t0_v1 = TestCase $ assertEqual "v1 is correct" (v1 t) (0.5, 1, 1) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Make sure that v2 of tetrahedron0 belonging to the cube centered -- on (1,1,1) with a grid constructed from the trilinear values -- winds up in the right place. See example one in the paper. test_trilinear_f0_t0_v2 :: Test test_trilinear_f0_t0_v2 = TestCase $ assertEqual "v2 is correct" (v2 t) (0.5, 0.5, 1.5) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube -- | Make sure that v3 of tetrahedron0 belonging to the cube centered -- on (1,1,1) with a grid constructed from the trilinear values -- winds up in the right place. See example one in the paper. test_trilinear_f0_t0_v3 :: Test test_trilinear_f0_t0_v3 = TestCase $ assertClose "v3 is correct" (v3 t) (0.5, 1.5, 1.5) where g = make_grid 1 trilinear cube = fromJust $ cube_at g 1 1 1 t = tetrahedron0 cube test_trilinear_reproduced :: Test test_trilinear_reproduced = TestCase $ assertTrue "trilinears are reproduced correctly" $ and [p (i', j', k') ~= value_at trilinear i j k | i <- [0..2], j <- [0..2], k <- [0..2], let i' = fromIntegral i, let j' = fromIntegral j, let k' = fromIntegral k] where g = make_grid 1 trilinear c0 = fromJust $ cube_at g 1 1 1 t0 = tetrahedron0 c0 p = polynomial t0 test_zeros_reproduced :: Test test_zeros_reproduced = TestCase $ assertTrue "the zero function is reproduced correctly" $ and [p (i', j', k') ~= value_at zeros i j k | i <- [0..2], j <- [0..2], k <- [0..2], let i' = fromIntegral i, let j' = fromIntegral j, let k' = fromIntegral k] where g = make_grid 1 zeros c0 = fromJust $ cube_at g 1 1 1 t0 = tetrahedron0 c0 p = polynomial t0 -- | A list of all HUnit tests defined in this module. grid_tests :: [Test] grid_tests = [test_trilinear_c0030, test_trilinear_c0003, test_trilinear_c0021, test_trilinear_c0012, test_trilinear_c0120, test_trilinear_c0102, test_trilinear_c0111, test_trilinear_c0210, test_trilinear_c0201, test_trilinear_c0300, test_trilinear_c1020, test_trilinear_c1002, test_trilinear_c1011, test_trilinear_c1110, test_trilinear_c1101, test_trilinear_c1200, test_trilinear_c2010, test_trilinear_c2001, test_trilinear_c2100, test_trilinear_c3000, test_trilinear_f0_t0_v0, test_trilinear_f0_t0_v1, test_trilinear_f0_t0_v2, test_trilinear_f0_t0_v3, test_trilinear_reproduced, test_zeros_reproduced]