hunt-searchengine-0.3.0.1: test/Hunt/Strict/DocTable.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ExistentialQuantification #-}
module Hunt.Strict.DocTable
(docTableTests)
where
import Control.Monad (foldM)
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 qualified Data.Set as S
import Data.Text (Text)
import Hunt.Common
import qualified Hunt.Common.DocIdSet as IS
import qualified Hunt.Common.DocDesc as DD
import qualified Hunt.DocTable as Dt
import qualified Hunt.DocTable.HashedDocTable as HDt
-- ----------------------------------------------------------------------------
docTableTests :: [Test]
docTableTests =
-- tests for data-structures used in contexts of the document table
[ testProperty "prop_strictness_document" prop_doc
, testProperty "prop_strictness_docdesc empty" prop_dd_empty
, testProperty "prop_strictness_docdesc fromList" prop_dd_fromList
, testProperty "prop_strictness_docdesc insert" prop_dd_insert
, testProperty "prop_strictness_docdesc union" prop_dd_union
-- strictness property for document table by function
, testProperty "prop_strictness union doctable" prop_dt_union
, testProperty "prop_strictness insert doctable" prop_dt_insert
, testProperty "prop_strictness update doctable" prop_dt_update
, testProperty "prop_strictness delete doctable" prop_dt_delete
, testProperty "prop_strictness delbyuri doctable" prop_dt_delete2
, testProperty "prop_strictness adjust doctable" prop_dt_adjust
, testProperty "prop_strictness adjuri doctable" prop_dt_adjust2
, testProperty "prop_strictness difference doctable" prop_dt_difference
, testProperty "prop_strictness diffusi doctable" prop_dt_difference2
-- TODO:
-- map
-- filter
-- mapKeys
]
-- ----------------------------------------------------------------------------
-- test data structures: Document
-- ----------------------------------------------------------------------------
prop_doc :: Property
prop_doc = monadicIO $ do
x <- pick arbitrary :: PropertyM IO Document
assertNF' $! x
-- ----------------------------------------------------------------------------
-- test data structures: Document description (DocDesc)
-- ----------------------------------------------------------------------------
prop_dd_empty :: Property
prop_dd_empty = monadicIO $ do
assertNF' $! DD.empty
prop_dd_fromList :: Property
prop_dd_fromList = monadicIO $ do
v1 <- pick niceText1
v2 <- pick niceText1
k1 <- pick niceText1
k2 <- pick niceText1
assertNF' $! DD.fromList (list k1 v1 k2 v2)
where
list k1 v1 k2 v2 = [(k1,v1), (k2,v2)] :: [(Text,Text)]
prop_dd_insert :: Property
prop_dd_insert = monadicIO $ do
assertNF' $! DD.insert "key" ("value"::String) DD.empty
prop_dd_union :: Property
prop_dd_union = monadicIO $ do
x <- pick mkDescription
y <- pick mkDescription
assertNF' $! DD.union x y
-- ----------------------------------------------------------------------------
-- document table implementation
-- ----------------------------------------------------------------------------
prop_dt_insert :: Property
prop_dt_insert
= monadicIO $ do
(_,dt) <- pickIx :: PropertyM IO (DocId, HDt.Documents Document)
assertNF' dt
where
pickIx = pick arbitrary >>= \doc -> Dt.insert doc Dt.empty
prop_dt_union :: Property
prop_dt_union
= monadicIO $ do
dt <- pick mkDocTables >>= foldM Dt.union Dt.empty
assertNF' dt
prop_dt_update :: Property
prop_dt_update
= monadicIO $ do
doc1 <- pick mkDocument'
(docid, dt1) <- Dt.insert doc1 (Dt.empty :: HDt.Documents Document)
doc2 <- pick mkDocument'
Dt.update docid doc2 dt1
prop_dt_delete :: Property
prop_dt_delete
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1 <- pick arbitrary
doc2 <- pick arbitrary
(docid, dt) <- Dt.insert doc1 Dt.empty
(_, dt') <- Dt.insert doc2 dt
Dt.delete docid dt'
prop_dt_delete2 :: Property
prop_dt_delete2
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1@(Document u _ _) <- pick arbitrary
doc2 <- pick arbitrary
(_, dt) <- Dt.insert doc1 Dt.empty
(_, dt') <- Dt.insert doc2 dt
Dt.deleteByURI u dt'
prop_dt_adjust :: Property
prop_dt_adjust
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1 <- pick arbitrary
doc2 <- pick arbitrary
(docid, dt) <- Dt.insert doc1 Dt.empty
Dt.adjust (\_ -> return doc2) docid dt
prop_dt_adjust2 :: Property
prop_dt_adjust2
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1@(Document u _ _) <- pick arbitrary
doc2 <- pick arbitrary
(_, dt) <- Dt.insert doc1 Dt.empty
Dt.adjustByURI (\_ -> return doc2) u dt
prop_dt_difference :: Property
prop_dt_difference
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1 <- pick arbitrary
doc2 <- pick arbitrary
(docid, dt) <- Dt.insert doc1 Dt.empty
(_, dt') <- Dt.insert doc2 dt
Dt.difference (IS.singleton docid) dt'
prop_dt_difference2 :: Property
prop_dt_difference2
= monadicIO $ do
dt <- pickIx :: PropertyM IO (HDt.Documents Document)
assertNF' dt
where
pickIx = do
doc1@(Document u _ _) <- pick arbitrary
doc2 <- pick arbitrary
(_, dt) <- Dt.insert doc1 Dt.empty
(_, dt') <- Dt.insert doc2 dt
Dt.differenceByURI (S.singleton u) dt'