module Tests.FunctionValues where import Test.HUnit import Test.QuickCheck import Assertions import Examples import FunctionValues -- | We perform addition with the function values contained in a -- FunctionValues object. If we choose random doubles near the machine -- min/max, we risk overflowing or underflowing the 'Double'. This -- places a reasonably safe limit on the maximum size of our generated -- 'Double' members. max_double :: Double max_double = 10000.0 -- | See 'max_double'. min_double :: Double min_double = (-1) * max_double instance Arbitrary FunctionValues where arbitrary = do front' <- choose (min_double, max_double) back' <- choose (min_double, max_double) left' <- choose (min_double, max_double) right' <- choose (min_double, max_double) top' <- choose (min_double, max_double) down' <- choose (min_double, max_double) front_left' <- choose (min_double, max_double) front_right' <- choose (min_double, max_double) front_top' <- choose (min_double, max_double) front_down' <- choose (min_double, max_double) back_left' <- choose (min_double, max_double) back_right' <- choose (min_double, max_double) back_top' <- choose (min_double, max_double) back_down' <- choose (min_double, max_double) left_top' <- choose (min_double, max_double) left_down' <- choose (min_double, max_double) right_top' <- choose (min_double, max_double) right_down' <- choose (min_double, max_double) front_left_top' <- choose (min_double, max_double) front_left_down' <- choose (min_double, max_double) front_right_top' <- choose (min_double, max_double) front_right_down' <- choose (min_double, max_double) back_left_top' <- choose (min_double, max_double) back_left_down' <- choose (min_double, max_double) back_right_top' <- choose (min_double, max_double) back_right_down' <- choose (min_double, max_double) interior' <- choose (min_double, max_double) return empty_values { front = front', back = back', left = left', right = right', top = top', down = down', front_left = front_left', front_right = front_right', front_top = front_top', front_down = front_down', back_left = back_left', back_right = back_right', back_top = back_top', back_down = back_down', left_top = left_top', left_down = left_down', right_top = right_top', right_down = right_down', front_left_top = front_left_top', front_left_down = front_left_down', front_right_top = front_right_top', front_right_down = front_right_down', back_left_top = back_left_top', back_left_down = back_left_down', back_right_top = back_right_top', back_right_down = back_right_down', interior = interior' } test_directions :: Assertion test_directions = assertTrue "all direction functions work" (and equalities) where fvs = make_values trilinear 1 1 1 equalities = [ interior fvs == 4, front fvs == 1, back fvs == 7, left fvs == 2, right fvs == 6, down fvs == 3, top fvs == 5, front_left fvs == 1, front_right fvs == 1, front_down fvs == 1, front_top fvs == 1, back_left fvs == 3, back_right fvs == 11, back_down fvs == 5, back_top fvs == 9, left_down fvs == 2, left_top fvs == 2, right_down fvs == 4, right_top fvs == 8, front_left_down fvs == 1, front_left_top fvs == 1, front_right_down fvs == 1, front_right_top fvs == 1, back_left_down fvs == 3, back_left_top fvs == 3, back_right_down fvs == 7, back_right_top fvs == 15]