Skip to content

Instantly share code, notes, and snippets.

@k-bx
Created September 24, 2013 09:57
Show Gist options
  • Select an option

  • Save k-bx/6682668 to your computer and use it in GitHub Desktop.

Select an option

Save k-bx/6682668 to your computer and use it in GitHub Desktop.
Factories using QuickCheck
{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
{-# OPTIONS_GHC -F -pgmFderive -optF-F #-}
import Control.Applicative
import Test.QuickCheck
import Test.QuickCheck (Positive(..))
import Test.QuickCheck.Gen (unGen)
import Data.Text (Text)
import Data.String (fromString, IsString)
import System.Random (getStdGen, StdGen)
import qualified Data.Text as T
data User = User { username :: Text
, age :: Int
, gender :: Maybe Gender
, email :: String }
deriving (Eq, Show)
data Gender = Male | Female
deriving (Eq, Show)
main :: IO ()
main = do
g <- getStdGen
-- let user = unGen userGen g 10
let user = buildUser g
putStrLn $ "User is: " ++ (show user)
buildUser :: StdGen -> User
buildUser g = unGen userGen g 20
userGen :: Gen User
userGen = do
u <- arbitrary :: Gen User
uid <- arbitrary :: Gen (Positive Int)
age <- arbitrary :: Gen (Positive Int)
return $ u { username = "user_" `T.append` (strPositive uid)
, email = buildEmail $ getPositive uid
, age = getPositive age }
buildEmail :: Int -> String
buildEmail uid = "email_" ++ (show uid) ++ "@example.com"
-- utilities
positiveIntGen :: Gen (Positive Int)
positiveIntGen = arbitrary
strPositive :: (Integral i, IsString s, Show i) => Positive i -> s
strPositive i = fromString . show $ getPositive i
instance Arbitrary Text where
arbitrary = fromString <$> (arbitrary :: Gen String)
{-!
deriving instance Arbitrary User
deriving instance Arbitrary Gender
!-}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment