packages feed

cursor-gen-0.0.0.0: test/Cursor/Simple/Map/KeyValueSpec.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module Cursor.Simple.Map.KeyValueSpec
    ( spec
    ) where

import Test.Hspec
import Test.QuickCheck
import Test.Validity

import Cursor.Simple.Map.KeyValue
import Cursor.Simple.Map.KeyValue.Gen ()

spec :: Spec
spec = do
    describe "makeKeyValueCursorKey" $
        it "produces valid cursors" $
        producesValidsOnValids2
            (makeKeyValueCursorKey @Double @Rational @Double @Rational)
    describe "makeKeyValueCursorValue" $
        it "produces valid cursors" $
        producesValidsOnValids2
            (makeKeyValueCursorValue @Double @Rational @Double @Rational)
    describe "rebuildKeyValueCursor" $
        it "produces valid tuples" $
        producesValidsOnValids (rebuildKeyValueCursor @Double @Rational)
    describe "keyValueCursorSelection" $
        it "produces valid selections" $
        producesValidsOnValids
            (keyValueCursorSelection @Double @Rational @Double @Rational)
    describe "keyValueCursorSelectKey" $ do
        it "produces valid cursors" $
            producesValidsOnValids (keyValueCursorSelectKey @Double @Rational)
        it "is a movement" $ isMovement keyValueCursorSelectKey
    describe "keyValueCursorSelectValue" $ do
        it "produces valid cursors" $
            producesValidsOnValids (keyValueCursorSelectValue @Double @Rational)
        it "is a movement" $ isMovement keyValueCursorSelectValue
    describe "keyValueCursorToggleSelected" $ do
        it "produces valid cursors" $
            producesValidsOnValids
                (keyValueCursorToggleSelected @Double @Rational)
        it "is a movement" $ isMovement keyValueCursorToggleSelected

isMovement :: (forall k v. KeyValueCursor k v -> KeyValueCursor k v) -> Property
isMovement func =
    forAllValid $ \lec ->
        rebuildKeyValueCursor (lec :: KeyValueCursor Double Rational) `shouldBe`
        rebuildKeyValueCursor (func lec)