hashable-1.3.3.0: tests/Regress.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Regress (regressions) where
import qualified Test.Framework as F
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit ((@=?))
import GHC.Generics (Generic)
import Data.List (nub)
import Data.Fixed (Pico)
import Data.Text (Text)
#ifdef HAVE_MMAP
import qualified Regress.Mmap as Mmap
#endif
import Data.Hashable
#include "MachDeps.h"
regressions :: [F.Test]
regressions = [] ++
#ifdef HAVE_MMAP
Mmap.regressions ++
[ testCase "Fixed" $ do
(hash (1 :: Pico) == hash (2 :: Pico)) @=? False
] ++
#endif
[ F.testGroup "Generic: sum of nullary constructors"
[ testCase "0" $ nullaryCase 0 S0
, testCase "1" $ nullaryCase 1 S1
, testCase "2" $ nullaryCase 2 S2
, testCase "3" $ nullaryCase 3 S3
, testCase "4" $ nullaryCase 4 S4
]
, testCase "Generic: Peano https://github.com/tibbe/hashable/issues/135" $ do
let ns = take 20 $ iterate S Z
let hs = map hash ns
hs @=? nub hs
#if WORD_SIZE_IN_BITS == 64
, testCase "64 bit Text" $ do
hash ("hello world" :: Text) @=? 2668910425102664189
#endif
]
where
nullaryCase :: Int -> SumOfNullary -> IO ()
nullaryCase n s = do
let salt = 42
let expected = salt `hashWithSalt` n `hashWithSalt` ()
let actual = hashWithSalt salt s
expected @=? actual
data SumOfNullary = S0 | S1 | S2 | S3 | S4 deriving (Generic)
instance Hashable SumOfNullary
data Nat = Z | S Nat deriving (Generic)
instance Hashable Nat