packages feed

taskell-1.10.0: test/Taskell/IO/KeyboardTest.hs

{-# LANGUAGE OverloadedLists #-}

module Taskell.IO.KeyboardTest
    ( test_keyboard
    ) where

import ClassyPrelude

import Test.Tasty
import Test.Tasty.HUnit

import Control.Lens ((.~))

import Data.Time.Clock (secondsToDiffTime)
import Data.Time.Zones (utcTZ)

import Graphics.Vty.Input.Events       (Event (..), Key (..))
import Taskell.Data.Lists              (initial)
import Taskell.Events.Actions.Types    as A
import Taskell.Events.State            (create, quit)
import Taskell.Events.State.Types      (State, Stateful, mode)
import Taskell.Events.State.Types.Mode (Mode (Shutdown))
import Taskell.IO.Keyboard             (generate)
import Taskell.IO.Keyboard.Types

mockTime :: UTCTime
mockTime = UTCTime (ModifiedJulianDay 20) (secondsToDiffTime 0)

tester :: BoundActions -> Event -> Stateful
tester actions ev state = lookup ev actions >>= ($ state)

cleanState :: State
cleanState = create utcTZ mockTime "taskell.md" initial

basicBindings :: Bindings
basicBindings = [(BChar 'q', A.Quit)]

basicActions :: Actions
basicActions = [(A.Quit, quit)]

basicResult :: Maybe State
basicResult = Just $ (mode .~ Shutdown) cleanState

test_keyboard :: TestTree
test_keyboard =
    testGroup
        "IO.Keyboard"
        [ testCase
              "generate"
              (assertEqual
                   "Parses basic"
                   basicResult
                   (tester (generate basicBindings basicActions) (EvKey (KChar 'q') []) cleanState))
        ]