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

import Control.Applicative
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 . 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']