@@ -24,9 +24,71 @@ larger_horiz_span_occlusion row_0 row_1 =
2424 ops = display_ops_for_pic p $ DisplayRegion (image_width i_larger) (image_height i_larger)
2525 in verify_ops_equality expected_ops ops
2626
27+-- | Two rows stacked vertical is equivalent to the first row rendered as the top layer and the
28+-- second row rendered as a bottom layer with a background fill where the first row would be.
29+vert_stack_layer_equivalence_0 :: SingleRowSingleAttrImage -> SingleRowSingleAttrImage -> Result
30+vert_stack_layer_equivalence_0 row_0 row_1 =
31+ let i_0 = row_image row_0
32+ i_1 = row_image row_1
33+ i = i_0 <-> i_1
34+ p = pic_for_image i
35+ i_lower = background_fill (image_width i_0) 1 <-> i_1
36+ p_layered = pic_for_layers [i_0, i_lower]
37+ expected_ops = display_ops_for_image i
38+ ops_layered = display_ops_for_pic p_layered $ DisplayRegion (image_width i_lower) (image_height i_lower)
39+ in verify_ops_equality expected_ops ops_layered
40+
41+vert_stack_layer_equivalence_1 :: SingleRowSingleAttrImage -> SingleRowSingleAttrImage -> Result
42+vert_stack_layer_equivalence_1 row_0 row_1 =
43+ let i_0 = row_image row_0
44+ i_1 = row_image row_1
45+ i = i_0 <-> i_1
46+ p = pic_for_image i
47+ i_lower = i_0 <-> background_fill (image_width i_1) 1
48+ i_upper = background_fill (image_width i_0) 1 <-> i_1
49+ p_layered = pic_for_layers [i_upper, i_lower]
50+ expected_ops = display_ops_for_image i
51+ ops_layered = display_ops_for_pic p_layered $ DisplayRegion (image_width i_lower) (image_height i_lower)
52+ in verify_ops_equality expected_ops ops_layered
53+
54+-- | Two rows horiz joined is equivalent to the first row rendered as the top layer and the
55+-- second row rendered as a bottom layer with a background fill where the first row would be.
56+horiz_stack_layer_equivalence_0 :: SingleRowSingleAttrImage -> SingleRowSingleAttrImage -> Result
57+horiz_stack_layer_equivalence_0 row_0 row_1 =
58+ let i_0 = row_image row_0
59+ i_1 = row_image row_1
60+ i = i_0 <|> i_1
61+ p = pic_for_image i
62+ i_lower = background_fill (image_width i_0) 1 <|> i_1
63+ p_layered = pic_for_layers [i_0, i_lower]
64+ expected_ops = display_ops_for_image i
65+ ops_layered = display_ops_for_pic p_layered $ DisplayRegion (image_width i_lower) (image_height i_lower)
66+ in verify_ops_equality expected_ops ops_layered
67+
68+horiz_stack_layer_equivalence_1 :: SingleRowSingleAttrImage -> SingleRowSingleAttrImage -> Result
69+horiz_stack_layer_equivalence_1 row_0 row_1 =
70+ let i_0 = row_image row_0
71+ i_1 = row_image row_1
72+ i = i_0 <|> i_1
73+ p = pic_for_image i
74+ i_lower = i_0 <|> background_fill (image_width i_1) 1
75+ i_upper = background_fill (image_width i_0) 1 <|> i_1
76+ p_layered = pic_for_layers [i_upper, i_lower]
77+ expected_ops = display_ops_for_image i
78+ ops_layered = display_ops_for_pic p_layered $ DisplayRegion (image_width i_lower) (image_height i_lower)
79+ in verify_ops_equality expected_ops ops_layered
80+
2781tests :: IO [Test]
2882tests = return
2983 [ verify "a larger horiz span occludes a smaller span on a lower layer"
3084 larger_horiz_span_occlusion
85+ , verify "two rows stack vertical equiv to first image layered on top of second with padding (0)"
86+ vert_stack_layer_equivalence_0
87+ , verify "two rows stack vertical equiv to first image layered on top of second with padding (1)"
88+ vert_stack_layer_equivalence_1
89+ , verify "two rows horiz joined equiv to first image layered on top of second with padding (0)"
90+ horiz_stack_layer_equivalence_0
91+ , verify "two rows horiz joined equiv to first image layered on top of second with padding (1)"
92+ horiz_stack_layer_equivalence_1
3193 ]
3294