packages feed

abides-0.0.0: test/Spec.hs

import qualified Test.Abides.Control.Alternative as Alt
import qualified Test.Abides.Control.Applicative as App
import qualified Test.Abides.Control.Category as Cat
import qualified Test.Abides.Control.Comonad as Com
import qualified Test.Abides.Control.Monad as Mon
import qualified Test.Abides.Data.Bounded as Bou
import qualified Test.Abides.Data.Enum as Enu
import qualified Test.Abides.Data.Eq as Eq
import qualified Test.Abides.Data.Foldable as Fol
import qualified Test.Abides.Data.Functor as Fun
import qualified Test.Abides.Data.Monoid as Mono
import qualified Test.Abides.Data.Ord as Ord
import qualified Test.Abides.Data.Semigroup as Sem

import Test.Tasty (defaultMain, testGroup)
import Test.Tasty.QuickCheck (testProperty)

import Data.Monoid (Sum (..))



main :: IO ()
main = defaultMain $ testGroup "All Tests"
  [ testGroup "Test.Abides.Control"
    [ testProperty "Alternative" alternativeTests
    , testProperty "Applicative" applicativeTests
    -- , testProperty "Category" categoryTests
    , testProperty "Comonad" comonadTests
    , testProperty "Monad" monadTests
    , testProperty "MonadPlus" monadPlusTests
    ]
  , testGroup "Test.Abides.Data"
    [ testProperty "Bounded" boundedTests
    , testProperty "Enum" enumTests
    , testProperty "Eq" eqTests
    , testProperty "Foldable" foldableTests
    , testProperty "Functor" functorTests
    , testProperty "Monoid" monoidTests
    , testProperty "Ord" ordTests
    , testProperty "Semigroup" semigroupTests
    ]
  ]
  where
    alternativeTests :: [Int] -> Bool
    alternativeTests x = and
      [ Alt.distributive [(+ 1)] [(* 2)] x
      , Alt.annihilation (map (+) x)
      ]
    applicativeTests :: [Int] -> Bool
    applicativeTests x = and
      [ App.identity x
      , App.composition [(+ 1)] [(* 2)] x
      ]
    -- categoryTests :: Kleisli [] Int Int -> Bool
    -- categoryTests x = and
    --   [ Cat.identity x
    --   , App.composition [(+ 1)] [(* 2)] x
    --   ]
    comonadTests :: (Int,Int) -> Bool
    comonadTests x = and
      [ Com.leftIdentity x
      , Com.rightIdentity (\(a,b) -> b + 1) x
      , Com.associative (\(a,b) -> b * 2) (\(a,b) -> b + 1) x
      ]
    monadTests :: [Int] -> Bool
    monadTests x = and
      [ Mon.leftIdentity (\a -> [a] ++ x) 5
      , Mon.rightIdentity x
      , Mon.associative (\a -> [a,1]) (\a -> [2,a]) x
      ]
    monadPlusTests :: Maybe Int -> Bool
    monadPlusTests x = and
      [ Mon.annihilation (\a -> Just (a + 1))
      , Mon.distributive (\a -> Just (a + 1)) x (Just 5)
      ]
    boundedTests :: Int -> Bool
    boundedTests x = Bou.bounded x
    enumTests :: Int -> Bool
    enumTests x = and
      [ Enu.compareHom x 1
      , Enu.predsucc x
      , Enu.succpred x
      ]
    eqTests :: (Int,Int) -> Bool
    eqTests (x,y) = and
      [ Eq.symmetry x y
      , Eq.transitive x y x
      , Eq.negation x y
      ]
    foldableTests :: [Sum Int] -> Bool
    foldableTests x = Fol.foldMap' (+ (Sum 5)) x
    functorTests :: [Int] -> Bool
    functorTests x = and
      [ Fun.identity x
      , Fun.composition (+ 5) (* 2) x
      ]
    monoidTests :: Sum Int -> Bool
    monoidTests x = and
      [ Mono.leftIdentity x
      , Mono.rightIdentity x
      ]
    ordTests :: (Int,Int) -> Bool
    ordTests (x,y) = and
      [ Ord.reflexive x
      , Ord.antisymmetry x y
      , Ord.transitive x y x
      ]
    semigroupTests :: (Sum Int, Sum Int, Sum Int) -> Bool
    semigroupTests (x,y,z) = Sem.associative x y z