mirror of
https://github.com/facebook/Haxl.git
synced 2024-10-04 06:07:32 +03:00
e5f95d6213
Summary: Bump the minimum Haxl version to GHC 8.2, which at this point is 2.5 years old but more importantly has many features that are really helpful in Haxl (such as the hs_try_put_mvar API function, which is really useful for BackgroundFetch) Reviewed By: josefs Differential Revision: D19327952 fbshipit-source-id: f635068fe9fb8f1d1f0d83ccbf9c3c04947183a0
77 lines
2.0 KiB
Haskell
77 lines
2.0 KiB
Haskell
-- Copyright (c) 2014-present, Facebook, Inc.
|
|
-- All rights reserved.
|
|
--
|
|
-- This source code is distributed under the terms of a BSD license,
|
|
-- found in the LICENSE file.
|
|
|
|
module MemoizationTests (tests) where
|
|
|
|
import Data.IORef
|
|
|
|
import Test.HUnit
|
|
|
|
import Haxl.Core
|
|
import Haxl.Core.Monad (unsafeLiftIO)
|
|
|
|
import ExampleDataSource
|
|
|
|
memoSoundness :: Test
|
|
memoSoundness = TestCase $ do
|
|
iEnv <- do
|
|
exState <- ExampleDataSource.initGlobalState
|
|
initEnv (stateSet exState stateEmpty) ()
|
|
|
|
unMemoizedWombats <- runHaxl iEnv $ listWombats 100
|
|
|
|
(initialGet, subsequentGet) <- runHaxl iEnv $ do
|
|
wombatsMemo <- newMemoWith (listWombats 100)
|
|
let memoizedWombats = runMemo wombatsMemo
|
|
|
|
initialGet <- memoizedWombats
|
|
subsequentGet <- memoizedWombats
|
|
|
|
return (initialGet, subsequentGet)
|
|
|
|
assertBool "Memo Soundness 1" $ initialGet == unMemoizedWombats
|
|
assertBool "Memo Soundness 2" $ subsequentGet == unMemoizedWombats
|
|
|
|
let impure runCounterRef = unsafeLiftIO $ do
|
|
modifyIORef runCounterRef succ
|
|
readIORef runCounterRef
|
|
|
|
initialRunCounter = 0 :: Int
|
|
|
|
runCounterRef <- newIORef initialRunCounter
|
|
|
|
(initialImpureGet, subsequentImpureGet) <- runHaxl iEnv $ do
|
|
impureMemo <- newMemoWith (impure runCounterRef)
|
|
let memoizedImpure = runMemo impureMemo
|
|
|
|
initialImpureGet <- memoizedImpure
|
|
subsequentImpureGet <- memoizedImpure
|
|
|
|
return (initialImpureGet, subsequentImpureGet)
|
|
|
|
assertBool "Memo Soundness 3" $ initialImpureGet == succ initialRunCounter
|
|
assertBool "Memo Soundness 4" $ subsequentImpureGet == initialImpureGet
|
|
|
|
let fMemoVal = 42 :: Int
|
|
|
|
dependentResult <- runHaxl iEnv $ do
|
|
fMemoRef <- newMemo
|
|
gMemoRef <- newMemo
|
|
|
|
let f = runMemo fMemoRef
|
|
g = runMemo gMemoRef
|
|
|
|
prepareMemo fMemoRef $ return fMemoVal
|
|
prepareMemo gMemoRef $ succ <$> f
|
|
|
|
a <- f
|
|
b <- g
|
|
return (a + b)
|
|
|
|
assertBool "Memo Soundness 5" $ dependentResult == fMemoVal + succ fMemoVal
|
|
|
|
tests = TestList [TestLabel "Memo Soundness" memoSoundness]
|