packages feed

astro-0.4.1.2: test/Data/Astro/UtilsTest.hs

module Data.Astro.UtilsTest
(
  tests
)

where

import Test.Framework (testGroup)
import Test.Framework.Providers.HUnit
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.HUnit
import Test.HUnit.Approx
import Test.QuickCheck

import Data.Fixed(Pico(..))

import Data.Astro.Utils

tests = [testGroup "fromFixed" [
            testProperty "property" prop_fromFixed
            , testCase "5.111123" $ assertApproxEqual "" 0.000000001 5.111123 $ fromFixed (toPico 5.111123)
            , testCase "-999.9999" $ assertApproxEqual "" 0.000000001 (-999.9999) $ fromFixed (toPico (-999.9999))
            ]
        , testGroup "fraction" [
            testProperty "property" prop_fraction
            , testCase "5.562" $ assertFraction 5.562
            , testCase "-7.93" $ assertFraction (-7.93)
            , testCase "-999.9999" $ assertFraction (-999.9999)
            ]
        , testGroup "trunc" [
            testProperty "property" prop_trunc
            , testCase "5.562" $ 5.0 @=? trunc 5.562
            , testCase "-7.93" $ (-7.0) @=? trunc (-7.93)
            ]
        , testGroup "reduceToZeroRange" [
            testCase "24 -465.986246" $ assertApproxEqual "" 0.000000001 14.013754 $ reduceToZeroRange 24 (-465.986246)
            , testProperty "property for r = 24" $ prop_reduceToZeroRange 24
            , testProperty "property for r = 1" $ prop_reduceToZeroRange 1
            ]
        , testGroup "Degrees <-> Radians" [
            testCase "0 -> 0 (rad)" $ assertApproxEqual "" 0.000000001 0 $ toRadians 0
            , testCase "45 -> PI/4" $ assertApproxEqual "" 0.000000001 (pi*0.25) $ toRadians 45
            , testCase "90 -> PI/2" $ assertApproxEqual "" 0.000000001 (pi*0.5) $ toRadians 90
            , testCase "180 -> PI" $ assertApproxEqual "" 0.000000001 pi $ toRadians 180
            , testCase "360 -> 2*PI" $ assertApproxEqual "" 0.000000001 (pi*2) $ toRadians 360
            , testCase "0 -> 0 (deg)" $ assertApproxEqual "" 0.000000001 0 $ fromRadians 0
            , testCase "pi/4 -> 45" $ assertApproxEqual "" 0.000000001 45 $ fromRadians (pi*0.25)
            , testCase "pi/2 -> 90" $ assertApproxEqual "" 0.000000001 90 $ fromRadians (pi*0.5)
            , testCase "pi -> 180" $ assertApproxEqual "" 0.000000001 180 $ fromRadians pi
            , testCase "2*pi -> 360" $ assertApproxEqual "" 0.000000001 360 $ fromRadians (pi*2)
            ]
        , testGroup "roundToN" [
            testCase "10.12341234 -> 10.12341" $ assertApproxEqual "" 0.000000001 10.12341 $ roundToN 5 10.12341234
            , testCase "-10.123456789 -> -10.123" $ assertApproxEqual "" 0.000000001 (-10.123) $ roundToN 3 (-10.123456789)
            , testCase "10.9876543 -> 10.987" $ assertApproxEqual "" 0.000000001 10.988 $ roundToN 3 10.9876543
            , testCase "-10.9876543 -> -10.987" $ assertApproxEqual "" 0.000000001 (-10.9877) $ roundToN 4 (-10.9876543)
            ]
        ]

toPico :: Real a => a -> Pico
toPico = realToFrac

fromFraction :: Real a => (Int, a) -> a
fromFraction (i, f) = f + fromIntegral i

assertFraction d = assertApproxEqual "" 0.0000001 d $ fromFraction $ fraction d

prop_fromFixed d =
  abs((fromFixed ((realToFrac d)::Pico))-d) < 0.0000001
  where types = (d::Double)

prop_fraction d =
  let (i, f) = fraction d
      f' = d - fromIntegral i
  in i == truncate d && abs(f'-f) < 0.0000001
  where types = (d::Double)

prop_trunc d =
  let d' = fromIntegral $ truncate d
  in abs(d' - trunc d) < 0.0000001
  where types = (d::Double)

prop_reduceToZeroRange r n =
  let k = reduceToZeroRange r n
  in k < r && k >= 0
     where types = (n::Double)