packages feed

crdt-0.4: test/GCounter.hs

{-# OPTIONS_GHC -Wno-orphans #-}

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}

module GCounter
    ( gCounter
    ) where

import           Test.QuickCheck (Arbitrary, arbitrary)
import           Test.Tasty (TestTree, testGroup)
import           Test.Tasty.QuickCheck (testProperty)

import           CRDT.Cm (update)
import qualified CRDT.GCounter.Cm as Cm
import qualified CRDT.GCounter.Cv as Cv
import qualified CRDT.GCounter.Cv.Internal as Cv

import           Laws (cmrdtLaws, cvrdtLaws)

instance Arbitrary (Cm.GCounter a) where
    arbitrary = pure Cm.Increment

deriving instance Arbitrary a => Arbitrary (Cv.GCounter a)

gCounter :: TestTree
gCounter = testGroup "GCounter"
    [ testGroup "Cv"
        [ cvrdtLaws @(Cv.GCounter Int)
        , testProperty "increment" $
            \(counter :: Cv.GCounter Int) i ->
                Cv.query (Cv.increment i counter)
                == succ (Cv.query counter)
        ]
    , testGroup "Cm"
        [ cmrdtLaws @(Cm.GCounter Int)
        , testProperty "increment" $
            \(counter :: Int) -> update Cm.Increment counter == succ counter
        ]
    ]