Skip to content

test-framework-th does not work with GeneralizedNewtypeDeriving or TypeSynonymInstances #11

@adamgordonbell

Description

@adamgordonbell

$(defaultMainGenerator) is not seeing the arbitary instance of Results.

Yet $quickCheckAll, from quickchek, works for these, so must be possible

Example TypeSynonymInstances Code:

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE OverlappingInstances #-}
module Main where

import ClassyPrelude
import qualified Data.Map as Map
import Test.HUnit
import Data.Number.Fixed
import Test.QuickCheck hiding (Result)
import Test.QuickCheck.All
import Test.Framework.TH
import Test.Framework
import Test.Framework.Providers.QuickCheck2

type Result = (Int,Int)

instance Arbitrary Result where
    arbitrary = elements resultElements

resultMax = 3

resultElements :: [Result]
resultElements = [(h,a)| h <- [0..resultMax], a <- [0..resultMax]]

type Results = Map Result Rational

instance Monoid Results where
    mempty = empty
    mappend = Map.unionWith (+)

instance Arbitrary Results where
    arbitrary = do
      rs <-listOf $ elements resultElements
      ws <-listOf $ elements [1, 1.5 .. 2]
      return $ Map.fromListWith (+) $ zip rs ws

main = do
    runTests1
    runTests2
    return ()


prop_resultsAdd :: Results -> Results -> Bool
prop_resultsAdd rs1 rs2 = mappend rs1 rs2 == mappend rs2 rs1

runTests1 = $quickCheckAll
runTests2 = $(defaultMainGenerator)


Error: No instance for (Arbitrary (Map Result Rational))

Example GeneralizedNewtypeDeriving Code:

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Main2 where

import ClassyPrelude
import qualified Data.Map as Map
import Test.HUnit
import Data.Number.Fixed
import Test.QuickCheck hiding (Result)
import Test.QuickCheck.All
import Test.Framework.TH
import Test.Framework
import Test.Framework.Providers.QuickCheck2

newtype Result = Result (Int,Int) deriving (Show,Eq,Ord)


instance Arbitrary Result where
    arbitrary = elements resultElements

resultMax = 3

resultElements :: [Result]
resultElements = [Result (h,a)| h <- [0..resultMax], a <- [0..resultMax]]

newtype Results = Results (Map Result Rational) deriving (Eq,Ord, Show)

instance Monoid Results where
    mempty = Results empty
    mappend (Results r1)(Results r2) = Results $ Map.unionWith (+) r1 r2

instance Arbitrary Results where
    arbitrary = do
      rs <-listOf $ elements resultElements
      ws <-listOf $ elements [1, 1.5 .. 2]
      return . Results . Map.fromListWith (+) $ zip rs ws

main = do
    runTests1
    runTests2
    return ()

runTests1 = $quickCheckAll
runTests2 = $(defaultMainGenerator)

prop_resultsAdd :: Results -> Results -> Bool
prop_resultsAdd rs1 rs2 = mappend rs1 rs2 == mappend rs2 rs1

Error: No instance for (Arbitrary Results)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions