packages feed

smallcheck-laws-0.1: tests/tasty.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main where

#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<$>))
#endif
import Data.Monoid (Sum(..), Product(..))
import Data.Proxy (Proxy(..))

import Test.SmallCheck.Series (Serial(series))
import Test.Tasty (TestTree, defaultMain, testGroup)

import Test.Tasty.SmallCheck.Laws.Applicative
import Test.Tasty.SmallCheck.Laws.Functor
import Test.Tasty.SmallCheck.Laws.Monad
import Test.Tasty.SmallCheck.Laws.Monoid

main :: IO ()
main = defaultMain $ testGroup "Laws"
     [ monoidTests
     , functorTests
     , applicativeTests
     , monadTests
     ]

monoidTests :: TestTree
monoidTests = testGroup "Monoid"
  [ testGroup "Sum"
    [ testGroup "Int"
      [ testMonoid (Proxy :: Proxy (Sum Int)) ]
    , testGroup "Integer"
      [ testMonoid (Proxy :: Proxy (Sum Integer)) ]
    , testGroup "Float"
      [ testMonoid (Proxy :: Proxy (Sum Float)) ]
    ]
  , testGroup "Product"
     [ testGroup "Int"
      [ testMonoid (Proxy :: Proxy (Product Int)) ]
    , testGroup "Integer"
      [ testMonoid (Proxy :: Proxy (Product Integer)) ]
    , testGroup "Float"
      [ testMonoid (Proxy :: Proxy (Product Float)) ]
    ]
  ]

functorTests :: TestTree
functorTests = testGroup "Functor"
  [ testGroup "Maybe"
    [ testGroup "Int"
      [ testFunctor (Proxy :: Proxy (Maybe Int)) ]
    , testGroup "Char"
      [ testFunctor (Proxy :: Proxy (Maybe Char)) ]
    ]
  , testGroup "[]"
    [ testGroup "Bool"
      [ testFunctor (Proxy :: Proxy [Bool]) ]
    , testGroup "Int"
      [ testFunctor (Proxy :: Proxy [Int]) ]
    ]
  ]

applicativeTests :: TestTree
applicativeTests = testGroup "Applicative"
  [ testGroup "Maybe"
    [ testGroup "Int"
      [ testApplicative (Proxy :: Proxy (Maybe Int)) ]
    , testGroup "Float"
      [ testApplicative (Proxy :: Proxy (Maybe Float)) ]
    ]
  , testGroup "[]"
    [ testGroup "Bool"
      [ testApplicative (Proxy :: Proxy [Bool]) ]
    , testGroup "Char"
      [ testApplicative (Proxy :: Proxy [Char]) ]
    ]
  ]

monadTests :: TestTree
monadTests = testGroup "Monad"
  [ testGroup "Maybe"
    [ testGroup "()"
      [ testMonad (Proxy :: Proxy (Maybe ())) ]
    , testGroup "Int"
      [ testMonad (Proxy :: Proxy (Maybe Int)) ]
    ]
  , testGroup "[]"
    [ testGroup "()"
      [ testMonad (Proxy :: Proxy [()]) ]
    ]
  ]

instance (Monad m, Serial m a) => Serial m (Sum a) where
    series = Sum <$> series

instance (Monad m, Serial m a) => Serial m (Product a) where
    series = Product <$> series