blaze-textual / tests / QC.hs

module Main (main) where

import Blaze.ByteString.Builder (Builder, toByteString)
import Blaze.Text (double, float, integral)
import Data.Int (Int8, Int16, Int32, Int64)
import Data.Word (Word, Word8, Word16, Word32, Word64)
import Test.Framework (Test, defaultMain, testGroup)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import qualified Data.ByteString.Char8 as B

-- Integral values should be rendered exactly as Haskell does.
t_integral :: (Integral a, Show a) => a -> a -> Bool
t_integral _ i = toByteString (integral i) == B.pack (show i)

-- This package doesn't render floating point numbers exactly as
-- Haskell does, but the numbers it renders should read back exactly.
-- So that's the property we check.
t_real :: (RealFloat a, Show a, Read a) => (a -> Builder) -> a -> a -> Bool
t_real f i j =
    case read (B.unpack . toByteString . f $ ij) of
      r | isNaN r      -> isNaN ij
        | isInfinite r -> isInfinite ij && signum r == signum ij
        | otherwise    -> r == ij
  where ij = i / j

main :: IO ()
main = defaultMain tests

tests :: [Test]
tests = [
    testGroup "int" [ testProperty "Integer" $ t_integral (undefined::Integer)
                    , testProperty "Int" $ t_integral (undefined::Int)
                    , testProperty "Int8" $ t_integral (undefined::Int8)
                    , testProperty "Int16" $ t_integral (undefined::Int16)
                    , testProperty "Int32" $ t_integral (undefined::Int32)
                    , testProperty "Int64" $ t_integral (undefined::Int64)
                    ]
  , testGroup "word" [ testProperty "Word" $ t_integral (undefined::Word)
                     , testProperty "Word8" $ t_integral (undefined::Word8)
                     , testProperty "Word16" $ t_integral (undefined::Word16)
                     , testProperty "Word32" $ t_integral (undefined::Word32)
                     , testProperty "Word64" $ t_integral (undefined::Word64)
                     ]
  , testProperty "Double" $ t_real double
  , testProperty "Float" $ t_real float
  ]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.