packages feed

quickcheck-arbitrary-template-0.2.0.0: test/Test/QuickCheck/TH/GeneratorsSpec.hs

{-# LANGUAGE TemplateHaskell #-}

module Test.QuickCheck.TH.GeneratorsSpec (tests) where

import           Data.List

import           Test.QuickCheck.TH.Generators

import           Test.Tasty
import           Test.Tasty.QuickCheck (Arbitrary)
import qualified Test.Tasty.QuickCheck as QC



-- | These example types should build arbitrary instances correctly

data ExampleSumTypes = ExampleSum0
                     | ExampleSum1 Int
                     | ExampleSum2 Int Int
                     | ExampleSum3 Int Int Int
                     | ExampleSum4 Int Int Int Int
                     | ExampleSum5 Int Int Int Int Int
                     | ExampleSum6 Int Int Int Int Int Int
                     | ExampleSum7 Int Int Int Int Int Int Int
                     | ExampleSum8 Int Int Int Int Int Int Int Int
                     | ExampleSum9 Int Int Int Int Int Int Int Int Int
                     | ExampleSum10 Int Int Int Int Int Int Int Int Int Int

 deriving (Show,Ord,Eq)

data ExampleProductType = ExampleProductType {
  _field0 :: Int
, _field1 :: Int
, _field2 :: Int
, _field3 :: Int
, _field4 :: Int
, _field5 :: Int
, _field6 :: Int
, _field7 :: Int
, _field8 :: Int
, _field9 :: Int
, _field10 :: Int
, _field11 :: Int
, _field12 :: Int
, _field13 :: Int
, _field14 :: Int
, _field15 :: Int
, _field16 :: Int
, _field17 :: Int
, _field18 :: Int
, _field19 :: Int

} deriving (Show,Ord,Eq)

makeArbitrary ''ExampleSumTypes
makeArbitrary ''ExampleProductType

instance Arbitrary ExampleSumTypes where
  arbitrary = arbitraryExampleSumTypes

instance Arbitrary ExampleProductType where
  arbitrary = arbitraryExampleProductType

tests :: TestTree
tests = testGroup "Tests" [properties]

properties :: TestTree
properties = testGroup "Properties" [qcProps]

qcProps :: TestTree
qcProps = testGroup "(checked by QuickCheck)"
  [ QC.testProperty "ExampleSumTypes sort == sort . reverse" (
       \list -> sort (list :: [ExampleSumTypes]) == sort (reverse list)) ,
    QC.testProperty "ExampleProductTypes sort == sort . reverse" (
       \list -> sort (list :: [ExampleProductType]) == sort (reverse list)) ]