packages feed

sql-words-0.1.3.0: test/MonoidLaw.hs

{-# OPTIONS -fno-warn-orphans #-}

module MonoidLaw (tests) where

import Language.SQL.Keyword (Keyword, DString)

import Data.Monoid (Monoid, mempty, (<>))
import Data.String (fromString)
import Distribution.TestSuite.Compat (TestList, testList, prop)
import Test.QuickCheck (Arbitrary (..))


leftId :: (Eq a, Monoid a) => a -> Bool
leftId a = mempty <> a == a

rightId :: (Eq a, Monoid a) => a -> Bool
rightId a = a <> mempty == a

assoc :: (Eq a, Monoid a) => a -> a -> a -> Bool
assoc a b c = (a <> b) <> c == a <> (b <> c)

dsLeftId :: DString -> Bool
dsLeftId =  leftId

dsRightId :: DString -> Bool
dsRightId =  rightId

dsAssoc :: DString -> DString -> DString -> Bool
dsAssoc =  assoc

instance Arbitrary DString where
  arbitrary = fmap read arbitrary

kwLeftId :: Keyword -> Bool
kwLeftId =  leftId

kwRightId :: Keyword -> Bool
kwRightId =  rightId

kwAssoc :: Keyword -> Keyword -> Keyword -> Bool
kwAssoc =  assoc

instance Arbitrary Keyword where
  arbitrary = fmap fromString arbitrary

tests :: TestList
tests =  testList [ prop "DString left Id"  dsLeftId
                  , prop "DString right Id" dsRightId
                  , prop "DString associativity" dsAssoc
                  , prop "Keyword left Id"  kwLeftId
                  , prop "Keyword right Id" kwRightId
                  , prop "Keyword associativity" kwAssoc
                  ]