-
Notifications
You must be signed in to change notification settings - Fork 12
Open
Description
$(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
Labels
No labels