exp-cache-0.1.0.0: test/Spec/RRTests.hs
module Spec.RRTests (
rrSpec
) where
import Data.Cache
import Data.Cache.Eviction.RR
import Test.QuickCheck
import Test.Tasty
import Test.Tasty.HUnit
import System.Random (StdGen, mkStdGen)
rrSpec :: TestTree
rrSpec = testGroup "RR Spec" [
testGroup "size never exceeds upper bound" [
testCase "size = 1" $ do
let rr = newRR defaultGen 1
rr' = insertN rr 2
1 @=? rrSizeDebug rr'
, testCase "size = 1000" $ do
let rr = newRR defaultGen 1000
rr' = insertN rr 5000
1000 @=? rrSizeDebug rr'
]
, testCase "empty strategy eviction is a no-op" $ do
let rr = newRR defaultGen 10 :: RR Int
(rr', res) = evict rr
res @=? Nothing
rr' @=? rr
, testCase "evict returns last evicted" $ do
let rr = newRR defaultGen 10 :: RR Int
rr' = insertN rr 1000
(_, evicted) = evict rr'
Just 5 @=? evicted
, testCase "evict is deterministic given a seed" $ do
let rr = newRR defaultGen 10 :: RR Int
rr' = insertN rr 1000
(e1, evicted) = evict rr'
e2 = recordLookup 2000 e1
(e3, evicted') = evict e2
e4 = recordLookup 10000 e3
(_, evicted'') = evict e4
Just 5 @=? evicted
Just 7 @=? evicted'
Just 10 @=? evicted''
]
defaultGen :: StdGen
defaultGen = mkStdGen 25
insertN ::
RR Int
-> Int
-> RR Int
insertN rr n = foldr recordLookup rr [0..n]