mirror of
https://github.com/fjvallarino/monomer.git
synced 2024-09-20 08:17:37 +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
|
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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
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.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
|
||||||
|
Loading…
Reference in New Issue
Block a user