packages feed

quickcheck-arbitrary-template-0.2.1.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)) ]