content: {-|
  Module      : Monomer.Widgets.Singles.ButtonSpec
  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 Button widget.
  -}
  module Monomer.Widgets.Singles.ButtonSpec (spec) where
  
  import Control.Lens ((&), (^.), (.~))
  import Data.Default
  import Data.Text (Text)
  import Test.Hspec
  
  import qualified Data.Sequence as Seq
  import qualified Data.Text as T
  
  import Monomer.Core
  import Monomer.Core.Combinators
  import Monomer.Event
  import Monomer.Graphics
  import Monomer.TestEventUtil
  import Monomer.TestUtil
  import Monomer.Widgets.Singles.Button
  
  import qualified Monomer.Lens as L
  
  data BtnEvent
    = BtnClick
    | GotFocus Path
    | LostFocus Path
    deriving (Eq, Show)
  
  spec :: Spec
  spec = describe "Button" $ do
    handleEvent
    getSizeReq
  
  handleEvent :: Spec
  handleEvent = describe "handleEvent" $ do
    it "should not generate an event if clicked outside" $
      clickEvts (Point 3000 3000) `shouldBe` Seq.empty
  
    it "should generate a user provided event when clicked" $
      clickEvts (Point 100 100) `shouldBe` Seq.singleton BtnClick
  
    it "should generate a user provided event when Enter/Space is pressed" $
      keyEvts keyReturn `shouldBe` Seq.singleton BtnClick
  
    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 ()
      btnNode = button_ "Click" BtnClick [onFocus GotFocus, onBlur LostFocus]
      clickEvts p = nodeHandleEventEvts wenv [evtClick p] btnNode
      keyEvts key = nodeHandleEventEvts wenv [KeyAction def key KeyPressed] btnNode
      events evt = nodeHandleEventEvts wenv [evt] btnNode
  
  getSizeReq :: Spec
  getSizeReq = describe "getSizeReq" $ do
    describe "fixed" $ do
      it "should return width = Fixed 50" $
        sizeReqW1 `shouldBe` fixedSize 50
  
      it "should return height = Fixed 20" $
        sizeReqH1 `shouldBe` fixedSize 20
  
    describe "flex" $ do
      it "should return width = Flex 70 1" $
        sizeReqW2 `shouldBe` flexSize 70 1
  
      it "should return height = Flex 20 2" $
        sizeReqH2 `shouldBe` flexSize 20 2
  
    describe "multi" $ do
      it "should return width = Fixed 50" $
        sizeReqW3 `shouldBe` fixedSize 50
  
      it "should return height = Flex 60 1" $
        sizeReqH3 `shouldBe` flexSize 60 1
  
    where
      wenv = mockWenv ()
      btnNode1 = button "Click" BtnClick
      btnNode2 = button_ "Click 2" BtnClick [resizeFactorW 1, resizeFactorH 2]
      btnNode3 = button_ "Line    line    line" BtnClick [multiline, trimSpaces] `styleBasic` [width 50]
      (sizeReqW1, sizeReqH1) = nodeGetSizeReq wenv btnNode1
      (sizeReqW2, sizeReqH2) = nodeGetSizeReq wenv btnNode2
      (sizeReqW3, sizeReqH3) = nodeGetSizeReq wenv btnNode3
  