monomer-1.6.0.0: test/unit/Monomer/Widgets/Animation/TransformSpec.hs
{-|
Module : Monomer.Widgets.Animation.TransformSpec
Copyright : (c) 2023 Ruslan Gadeev, Francisco Vallarino
License : BSD-3-Clause (see the LICENSE file)
Maintainer : fjvallarino@gmail.com
Stability : experimental
Portability : non-portable
Unit tests for Transform animation.
-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Monomer.Widgets.Animation.TransformSpec (spec) where
import Control.Lens ((&), (^.), (.~), (?~), (^?!), _1, _3, ix)
import Data.Default
import Data.Text (Text)
import Test.Hspec
import qualified Data.Sequence as Seq
import Monomer.Core
import Monomer.Core.Combinators
import Monomer.Event
import Monomer.TestUtil
import Monomer.TestEventUtil
import Monomer.Widgets.Animation.Transform
import Monomer.Widgets.Animation.Types
import Monomer.Widgets.Containers.Scroll
import Monomer.Widgets.Containers.Stack
import Monomer.Widgets.Singles.Label
import qualified Monomer.Lens as L
data TestEvt
= OnTestFinished
deriving (Eq, Show)
spec :: Spec
spec = describe "Transform" $ do
initWidget
handleMessage
getSizeReq
initWidget :: Spec
initWidget = describe "initWidget" $ do
it "should not request rendering if autoStart = False" $
reqs nodeNormal `shouldBe` Seq.empty
it "should request rendering if autoStart = True" $ do
reqs nodeAuto ^?! ix 0 `shouldSatisfy` isRunTask
reqs nodeAuto ^?! ix 1 `shouldSatisfy` isRenderEvery
where
wenv = mockWenvEvtUnit ()
f _ _ = []
nodeNormal = animTransform f (label "Test")
nodeAuto = animTransform_ [autoStart, duration 100] f (label "Test")
reqs node = nodeHandleEvents_ wenv WInit [] node ^?! ix 0 . _1 . _3
handleMessage :: Spec
handleMessage = describe "handleMessage" $ do
it "should not request rendering if an invalid message is received" $
reqs ScrollReset `shouldBe` Seq.empty
it "should request rendering if AnimationStart is received" $ do
reqs AnimationStart ^?! ix 0 `shouldSatisfy` isRunTask
reqs AnimationStart ^?! ix 1 `shouldSatisfy` isRenderEvery
evts AnimationStart `shouldBe` Seq.empty
it "should cancel rendering if AnimationStop is received" $ do
reqs AnimationStop ^?! ix 0 `shouldSatisfy` isRenderStop
evts AnimationStop `shouldBe` Seq.empty
it "should generate an event if AnimationFinished is received" $
evts (AnimationFinished 0) `shouldBe` Seq.singleton OnTestFinished
where
wenv = mockWenv ()
f _ _ = []
baseNode = animTransform_ [autoStart, duration 100, onFinished OnTestFinished] f (label "Test")
node = nodeInit wenv baseNode
res msg = widgetHandleMessage (node^. L.widget) wenv node rootPath msg
evts msg = eventsFromReqs (reqs msg)
reqs msg = maybe Seq.empty (^. L.requests) (res msg)
getSizeReq :: Spec
getSizeReq = describe "getSizeReq" $ do
it "should return same reqW as child node" $
tSizeReqW `shouldBe` lSizeReqW
it "should return same reqH as child node" $
tSizeReqH `shouldBe` lSizeReqH
where
wenv = mockWenvEvtUnit ()
lblNode = label "Test label"
f _ _ = []
(lSizeReqW, lSizeReqH) = nodeGetSizeReq wenv lblNode
(tSizeReqW, tSizeReqH) = nodeGetSizeReq wenv (animTransform f lblNode)