44
55module ScheduledMergesTestQLS (tests ) where
66
7- import Prelude hiding (lookup )
7+ import Control.Monad.ST
8+ import Control.Tracer (Tracer , nullTracer )
9+ import Data.Constraint (Dict (.. ))
810import Data.Map.Strict (Map )
911import qualified Data.Map.Strict as Map
10- import Data.Constraint (Dict (.. ))
1112import Data.Proxy
12- import Control.Monad.ST
13- import Control.Tracer (Tracer , nullTracer )
13+ import Prelude hiding (lookup )
1414
1515import ScheduledMerges as LSM
1616
@@ -35,17 +35,17 @@ prop_LSM = Lockstep.runActions (Proxy :: Proxy Model)
3535
3636type ModelLSM = Int
3737
38- newtype Model = Model { mlsms :: Map ModelLSM (Map Key Value ) }
38+ newtype Model = Model { mlsms :: Map ModelLSM (Map Key ( Value , Maybe Blob ) ) }
3939 deriving stock (Show )
4040
4141type ModelOp r = Model -> (r , Model )
4242
43- modelNew :: ModelOp ModelLSM
44- modelInsert :: ModelLSM -> Key -> Value -> ModelOp ()
45- modelDelete :: ModelLSM -> Key -> ModelOp ()
46- modelLookup :: ModelLSM -> Key -> ModelOp (Maybe Value )
47- modelDuplicate :: ModelLSM -> ModelOp ModelLSM
48- modelDump :: ModelLSM -> ModelOp (Map Key Value )
43+ modelNew :: ModelOp ModelLSM
44+ modelInsert :: ModelLSM -> Key -> Value -> Maybe Blob -> ModelOp ()
45+ modelDelete :: ModelLSM -> Key -> ModelOp ()
46+ modelLookup :: ModelLSM -> Key -> ModelOp (LookupResult Value Blob )
47+ modelDuplicate :: ModelLSM -> ModelOp ModelLSM
48+ modelDump :: ModelLSM -> ModelOp (Map Key ( Value , Maybe Blob ) )
4949
5050initModel :: Model
5151initModel = Model { mlsms = Map. empty }
@@ -55,8 +55,8 @@ modelNew Model {mlsms} =
5555 where
5656 mlsm = Map. size mlsms
5757
58- modelInsert mlsm k v Model {mlsms} =
59- (() , Model { mlsms = Map. adjust (Map. insert k v ) mlsm mlsms })
58+ modelInsert mlsm k v b Model {mlsms} =
59+ (() , Model { mlsms = Map. adjust (Map. insert k (v, b) ) mlsm mlsms })
6060
6161modelDelete mlsm k Model {mlsms} =
6262 (() , Model { mlsms = Map. adjust (Map. delete k) mlsm mlsms })
@@ -65,7 +65,10 @@ modelLookup mlsm k model@Model {mlsms} =
6565 (result, model)
6666 where
6767 Just mval = Map. lookup mlsm mlsms
68- result = Map. lookup k mval
68+ result = case Map. lookup k mval of
69+ Nothing -> NotFound
70+ Just (v, Nothing ) -> Found v
71+ Just (v, Just b) -> FoundWithBlob v b
6972
7073modelDuplicate mlsm Model {mlsms} =
7174 (mlsm', Model { mlsms = Map. insert mlsm' mval mlsms })
@@ -85,6 +88,7 @@ instance StateModel (Lockstep Model) where
8588 AInsert :: ModelVar Model (LSM RealWorld )
8689 -> Either (ModelVar Model Key ) Key -- to refer to a prior key
8790 -> Value
91+ -> Maybe Blob
8892 -> Action (Lockstep Model ) (Key )
8993
9094 ADelete :: ModelVar Model (LSM RealWorld )
@@ -93,13 +97,13 @@ instance StateModel (Lockstep Model) where
9397
9498 ALookup :: ModelVar Model (LSM RealWorld )
9599 -> Either (ModelVar Model Key ) Key
96- -> Action (Lockstep Model ) (Maybe Value )
100+ -> Action (Lockstep Model ) (LookupResult Value Blob )
97101
98102 ADuplicate :: ModelVar Model (LSM RealWorld )
99103 -> Action (Lockstep Model ) (LSM RealWorld )
100104
101105 ADump :: ModelVar Model (LSM RealWorld )
102- -> Action (Lockstep Model ) (Map Key Value )
106+ -> Action (Lockstep Model ) (Map Key ( Value , Maybe Blob ) )
103107
104108 initialState = Lockstep. initialState initModel
105109 nextState = Lockstep. nextState
@@ -114,11 +118,16 @@ instance RunModel (Lockstep Model) IO where
114118
115119instance InLockstep Model where
116120 data ModelValue Model a where
117- MLSM :: ModelLSM -> ModelValue Model (LSM RealWorld )
118- MUnit :: () -> ModelValue Model ()
119- MInsert :: Key -> ModelValue Model (Key )
120- MLookup :: Maybe Value -> ModelValue Model (Maybe Value )
121- MDump :: Map Key Value -> ModelValue Model (Map Key Value )
121+ MLSM :: ModelLSM
122+ -> ModelValue Model (LSM RealWorld )
123+ MUnit :: ()
124+ -> ModelValue Model ()
125+ MInsert :: Key
126+ -> ModelValue Model Key
127+ MLookup :: LookupResult Value Blob
128+ -> ModelValue Model (LookupResult Value Blob )
129+ MDump :: Map Key (Value , Maybe Blob )
130+ -> ModelValue Model (Map Key (Value , Maybe Blob ))
122131
123132 data Observable Model a where
124133 ORef :: Observable Model (LSM RealWorld )
@@ -130,15 +139,15 @@ instance InLockstep Model where
130139 observeModel (MLookup x) = OId x
131140 observeModel (MDump x) = OId x
132141
133- usedVars ANew = []
134- usedVars (AInsert v evk _) = SomeGVar v
135- : case evk of Left vk -> [SomeGVar vk]; _ -> []
136- usedVars (ADelete v evk) = SomeGVar v
137- : case evk of Left vk -> [SomeGVar vk]; _ -> []
138- usedVars (ALookup v evk) = SomeGVar v
139- : case evk of Left vk -> [SomeGVar vk]; _ -> []
140- usedVars (ADuplicate v) = [SomeGVar v]
141- usedVars (ADump v) = [SomeGVar v]
142+ usedVars ANew = []
143+ usedVars (AInsert v evk _ _ ) = SomeGVar v
144+ : case evk of Left vk -> [SomeGVar vk]; _ -> []
145+ usedVars (ADelete v evk) = SomeGVar v
146+ : case evk of Left vk -> [SomeGVar vk]; _ -> []
147+ usedVars (ALookup v evk) = SomeGVar v
148+ : case evk of Left vk -> [SomeGVar vk]; _ -> []
149+ usedVars (ADuplicate v) = [SomeGVar v]
150+ usedVars (ADump v) = [SomeGVar v]
142151
143152 modelNextState = runModel
144153
@@ -154,13 +163,15 @@ instance InLockstep Model where
154163 [ (3 , fmap Some $
155164 AInsert <$> elements vars
156165 <*> freshKey
157- <*> arbitrary @ Value )
166+ <*> arbitrary @ Value
167+ <*> arbitrary @ (Maybe Blob ))
158168 ]
159169 -- inserts of the same keys as used earlier
160170 ++ [ (1 , fmap Some $
161171 AInsert <$> elements vars
162172 <*> existingKey
163- <*> arbitrary @ Value )
173+ <*> arbitrary @ Value
174+ <*> arbitrary @ (Maybe Blob ))
164175 | not (null kvars)
165176 ]
166177 -- deletes of arbitrary keys:
@@ -192,11 +203,11 @@ instance InLockstep Model where
192203 ADuplicate <$> elements vars)
193204 ]
194205
195- shrinkWithVars _ctx _model (AInsert var (Right k) v) =
196- [ Some $ AInsert var (Right k') v' | (k', v') <- shrink (k, v) ]
206+ shrinkWithVars _ctx _model (AInsert var (Right k) v b ) =
207+ [ Some $ AInsert var (Right k') v' b' | (k', v', b' ) <- shrink (k, v, b ) ]
197208
198- shrinkWithVars _ctx _model (AInsert var (Left _kv) v) =
199- [ Some $ AInsert var (Right k) v | k <- shrink (K 100 ) ]
209+ shrinkWithVars _ctx _model (AInsert var (Left _kv) v b ) =
210+ [ Some $ AInsert var (Right k' ) v' b' | (k', v', b') <- shrink (K 100 , v, b ) ]
200211
201212 shrinkWithVars _ctx _model (ADelete var (Right k)) =
202213 [ Some $ ADelete var (Right k') | k' <- shrink k ]
@@ -239,23 +250,19 @@ runActionIO :: Action (Lockstep Model) a
239250runActionIO action lookUp =
240251 stToIO $
241252 case action of
242- ANew -> new
243- AInsert var evk v -> insert tr (lookUpVar var) k v >> return k
253+ ANew -> new
254+ AInsert var evk v b -> insert tr (lookUpVar var) k v b >> return k
244255 where k = either lookUpVar id evk
245- ADelete var evk -> delete tr (lookUpVar var) k >> return ()
256+ ADelete var evk -> delete tr (lookUpVar var) k >> return ()
246257 where k = either lookUpVar id evk
247- ALookup var evk -> lookupResultValue <$ > lookup (lookUpVar var) k
258+ ALookup var evk - > lookup (lookUpVar var) k
248259 where k = either lookUpVar id evk
249- ADuplicate var -> duplicate (lookUpVar var)
250- ADump var -> logicalValue (lookUpVar var)
260+ ADuplicate var -> duplicate (lookUpVar var)
261+ ADump var -> logicalValue (lookUpVar var)
251262 where
252263 lookUpVar :: ModelVar Model a -> a
253264 lookUpVar = lookUpGVar (Proxy :: Proxy IO ) lookUp
254265
255- lookupResultValue NotFound = Nothing
256- lookupResultValue (Found v) = Just v
257- lookupResultValue (FoundWithBlob v _b) = Just v
258-
259266 tr :: Tracer (ST RealWorld ) Event
260267 tr = nullTracer
261268
@@ -268,8 +275,8 @@ runModel action ctx m =
268275 ANew -> (MLSM mlsm, m')
269276 where (mlsm, m') = modelNew m
270277
271- AInsert var evk v -> (MInsert k, m')
272- where (() , m') = modelInsert (lookUpLsMVar var) k v m
278+ AInsert var evk v b -> (MInsert k, m')
279+ where (() , m') = modelInsert (lookUpLsMVar var) k v b m
273280 k = either lookUpKeyVar id evk
274281
275282 ADelete var evk -> (MUnit () , m')
0 commit comments