packages feed

astro-0.4.1.2: test/Data/Astro/CelestialObject/RiseSetTest.hs

module Data.Astro.CelestialObject.RiseSetTest
(
  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 Control.Monad (unless)

import Data.Astro.Types (DecimalDegrees(..), DecimalHours(..), fromDMS, fromHMS)
import Data.Astro.Coordinate (EquatorialCoordinates1(..))
import Data.Astro.Time.Sidereal (lstToDH, dhToLST)
import Data.Astro.CelestialObject.RiseSet
import Data.Astro.Star

tests = [testGroup "riseAndSet" [
             testRiseAndSet "a star, NH"
                 0.000001
                 (RiseSet (dhToLST 16.721731, DD 64.362370) (dhToLST 6.589380, DD 295.637630))
                 (riseAndSet (EC1 (fromDMS 21 42 0) (fromHMS 23 39 20)) verticalShift (DD 30))
             , testRiseAndSet "Polaris, NH"
                 0.000001
                 Circumpolar
                 (riseAndSet ecPolaris verticalShift (DD 30))
             , testRiseAndSet "Polaris, SH"
                 0.000001
                 NeverRises
                 (riseAndSet ecPolaris verticalShift (DD $ -30))
             , testRiseAndSet "Alpha Crucis, NH"
                 0.000001
                 NeverRises
                 (riseAndSet ecAlphaCrucis verticalShift (DD 30))
             , testRiseAndSet "Alpha Crucis, SH"
                 0.000001
                 Circumpolar
                 (riseAndSet ecAlphaCrucis verticalShift (DD $ -30))
             , testRiseAndSet "Sirius, NH"
                 0.000001
                 (RiseSet (dhToLST 2.507612, DD 120.857651) (dhToLST 10.997344, DD 239.142349))
                 (riseAndSet ecSirius verticalShift (DD 57))
             , testRiseAndSet "Sirius, SH"
                 0.000001
                 (RiseSet (dhToLST 23.390844, DD 116.158877) (dhToLST 14.114111, DD 243.841123))
                 (riseAndSet ecSirius verticalShift (DD $ -48))
             ]
        ]


ecPolaris = starCoordinates Polaris
ecAlphaCrucis = starCoordinates AlphaCrucis
ecSirius = starCoordinates Sirius

verticalShift = (fromDMS 0 34 0)

testRiseAndSet msg eps expected actual =
  testCase msg $ assertRiseAndSet eps expected actual

assertRiseAndSet eps expected@(RiseSet (etr, DD ear) (ets, DD eas)) actual@(RiseSet (atr, DD aar) (ats, DD aas)) =
  unless (eqLST eps etr atr && abs(ear-aar) <= eps
          && eqLST eps ets ats && abs(eas-aas) <= eps) (assertFailure msg)
  where msg = "expected: " ++ show expected ++ "\n but got: " ++ show actual ++
              "\n (maximum margin of error: " ++ show eps ++ ")"
assertRiseAndSet _ Circumpolar Circumpolar = assertString ""
assertRiseAndSet _ Circumpolar actual = assertString msg
  where msg = "expected: Circumpolar\n but got: " ++ show actual
assertRiseAndSet _ NeverRises NeverRises = assertString ""
assertRiseAndSet _ NeverRises actual = assertString msg
  where msg = "expected: NeverRises\n but got: " ++ show actual

eqLST eps lst1 lst2 =
  let DH dh1 = lstToDH lst1
      DH dh2 = lstToDH lst2
  in abs (dh1 - dh2) < eps