packages feed

chatter-0.7.0.0: tests/src/Data/DefaultMapTests.hs

module Data.DefaultMapTests where

import Control.Applicative ((<$>))
import qualified Data.HashSet as S
import qualified Data.Text as T
import Test.QuickCheck.Instances ()
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)
import Data.Function (on)
import Data.List (nubBy)

import Data.Serialize (decode, encode)

import qualified Data.DefaultMap as DM

tests :: TestTree
tests = testGroup "NLP.Data.DefaultMapTests"
        [ testGroup "Serialize / Deserialize Tests"
          [ testProperty "DefaultMap round-trips" prop_defMapSerialize
          , testProperty "DefaultMap elems" prop_elems
          , testProperty "DefaultMap unionWith" prop_unionWith
          , testProperty "DefaultMap map" prop_map
          ]
        ]

prop_defMapSerialize :: DM.DefaultMap String String -> Bool
prop_defMapSerialize c = case (decode . encode) c of
                           Right c' -> c == c'
                           Left _ -> False

prop_elems :: [(T.Text, Int)] -> Bool
prop_elems pairs =
    let uPairs = nubBy ((==) `on` fst) pairs
    in (S.fromList $ snd <$> uPairs) ==
       (S.fromList $ DM.elems $ DM.fromList 0 uPairs)

prop_map :: [(T.Text, Int)] -> Bool
prop_map pairs =
    let uPairs = nubBy ((==) `on` fst) pairs
        f = (+ 4)
    in (S.fromList $ f <$> snd <$> uPairs) ==
       (S.fromList $ DM.elems $ DM.map f $ DM.fromList 0 uPairs)

prop_unionWith :: DM.DefaultMap T.Text Int -> DM.DefaultMap T.Text Int -> Bool
prop_unionWith a b =
    let f = (+)
        result = DM.unionWith f 0 a b
    in and [ f (DM.lookup k a) (DM.lookup k b) == DM.lookup k result
           | k <- S.toList $ S.fromList (DM.keys a ++ DM.keys b)
           ]