packages feed

number-length-0.1.0.0: test/TestCase/Data/NumberLength.hs

{-# LANGUAGE NoImplicitPrelude #-}
-- |
-- Module:       $HEADER$
-- Description:  TODO
-- Copyright:    (c) 2015, Peter Trško
-- License:      BSD3
--
-- Stability:    experimental
-- Portability:  NoImplicitPrelude
module TestCase.Data.NumberLength
  where

import Prelude (Bounded(maxBound))

import Control.Applicative (liftA2)
import Data.Bool (Bool)
import Data.Eq (Eq((==)))
import Data.Function (($))
import Data.Int (Int, Int16, Int32, Int64, Int8)
import Data.Proxy (Proxy(Proxy))
import Data.Word (Word, Word16, Word32, Word64, Word8)

import Test.HUnit ((@?=))
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.Framework.Providers.QuickCheck2 (testProperty)

import Data.NumberLength
    ( NumberLength(numberLength, numberLengthHex)
    , BoundedNumberLength(maxNumberLength, maxNumberLengthHex)
    )
import Data.NumberLength.Int
    ( lengthInt
    , lengthInt16
    , lengthInt16hex
    , lengthInt32
    , lengthInt32hex
    , lengthInt64
    , lengthInt64hex
    , lengthInt8
    , lengthInt8hex
    , lengthIntHex
    )
import Data.NumberLength.Word
    ( lengthWord
    , lengthWord16
    , lengthWord16hex
    , lengthWord32
    , lengthWord32hex
    , lengthWord64
    , lengthWord64hex
    , lengthWord8
    , lengthWord8hex
    , lengthWordHex
    )


tests :: [Test]
tests =
    [ testGroup "class NumberLength"
        [ testGroup "numberLengthHex"
            [ testProperty "Int"    $ numberLength <==> lengthInt
            , testProperty "Int8"   $ numberLength <==> lengthInt8
            , testProperty "Int16"  $ numberLength <==> lengthInt16
            , testProperty "Int32"  $ numberLength <==> lengthInt32
            , testProperty "Int64"  $ numberLength <==> lengthInt64
            , testProperty "Word"   $ numberLength <==> lengthWord
            , testProperty "Word8"  $ numberLength <==> lengthWord8
            , testProperty "Word16" $ numberLength <==> lengthWord16
            , testProperty "Word32" $ numberLength <==> lengthWord32
            , testProperty "Word64" $ numberLength <==> lengthWord64
            ]

        , testGroup "numberLengthHex"
            [ testProperty "Int"    $ numberLengthHex <==> lengthIntHex
            , testProperty "Int8"   $ numberLengthHex <==> lengthInt8hex
            , testProperty "Int16"  $ numberLengthHex <==> lengthInt16hex
            , testProperty "Int32"  $ numberLengthHex <==> lengthInt32hex
            , testProperty "Int64"  $ numberLengthHex <==> lengthInt64hex
            , testProperty "Word"   $ numberLengthHex <==> lengthWordHex
            , testProperty "Word8"  $ numberLengthHex <==> lengthWord8hex
            , testProperty "Word16" $ numberLengthHex <==> lengthWord16hex
            , testProperty "Word32" $ numberLengthHex <==> lengthWord32hex
            , testProperty "Word64" $ numberLengthHex <==> lengthWord64hex
            ]
        ]

    , testGroup "class BoundedNumberLength"
        [ testGroup "maxNumberLength"
            [ testCase "Int"
                $ maxNumberLength int    @?= lengthInt    maxBound
            , testCase "Int8"
                $ maxNumberLength int8   @?= lengthInt8   maxBound
            , testCase "Int16"
                $ maxNumberLength int16  @?= lengthInt16  maxBound
            , testCase "Int32"
                $ maxNumberLength int32  @?= lengthInt32  maxBound
            , testCase "Int64"
                $ maxNumberLength int64  @?= lengthInt64  maxBound
            , testCase "Word"
                $ maxNumberLength word   @?= lengthWord   maxBound
            , testCase "Word8"
                $ maxNumberLength word8  @?= lengthWord8  maxBound
            , testCase "Word16"
                $ maxNumberLength word16 @?= lengthWord16 maxBound
            , testCase "Word32"
                $ maxNumberLength word32 @?= lengthWord32 maxBound
            , testCase "Word64"
                $ maxNumberLength word64 @?= lengthWord64 maxBound
            ]

        , testGroup "maxNumberLengthHex"
            [ testCase "Int"
                $ maxNumberLengthHex int    @?= lengthIntHex    maxBound
            , testCase "Int8"
                $ maxNumberLengthHex int8   @?= lengthInt8hex   maxBound
            , testCase "Int16"
                $ maxNumberLengthHex int16  @?= lengthInt16hex  maxBound
            , testCase "Int32"
                $ maxNumberLengthHex int32  @?= lengthInt32hex  maxBound
            , testCase "Int64"
                $ maxNumberLengthHex int64  @?= lengthInt64hex  maxBound
            , testCase "Word"
                $ maxNumberLengthHex word   @?= lengthWordHex   maxBound
            , testCase "Word8"
                $ maxNumberLengthHex word8  @?= lengthWord8hex  maxBound
            , testCase "Word16"
                $ maxNumberLengthHex word16 @?= lengthWord16hex maxBound
            , testCase "Word32"
                $ maxNumberLengthHex word32 @?= lengthWord32hex maxBound
            , testCase "Word64"
                $ maxNumberLengthHex word64 @?= lengthWord64hex maxBound
            ]
        ]
    ]
  where
    int    = Proxy :: Proxy Int
    int8   = Proxy :: Proxy Int8
    int16  = Proxy :: Proxy Int16
    int32  = Proxy :: Proxy Int32
    int64  = Proxy :: Proxy Int64

    word   = Proxy :: Proxy Word
    word8  = Proxy :: Proxy Word8
    word16 = Proxy :: Proxy Word16
    word32 = Proxy :: Proxy Word32
    word64 = Proxy :: Proxy Word64

(<==>) :: Eq b => (a -> b) -> (a -> b) -> a -> Bool
(<==>) = liftA2 (==)