Add tests for zstack

This commit is contained in:
Francisco Vallarino 2020-11-20 21:52:38 -03:00
parent ab3ed575af
commit 76cb616f52
5 changed files with 168 additions and 17 deletions

View File

@ -81,24 +81,24 @@ sizeReqMergeSum :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeSum req1 req2 = case (req1, req2) of sizeReqMergeSum req1 req2 = case (req1, req2) of
-- Fixed -- Fixed
(FixedSize s1, FixedSize s2) -> FixedSize (s1 + s2) (FixedSize s1, FixedSize s2) -> FixedSize (s1 + s2)
(FixedSize s1, FlexSize s2 f2) -> RangeSize s1 (s1 + s2) f2 (FixedSize s1, FlexSize s2 f2) -> mkRangeSize s1 (s1 + s2) f2
(FixedSize s1, MinSize s2 f2) -> MinSize (s1 + s2) f2 (FixedSize s1, MinSize s2 f2) -> MinSize (s1 + s2) f2
(FixedSize s1, MaxSize s2 f2) -> RangeSize s1 (s1 + s2) f2 (FixedSize s1, MaxSize s2 f2) -> mkRangeSize s1 (s1 + s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (s1 + sb2) f2 (FixedSize s1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (s1 + sb2) f2
-- Flex -- Flex
(FlexSize s1 f1, FlexSize s2 f2) -> FlexSize (s1 + s2) (max f1 f2) (FlexSize s1 f1, FlexSize s2 f2) -> FlexSize (s1 + s2) (max f1 f2)
(FlexSize s1 f1, MinSize s2 f2) -> RangeSize s2 (s1 + s2) (max f1 f2) (FlexSize s1 f1, MinSize s2 f2) -> mkRangeSize s2 (s1 + s2) (max f1 f2)
(FlexSize s1 f1, MaxSize s2 f2) -> FlexSize (s1 + s2) (max f1 f2) (FlexSize s1 f1, MaxSize s2 f2) -> FlexSize (s1 + s2) (max f1 f2)
(FlexSize s1 f1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (s1 + sb2) (max f1 f2) (FlexSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (s1 + sb2) (max f1 f2)
-- Min -- Min
(MinSize s1 f1, MinSize s2 f2) -> MinSize (s1 + s2) (max f1 f2) (MinSize s1 f1, MinSize s2 f2) -> MinSize (s1 + s2) (max f1 f2)
(MinSize s1 f1, MaxSize s2 f2) -> RangeSize s1 (s1 + s2) (max f1 f2) (MinSize s1 f1, MaxSize s2 f2) -> mkRangeSize s1 (s1 + s2) (max f1 f2)
(MinSize s1 f1, RangeSize sa2 sb2 f2) -> RangeSize (s1 + sa2) (s1 + sb2) (max f1 f2) (MinSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize (s1 + sa2) (s1 + sb2) (max f1 f2)
-- Max -- Max
(MaxSize s1 f1, MaxSize s2 f2) -> MaxSize (s1 + s2) (max f1 f2) (MaxSize s1 f1, MaxSize s2 f2) -> MaxSize (s1 + s2) (max f1 f2)
(MaxSize s1 f1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (s1 + sb2) (max f1 f2) (MaxSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (s1 + sb2) (max f1 f2)
-- Range -- Range
(RangeSize sa1 sb1 f1, RangeSize sa2 sb2 f2) -> RangeSize (sa1 + sa2) (sb1 + sb2) (max f1 f2) (RangeSize sa1 sb1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize (sa1 + sa2) (sb1 + sb2) (max f1 f2)
-- Reverse handled with existing cases -- Reverse handled with existing cases
(pending1, pending2) -> sizeReqMergeSum pending2 pending1 (pending1, pending2) -> sizeReqMergeSum pending2 pending1
@ -106,24 +106,24 @@ sizeReqMergeMax :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeMax req1 req2 = case (req1, req2) of sizeReqMergeMax req1 req2 = case (req1, req2) of
-- Fixed -- Fixed
(FixedSize s1, FixedSize s2) -> FixedSize (max s1 s2) (FixedSize s1, FixedSize s2) -> FixedSize (max s1 s2)
(FixedSize s1, FlexSize s2 f2) -> RangeSize s1 (max s1 s2) f2 (FixedSize s1, FlexSize s2 f2) -> mkRangeSize s1 (max s1 s2) f2
(FixedSize s1, MinSize s2 f2) -> MinSize (max s1 s2) f2 (FixedSize s1, MinSize s2 f2) -> MinSize (max s1 s2) f2
(FixedSize s1, MaxSize s2 f2) -> RangeSize s1 (max s1 s2) f2 (FixedSize s1, MaxSize s2 f2) -> mkRangeSize s1 (max s1 s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> RangeSize (max s1 sa2) (max s1 sb2) f2 (FixedSize s1, RangeSize sa2 sb2 f2) -> mkRangeSize (max s1 sa2) (max s1 sb2) f2
-- Flex -- Flex
(FlexSize s1 f1, FlexSize s2 f2) -> FlexSize (max s1 s2) (max f1 f2) (FlexSize s1 f1, FlexSize s2 f2) -> FlexSize (max s1 s2) (max f1 f2)
(FlexSize s1 f1, MinSize s2 f2) -> MinSize s2 (max f1 f2) (FlexSize s1 f1, MinSize s2 f2) -> MinSize s2 (max f1 f2)
(FlexSize s1 f1, MaxSize s2 f2) -> FlexSize (max s1 s2) f1 (FlexSize s1 f1, MaxSize s2 f2) -> FlexSize (max s1 s2) f1
(FlexSize s1 f1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (max s1 sb2) (max f1 f2) (FlexSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (max s1 sb2) (max f1 f2)
-- Min -- Min
(MinSize s1 f1, MinSize s2 f2) -> MinSize (max s1 s2) (max f1 f2) (MinSize s1 f1, MinSize s2 f2) -> MinSize (max s1 s2) (max f1 f2)
(MinSize s1 f1, MaxSize s2 f2) -> MinSize s1 f1 (MinSize s1 f1, MaxSize s2 f2) -> MinSize s1 f1
(MinSize s1 f1, RangeSize sa2 sb2 f2) -> MinSize (max s1 sa2) f1 (MinSize s1 f1, RangeSize sa2 sb2 f2) -> MinSize (max s1 sa2) f1
-- Max -- Max
(MaxSize s1 f1, MaxSize s2 f2) -> MaxSize (max s1 s2) (max f1 f2) (MaxSize s1 f1, MaxSize s2 f2) -> MaxSize (max s1 s2) (max f1 f2)
(MaxSize s1 f1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (max s1 sb2) (max f1 f2) (MaxSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (max s1 sb2) (max f1 f2)
-- Range -- Range
(RangeSize sa1 sb1 f1, RangeSize sa2 sb2 f2) -> RangeSize (max sa1 sa2) (max sb1 sb2) (max f1 f2) (RangeSize sa1 sb1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize (max sa1 sa2) (max sb1 sb2) (max f1 f2)
-- Reverse handled with existing cases -- Reverse handled with existing cases
(pending1, pending2) -> sizeReqMergeMax pending2 pending1 (pending1, pending2) -> sizeReqMergeMax pending2 pending1
@ -133,3 +133,8 @@ modifySizeReq (FlexSize c factor) f = FlexSize (f c) factor
modifySizeReq (MinSize c factor) f = MinSize (f c) factor modifySizeReq (MinSize c factor) f = MinSize (f c) factor
modifySizeReq (MaxSize c factor) f = MaxSize (f c) factor modifySizeReq (MaxSize c factor) f = MaxSize (f c) factor
modifySizeReq (RangeSize c1 c2 factor) f = RangeSize (f c1) (f c2) factor modifySizeReq (RangeSize c1 c2 factor) f = RangeSize (f c1) (f c2) factor
mkRangeSize :: Double -> Double -> Double -> SizeReq
mkRangeSize s1 s2 f
| abs (s2 - s1) < 0.01 = FixedSize s1
| otherwise = RangeSize s1 s2 f

View File

@ -80,6 +80,17 @@ makeZStack config = widget where
| onlyTop = Seq.take 1 vchildren | onlyTop = Seq.take 1 vchildren
| otherwise = vchildren | otherwise = vchildren
getSizeReq wenv inst children = (newSizeReqW, newSizeReqH) where
vchildren = Seq.filter _wiVisible children
newSizeReqW = getDimSizeReq _wiSizeReqW vchildren
newSizeReqH = getDimSizeReq _wiSizeReqH vchildren
getDimSizeReq accesor vchildren
| Seq.null vreqs = FixedSize 0
| otherwise = foldl1 sizeReqMergeMax vreqs
where
vreqs = accesor <$> vchildren
{--
getSizeReq wenv inst children = (newSizeReqW, newSizeReqH) where getSizeReq wenv inst children = (newSizeReqW, newSizeReqH) where
vchildren = Seq.filter _wiVisible children vchildren = Seq.filter _wiVisible children
nReqs = length vchildren nReqs = length vchildren
@ -101,7 +112,7 @@ makeZStack config = widget where
newSizeReqH newSizeReqH
| fixedH = FixedSize height | fixedH = FixedSize height
| otherwise = FlexSize height factor | otherwise = FlexSize height factor
--}
resize wenv viewport renderArea children inst = resized where resize wenv viewport renderArea children inst = resized where
style = activeStyle wenv inst style = activeStyle wenv inst
raChild = fromMaybe def (removeOuterBounds style renderArea) raChild = fromMaybe def (removeOuterBounds style renderArea)

View File

@ -98,6 +98,6 @@
- [x] Add/remove characters - [x] Add/remove characters
- [x] Copy/Paste - [x] Copy/Paste
- ZStack - ZStack
- [ ] Assign size - [x] Assign size
- [ ] Handle click passthrough/focus - [ ] Handle click passthrough/focus
- [ ] stack's ignore empty click - [ ] stack's ignore empty click

View File

@ -0,0 +1,133 @@
module Monomer.Widgets.ZStackSpec (spec) where
import Control.Lens ((&), (.~))
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.Label
import Monomer.Widgets.Stack
import Monomer.Widgets.ZStack
import qualified Monomer.Lens as L
spec :: Spec
spec = describe "ZStack" $ do
updateSizeReq
resize
updateSizeReq :: Spec
updateSizeReq = describe "updateSizeReq" $ do
updateSizeReqEmpty
updateSizeReqItems
updateSizeReqItemsFixed
updateSizeReqEmpty :: Spec
updateSizeReqEmpty = describe "empty" $ do
it "should return width = Fixed 0" $
sizeReqW `shouldBe` FixedSize 0
it "should return height = Fixed 0" $
sizeReqH `shouldBe` FixedSize 0
where
wenv = mockWenv ()
zstackInst = zstack []
(sizeReqW, sizeReqH) = instUpdateSizeReq wenv zstackInst
updateSizeReqItems :: Spec
updateSizeReqItems = describe "several items, horizontal" $ do
it "should return width = Flex 130 0.01" $
sizeReqW `shouldBe` FlexSize 130 0.01
it "should return height = Fixed 60" $
sizeReqH `shouldBe` FixedSize 60
where
wenv = mockWenv ()
zstackInst = zstack [
vstack [
label "Label a1"
],
vstack [
label "Long label b1",
label "Long label b2"
],
vstack [
label "Label c1",
label "Label c2",
label "Label c3"
]
]
(sizeReqW, sizeReqH) = instUpdateSizeReq wenv zstackInst
updateSizeReqItemsFixed :: Spec
updateSizeReqItemsFixed = describe "several items, horizontal" $ do
it "should return width = Fixed 300" $
sizeReqW `shouldBe` FixedSize 300
it "should return height = Fixed 40" $
sizeReqH `shouldBe` FixedSize 40
where
wenv = mockWenv ()
zstackInst = zstack [
vstack [
label "Label a1",
label "Label a2"
],
vstack [
label "Long b1",
label "Long b2"
] `style` [width 300]
]
(sizeReqW, sizeReqH) = instUpdateSizeReq wenv zstackInst
resize :: Spec
resize = describe "resize" $ do
resizeEmpty
resizeItems
resizeEmpty :: Spec
resizeEmpty = describe "empty" $ do
it "should have the provided viewport size" $
viewport `shouldBe` vp
it "should not have children" $
children `shouldSatisfy` Seq.null
where
wenv = mockWenv ()
vp = Rect 0 0 640 480
zstackInst = zstack []
newInst = instInit wenv zstackInst
viewport = _wiViewport newInst
children = _wiChildren newInst
resizeItems :: Spec
resizeItems = describe "several items, horizontal" $ do
it "should have the provided viewport size" $
viewport `shouldBe` vp
it "should assign the same viewport size to each children" $
childrenVp `shouldBe` Seq.fromList [vp, vp, vp]
it "should assign the same renderArea size to each children" $
childrenRa `shouldBe` Seq.fromList [vp, vp, vp]
where
wenv = mockWenv ()
vp = Rect 0 0 640 480
zstackInst = zstack [
label "Label 1",
label "Label Number Two",
label "Label 3"
]
newInst = instInit wenv zstackInst
viewport = _wiViewport newInst
childrenVp = _wiViewport <$> _wiChildren newInst
childrenRa = _wiRenderArea <$> _wiChildren newInst

View File

@ -16,6 +16,7 @@ import qualified Monomer.Widgets.IntegralFieldSpec as IntegralFieldSpec
import qualified Monomer.Widgets.RadioSpec as RadioSpec import qualified Monomer.Widgets.RadioSpec as RadioSpec
import qualified Monomer.Widgets.StackSpec as StackSpec import qualified Monomer.Widgets.StackSpec as StackSpec
import qualified Monomer.Widgets.TextFieldSpec as TextFieldSpec import qualified Monomer.Widgets.TextFieldSpec as TextFieldSpec
import qualified Monomer.Widgets.ZStackSpec as ZStackSpec
main :: IO () main :: IO ()
main = hspec spec main = hspec spec
@ -36,3 +37,4 @@ spec = do
RadioSpec.spec RadioSpec.spec
StackSpec.spec StackSpec.spec
TextFieldSpec.spec TextFieldSpec.spec
ZStackSpec.spec