{-|
Some QuickCheck utility functions.
-}
module B9.QCUtil where

#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
import Control.Monad
import Test.QuickCheck

arbitraryEnv
    :: Arbitrary a
    => Gen [(String, a)]
arbitraryEnv = listOf ((,) <$> listOf1 (choose ('a', 'z')) <*> arbitrary)

halfSize :: Gen a -> Gen a
halfSize g = sized (flip resize g . flip div 2)

smaller :: Gen a -> Gen a
smaller g = sized (flip resize g . max 0 . flip (-) 1)

arbitraryFilePath :: Gen FilePath
arbitraryFilePath = do
    path <-
        join <$>
        listOf
            (elements
                 [ "/"
                 , "../"
                 , "./"
                 , "etc/"
                 , "opt/"
                 , "user/"
                 , "var/"
                 , "tmp/"
                 , "doc/"
                 , "share/"
                 , "conf.d/"])
    prefix <- elements ["foo_", "", "alt_", "ssh-", ""]
    body <- elements ["www", "passwd", "cert", "opnsfe", "runtime"]
    extension <- elements [".txt", ".png", ".ps", ".erl", ""]
    return (path ++ prefix ++ body ++ extension)

arbitraryLetter :: Gen Char
arbitraryLetter = oneof [arbitraryLetterUpper, arbitraryLetterLower]

arbitraryLetterUpper :: Gen Char
arbitraryLetterUpper = elements ['A' .. 'Z']

arbitraryLetterLower :: Gen Char
arbitraryLetterLower = elements ['a' .. 'z']

arbitraryDigit :: Gen Char
arbitraryDigit = elements ['0' .. '9']