hunt-searchengine-0.3.0.1: test/Hunt/Strict/ContextIndex.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ExistentialQuantification #-}
module Hunt.Strict.ContextIndex
(contextIndexTests)
where
import Hunt.TestHelper
import Hunt.Strict.Helper
import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Test.QuickCheck
import Test.QuickCheck.Monadic (PropertyM,
monadicIO,
pick)
import Hunt.Common
import Hunt.Common.IntermediateValue
import qualified Data.Map.Strict as M
import Data.Default
import qualified Hunt.Index as Ix
import Hunt.ContextIndex
import qualified Hunt.Index.IndexImpl as Impl
import qualified Hunt.Index.InvertedIndex as InvIx
import qualified Hunt.DocTable as Dt
import qualified Hunt.DocTable.HashedDocTable as HDt
-- ----------------------------------------------------------------------------
contextIndexTests :: [Test]
contextIndexTests =
[ testProperty "prop_strictness_insertList1" prop_cx_insertlist
, testProperty "prop_strictness_insertList2" prop_cx_insertlist2
, testProperty "prop_strictness_insertList3" prop_cx_insertlist3
]
-- ----------------------------------------------------------------------------
-- context index implementation
-- ----------------------------------------------------------------------------
prop_cx_insertlist3 :: Property
prop_cx_insertlist3 = monadicIO $ do
-- generate list of distinct documents (in terms of uri)
documents <- pick mkDocuments
-- genearte mock ContextIndex to work with.
-- Use some of the documents to be initially stored in the
-- document table
cxIx <- pickContextIx $ take 10 documents
-- generate mock document-word pairs to insert.
-- use rest of documents for this list
insertData <- pick $ mkInsertList $ drop 10 documents
-- check resulting document table for strictness property
(ContextIndex _ dt') <- insertList insertData cxIx
assertNF' dt'
where
pickIx = do
val <- pick arbitrary
return $ Ix.insert "key" (toIntermediate (val :: Occurrences)) Ix.empty
pickContextIx docs = do
ix <- pickIx :: PropertyM IO InvIx.InvertedIndex
let cxmap = mkContextMap $ M.fromList [("context", (def, Impl.mkIndex ix))]
dt <- pick $ mkDocTable docs
return $ ContextIndex cxmap dt
prop_cx_insertlist ::Property
prop_cx_insertlist = monadicIO $ do
(table, idsAndWords) <- pickRes :: PropertyM IO (HDt.Documents Document, [(DocId, Words)])
assertNF' table
assertNF' idsAndWords
where
pickRes = pick mkInsertList' >>= createDocTableFromPartition
prop_cx_insertlist2 ::Property
prop_cx_insertlist2 = monadicIO $ do
-- generate list of doctables and chekc if they are strict
dts <- pick mkDocTables
-- create input list to work with
let dt = if length dts > 0 then (head dts) else Dt.empty
input <- mapM (\dt' -> return (dt',[])) $ drop 1 dts
-- union doctables with insertLists reduce function and check result for strictness
(outDt,_) <- unionDocTables input dt
assertNF' outDt