packages feed

astro-0.4.1.2: test/Data/Astro/Time/GregorianCalendarTest.hs

module Data.Astro.Time.GregorianCalendarTest
(
  tests
)

where

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

import Data.Time.Calendar (fromGregorian, toGregorian)

import Data.Astro.Time.GregorianCalendar


tests = [testGroup "easter day" [
            testCase "2009" easterDay2009
            , testCase "2016" easterDay2016
            , testCase "2027" easterDay2027
            , testProperty "easter properties" prop_Easter
            ]
         , testGroup "leap year" [
             testCase "2016" (isLeapYear 2016 @?= True)
             , testCase "2000" (isLeapYear 2000 @?= True)
             , testCase "2015" (isLeapYear 2015 @?= False)
             , testCase "1900" (isLeapYear 1900 @?= False)
             , testCase "1800" (isLeapYear 1800 @?= False)
           ]
         , testGroup "day number" [
             testCase "1 Jan of leap year" (dayNumber (fromGregorian 2016 1 1) @?= 1)
             , testCase "11 Feb of leap year" (dayNumber (fromGregorian 2016 2 11) @?= 42)
             , testCase "10 Mar of leap year" (dayNumber (fromGregorian 2016 3 10) @?= 70)
             , testCase "15 Nov of leap year" (dayNumber (fromGregorian 2016 11 15) @?= 320)
             , testCase "31 Dec of leap year" (dayNumber (fromGregorian 2016 12 31) @?= 366)
             , testCase "1 Jan of non-leap year" (dayNumber (fromGregorian 2015 1 1) @?= 1)
             , testCase "11 Feb of non-leap year" (dayNumber (fromGregorian 2015 2 11) @?= 42)
             , testCase "10 Mar of non-leap year" (dayNumber (fromGregorian 2015 3 10) @?= 69)
             , testCase "15 Nov of non-leap year" (dayNumber (fromGregorian 2015 11 15) @?= 319)
             , testCase "31 Dec of non-leap year" (dayNumber (fromGregorian 2015 12 31) @?= 365)
             ]
         ]


easterDay2009 = easterDayInYear 2009 @?= fromGregorian 2009 4 12
easterDay2016 = easterDayInYear 2016 @?= fromGregorian 2016 3 27
easterDay2027 = easterDayInYear 2027 @?= fromGregorian 2027 3 28

prop_Easter =
  forAll (choose (1583, 999900)) $ checkEasterProperties

checkEasterProperties year = let date = easterDayInYear year
                                 (y, m, _) = toGregorian date
                             in fromIntegral y == year && (m == 3 || m == 4)