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
-- Fixed
(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, MaxSize s2 f2) -> RangeSize s1 (s1 + s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> RangeSize sa2 (s1 + sb2) f2
(FixedSize s1, MaxSize s2 f2) -> mkRangeSize s1 (s1 + s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> mkRangeSize sa2 (s1 + sb2) f2
-- Flex
(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, 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
(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, RangeSize sa2 sb2 f2) -> RangeSize (s1 + sa2) (s1 + sb2) (max f1 f2)
(MinSize s1 f1, MaxSize s2 f2) -> mkRangeSize s1 (s1 + s2) (max f1 f2)
(MinSize s1 f1, RangeSize sa2 sb2 f2) -> mkRangeSize (s1 + sa2) (s1 + sb2) (max f1 f2)
-- Max
(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
(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
(pending1, pending2) -> sizeReqMergeSum pending2 pending1
@ -106,24 +106,24 @@ sizeReqMergeMax :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeMax req1 req2 = case (req1, req2) of
-- Fixed
(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, MaxSize s2 f2) -> RangeSize s1 (max s1 s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> RangeSize (max s1 sa2) (max s1 sb2) f2
(FixedSize s1, MaxSize s2 f2) -> mkRangeSize s1 (max s1 s2) f2
(FixedSize s1, RangeSize sa2 sb2 f2) -> mkRangeSize (max s1 sa2) (max s1 sb2) f2
-- Flex
(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, 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
(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, RangeSize sa2 sb2 f2) -> MinSize (max s1 sa2) f1
-- Max
(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
(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
(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 (MaxSize c factor) f = MaxSize (f c) 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
| 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
vchildren = Seq.filter _wiVisible children
nReqs = length vchildren
@ -101,7 +112,7 @@ makeZStack config = widget where
newSizeReqH
| fixedH = FixedSize height
| otherwise = FlexSize height factor
--}
resize wenv viewport renderArea children inst = resized where
style = activeStyle wenv inst
raChild = fromMaybe def (removeOuterBounds style renderArea)

View File

@ -98,6 +98,6 @@
- [x] Add/remove characters
- [x] Copy/Paste
- ZStack
- [ ] Assign size
- [x] Assign size
- [ ] Handle click passthrough/focus
- [ ] 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.StackSpec as StackSpec
import qualified Monomer.Widgets.TextFieldSpec as TextFieldSpec
import qualified Monomer.Widgets.ZStackSpec as ZStackSpec
main :: IO ()
main = hspec spec
@ -36,3 +37,4 @@ spec = do
RadioSpec.spec
StackSpec.spec
TextFieldSpec.spec
ZStackSpec.spec