mirror of
https://github.com/fjvallarino/monomer.git
synced 2024-09-20 00:09:02 +03:00
Add tests for zstack
This commit is contained in:
parent
ab3ed575af
commit
76cb616f52
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
133
test/unit/Monomer/Widgets/ZStackSpec.hs
Normal file
133
test/unit/Monomer/Widgets/ZStackSpec.hs
Normal 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
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user