{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
module AxiomsSpec
  ( spec
  ) where

import           Data.Time                      ( Day
                                                , UTCTime
                                                )
import           IntervalAlgebra.Axioms         ( IntervalAxioms(..) )
import           Test.Hspec                     ( Spec
                                                , describe
                                                , hspec
                                                , it
                                                )
import           Test.Hspec.QuickCheck          ( modifyMaxSuccess )
import           Test.QuickCheck                ( Arbitrary(arbitrary)
                                                , Gen(..)
                                                , Property
                                                , Testable(property)
                                                , generate
                                                , quickCheck
                                                )


testScale :: Int
testScale = 1000

spec :: Spec
spec = do

  describe "An Axiomatization of Interval Time"
    $ modifyMaxSuccess (* testScale)
    $ do
        it "M1" $ property (prop_IAaxiomM1 @Int)
        it "M1" $ property (prop_IAaxiomM1 @Day)
        it "M1" $ property (prop_IAaxiomM1 @UTCTime)

        it "M2" $ property (prop_IAaxiomM2 @Int)
        it "M2" $ property (prop_IAaxiomM2 @Day)
        it "M2" $ property (prop_IAaxiomM2 @UTCTime)

        it "ML1" $ property (prop_IAaxiomML1 @Int)
        it "ML1" $ property (prop_IAaxiomML1 @Day)
        it "ML1" $ property (prop_IAaxiomML1 @UTCTime)

        it "ML2" $ property (prop_IAaxiomML2 @Int)
        it "ML2" $ property (prop_IAaxiomML2 @Day)
        it "ML2" $ property (prop_IAaxiomML2 @UTCTime)

        it "M3" $ property (prop_IAaxiomM3 @Int)
        it "M3" $ property (prop_IAaxiomM3 @Day)
        it "M3" $ property (prop_IAaxiomM3 @UTCTime)

        it "M4" $ property (prop_IAaxiomM4 @Int)
        it "M4" $ property (prop_IAaxiomM4 @Day)
        it "M4" $ property (prop_IAaxiomM4 @UTCTime)

        it "M5" $ property (prop_IAaxiomM5 @Int)
        it "M5" $ property (prop_IAaxiomM5 @Day)
        it "M5" $ property (prop_IAaxiomM5 @UTCTime)

        it "M4.1" $ property (prop_IAaxiomM4_1 @Int)
        it "M4.1" $ property (prop_IAaxiomM4_1 @Day)
        it "M4.1" $ property (prop_IAaxiomM4_1 @UTCTime)

