on master help sign in
vty/test/VerifySimpleSpanGeneration.hs
188 lines 9.3 kB history raw
1{-# LANGUAGE DisambiguateRecordFields #-}
2{-# LANGUAGE NamedFieldPuns #-}
3module VerifySimpleSpanGeneration where
5import Verify.Graphics.Vty.Prelude
7import Verify.Graphics.Vty.Image
8import Verify.Graphics.Vty.Picture
9import Verify.Graphics.Vty.Span
11import Graphics.Vty.Debug
12import Graphics.Vty.PictureToSpans
14import Verify
16import qualified Data.Vector as Vector
18unitImageAndZeroWindow0 :: UnitImage -> EmptyWindow -> Bool
19unitImageAndZeroWindow0 (UnitImage _ i) (EmptyWindow w) =
20 let p = picForImage i
21 ops = displayOpsForPic p (regionForWindow w)
22 in displayOpsColumns ops == 0 && displayOpsRows ops == 0
24unitImageAndZeroWindow1 :: UnitImage -> EmptyWindow -> Bool
25unitImageAndZeroWindow1 (UnitImage _ i) (EmptyWindow w) =
26 let p = picForImage i
27 ops = displayOpsForPic p (regionForWindow w)
28 in ( spanOpsAffectedRows ops == 0 ) && ( allSpansHaveWidth ops 0 )
30horizSpanImageAndZeroWindow0 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
31horizSpanImageAndZeroWindow0 (SingleRowSingleAttrImage { rowImage = i }) (EmptyWindow w) =
32 let p = picForImage i
33 ops = displayOpsForPic p (regionForWindow w)
34 in displayOpsColumns ops == 0 && displayOpsRows ops == 0
36horizSpanImageAndZeroWindow1 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
37horizSpanImageAndZeroWindow1 (SingleRowSingleAttrImage { rowImage = i }) (EmptyWindow w) =
38 let p = picForImage i
39 ops = displayOpsForPic p (regionForWindow w)
40 in ( spanOpsAffectedRows ops == 0 ) && ( allSpansHaveWidth ops 0 )
42horizSpanImageAndEqualWindow0 :: SingleRowSingleAttrImage -> Result
43horizSpanImageAndEqualWindow0 (SingleRowSingleAttrImage { rowImage = i, expectedColumns = c }) =
44 let p = picForImage i
45 w = MockWindow c 1
46 ops = displayOpsForPic p (regionForWindow w)
47 in verifyAllSpansHaveWidth i ops c
49horizSpanImageAndEqualWindow1 :: SingleRowSingleAttrImage -> Bool
50horizSpanImageAndEqualWindow1 (SingleRowSingleAttrImage { rowImage = i, expectedColumns = c }) =
51 let p = picForImage i
52 w = MockWindow c 1
53 ops = displayOpsForPic p (regionForWindow w)
54 in spanOpsAffectedRows ops == 1
56horizSpanImageAndLesserWindow0 :: SingleRowSingleAttrImage -> Result
57horizSpanImageAndLesserWindow0 (SingleRowSingleAttrImage { rowImage = i, expectedColumns = c }) =
58 let p = picForImage i
59 lesserWidth = c `div` 2
60 w = MockWindow lesserWidth 1
61 ops = displayOpsForPic p (regionForWindow w)
62 in verifyAllSpansHaveWidth i ops lesserWidth
64singleAttrSingleSpanStackCropped0 :: SingleAttrSingleSpanStack -> Result
65singleAttrSingleSpanStackCropped0 stack =
66 let p = picForImage (stackImage stack)
67 w = MockWindow (stackWidth stack `div` 2) (stackHeight stack)
68 ops = displayOpsForPic p (regionForWindow w)
69 in verifyAllSpansHaveWidth (stackImage stack) ops (stackWidth stack `div` 2)
71singleAttrSingleSpanStackCropped1 :: SingleAttrSingleSpanStack -> Bool
72singleAttrSingleSpanStackCropped1 stack =
73 let p = picForImage (stackImage stack)
74 expectedRowCount = stackHeight stack `div` 2
75 w = MockWindow (stackWidth stack) expectedRowCount
76 ops = displayOpsForPic p (regionForWindow w)
77 actualRowCount = spanOpsAffectedRows ops
78 in expectedRowCount == actualRowCount
80singleAttrSingleSpanStackCropped2 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
81singleAttrSingleSpanStackCropped2 stack0 stack1 =
82 let p = picForImage (stackImage stack0 <|> stackImage stack1)
83 w = MockWindow (stackWidth stack0) (imageHeight (picImage p))
84 ops = displayOpsForPic p (regionForWindow w)
85 in verifyAllSpansHaveWidth (picImage p) ops (stackWidth stack0)
87singleAttrSingleSpanStackCropped3 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
88singleAttrSingleSpanStackCropped3 stack0 stack1 =
89 let p = picForImage (stackImage stack0 <|> stackImage stack1)
90 w = MockWindow (imageWidth (picImage p)) expectedRowCount
91 ops = displayOpsForPic p (regionForWindow w)
92 expectedRowCount = imageHeight (picImage p) `div` 2
93 actualRowCount = spanOpsAffectedRows ops
94 in expectedRowCount == actualRowCount
96singleAttrSingleSpanStackCropped4 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
97singleAttrSingleSpanStackCropped4 stack0 stack1 =
98 let p = picForImage (stackImage stack0 <-> stackImage stack1)
99 w = MockWindow expectedWidth (imageHeight (picImage p))
100 ops = displayOpsForPic p (regionForWindow w)
101 expectedWidth = imageWidth (picImage p) `div` 2
102 in verifyAllSpansHaveWidth (picImage p) ops expectedWidth
104singleAttrSingleSpanStackCropped5 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
105singleAttrSingleSpanStackCropped5 stack0 stack1 =
106 let p = picForImage (stackImage stack0 <-> stackImage stack1)
107 w = MockWindow (imageWidth (picImage p)) (stackHeight stack0)
108 ops = displayOpsForPic p (regionForWindow w)
109 expectedRowCount = stackHeight stack0
110 actualRowCount = spanOpsAffectedRows ops
111 in expectedRowCount == actualRowCount
113horizSpanImageAndGreaterWindow0 :: SingleRowSingleAttrImage -> Result
114horizSpanImageAndGreaterWindow0 (SingleRowSingleAttrImage { rowImage = i, expectedColumns = c }) =
115 let p = picForImage i
116 -- SingleRowSingleAttrImage always has width >= 1
117 greaterWidth = c * 2
118 w = MockWindow greaterWidth 1
119 ops = displayOpsForPic p (regionForWindow w)
120 in verifyAllSpansHaveWidth i ops greaterWidth
122arbImageIsCropped :: DefaultImage -> MockWindow -> Bool
123arbImageIsCropped (DefaultImage image) win@(MockWindow w h) =
124 let pic = picForImage image
125 ops = displayOpsForPic pic (regionForWindow win)
126 in ( spanOpsAffectedRows ops == h ) && ( allSpansHaveWidth ops w )
128spanOpsActuallyFillRows :: DefaultPic -> Bool
129spanOpsActuallyFillRows (DefaultPic pic win) =
130 let ops = displayOpsForPic pic (regionForWindow win)
131 expectedRowCount = regionHeight (regionForWindow win)
132 actualRowCount = spanOpsAffectedRows ops
133 in expectedRowCount == actualRowCount
135spanOpsActuallyFillColumns :: DefaultPic -> Bool
136spanOpsActuallyFillColumns (DefaultPic pic win) =
137 let ops = displayOpsForPic pic (regionForWindow win)
138 expectedColumnCount = regionWidth (regionForWindow win)
139 in allSpansHaveWidth ops expectedColumnCount
141firstSpanOpSetsAttr :: DefaultPic -> Bool
142firstSpanOpSetsAttr DefaultPic { defaultPic = pic, defaultWin = win } =
143 let ops = displayOpsForPic pic (regionForWindow win)
144 in all ( isAttrSpanOp . Vector.head ) ( Vector.toList ops )
146singleAttrSingleSpanStackOpCoverage :: SingleAttrSingleSpanStack -> Result
147singleAttrSingleSpanStackOpCoverage stack =
148 let p = picForImage (stackImage stack)
149 w = MockWindow (stackWidth stack) (stackHeight stack)
150 ops = displayOpsForPic p (regionForWindow w)
151 in verifyAllSpansHaveWidth (stackImage stack) ops (stackWidth stack)
153imageCoverageMatchesBounds :: Image -> Result
154imageCoverageMatchesBounds i =
155 let p = picForImage i
156 r = (imageWidth i,imageHeight i)
157 ops = displayOpsForPic p r
158 in verifyAllSpansHaveWidth i ops (imageWidth i)
160tests :: IO [Test]
161tests = return
162 [ verify "unit image is cropped when window size == (0,0) [0]" unitImageAndZeroWindow0
163 , verify "unit image is cropped when window size == (0,0) [1]" unitImageAndZeroWindow1
164 , verify "horiz span image is cropped when window size == (0,0) [0]" horizSpanImageAndZeroWindow0
165 , verify "horiz span image is cropped when window size == (0,0) [1]" horizSpanImageAndZeroWindow1
166 , verify "horiz span image is not cropped when window size == size of image [width]" horizSpanImageAndEqualWindow0
167 , verify "horiz span image is not cropped when window size == size of image [height]" horizSpanImageAndEqualWindow1
168 , verify "horiz span image is not cropped when window size < size of image [width]" horizSpanImageAndLesserWindow0
169 , verify "horiz span image is not cropped when window size > size of image [width]" horizSpanImageAndGreaterWindow0
170 , verify "first span op is always to set the text attribute" firstSpanOpSetsAttr
171 , verify "a stack of single attr text spans should define content for all the columns [output region == size of stack]"
172 singleAttrSingleSpanStackOpCoverage
173 , verify "a single attr text span is cropped when window size < size of stack image [width]"
174 singleAttrSingleSpanStackCropped0
175 , verify "a single attr text span is cropped when window size < size of stack image [height]"
176 singleAttrSingleSpanStackCropped1
177 , verify "single attr text span <|> single attr text span display cropped. [width]"
178 singleAttrSingleSpanStackCropped2
179 , verify "single attr text span <|> single attr text span display cropped. [height]"
180 singleAttrSingleSpanStackCropped3
181 , verify "single attr text span <-> single attr text span display cropped. [width]"
182 singleAttrSingleSpanStackCropped4
183 , verify "single attr text span <-> single attr text span display cropped. [height]"
184 singleAttrSingleSpanStackCropped5
185 , verify "an arbitrary image when rendered to a window of the same size will cover the entire window"
186 imageCoverageMatchesBounds
187 ]