packages feed

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]