packages feed

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

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

import Control.Lens ((&), (^.), (.~), _2)
import Data.Text (Text)
import Test.Hspec

import qualified Data.Sequence as Seq

import Monomer.Core
import Monomer.Event
import Monomer.TestUtil
import Monomer.Widgets.Singles.Image

import qualified Monomer.Lens as L

spec :: Spec
spec = describe "Image"
  initMergeWidget

initMergeWidget :: Spec
initMergeWidget = describe "init/merge" $ do
  it "should create a RunTask on init" $ do
    Seq.length reqs1 `shouldBe` 1
    Seq.index reqs1 0 `shouldSatisfy` isRunTask

  it "should not create a task when merging to the same path" $
    Seq.length reqs2 `shouldBe` 0

  it "should create a task when merging to a different path" $ do
    Seq.length reqs3 `shouldBe` 2
    Seq.index reqs3 0 `shouldSatisfy` isRemoveRendererImage
    Seq.index reqs3 1 `shouldSatisfy` isRunTask

  it "should have one widgetId on init (loading)" $
    ctx1 ^. L.widgetPaths `shouldSatisfy` (== 1) . length

  it "should not have any widgetId on merge with the same image (not loading)" $
    ctx2 ^. L.widgetPaths `shouldSatisfy` null

  it "should have one widgetId on merge with a different image (loading)" $
    ctx3 ^. L.widgetPaths `shouldSatisfy` (== 1) . length

  where
    wenv = mockWenvEvtUnit ()
    node1 = image "assets/images/beach.jpg"
    node2 = image "assets/images/beach.jpg"
    node3 = image "assets/images/beach2.jpg"
    initRes = widgetInit (node1 ^. L.widget) wenv node1
    WidgetResult newNode1 reqs1 = initRes
    mergeRes1 = widgetMerge (node2 ^. L.widget) wenv node2 newNode1
    WidgetResult _ reqs2 = mergeRes1
    mergeRes2 = widgetMerge (node3 ^. L.widget) wenv node3 newNode1
    WidgetResult _ reqs3 = mergeRes2
    ctx1 = nodeHandleResult wenv initRes ^. _2
    ctx2 = nodeHandleResult wenv mergeRes1 ^. _2
    ctx3 = nodeHandleResult wenv mergeRes2 ^. _2