@@ -17,96 +17,96 @@ import qualified Data.Vector as Vector
17unit_image_and_zero_window_0 :: UnitImage -> EmptyWindow -> Bool
17unit_image_and_zero_window_0 :: UnitImage -> EmptyWindow -> Bool
18unit_image_and_zero_window_0 (UnitImage _ i) (EmptyWindow w) =
18unit_image_and_zero_window_0 (UnitImage _ i) (EmptyWindow w) =
19 let p = pic_for_image i
19 let p = pic_for_image i
20− spans = spans_for_pic p (region_for_window w)
20+ ops = display_ops_for_pic p (region_for_window w)
21− in span_ops_columns spans == 0 && span_ops_rows spans == 0
21+ in display_ops_columns ops == 0 && display_ops_rows ops == 0
23unit_image_and_zero_window_1 :: UnitImage -> EmptyWindow -> Bool
23unit_image_and_zero_window_1 :: UnitImage -> EmptyWindow -> Bool
24unit_image_and_zero_window_1 (UnitImage _ i) (EmptyWindow w) =
24unit_image_and_zero_window_1 (UnitImage _ i) (EmptyWindow w) =
25 let p = pic_for_image i
25 let p = pic_for_image i
26− spans = spans_for_pic p (region_for_window w)
26+ ops = display_ops_for_pic p (region_for_window w)
27− in ( span_ops_effected_rows spans == 0 ) && ( all_spans_have_width spans 0 )
27+ in ( span_ops_effected_rows ops == 0 ) && ( all_spans_have_width ops 0 )
29horiz_span_image_and_zero_window_0 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
29horiz_span_image_and_zero_window_0 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
30horiz_span_image_and_zero_window_0 (SingleRowSingleAttrImage { row_image = i }) (EmptyWindow w) =
30horiz_span_image_and_zero_window_0 (SingleRowSingleAttrImage { row_image = i }) (EmptyWindow w) =
31 let p = pic_for_image i
31 let p = pic_for_image i
32− spans = spans_for_pic p (region_for_window w)
32+ ops = display_ops_for_pic p (region_for_window w)
33− in span_ops_columns spans == 0 && span_ops_rows spans == 0
33+ in display_ops_columns ops == 0 && display_ops_rows ops == 0
35horiz_span_image_and_zero_window_1 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
35horiz_span_image_and_zero_window_1 :: SingleRowSingleAttrImage -> EmptyWindow -> Bool
36horiz_span_image_and_zero_window_1 (SingleRowSingleAttrImage { row_image = i }) (EmptyWindow w) =
36horiz_span_image_and_zero_window_1 (SingleRowSingleAttrImage { row_image = i }) (EmptyWindow w) =
37 let p = pic_for_image i
37 let p = pic_for_image i
38− spans = spans_for_pic p (region_for_window w)
38+ ops = display_ops_for_pic p (region_for_window w)
39− in ( span_ops_effected_rows spans == 0 ) && ( all_spans_have_width spans 0 )
39+ in ( span_ops_effected_rows ops == 0 ) && ( all_spans_have_width ops 0 )
41horiz_span_image_and_equal_window_0 :: SingleRowSingleAttrImage -> Result
41horiz_span_image_and_equal_window_0 :: SingleRowSingleAttrImage -> Result
42horiz_span_image_and_equal_window_0 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
42horiz_span_image_and_equal_window_0 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
43 let p = pic_for_image i
43 let p = pic_for_image i
44 w = MockWindow c 1
44 w = MockWindow c 1
45− spans = spans_for_pic p (region_for_window w)
45+ ops = display_ops_for_pic p (region_for_window w)
46− in verify_all_spans_have_width i spans c
46+ in verify_all_spans_have_width i ops c
48horiz_span_image_and_equal_window_1 :: SingleRowSingleAttrImage -> Bool
48horiz_span_image_and_equal_window_1 :: SingleRowSingleAttrImage -> Bool
49horiz_span_image_and_equal_window_1 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
49horiz_span_image_and_equal_window_1 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
50 let p = pic_for_image i
50 let p = pic_for_image i
51 w = MockWindow c 1
51 w = MockWindow c 1
52− spans = spans_for_pic p (region_for_window w)
52+ ops = display_ops_for_pic p (region_for_window w)
53− in span_ops_effected_rows spans == 1
53+ in span_ops_effected_rows ops == 1
55horiz_span_image_and_lesser_window_0 :: SingleRowSingleAttrImage -> Result
55horiz_span_image_and_lesser_window_0 :: SingleRowSingleAttrImage -> Result
56horiz_span_image_and_lesser_window_0 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
56horiz_span_image_and_lesser_window_0 (SingleRowSingleAttrImage { row_image = i, expected_columns = c }) =
57 let p = pic_for_image i
57 let p = pic_for_image i
58 lesser_width = c `div` 2
58 lesser_width = c `div` 2
59 w = MockWindow lesser_width 1
59 w = MockWindow lesser_width 1
60− spans = spans_for_pic p (region_for_window w)
60+ ops = display_ops_for_pic p (region_for_window w)
61− in verify_all_spans_have_width i spans lesser_width
61+ in verify_all_spans_have_width i ops lesser_width
63single_attr_single_span_stack_cropped_0 :: SingleAttrSingleSpanStack -> Result
63single_attr_single_span_stack_cropped_0 :: SingleAttrSingleSpanStack -> Result
64single_attr_single_span_stack_cropped_0 stack =
64single_attr_single_span_stack_cropped_0 stack =
65 let p = pic_for_image (stack_image stack)
65 let p = pic_for_image (stack_image stack)
66 w = MockWindow (stack_width stack `div` 2) (stack_height stack)
66 w = MockWindow (stack_width stack `div` 2) (stack_height stack)
67− spans = spans_for_pic p (region_for_window w)
67+ ops = display_ops_for_pic p (region_for_window w)
68− in verify_all_spans_have_width (stack_image stack) spans (stack_width stack `div` 2)
68+ in verify_all_spans_have_width (stack_image stack) ops (stack_width stack `div` 2)
70single_attr_single_span_stack_cropped_1 :: SingleAttrSingleSpanStack -> Bool
70single_attr_single_span_stack_cropped_1 :: SingleAttrSingleSpanStack -> Bool
71single_attr_single_span_stack_cropped_1 stack =
71single_attr_single_span_stack_cropped_1 stack =
72 let p = pic_for_image (stack_image stack)
72 let p = pic_for_image (stack_image stack)
73 expected_row_count = stack_height stack `div` 2
73 expected_row_count = stack_height stack `div` 2
74 w = MockWindow (stack_width stack) expected_row_count
74 w = MockWindow (stack_width stack) expected_row_count
75− spans = spans_for_pic p (region_for_window w)
75+ ops = display_ops_for_pic p (region_for_window w)
76− actual_row_count = span_ops_effected_rows spans
76+ actual_row_count = span_ops_effected_rows ops
77 in expected_row_count == actual_row_count
77 in expected_row_count == actual_row_count
79single_attr_single_span_stack_cropped_2 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
79single_attr_single_span_stack_cropped_2 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
80single_attr_single_span_stack_cropped_2 stack_0 stack_1 =
80single_attr_single_span_stack_cropped_2 stack_0 stack_1 =
81 let p = pic_for_image (stack_image stack_0 <|> stack_image stack_1)
81 let p = pic_for_image (stack_image stack_0 <|> stack_image stack_1)
82 w = MockWindow (stack_width stack_0) (image_height (pic_image p))
82 w = MockWindow (stack_width stack_0) (image_height (pic_image p))
83− spans = spans_for_pic p (region_for_window w)
83+ ops = display_ops_for_pic p (region_for_window w)
84− in verify_all_spans_have_width (pic_image p) spans (stack_width stack_0)
84+ in verify_all_spans_have_width (pic_image p) ops (stack_width stack_0)
86single_attr_single_span_stack_cropped_3 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
86single_attr_single_span_stack_cropped_3 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
87single_attr_single_span_stack_cropped_3 stack_0 stack_1 =
87single_attr_single_span_stack_cropped_3 stack_0 stack_1 =
88 let p = pic_for_image (stack_image stack_0 <|> stack_image stack_1)
88 let p = pic_for_image (stack_image stack_0 <|> stack_image stack_1)
89 w = MockWindow (image_width (pic_image p)) expected_row_count
89 w = MockWindow (image_width (pic_image p)) expected_row_count
90− spans = spans_for_pic p (region_for_window w)
90+ ops = display_ops_for_pic p (region_for_window w)
91 expected_row_count = image_height (pic_image p) `div` 2
91 expected_row_count = image_height (pic_image p) `div` 2
92− actual_row_count = span_ops_effected_rows spans
92+ actual_row_count = span_ops_effected_rows ops
93 in expected_row_count == actual_row_count
93 in expected_row_count == actual_row_count
95single_attr_single_span_stack_cropped_4 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
95single_attr_single_span_stack_cropped_4 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Result
96single_attr_single_span_stack_cropped_4 stack_0 stack_1 =
96single_attr_single_span_stack_cropped_4 stack_0 stack_1 =
97 let p = pic_for_image (stack_image stack_0 <-> stack_image stack_1)
97 let p = pic_for_image (stack_image stack_0 <-> stack_image stack_1)
98 w = MockWindow expected_width (image_height (pic_image p))
98 w = MockWindow expected_width (image_height (pic_image p))
99− spans = spans_for_pic p (region_for_window w)
99+ ops = display_ops_for_pic p (region_for_window w)
100 expected_width = image_width (pic_image p) `div` 2
100 expected_width = image_width (pic_image p) `div` 2
101− in verify_all_spans_have_width (pic_image p) spans expected_width
101+ in verify_all_spans_have_width (pic_image p) ops expected_width
103single_attr_single_span_stack_cropped_5 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
103single_attr_single_span_stack_cropped_5 :: SingleAttrSingleSpanStack -> SingleAttrSingleSpanStack -> Bool
104single_attr_single_span_stack_cropped_5 stack_0 stack_1 =
104single_attr_single_span_stack_cropped_5 stack_0 stack_1 =
105 let p = pic_for_image (stack_image stack_0 <-> stack_image stack_1)
105 let p = pic_for_image (stack_image stack_0 <-> stack_image stack_1)
106 w = MockWindow (image_width (pic_image p)) (stack_height stack_0)
106 w = MockWindow (image_width (pic_image p)) (stack_height stack_0)
107− spans = spans_for_pic p (region_for_window w)
107+ ops = display_ops_for_pic p (region_for_window w)
108 expected_row_count = stack_height stack_0
108 expected_row_count = stack_height stack_0
109− actual_row_count = span_ops_effected_rows spans
109+ actual_row_count = span_ops_effected_rows ops
110 in expected_row_count == actual_row_count
110 in expected_row_count == actual_row_count
112horiz_span_image_and_greater_window_0 :: SingleRowSingleAttrImage -> Result
112horiz_span_image_and_greater_window_0 :: SingleRowSingleAttrImage -> Result
@@ -115,46 +115,82 @@ horiz_span_image_and_greater_window_0 (SingleRowSingleAttrImage { row_image = i,
115 -- SingleRowSingleAttrImage always has width >= 1
115 -- SingleRowSingleAttrImage always has width >= 1
116 greater_width = c * 2
116 greater_width = c * 2
117 w = MockWindow greater_width 1
117 w = MockWindow greater_width 1
118− spans = spans_for_pic p (region_for_window w)
118+ ops = display_ops_for_pic p (region_for_window w)
119− in verify_all_spans_have_width i spans greater_width
119+ in verify_all_spans_have_width i ops greater_width
121arb_image_is_cropped :: DefaultImage -> MockWindow -> Bool
121arb_image_is_cropped :: DefaultImage -> MockWindow -> Bool
122arb_image_is_cropped (DefaultImage image) win@(MockWindow w h) =
122arb_image_is_cropped (DefaultImage image) win@(MockWindow w h) =
123 let pic = pic_for_image image
123 let pic = pic_for_image image
124− spans = spans_for_pic pic (region_for_window win)
124+ ops = display_ops_for_pic pic (region_for_window win)
125− in ( span_ops_effected_rows spans == h ) && ( all_spans_have_width spans w )
125+ in ( span_ops_effected_rows ops == h ) && ( all_spans_have_width ops w )
127span_ops_actually_fill_rows :: DefaultPic -> Bool
127span_ops_actually_fill_rows :: DefaultPic -> Bool
128span_ops_actually_fill_rows (DefaultPic pic win) =
128span_ops_actually_fill_rows (DefaultPic pic win) =
129− let spans = spans_for_pic pic (region_for_window win)
129+ let ops = display_ops_for_pic pic (region_for_window win)
130 expected_row_count = region_height (region_for_window win)
130 expected_row_count = region_height (region_for_window win)
131− actual_row_count = span_ops_effected_rows spans
131+ actual_row_count = span_ops_effected_rows ops
132 in expected_row_count == actual_row_count
132 in expected_row_count == actual_row_count
134span_ops_actually_fill_columns :: DefaultPic -> Bool
134span_ops_actually_fill_columns :: DefaultPic -> Bool
135span_ops_actually_fill_columns (DefaultPic pic win) =
135span_ops_actually_fill_columns (DefaultPic pic win) =
136− let spans = spans_for_pic pic (region_for_window win)
136+ let ops = display_ops_for_pic pic (region_for_window win)
137 expected_column_count = region_width (region_for_window win)
137 expected_column_count = region_width (region_for_window win)
138− in all_spans_have_width spans expected_column_count
138+ in all_spans_have_width ops expected_column_count
140first_span_op_sets_attr :: DefaultPic -> Bool
140first_span_op_sets_attr :: DefaultPic -> Bool
141first_span_op_sets_attr DefaultPic { default_pic = pic, default_win = win } =
141first_span_op_sets_attr DefaultPic { default_pic = pic, default_win = win } =
142− let spans = spans_for_pic pic (region_for_window win)
142+ let ops = display_ops_for_pic pic (region_for_window win)
143− in all ( is_attr_span_op . Vector.head ) ( Vector.toList $ display_ops spans )
143+ in all ( is_attr_span_op . Vector.head ) ( Vector.toList ops )
145single_attr_single_span_stack_op_coverage :: SingleAttrSingleSpanStack -> Result
145single_attr_single_span_stack_op_coverage :: SingleAttrSingleSpanStack -> Result
146single_attr_single_span_stack_op_coverage stack =
146single_attr_single_span_stack_op_coverage stack =
147 let p = pic_for_image (stack_image stack)
147 let p = pic_for_image (stack_image stack)
148 w = MockWindow (stack_width stack) (stack_height stack)
148 w = MockWindow (stack_width stack) (stack_height stack)
149− spans = spans_for_pic p (region_for_window w)
149+ ops = display_ops_for_pic p (region_for_window w)
150− in verify_all_spans_have_width (stack_image stack) spans (stack_width stack)
150+ in verify_all_spans_have_width (stack_image stack) ops (stack_width stack)
152+crop_op_display_ops :: (Int -> Image -> Image) ->
153+ Int -> Image -> (DisplayOps, Image)
154+crop_op_display_ops crop_op v i =
155+ let i_out = crop_op v i
156+ p = pic_for_image i_out
157+ w = MockWindow (image_width i_out) (image_height i_out)
158+ in (display_ops_for_pic p (region_for_window w), i_out)
160+width_crop_output_columns :: (Int -> Image -> Image) ->
161+ SingleAttrSingleSpanStack ->
164+width_crop_output_columns crop_op s (NonNegative w) = stack_width s > w ==>
165+ let (ops, i_out) = crop_op_display_ops crop_op w (stack_image s)
166+ in verify_all_spans_have_width i_out ops w
168+height_crop_output_columns :: (Int -> Image -> Image) ->
169+ SingleAttrSingleSpanStack ->
172+height_crop_output_columns crop_op s (NonNegative h) = stack_height s > h ==>
173+ let (ops, _) = crop_op_display_ops crop_op h (stack_image s)
174+ in display_ops_rows ops == h
176+crop_right_output_columns :: SingleAttrSingleSpanStack -> NonNegative Int -> Property
177+crop_right_output_columns = width_crop_output_columns crop_right
179+crop_left_output_columns :: SingleAttrSingleSpanStack -> NonNegative Int -> Property
180+crop_left_output_columns = width_crop_output_columns crop_left
182+crop_top_output_rows :: SingleAttrSingleSpanStack -> NonNegative Int -> Property
183+crop_top_output_rows = height_crop_output_columns crop_top
185+crop_bottom_output_rows :: SingleAttrSingleSpanStack -> NonNegative Int -> Property
186+crop_bottom_output_rows = height_crop_output_columns crop_bottom
152image_coverage_matches_bounds :: Image -> Result
188image_coverage_matches_bounds :: Image -> Result
153image_coverage_matches_bounds i =
189image_coverage_matches_bounds i =
154 let p = pic_for_image i
190 let p = pic_for_image i
155 r = DisplayRegion (image_width i) (image_height i)
191 r = DisplayRegion (image_width i) (image_height i)
156− spans = spans_for_pic p r
192+ ops = display_ops_for_pic p r
157− in verify_all_spans_have_width i spans (image_width i)
193+ in verify_all_spans_have_width i ops (image_width i)
159tests :: IO [Test]
195tests :: IO [Test]
160tests = return
196tests = return
@@ -176,14 +212,22 @@ tests = return
176 single_attr_single_span_stack_cropped_0
212 single_attr_single_span_stack_cropped_0
177 , verify "a single attr text span is cropped when window size < size of stack image [height]"
213 , verify "a single attr text span is cropped when window size < size of stack image [height]"
178 single_attr_single_span_stack_cropped_1
214 single_attr_single_span_stack_cropped_1
179− , verify "single attr text span <|> single attr text span cropped. [width]"
215+ , verify "single attr text span <|> single attr text span display cropped. [width]"
180 single_attr_single_span_stack_cropped_2
216 single_attr_single_span_stack_cropped_2
181− , verify "single attr text span <|> single attr text span cropped. [height]"
217+ , verify "single attr text span <|> single attr text span display cropped. [height]"
182 single_attr_single_span_stack_cropped_3
218 single_attr_single_span_stack_cropped_3
183− , verify "single attr text span <-> single attr text span cropped. [width]"
219+ , verify "single attr text span <-> single attr text span display cropped. [width]"
184 single_attr_single_span_stack_cropped_4
220 single_attr_single_span_stack_cropped_4
185− , verify "single attr text span <-> single attr text span cropped. [height]"
221+ , verify "single attr text span <-> single attr text span display cropped. [height]"
186 single_attr_single_span_stack_cropped_5
222 single_attr_single_span_stack_cropped_5
223+ , verify "cropping from the bottom produces display operations covering the expected rows"
224+ crop_bottom_output_rows
225+ , verify "cropping from the top produces display operations covering the expected rows"
226+ crop_top_output_rows
227+ , verify "cropping from the left produces display operations covering the expected columns"
228+ crop_left_output_columns
229+ , verify "cropping from the right produces display operations covering the expected columns"
230+ crop_right_output_columns
187 , verify "an arbitrary image when rendered to a window of the same size will cover the entire window"
231 , verify "an arbitrary image when rendered to a window of the same size will cover the entire window"
188 image_coverage_matches_bounds
232 image_coverage_matches_bounds