packages feed

focus-1.0.3.1: test/Main.hs

module Main where

import qualified Focus
import Test.Tasty
import Test.Tasty.HUnit
import Prelude hiding (choose)

main :: IO ()
main =
  defaultMain $
    testGroup "" $
      [ testCase "Monadically composed lookup and insert (https://github.com/nikita-volkov/stm-containers/issues/25)" $
          let Focus.Focus absent present = do
                prev <- Focus.lookup
                Focus.insert "one"
                pure (isJust prev)
           in do
                assertEqual "" (True, Focus.Set "one") $ runIdentity (present "zero")
                assertEqual "" (False, Focus.Set "one") $ runIdentity absent,
        testCase "Applicatively composed lookup and insert" $
          let Focus.Focus absent present = (isJust <$> Focus.lookup) <* Focus.insert "one"
           in do
                assertEqual "" (True, Focus.Set "one") $ runIdentity (present "zero")
                assertEqual "" (False, Focus.Set "one") $ runIdentity absent,
        testCase "Applicatively composed pure and insert" $
          let Focus.Focus absent present = pure () <* Focus.insert "one"
           in do
                assertEqual "" ((), Focus.Set "one") (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Set "one") (runIdentity absent),
        testCase "insert" $
          let Focus.Focus absent present = Focus.insert "one"
           in do
                assertEqual "" ((), Focus.Set "one") (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Set "one") (runIdentity absent),
        testCase "alter" $
          let f :: Maybe String -> Maybe String
              f = const Nothing
              Focus.Focus absent present = Focus.alter f
           in do
                assertEqual "" ((), Focus.Remove) (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Leave) (runIdentity absent),
        testCase "update" $
          let f :: String -> Maybe String
              f = const Nothing
              Focus.Focus absent present = Focus.update f
           in do
                assertEqual "" ((), Focus.Remove) (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Leave) (runIdentity absent),
        testCase "updateM" $
          let f :: String -> Identity (Maybe String)
              f = const (pure Nothing)
              Focus.Focus absent present = Focus.updateM f
           in do
                assertEqual "" ((), Focus.Remove) (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Leave) (runIdentity absent),
        testCase "delete" $
          let Focus.Focus absent present = Focus.delete
           in do
                assertEqual "" ((), Focus.Remove) (runIdentity (present "zero"))
                assertEqual "" ((), Focus.Leave @()) (runIdentity absent),
        testCase "Monadically composed lookup and delete (https://github.com/nikita-volkov/focus/issues/7)" $
          let Focus.Focus absent present = do
                a <- Focus.lookup
                Focus.delete
                pure a
           in do
                assertEqual "" (Just (), Focus.Remove) (runIdentity (present ()))
                assertEqual "" (Nothing @(), Focus.Leave) (runIdentity absent)
      ]