packages feed

full-text-search-0.2.2.0: tests/Test/Data/SearchEngine/DocIdSet.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.Data.SearchEngine.DocIdSet where

import Data.SearchEngine.DocIdSet (DocIdSet(DocIdSet), DocId(DocId))
import qualified Data.SearchEngine.DocIdSet as DocIdSet

import qualified Data.Vector.Unboxed as Vec
import qualified Data.List as List
import Test.QuickCheck


instance Arbitrary DocIdSet where
  arbitrary = DocIdSet.fromList `fmap` (listOf arbitrary)

instance Arbitrary DocId where
  arbitrary = DocId `fmap` choose (0,15)


prop_insert :: DocIdSet -> DocId -> Bool
prop_insert dset x =
    let dset' = DocIdSet.insert x dset
     in DocIdSet.invariant dset && DocIdSet.invariant dset'
     && all (`member` dset') (x : DocIdSet.toList dset)

prop_delete :: DocIdSet -> DocId -> Bool
prop_delete dset x =
    let dset' = DocIdSet.delete x dset
     in DocIdSet.invariant dset && DocIdSet.invariant dset'
     && all (`member` dset') (List.delete x (DocIdSet.toList dset))
     && not (x `member` dset')

prop_delete' :: DocIdSet -> Bool
prop_delete' dset =
    all (prop_delete dset) (DocIdSet.toList dset)

prop_union :: DocIdSet -> DocIdSet -> Bool
prop_union dset1 dset2 =
    let dset  = DocIdSet.union dset1 dset2
        dset' = DocIdSet.fromList (List.union (DocIdSet.toList dset1) (DocIdSet.toList dset2))

     in DocIdSet.invariant dset && DocIdSet.invariant dset'
     && dset == dset'

prop_union' :: DocIdSet -> DocIdSet -> Bool
prop_union' dset1 dset2 =
    let dset   = DocIdSet.union dset1 dset2
        dset'  = List.foldl' (\s i -> DocIdSet.insert i s) dset1 (DocIdSet.toList dset2)
        dset'' = List.foldl' (\s i -> DocIdSet.insert i s) dset2 (DocIdSet.toList dset1)
     in DocIdSet.invariant dset && DocIdSet.invariant dset' && DocIdSet.invariant dset''
     && dset == dset'
     && dset' == dset''

member :: DocId -> DocIdSet -> Bool
member x (DocIdSet vec) =
   x `List.elem` Vec.toList vec