packages feed

monomer-1.5.1.0: test/unit/Monomer/Widgets/Singles/ColorPickerSpec.hs

{-|
Module      : Monomer.Widgets.Singles.ColorPickerSpec
Copyright   : (c) 2018 Francisco Vallarino
License     : BSD-3-Clause (see the LICENSE file)
Maintainer  : fjvallarino@gmail.com
Stability   : experimental
Portability : non-portable

Unit tests for ColorPicker widget.
-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

module Monomer.Widgets.Singles.ColorPickerSpec (spec) where

import Control.Lens ((&), (^.), (.~))
import Control.Lens.TH (abbreviatedFields, makeLensesWith)
import Data.Default
import Test.Hspec

import qualified Data.Sequence as Seq

import Monomer.Core
import Monomer.Core.Combinators
import Monomer.Event
import Monomer.Graphics
import Monomer.TestEventUtil
import Monomer.TestUtil
import Monomer.Widgets.Singles.ColorPicker

import qualified Monomer.Lens as L

data PickerEvent
  = ColorChanged Color
  | GotFocus Path
  | LostFocus Path
  deriving (Eq, Show)

newtype TestModel = TestModel {
  _tmColor :: Color
} deriving (Eq, Show)

makeLensesWith abbreviatedFields ''TestModel

spec :: Spec
spec = describe "ColorPicker" $ do
  handleEvent
  handleEventV
  getSizeReq

handleEvent :: Spec
handleEvent = describe "handleEvent" $ do
  it "should update the model" $
    model (Point 285 10) ^. color `shouldBe` rgb 127 0 0

  it "should generate an event when focus is received" $
    events evtFocus `shouldBe` Seq.singleton (GotFocus emptyPath)

  it "should generate an event when focus is lost" $
    events evtBlur `shouldBe` Seq.singleton (LostFocus emptyPath)

  where
    wenv = mockWenv (TestModel (rgb 0 0 0))
    pckNode = colorPicker_ color [onFocus GotFocus, onBlur LostFocus]
    model p = nodeHandleEventModel wenv [evtRelease p] pckNode
    events evt = nodeHandleEventEvts wenv [evt] pckNode

handleEventV :: Spec
handleEventV = describe "handleEventV" $ do
  it "should generate a change event" $
    events (evtRelease (Point 440 30)) `shouldBe` Seq.singleton (ColorChanged (rgb 0 200 0))

  it "should generate an event when focus is received" $
    events evtFocus `shouldBe` Seq.singleton (GotFocus emptyPath)

  it "should generate an event when focus is lost" $
    events evtBlur `shouldBe` Seq.singleton (LostFocus emptyPath)

  where
    wenv = mockWenv (TestModel (rgb 0 0 0))
    pckNode = colorPickerV_ (rgb 0 0 0) ColorChanged [onFocus GotFocus, onBlur LostFocus]
    events evt = nodeHandleEventEvts wenv [evt] pckNode

getSizeReq :: Spec
getSizeReq = describe "getSizeReq" $ do
  it "should return width = Range 97 1097" $
    sizeReqW `shouldBe` rangeSize 97 1097 1

  it "should return height = Fixed 64" $
    sizeReqH `shouldBe` fixedSize 64

  where
    wenv = mockWenvEvtUnit (TestModel (rgb 0 0 0))
    (sizeReqW, sizeReqH) = nodeGetSizeReq wenv (colorPicker color)