packages feed

monomer-1.0.0.0: test/unit/Monomer/Widgets/Singles/LabelSpec.hs

{-|
Module      : Monomer.Widgets.Singles.LabelSpec
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 Label widget.
-}
module Monomer.Widgets.Singles.LabelSpec (spec) where

import Control.Lens ((&), (^.), (^?!), (.~), ix)
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.TestUtil
import Monomer.Widgets.Singles.Label

import qualified Monomer.Lens as L

spec :: Spec
spec = describe "Label" $ do
  getSizeReq
  getSizeReqMulti
  getSizeReqMultiKeepSpaces
  getSizeReqMultiMaxLines
  getSizeReqMerge
  resize

getSizeReq :: Spec
getSizeReq = describe "getSizeReq" $ do
  it "should return width = Fixed 100" $
    sizeReqW `shouldBe` fixedSize 100

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

  it "should return width = Flex 120 1" $
    sizeReq2W `shouldBe` flexSize 120 1

  it "should return height = Flex 20 2" $
    sizeReq2H `shouldBe` flexSize 20 2

  it "should return width = Flex 120 1" $
    sizeReq3W `shouldBe` flexSize 120 0.01

  it "should return height = Flex 20 2" $
    sizeReq3H `shouldBe` flexSize 20 0.01

  where
    wenv = mockWenv ()
    lblNode = label "Test label"
    lblNode2 = label_ "Test label 2" [resizeFactorW 1, resizeFactorH 2]
    lblNode3 = label_ "Test label 3" [ellipsis]
    (sizeReqW, sizeReqH) = nodeGetSizeReq wenv lblNode
    (sizeReq2W, sizeReq2H) = nodeGetSizeReq wenv lblNode2
    (sizeReq3W, sizeReq3H) = nodeGetSizeReq wenv lblNode3

getSizeReqMulti :: Spec
getSizeReqMulti = describe "getSizeReq" $ do
  it "should return width = Fixed 50" $
    sizeReqW `shouldBe` fixedSize 50

  it "should return height = Flex 60 1" $
    sizeReqH `shouldBe` flexSize 60 1

  where
    wenv = mockWenv ()
    lblNode = label_ "Line    line    line" [multiline, trimSpaces] `styleBasic` [width 50]
    (sizeReqW, sizeReqH) = nodeGetSizeReq wenv lblNode

getSizeReqMultiKeepSpaces :: Spec
getSizeReqMultiKeepSpaces = describe "getSizeReq" $ do
  it "should return width = Max 50 1" $
    sizeReqW `shouldBe` maxSize 50 1

  it "should return height = Flex 100 1" $
    sizeReqH `shouldBe` flexSize 100 1

  where
    wenv = mockWenv ()
    caption = "Line    line    line"
    lblNode = label_ caption [multiline, trimSpaces_ False] `styleBasic` [maxWidth 50]
    (sizeReqW, sizeReqH) = nodeGetSizeReq wenv lblNode

getSizeReqMultiMaxLines :: Spec
getSizeReqMultiMaxLines = describe "getSizeReq" $ do
  it "should return width = Max 50 1" $
    sizeReqW `shouldBe` maxSize 50 1

  it "should return height = Flex 80 1" $
    sizeReqH `shouldBe` flexSize 80 1

  where
    wenv = mockWenv ()
    caption = "Line    line    line    line    line"
    lblNode = label_ caption [multiline, trimSpaces_ False, maxLines 4] `styleBasic` [maxWidth 50]
    (sizeReqW, sizeReqH) = nodeGetSizeReq wenv lblNode

getSizeReqMerge :: Spec
getSizeReqMerge = describe "getSizeReqMerge" $ do
  it "should return width = Fixed 320" $
    sizeReqW `shouldBe` fixedSize 320

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

  it "should return width = Fixed 600" $
    sizeReq2W `shouldBe` fixedSize 600

  it "should return height = Fixed 20" $
    sizeReq2H `shouldBe` fixedSize 20

  where
    fontMgr = mockFontManager {
      computeGlyphsPos = mockGlyphsPos Nothing
    }
    wenv = mockWenvEvtUnit ()
      & L.fontManager .~ fontMgr
    lblNode = nodeInit wenv (label "Test Label")
    lblNode2 = label "Test Label" `styleBasic` [textSize 60]
    lblRes = widgetMerge (lblNode2 ^. L.widget) wenv lblNode2 lblNode
    WidgetResult lblMerged _ = lblRes
    lblInfo = lblNode ^. L.info
    mrgInfo = lblMerged ^. L.info
    (sizeReqW, sizeReqH) = (lblInfo ^. L.sizeReqW, lblInfo ^. L.sizeReqH)
    (sizeReq2W, sizeReq2H) = (mrgInfo ^. L.sizeReqW, mrgInfo ^. L.sizeReqH)

resize :: Spec
resize = describe "resize" $ do
  it "should resize single line in a single step" $
    reqsSingle `shouldBe` Seq.Empty

  it "should resize multi line in two steps" $
    reqsMulti ^?! ix 0 `shouldSatisfy` isResizeWidgets

  where
    wenv = mockWenvEvtUnit ()
    vp = Rect 0 0 640 480
    single = label "Test label"
    resizeCheck = const True
    resSingle = widgetResize (single ^. L.widget) wenv single vp resizeCheck
    reqsSingle = resSingle ^. L.requests
    multi = label_ "Test label" [multiline]
    resMulti = widgetResize (multi ^. L.widget) wenv multi vp resizeCheck
    reqsMulti = resMulti ^. L.requests