delta-store-1.0.0.0: Facilities for storing a Haskell value, using delta types.
Copyright© 2022-2023 IOHK 2023-2025 Cardano Foundation
LicenseApache-2.0
Safe HaskellSafe-Inferred
LanguageHaskell2010

Test.Data.Store

Description

This module provides utilities for testing Store implementations.

Synopsis

Store laws

type GenDelta da = Base da -> Gen da Source #

Given a value, generate a random delta that applies to this value.

prop_StoreUpdate Source #

Arguments

:: (Monad m, Delta da, Eq (Base da), Show da, Show (Base da)) 
=> (forall b. m b -> IO b)

Function to embed the monad in IO

-> m (Store m qa da)

Creation for Store that is to be tested.

-> Gen (Base da)

Generator for the initial value.

-> GenDelta da

Generator for deltas.

-> Property 

Test whether the law on updateS is satisfied.

Subsumes test for the law on writeS / loadS.

Generators

data Chain da Source #

Chain of deltas and the results of their application.

The delta that is applied *last* appears in the list *first*.

Constructors

Chain [(Base da, da)] (Base da) 

Instances

Instances details
Show da => Show (Chain da) Source # 
Instance details

Defined in Test.Data.Store

Methods

showsPrec :: Int -> Chain da -> ShowS #

show :: Chain da -> String #

showList :: [Chain da] -> ShowS #

genChain :: Delta da => Gen (Base da) -> GenDelta da -> Gen (Chain da) Source #

Randomly generate a chain of deltas.

shrinkChain :: Chain da -> [Chain da] Source #

Shrink a chain of deltas.

Unit test DSL for developing a Store

data StoreUnitTest m qa da r Source #

A monadic DSL to unit test a Store.

Instances

Instances details
Monad m => Applicative (StoreUnitTest m qa da) Source # 
Instance details

Defined in Test.Data.Store

Methods

pure :: a -> StoreUnitTest m qa da a #

(<*>) :: StoreUnitTest m qa da (a -> b) -> StoreUnitTest m qa da a -> StoreUnitTest m qa da b #

liftA2 :: (a -> b -> c) -> StoreUnitTest m qa da a -> StoreUnitTest m qa da b -> StoreUnitTest m qa da c #

(*>) :: StoreUnitTest m qa da a -> StoreUnitTest m qa da b -> StoreUnitTest m qa da b #

(<*) :: StoreUnitTest m qa da a -> StoreUnitTest m qa da b -> StoreUnitTest m qa da a #

Functor m => Functor (StoreUnitTest m qa da) Source # 
Instance details

Defined in Test.Data.Store

Methods

fmap :: (a -> b) -> StoreUnitTest m qa da a -> StoreUnitTest m qa da b #

(<$) :: a -> StoreUnitTest m qa da b -> StoreUnitTest m qa da a #

Monad m => Monad (StoreUnitTest m qa da) Source # 
Instance details

Defined in Test.Data.Store

Methods

(>>=) :: StoreUnitTest m qa da a -> (a -> StoreUnitTest m qa da b) -> StoreUnitTest m qa da b #

(>>) :: StoreUnitTest m qa da a -> StoreUnitTest m qa da b -> StoreUnitTest m qa da b #

return :: a -> StoreUnitTest m qa da a #

unitTestStore :: (Monad m, Eq (Base da), Show (Base da), Show da) => Base da -> Store m qa da -> StoreUnitTest m qa da a -> m Property Source #

Run a unit test for a Store.

applyS :: (Monad m, Delta da) => da -> StoreUnitTest m qa da () Source #

Apply a delta to the current value.

checkLaw :: (Monad m, Eq (Base da), Show (Base da), Show da) => StoreUnitTest m qa da () Source #

Check the store laws.

reset :: Monad m => StoreUnitTest m qa da () Source #

Reset the store state to the initial value.

context :: Monad m => (Property -> Property) -> StoreUnitTest m qa da x -> StoreUnitTest m qa da x Source #

Add a context to test.

observe :: Monad m => (Base da -> Property) -> StoreUnitTest m qa da () Source #

Observe a property on the current value of the store.

ignore :: Monad m => StoreUnitTest m qa da x -> StoreUnitTest m qa da x Source #

Ignore the properties of a sub-test.