-- This Source Code Form is subject to the terms of the Mozilla Public -- License, v. 2.0. If a copy of the MPL was not distributed with this -- file, You can obtain one at http://mozilla.org/MPL/2.0/. {-# LANGUAGE OverloadedStrings #-} module Properties (tests) where import Control.Applicative import Data.ByteString.Char8 (pack) import Data.ByteString.Conversion import Data.Int import Data.List (intercalate) import Data.Maybe (fromMaybe) import Data.Word import Test.QuickCheck import Test.Tasty import Test.Tasty.QuickCheck import Text.Printf tests :: TestTree tests = testGroup "Properties" [ testGroup "Decimals" [ testProperty "Int" (\a -> Just (a :: Int) == readBack a) , testProperty "Int8" (\a -> Just (a :: Int8) == readBack a) , testProperty "Int16" (\a -> Just (a :: Int16) == readBack a) , testProperty "Int32" (\a -> Just (a :: Int32) == readBack a) , testProperty "Int64" (\a -> Just (a :: Int64) == readBack a) , testProperty "Word" (\a -> Just (a :: Word) == readBack a) , testProperty "Word8 " (\a -> Just (a :: Word8) == readBack a) , testProperty "Word16" (\a -> Just (a :: Word16) == readBack a) , testProperty "Word32" (\a -> Just (a :: Word32) == readBack a) , testProperty "Word64" (\a -> Just (a :: Word64) == readBack a) ] , testGroup "Hexadecimals" [ testProperty "Int" (\a -> Just (a :: Hex Int) == readBackHex a) , testProperty "Int8" (\a -> Just (a :: Hex Int8) == readBackHex a) , testProperty "Int16" (\a -> Just (a :: Hex Int16) == readBackHex a) , testProperty "Int32" (\a -> Just (a :: Hex Int32) == readBackHex a) , testProperty "Int64" (\a -> Just (a :: Hex Int64) == readBackHex a) , testProperty "Word" (\a -> Just (a :: Hex Word) == readBackHex a) , testProperty "Word8 " (\a -> Just (a :: Hex Word8) == readBackHex a) , testProperty "Word16" (\a -> Just (a :: Hex Word16) == readBackHex a) , testProperty "Word32" (\a -> Just (a :: Hex Word32) == readBackHex a) , testProperty "Word64" (\a -> Just (a :: Hex Word64) == readBackHex a) ] , testGroup "Bool" [ testProperty "True" readBackTrue , testProperty "False" readBackFalse ] , testGroup "Double" [ testProperty "Double" readBackDouble ] , testGroup "List" [ testProperty "List Int" (readCSV :: List Int -> Bool) , testProperty "List Word" (readCSV :: List Word -> Bool) , testProperty "List Double" (readCSV :: List Double -> Bool) , testProperty "List Bool" (readCSV :: List Bool -> Bool) , testProperty "List Hex" readHexCSV , testProperty "Error" readDoubleCSVAsInt ] ] readBack :: (Show a, FromByteString a) => a -> Maybe a readBack = fromByteString . pack . show readBackDouble :: Double -> Bool readBackDouble d = Just d == (fromByteString . pack . show $ d) readBackHex :: (PrintfArg i, Show i, FromByteString i, Integral i) => i -> Maybe i readBackHex = fromByteString . pack . printf "+0x%x" readBackTrue :: Property readBackTrue = forAll (elements ["True", "true"]) $ fromMaybe False . fromByteString readBackFalse :: Property readBackFalse = forAll (elements ["False", "false"]) $ fromMaybe False . fmap not . fromByteString readCSV :: (Eq a, Show a, FromByteString a) => List a -> Bool readCSV lst = Just lst == fromByteString (pack (csv lst)) where csv = intercalate "," . map show . fromList readHexCSV :: List HexStr -> Bool readHexCSV lst = let x = fromByteString (pack (csv lst)) y = map (snd . hex) (fromList lst) in x == Just (List y) where csv = intercalate "," . map (fst . hex) . fromList readDoubleCSVAsInt :: List Double -> Bool readDoubleCSVAsInt (List []) = True readDoubleCSVAsInt lst = Nothing == (fromByteString (pack (csv lst)) :: Maybe (List Int)) where csv = intercalate "," . map show . fromList newtype HexStr = HexStr { hex :: (String, Hex Int) } deriving (Show) instance Arbitrary HexStr where arbitrary = do i <- arbitrary x <- elements ['x', 'X'] return $ HexStr (printf ('+':'0':x:"%x") i, i) instance Arbitrary a => Arbitrary (Hex a) where arbitrary = Hex <$> arbitrary instance Arbitrary a => Arbitrary (List a) where arbitrary = List <$> arbitrary