1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/flow/embedded_views.h"
6#include "gtest/gtest.h"
7
8namespace flutter {
9namespace testing {
10
11TEST(MutatorsStack, Initialization) {
12 MutatorsStack stack;
13 ASSERT_TRUE(true);
14}
15
16TEST(MutatorsStack, CopyConstructor) {
17 MutatorsStack stack;
18 auto rrect = SkRRect::MakeEmpty();
19 auto rect = SkRect::MakeEmpty();
20 stack.PushClipRect(rect);
21 stack.PushClipRRect(rrect);
22 MutatorsStack copy = MutatorsStack(stack);
23 ASSERT_TRUE(copy == stack);
24}
25
26TEST(MutatorsStack, CopyAndUpdateTheCopy) {
27 MutatorsStack stack;
28 auto rrect = SkRRect::MakeEmpty();
29 auto rect = SkRect::MakeEmpty();
30 stack.PushClipRect(rect);
31 stack.PushClipRRect(rrect);
32 MutatorsStack copy = MutatorsStack(stack);
33 copy.Pop();
34 copy.Pop();
35 ASSERT_TRUE(copy != stack);
36 ASSERT_TRUE(copy.is_empty());
37 ASSERT_TRUE(!stack.is_empty());
38 auto iter = stack.Bottom();
39 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRRect);
40 ASSERT_TRUE(iter->get()->GetRRect() == rrect);
41 ++iter;
42 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRect);
43 ASSERT_TRUE(iter->get()->GetRect() == rect);
44}
45
46TEST(MutatorsStack, PushClipRect) {
47 MutatorsStack stack;
48 auto rect = SkRect::MakeEmpty();
49 stack.PushClipRect(rect);
50 auto iter = stack.Bottom();
51 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRect);
52 ASSERT_TRUE(iter->get()->GetRect() == rect);
53}
54
55TEST(MutatorsStack, PushClipRRect) {
56 MutatorsStack stack;
57 auto rrect = SkRRect::MakeEmpty();
58 stack.PushClipRRect(rrect);
59 auto iter = stack.Bottom();
60 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRRect);
61 ASSERT_TRUE(iter->get()->GetRRect() == rrect);
62}
63
64TEST(MutatorsStack, PushClipPath) {
65 MutatorsStack stack;
66 SkPath path;
67 stack.PushClipPath(path);
68 auto iter = stack.Bottom();
69 ASSERT_TRUE(iter->get()->GetType() == flutter::MutatorType::kClipPath);
70 ASSERT_TRUE(iter->get()->GetPath() == path);
71}
72
73TEST(MutatorsStack, PushTransform) {
74 MutatorsStack stack;
75 SkMatrix matrix;
76 matrix.setIdentity();
77 stack.PushTransform(matrix);
78 auto iter = stack.Bottom();
79 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kTransform);
80 ASSERT_TRUE(iter->get()->GetMatrix() == matrix);
81}
82
83TEST(MutatorsStack, PushOpacity) {
84 MutatorsStack stack;
85 int alpha = 240;
86 stack.PushOpacity(alpha);
87 auto iter = stack.Bottom();
88 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kOpacity);
89 ASSERT_TRUE(iter->get()->GetAlpha() == 240);
90}
91
92TEST(MutatorsStack, PushBackdropFilter) {
93 MutatorsStack stack;
94 const int num_of_mutators = 10;
95 for (int i = 0; i < num_of_mutators; i++) {
96 auto filter = std::make_shared<DlBlurImageFilter>(args&: i, args: 5, args: DlTileMode::kClamp);
97 stack.PushBackdropFilter(filter, filter_rect: SkRect::MakeXYWH(x: i, y: i, w: i, h: i));
98 }
99
100 auto iter = stack.Begin();
101 int i = 0;
102 while (iter != stack.End()) {
103 ASSERT_EQ(iter->get()->GetType(), MutatorType::kBackdropFilter);
104 ASSERT_EQ(iter->get()->GetFilterMutation().GetFilter().asBlur()->sigma_x(),
105 i);
106 ASSERT_EQ(iter->get()->GetFilterMutation().GetFilterRect().x(), i);
107 ASSERT_EQ(iter->get()->GetFilterMutation().GetFilterRect().x(), i);
108 ASSERT_EQ(iter->get()->GetFilterMutation().GetFilterRect().width(), i);
109 ASSERT_EQ(iter->get()->GetFilterMutation().GetFilterRect().height(), i);
110 ++iter;
111 ++i;
112 }
113 ASSERT_EQ(i, num_of_mutators);
114}
115
116TEST(MutatorsStack, Pop) {
117 MutatorsStack stack;
118 SkMatrix matrix;
119 matrix.setIdentity();
120 stack.PushTransform(matrix);
121 stack.Pop();
122 auto iter = stack.Bottom();
123 ASSERT_TRUE(iter == stack.Top());
124}
125
126TEST(MutatorsStack, Traversal) {
127 MutatorsStack stack;
128 SkMatrix matrix;
129 matrix.setIdentity();
130 stack.PushTransform(matrix);
131 auto rect = SkRect::MakeEmpty();
132 stack.PushClipRect(rect);
133 auto rrect = SkRRect::MakeEmpty();
134 stack.PushClipRRect(rrect);
135 auto iter = stack.Bottom();
136 int index = 0;
137 while (iter != stack.Top()) {
138 switch (index) {
139 case 0:
140 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRRect);
141 ASSERT_TRUE(iter->get()->GetRRect() == rrect);
142 break;
143 case 1:
144 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kClipRect);
145 ASSERT_TRUE(iter->get()->GetRect() == rect);
146 break;
147 case 2:
148 ASSERT_TRUE(iter->get()->GetType() == MutatorType::kTransform);
149 ASSERT_TRUE(iter->get()->GetMatrix() == matrix);
150 break;
151 default:
152 break;
153 }
154 ++iter;
155 ++index;
156 }
157}
158
159TEST(MutatorsStack, Equality) {
160 MutatorsStack stack;
161 SkMatrix matrix = SkMatrix::Scale(sx: 1, sy: 1);
162 stack.PushTransform(matrix);
163 SkRect rect = SkRect::MakeEmpty();
164 stack.PushClipRect(rect);
165 SkRRect rrect = SkRRect::MakeEmpty();
166 stack.PushClipRRect(rrect);
167 SkPath path;
168 stack.PushClipPath(path);
169 int alpha = 240;
170 stack.PushOpacity(alpha);
171 auto filter = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
172 stack.PushBackdropFilter(filter, filter_rect: SkRect::MakeEmpty());
173
174 MutatorsStack stack_other;
175 SkMatrix matrix_other = SkMatrix::Scale(sx: 1, sy: 1);
176 stack_other.PushTransform(matrix: matrix_other);
177 SkRect rect_other = SkRect::MakeEmpty();
178 stack_other.PushClipRect(rect: rect_other);
179 SkRRect rrect_other = SkRRect::MakeEmpty();
180 stack_other.PushClipRRect(rrect: rrect_other);
181 SkPath other_path;
182 stack_other.PushClipPath(path: other_path);
183 int other_alpha = 240;
184 stack_other.PushOpacity(alpha: other_alpha);
185 auto other_filter =
186 std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
187 stack_other.PushBackdropFilter(filter: other_filter, filter_rect: SkRect::MakeEmpty());
188
189 ASSERT_TRUE(stack == stack_other);
190}
191
192TEST(Mutator, Initialization) {
193 SkRect rect = SkRect::MakeEmpty();
194 Mutator mutator = Mutator(rect);
195 ASSERT_TRUE(mutator.GetType() == MutatorType::kClipRect);
196 ASSERT_TRUE(mutator.GetRect() == rect);
197
198 SkRRect rrect = SkRRect::MakeEmpty();
199 Mutator mutator2 = Mutator(rrect);
200 ASSERT_TRUE(mutator2.GetType() == MutatorType::kClipRRect);
201 ASSERT_TRUE(mutator2.GetRRect() == rrect);
202
203 SkPath path;
204 Mutator mutator3 = Mutator(path);
205 ASSERT_TRUE(mutator3.GetType() == MutatorType::kClipPath);
206 ASSERT_TRUE(mutator3.GetPath() == path);
207
208 SkMatrix matrix;
209 matrix.setIdentity();
210 Mutator mutator4 = Mutator(matrix);
211 ASSERT_TRUE(mutator4.GetType() == MutatorType::kTransform);
212 ASSERT_TRUE(mutator4.GetMatrix() == matrix);
213
214 int alpha = 240;
215 Mutator mutator5 = Mutator(alpha);
216 ASSERT_TRUE(mutator5.GetType() == MutatorType::kOpacity);
217
218 auto filter = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
219 Mutator mutator6 = Mutator(filter, SkRect::MakeEmpty());
220 ASSERT_TRUE(mutator6.GetType() == MutatorType::kBackdropFilter);
221 ASSERT_TRUE(mutator6.GetFilterMutation().GetFilter() == *filter);
222}
223
224TEST(Mutator, CopyConstructor) {
225 SkRect rect = SkRect::MakeEmpty();
226 Mutator mutator = Mutator(rect);
227 Mutator copy = Mutator(mutator);
228 ASSERT_TRUE(mutator == copy);
229
230 SkRRect rrect = SkRRect::MakeEmpty();
231 Mutator mutator2 = Mutator(rrect);
232 Mutator copy2 = Mutator(mutator2);
233 ASSERT_TRUE(mutator2 == copy2);
234
235 SkPath path;
236 Mutator mutator3 = Mutator(path);
237 Mutator copy3 = Mutator(mutator3);
238 ASSERT_TRUE(mutator3 == copy3);
239
240 SkMatrix matrix;
241 matrix.setIdentity();
242 Mutator mutator4 = Mutator(matrix);
243 Mutator copy4 = Mutator(mutator4);
244 ASSERT_TRUE(mutator4 == copy4);
245
246 int alpha = 240;
247 Mutator mutator5 = Mutator(alpha);
248 Mutator copy5 = Mutator(mutator5);
249 ASSERT_TRUE(mutator5 == copy5);
250
251 auto filter = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
252 Mutator mutator6 = Mutator(filter, SkRect::MakeEmpty());
253 Mutator copy6 = Mutator(mutator6);
254 ASSERT_TRUE(mutator6 == copy6);
255}
256
257TEST(Mutator, Equality) {
258 SkMatrix matrix;
259 matrix.setIdentity();
260 Mutator mutator = Mutator(matrix);
261 Mutator other_mutator = Mutator(matrix);
262 ASSERT_TRUE(mutator == other_mutator);
263
264 SkRect rect = SkRect::MakeEmpty();
265 Mutator mutator2 = Mutator(rect);
266 Mutator other_mutator2 = Mutator(rect);
267 ASSERT_TRUE(mutator2 == other_mutator2);
268
269 SkRRect rrect = SkRRect::MakeEmpty();
270 Mutator mutator3 = Mutator(rrect);
271 Mutator other_mutator3 = Mutator(rrect);
272 ASSERT_TRUE(mutator3 == other_mutator3);
273
274 SkPath path;
275 flutter::Mutator mutator4 = flutter::Mutator(path);
276 flutter::Mutator other_mutator4 = flutter::Mutator(path);
277 ASSERT_TRUE(mutator4 == other_mutator4);
278 ASSERT_FALSE(mutator2 == mutator);
279 int alpha = 240;
280 Mutator mutator5 = Mutator(alpha);
281 Mutator other_mutator5 = Mutator(alpha);
282 ASSERT_TRUE(mutator5 == other_mutator5);
283
284 auto filter1 = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
285 auto filter2 = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
286 Mutator mutator6 = Mutator(filter1, SkRect::MakeEmpty());
287 Mutator other_mutator6 = Mutator(filter2, SkRect::MakeEmpty());
288 ASSERT_TRUE(mutator6 == other_mutator6);
289}
290
291TEST(Mutator, UnEquality) {
292 SkRect rect = SkRect::MakeEmpty();
293 Mutator mutator = Mutator(rect);
294 SkMatrix matrix;
295 matrix.setIdentity();
296 Mutator not_equal_mutator = Mutator(matrix);
297 ASSERT_TRUE(not_equal_mutator != mutator);
298
299 int alpha = 240;
300 int alpha2 = 241;
301 Mutator mutator2 = Mutator(alpha);
302 Mutator other_mutator2 = Mutator(alpha2);
303 ASSERT_TRUE(mutator2 != other_mutator2);
304
305 auto filter = std::make_shared<DlBlurImageFilter>(args: 5, args: 5, args: DlTileMode::kClamp);
306 auto filter2 =
307 std::make_shared<DlBlurImageFilter>(args: 10, args: 10, args: DlTileMode::kClamp);
308 Mutator mutator3 = Mutator(filter, SkRect::MakeEmpty());
309 Mutator other_mutator3 = Mutator(filter2, SkRect::MakeEmpty());
310 ASSERT_TRUE(mutator3 != other_mutator3);
311}
312
313} // namespace testing
314} // namespace flutter
315

source code of flutter_engine/flutter/flow/mutators_stack_unittests.cc