{-# LANGUAGE OverloadedStrings #-}

module TestOrdECMWithTestSequence (
    testWithTestSequence
) where

import Caching.ExpiringCacheMap.OrdECM (newECMForM, lookupECM, CacheSettings(..), consistentDuration)
import qualified Caching.ExpiringCacheMap.Utils.TestSequence as TestSeq

import TestECMWithTestSequenceCommon

import qualified Data.ByteString.Char8 as BS
import System.Exit (exitFailure)

testWithTestSequence = do
  (TestSeq.TestSequenceState (_, events',    _), return_value) <- TestSeq.runTestSequence test'
  (TestSeq.TestSequenceState (_, events'',   _), return_value) <- TestSeq.runTestSequence test''
  (TestSeq.TestSequenceState (_, events''',  _), return_value) <- TestSeq.runTestSequence test'''
  (TestSeq.TestSequenceState (_, events'''', _), return_value) <- TestSeq.runTestSequence test''''
  if pattern'    (filt events') &&
     pattern''   (filt events'') &&
     pattern'''  (filt events''') &&
     pattern'''' (filt events'''')
    then do
      putStrLn "Passed TestOrdECMWithTestSequence"
      -- printOutEvents events' events'' events''' events''''
      return ()
    else do
      printOutFailedPattern "TestOrdECMWithTestSequence.testWithTestSequence"
        (filt events') (filt events'') (filt events''') (filt events'''')
      printOutEvents events' events'' events''' events''''
      exitFailure
  where
    filt = filter someEventsOnly . reverse
    commonreadnumber = 
      (\state _id -> do number <- TestSeq.readNumber
                        return (state, number))
    
    newTestECM valreq timecheck =
      newECMForM valreq
        (TestSeq.getCurrentTime >>= return)
        timecheck
        (CacheWithLRUList 6 6 12)
        TestSeq.newTestSVar TestSeq.enterTestSVar TestSeq.readTestSVar
  
    test' = do
      filecache <- newTestECM
        (consistentDuration 100 commonreadnumber) -- Duration between access and expiry time
        12000 -- Time check frequency
      testLookups (lookupECM filecache)
    
    test'' = do
      filecache <- newTestECM
        (consistentDuration 100 commonreadnumber) -- Duration between access and expiry time
        1 -- Time check frequency
      testLookups (lookupECM filecache)
  
    test''' = do
      filecache <- newTestECM
        (consistentDuration 1 commonreadnumber) -- Duration between access and expiry time
        12000 -- Time check frequency
      testLookups (lookupECM filecache)
    
    test'''' = do
      filecache <- newTestECM
        (consistentDuration 1 commonreadnumber) -- Duration between access and expiry time
        1 -- Time check frequency
      testLookups (lookupECM filecache)


-- main = testWithTestSequence
