packages feed

changeset-lens-0.1.0.0: test/Setter.hs

module Setter where

-- base
import Prelude hiding (Foldable (..))

-- lens
import Control.Lens (Lens', lens)

-- tasty
import Test.Tasty

-- tasty-hunit
import Test.Tasty.HUnit (testCase, (@?=))

-- containers
import qualified Data.IntMap as IM

-- changeset
import Control.Monad.Changeset.Class
import Control.Monad.Trans.Changeset

-- changeset-lens
import Control.Monad.Changeset.Lens
import Control.Monad.Changeset.Lens.Ixed ((|>!))
import Control.Monad.Changeset.Lens.Setter (setterChangeset)

data Big = Big
  { irrelevant :: String
  , counter :: Int
  }
  deriving (Eq, Show)

lensCounter :: Lens' Big Int
lensCounter = lens counter $ \big counter -> big {counter}

tests :: TestTree
tests =
  testGroup
    "Setter"
    [ testGroup
        "Small change on big data structure"
        [ testCase "single change" $ execChangeset (change (lensChangeset lensCounter (singleChange Increment))) (Big "foo" 0) @?= Big "foo" 1
        ]
    , testGroup
        "nested IxedChangeset with SetterChangeset"
        [ testCase "Can apply setter changeset inside indexed structure" $
            let initialState = IM.fromList [(0, Big "" 0), (1, Big "" 0)]
                action = do
                  2 |>! setterChangeset lensCounter (singleChange Increment)
                  s <- current
                  1 |>! setterChangeset lensCounter (singleChange Increment)
                  2 |>! setterChangeset lensCounter (singleChange Increment)
                  return s
             in runChangeset action initialState
                  @?= ( initialState
                      , IM.fromList
                          [ (0, Big "" 0)
                          , (1, Big "" 1)
                          ]
                      )
        ]
    ]