add newtypes for QuickCheck to avoid LANG=C issues
All properties changed to use them, except for prop_encode_c_decode_c_roundtrip, which already filtered to ascii for other reasons. A few modules had to be split out, because Setup does not build-depend on QuickCheck.
This commit is contained in:
parent
aad4129669
commit
885974be99
17 changed files with 211 additions and 130 deletions
|
@ -1,6 +1,6 @@
|
|||
{- QuickCheck with additional instances
|
||||
-
|
||||
- Copyright 2012-2014 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2012-2020 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- License: BSD-2-clause
|
||||
-}
|
||||
|
@ -10,16 +10,53 @@
|
|||
|
||||
module Utility.QuickCheck
|
||||
( module X
|
||||
, module Utility.QuickCheck
|
||||
, TestableString
|
||||
, fromTestableString
|
||||
, TestableFilePath
|
||||
, fromTestableFilePath
|
||||
, nonNegative
|
||||
, positive
|
||||
) where
|
||||
|
||||
import Test.QuickCheck as X
|
||||
import Data.Time.Clock.POSIX
|
||||
import Data.Ratio
|
||||
import Data.Char
|
||||
import System.Posix.Types
|
||||
import Data.List.NonEmpty (NonEmpty(..))
|
||||
import Prelude
|
||||
|
||||
{- A String, but Arbitrary is limited to ascii.
|
||||
-
|
||||
- When in a non-utf8 locale, String does not normally contain any non-ascii
|
||||
- characters, except for ones in surrogate plane. Converting a string that
|
||||
- does contain other unicode characters to a ByteString using the
|
||||
- filesystem encoding (see GHC.IO.Encoding) will throw an exception,
|
||||
- so use this instead to avoid quickcheck tests breaking unncessarily.
|
||||
-}
|
||||
newtype TestableString = TestableString
|
||||
{ fromTestableString :: String }
|
||||
deriving (Show)
|
||||
|
||||
instance Arbitrary TestableString where
|
||||
arbitrary = TestableString . filter isAscii <$> arbitrary
|
||||
|
||||
{- FilePath constrained to not be the empty string, not contain a NUL,
|
||||
- and contain only ascii.
|
||||
-
|
||||
- No real-world filename can be empty or contain a NUL. So code can
|
||||
- well be written that assumes that and using this avoids quickcheck
|
||||
- tests breaking unncessarily.
|
||||
-}
|
||||
newtype TestableFilePath = TestableFilePath
|
||||
{ fromTestableFilePath :: FilePath }
|
||||
deriving (Show)
|
||||
|
||||
instance Arbitrary TestableFilePath where
|
||||
arbitrary = (TestableFilePath . fromTestableString <$> arbitrary)
|
||||
`suchThat` (not . null . fromTestableFilePath)
|
||||
`suchThat` (not . any (== '\NUL') . fromTestableFilePath)
|
||||
|
||||
{- Times before the epoch are excluded. Half with decimal and half without. -}
|
||||
instance Arbitrary POSIXTime where
|
||||
arbitrary = do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue