| 
 Module       :  . Widgets . Containers . BoxShadowSpec 
 Copyright    : ( c ) 2022   ,   
 License      : BSD-3 - Clause ( see the LICENSE file ) 
 Maintainer   :  
 Stability    : experimental 
 Portability : non - portable 

 Unit tests for BoxShadow widget . 

Module      : Monomer.Widgets.Containers.BoxShadowSpec
Copyright   : (c) 2022 Gareth Smith, Francisco Vallarino
License     : BSD-3-Clause (see the LICENSE file)
Maintainer  : 
Stability   : experimental
Portability : non-portable

Unit tests for BoxShadow widget.
-}

module Monomer.Widgets.Containers.BoxShadowSpec (spec) where

import Control.Lens ((^.))
import Test.Hspec

import qualified Data.Sequence as Seq

import Monomer.Core
import Monomer.Core.Combinators
import Monomer.TestUtil
import Monomer.Widgets.Containers.BoxShadow
import Monomer.Widgets.Singles.Label

import qualified Monomer.Lens as L

spec :: Spec
spec = describe "BoxShadow" $ do
  getSizeReq
  resize

getSizeReq :: Spec
getSizeReq = describe "getSizeReq" $ do
  it "should return child width plus radius on each side" $ do
    sizeW `shouldBe` fixedSize (6 + 7 * 2)

  it "should return child height plus radius on each side" $ do
    sizeH `shouldBe` fixedSize (9 + 7 * 2)

  where
    wenv = mockWenvEvtUnit ()
    boxShadowNode = boxShadow_ [radius 7] $
      label "test" `styleBasic` [sizeReqW (fixedSize 6), sizeReqH (fixedSize 9)]
    (sizeW, sizeH) = nodeGetSizeReq wenv boxShadowNode

resize :: Spec
resize = describe "resize" $ do
  it "shadow in middle-center should put child in middle-center" $ do
    childVp [radius 8, alignMiddle, alignCenter] `shouldBe` Rect 8 8 624 464

  it "shadow in top-left should put child in bottom-right" $ do
    childVp [radius 8, alignTop, alignLeft] `shouldBe` Rect 10 10 624 464

  it "shadow in bottom-right should put child in top-left" $ do
    childVp [radius 8, alignBottom, alignRight] `shouldBe` Rect 6 6 624 464

  it "shadow in default location should put child in top-center" $ do
    childVp [radius 8] `shouldBe` Rect 8 6 624 464

  where
    wenv = mockWenvEvtUnit ()
    childVp config = childWidget ^. L.info . L.viewport where
      node = boxShadow_ config (label "test")
      initedNode = nodeInit wenv node
      childWidget = Seq.index (initedNode ^. L.children) 0

| 
 Module       :  . Widgets . Containers . BoxShadowSpec 
 Copyright    : ( c ) 2022   ,   
 License      : BSD-3 - Clause ( see the LICENSE file ) 
 Maintainer   :  
 Stability    : experimental 
 Portability : non - portable 

 Unit tests for BoxShadow widget . 

Module      : Monomer.Widgets.Containers.BoxShadowSpec
Copyright   : (c) 2022 Gareth Smith, Francisco Vallarino
License     : BSD-3-Clause (see the LICENSE file)
Maintainer  : 
Stability   : experimental
Portability : non-portable

Unit tests for BoxShadow widget.
-}

module Monomer.Widgets.Containers.BoxShadowSpec (spec) where

import Control.Lens ((^.))
import Test.Hspec

import qualified Data.Sequence as Seq

import Monomer.Core
import Monomer.Core.Combinators
import Monomer.TestUtil
import Monomer.Widgets.Containers.BoxShadow
import Monomer.Widgets.Singles.Label

import qualified Monomer.Lens as L

spec :: Spec
spec = describe "BoxShadow" $ do
  getSizeReq
  resize

getSizeReq :: Spec
getSizeReq = describe "getSizeReq" $ do
  it "should return child width plus radius on each side" $ do
    sizeW `shouldBe` fixedSize (6 + 7 * 2)

  it "should return child height plus radius on each side" $ do
    sizeH `shouldBe` fixedSize (9 + 7 * 2)

  where
    wenv = mockWenvEvtUnit ()
    boxShadowNode = boxShadow_ [radius 7] $
      label "test" `styleBasic` [sizeReqW (fixedSize 6), sizeReqH (fixedSize 9)]
    (sizeW, sizeH) = nodeGetSizeReq wenv boxShadowNode

resize :: Spec
resize = describe "resize" $ do
  it "shadow in middle-center should put child in middle-center" $ do
    childVp [radius 8, alignMiddle, alignCenter] `shouldBe` Rect 8 8 624 464

  it "shadow in top-left should put child in bottom-right" $ do
    childVp [radius 8, alignTop, alignLeft] `shouldBe` Rect 10 10 624 464

  it "shadow in bottom-right should put child in top-left" $ do
    childVp [radius 8, alignBottom, alignRight] `shouldBe` Rect 6 6 624 464

  it "shadow in default location should put child in top-center" $ do
    childVp [radius 8] `shouldBe` Rect 8 6 624 464

  where
    wenv = mockWenvEvtUnit ()
    childVp config = childWidget ^. L.info . L.viewport where
      node = boxShadow_ config (label "test")
      initedNode = nodeInit wenv node
      childWidget = Seq.index (initedNode ^. L.children) 0
