{-# OPTIONS_GHC -fno-warn-orphans #-}
import Data.ByteString.Char8 ()
import qualified Data.ByteString as P
import qualified Data.ByteString.Internal as P
import qualified Data.ByteString.Short as Short
import Control.Applicative ((<$>))
import Control.Monad (unless)
import Data.Monoid (mappend, mconcat)
import Data.Maybe (catMaybes)
import Data.String (fromString)
import System.IO (stderr, hPutStrLn)
import Test.QuickCheck
(Testable, Property, Result (..), quickCheckResult, label,
Arbitrary (..), choose)
type Test = (String, Property)
testProperty :: Testable prop => String -> prop -> Test
testProperty m = (,) m . label m
runMayError :: Testable prop => (a, prop) -> IO (Maybe (a, Result))
runMayError (m, prop) = fmap ((,) m) . err <$> quickCheckResult prop where
err :: Result -> Maybe Result
err (Success {}) = Nothing
err x = Just x
defaultMain :: [Test] -> IO ()
defaultMain xs = do
es <- catMaybes <$> mapM runMayError xs
mapM_ (\(m, r) -> hPutStrLn stderr $ m ++ ":\n" ++ show r) es
unless (null es) $ fail "Found some failures."
main :: IO ()
main = defaultMain tests
-- Arbitrary instance for only test.
instance Arbitrary P.ByteString where
arbitrary = do
bs <- P.pack `fmap` arbitrary
n <- choose (0, 2)
return (P.drop n bs) -- to give us some with non-0 offset
prop_short_pack_unpack xs =
(Short.unpack . Short.pack) xs == xs
prop_short_toShort_fromShort bs =
(Short.fromShort . Short.toShort) bs == bs
prop_short_toShort_unpack bs =
(Short.unpack . Short.toShort) bs == P.unpack bs
prop_short_pack_fromShort xs =
(Short.fromShort . Short.pack) xs == P.pack xs
prop_short_empty =
Short.empty == Short.toShort P.empty
&& Short.empty == Short.pack []
&& Short.null (Short.toShort P.empty)
&& Short.null (Short.pack [])
&& Short.null Short.empty
prop_short_null_toShort bs =
P.null bs == Short.null (Short.toShort bs)
prop_short_null_pack xs =
null xs == Short.null (Short.pack xs)
prop_short_length_toShort bs =
P.length bs == Short.length (Short.toShort bs)
prop_short_length_pack xs =
length xs == Short.length (Short.pack xs)
prop_short_index_pack xs =
all (\i -> Short.pack xs `Short.index` i == xs !! i)
[0 .. length xs - 1]
prop_short_index_toShort bs =
all (\i -> Short.toShort bs `Short.index` i == bs `P.index` i)
[0 .. P.length bs - 1]
prop_short_eq xs ys =
(xs == ys) == (Short.pack xs == Short.pack ys)
prop_short_ord xs ys =
(xs `compare` ys) == (Short.pack xs `compare` Short.pack ys)
prop_short_mappend_empty_empty =
Short.empty `mappend` Short.empty == Short.empty
prop_short_mappend_empty xs =
Short.empty `mappend` Short.pack xs == Short.pack xs
&& Short.pack xs `mappend` Short.empty == Short.pack xs
prop_short_mappend xs ys =
(xs `mappend` ys) == Short.unpack (Short.pack xs `mappend` Short.pack ys)
prop_short_mconcat xss =
mconcat xss == Short.unpack (mconcat (map Short.pack xss))
prop_short_fromString s =
fromString s == Short.fromShort (fromString s)
prop_short_show xs =
show (Short.pack xs) == show (map P.w2c xs)
prop_short_show' xs =
show (Short.pack xs) == show (P.pack xs)
prop_short_read xs =
read (show (Short.pack xs)) == Short.pack xs
tests :: [Test]
tests =
[ testProperty "pack/unpack" prop_short_pack_unpack
, testProperty "toShort/fromShort" prop_short_toShort_fromShort
, testProperty "toShort/unpack" prop_short_toShort_unpack
, testProperty "pack/fromShort" prop_short_pack_fromShort
, testProperty "empty" prop_short_empty
, testProperty "null/toShort" prop_short_null_toShort
, testProperty "null/pack" prop_short_null_pack
, testProperty "length/toShort" prop_short_length_toShort
, testProperty "length/pack" prop_short_length_pack
, testProperty "index/pack" prop_short_index_pack
, testProperty "index/toShort" prop_short_index_toShort
, testProperty "Eq" prop_short_eq
, testProperty "Ord" prop_short_ord
, testProperty "mappend/empty/empty" prop_short_mappend_empty_empty
, testProperty "mappend/empty" prop_short_mappend_empty
, testProperty "mappend" prop_short_mappend
, testProperty "mconcat" prop_short_mconcat
, testProperty "fromString" prop_short_fromString
, testProperty "show" prop_short_show
, testProperty "show'" prop_short_show'
, testProperty "read" prop_short_read
]