Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: ui/views/animation/ink_drop_impl_unittest.cc

Issue 2447523002: [ash-md] Added different highlighting modes to the InkDropImpl. (Closed)
Patch Set: Fixed InkDropHostView::GetInkDrop() to use CreateInkDrop(). Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/views/animation/ink_drop_impl.cc ('k') | ui/views/animation/ink_drop_ripple.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory>
6
5 #include "ui/views/animation/ink_drop_impl.h" 7 #include "ui/views/animation/ink_drop_impl.h"
6 8
7 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
8 #include "base/test/test_simple_task_runner.h" 11 #include "base/test/test_simple_task_runner.h"
9 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
10 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/views/animation/test/ink_drop_impl_test_api.h" 14 #include "ui/views/animation/test/ink_drop_impl_test_api.h"
12 #include "ui/views/animation/test/test_ink_drop_host.h" 15 #include "ui/views/animation/test/test_ink_drop_host.h"
13 16
14 namespace views { 17 namespace views {
15 18
16 // NOTE: The InkDropImpl class is also tested by the InkDropFactoryTest tests. 19 // NOTE: The InkDropImpl class is also tested by the InkDropFactoryTest tests.
17 class InkDropImplTest : public testing::Test { 20 class InkDropImplTest : public testing::Test {
18 public: 21 public:
19 InkDropImplTest(); 22 InkDropImplTest();
20 ~InkDropImplTest() override; 23 ~InkDropImplTest() override;
21 24
22 protected: 25 protected:
23 TestInkDropHost ink_drop_host_; 26 TestInkDropHost* ink_drop_host() { return ink_drop_host_.get(); }
24 27
25 // The test target. 28 InkDropImpl* ink_drop() { return ink_drop_.get(); }
26 InkDropImpl ink_drop_;
27 29
28 // Allows privileged access to the the |ink_drop_highlight_|. 30 test::InkDropImplTestApi* test_api() { return test_api_.get(); }
29 test::InkDropImplTestApi test_api_; 31
32 // Runs all the pending tasks in |task_runner_|. This can be used to progress
33 // timers. e.g. HideHighlightOnRippleHiddenState's
34 // |highlight_after_ripple_timer_|.
35 void RunPendingTasks();
36
37 // Returns true if the ink drop layers have been added to |ink_drop_host_|.
38 bool AreLayersAddedToHost() const;
39
40 // Destroyes the |ink_drop_| and assocated |test_api_|.
41 void DestroyInkDrop();
30 42
31 // Used to control the tasks scheduled by the InkDropImpl's Timer. 43 // Used to control the tasks scheduled by the InkDropImpl's Timer.
32 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 44 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
33 45
34 // Required by base::Timer's. 46 // Required by base::Timer's.
35 std::unique_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; 47 std::unique_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_;
36 48
37 private: 49 private:
50 std::unique_ptr<TestInkDropHost> ink_drop_host_;
51
52 // The test target.
53 std::unique_ptr<InkDropImpl> ink_drop_;
54
55 // Allows privileged access to the the |ink_drop_highlight_|.
56 std::unique_ptr<test::InkDropImplTestApi> test_api_;
57
38 DISALLOW_COPY_AND_ASSIGN(InkDropImplTest); 58 DISALLOW_COPY_AND_ASSIGN(InkDropImplTest);
39 }; 59 };
40 60
41 InkDropImplTest::InkDropImplTest() 61 InkDropImplTest::InkDropImplTest()
42 : ink_drop_(&ink_drop_host_), 62 : task_runner_(new base::TestSimpleTaskRunner),
43 test_api_(&ink_drop_),
44 task_runner_(new base::TestSimpleTaskRunner),
45 thread_task_runner_handle_( 63 thread_task_runner_handle_(
46 new base::ThreadTaskRunnerHandle(task_runner_)) { 64 new base::ThreadTaskRunnerHandle(task_runner_)),
47 ink_drop_host_.set_disable_timers_for_test(true); 65 ink_drop_host_(base::MakeUnique<TestInkDropHost>()),
66 ink_drop_(base::MakeUnique<InkDropImpl>(ink_drop_host_.get())),
67 test_api_(base::MakeUnique<test::InkDropImplTestApi>(ink_drop_.get())) {
68 ink_drop_host_->set_disable_timers_for_test(true);
48 } 69 }
49 70
50 InkDropImplTest::~InkDropImplTest() {} 71 InkDropImplTest::~InkDropImplTest() {}
51 72
52 TEST_F(InkDropImplTest, SetHoveredHighlightIsFadingInOrVisible) { 73 void InkDropImplTest::RunPendingTasks() {
53 ink_drop_host_.set_should_show_highlight(true); 74 task_runner_->RunPendingTasks();
54
55 ink_drop_.SetHovered(true);
56 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
57
58 test_api_.CompleteAnimations();
59
60 ink_drop_.SetHovered(false);
61 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
62 }
63
64 TEST_F(InkDropImplTest, FocusAndHoverAtSameTime) {
65 ink_drop_host_.set_should_show_highlight(true);
66 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
67
68 ink_drop_.SetFocused(true);
69 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
70
71 test_api_.CompleteAnimations();
72 ink_drop_.SetHovered(false);
73 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
74
75 test_api_.CompleteAnimations();
76 ink_drop_.SetHovered(true);
77 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
78
79 test_api_.CompleteAnimations();
80 ink_drop_.SetFocused(false);
81 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
82
83 test_api_.CompleteAnimations();
84 ink_drop_.SetHovered(false);
85 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
86 }
87
88 TEST_F(InkDropImplTest, HighlightDoesntFadeInAfterAnimationIfHighlightNotSet) {
89 ink_drop_host_.set_should_show_highlight(true);
90 ink_drop_.SetHovered(false);
91 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
92 test_api_.CompleteAnimations();
93
94 EXPECT_FALSE(task_runner_->HasPendingTask()); 75 EXPECT_FALSE(task_runner_->HasPendingTask());
95 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); 76 }
96 } 77
97 78 bool InkDropImplTest::AreLayersAddedToHost() const {
98 TEST_F(InkDropImplTest, HighlightFadesInAfterAnimationWhenHostIsHovered) { 79 return ink_drop_host_->num_ink_drop_layers() >= 1;
99 ink_drop_host_.set_should_show_highlight(true); 80 }
100 ink_drop_.SetHovered(true); 81
101 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); 82 void InkDropImplTest::DestroyInkDrop() {
102 test_api_.CompleteAnimations(); 83 test_api_.reset();
103 84 ink_drop_.reset();
104 EXPECT_TRUE(task_runner_->HasPendingTask()); 85 }
105 86
106 task_runner_->RunPendingTasks(); 87 // AutoHighlightMode parameterized test fixture.
107 88 class InkDropImplAutoHighlightTest
108 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); 89 : public InkDropImplTest,
90 public testing::WithParamInterface<
91 testing::tuple<InkDropImpl::AutoHighlightMode>> {
92 public:
93 InkDropImplAutoHighlightTest();
94 ~InkDropImplAutoHighlightTest() override;
95
96 InkDropImpl::AutoHighlightMode GetAutoHighlightMode() const;
97
98 private:
99 DISALLOW_COPY_AND_ASSIGN(InkDropImplAutoHighlightTest);
100 };
101
102 InkDropImplAutoHighlightTest::InkDropImplAutoHighlightTest()
103 : InkDropImplTest() {
104 ink_drop()->SetAutoHighlightMode(GetAutoHighlightMode());
105 }
106
107 InkDropImplAutoHighlightTest::~InkDropImplAutoHighlightTest() {}
108
109 InkDropImpl::AutoHighlightMode
110 InkDropImplAutoHighlightTest::GetAutoHighlightMode() const {
111 return testing::get<0>(GetParam());
112 }
113
114 ////////////////////////////////////////////////////////////////////////////////
115 //
116 // InkDropImpl tests
117 //
118
119 TEST_F(InkDropImplTest, ShouldHighlight) {
120 ink_drop()->SetShowHighlightOnHover(false);
121 ink_drop()->SetHovered(false);
122 ink_drop()->SetShowHighlightOnFocus(false);
123 ink_drop()->SetFocused(false);
124 EXPECT_FALSE(test_api()->ShouldHighlight());
125
126 ink_drop()->SetShowHighlightOnHover(true);
127 ink_drop()->SetHovered(false);
128 ink_drop()->SetShowHighlightOnFocus(false);
129 ink_drop()->SetFocused(false);
130 EXPECT_FALSE(test_api()->ShouldHighlight());
131
132 ink_drop()->SetShowHighlightOnHover(false);
133 ink_drop()->SetHovered(true);
134 ink_drop()->SetShowHighlightOnFocus(false);
135 ink_drop()->SetFocused(false);
136 EXPECT_FALSE(test_api()->ShouldHighlight());
137
138 ink_drop()->SetShowHighlightOnHover(false);
139 ink_drop()->SetHovered(false);
140 ink_drop()->SetShowHighlightOnFocus(true);
141 ink_drop()->SetFocused(false);
142 EXPECT_FALSE(test_api()->ShouldHighlight());
143
144 ink_drop()->SetShowHighlightOnHover(false);
145 ink_drop()->SetHovered(false);
146 ink_drop()->SetShowHighlightOnFocus(false);
147 ink_drop()->SetFocused(true);
148 EXPECT_FALSE(test_api()->ShouldHighlight());
149
150 ink_drop()->SetShowHighlightOnHover(true);
151 ink_drop()->SetHovered(true);
152 ink_drop()->SetShowHighlightOnFocus(false);
153 ink_drop()->SetFocused(false);
154 EXPECT_TRUE(test_api()->ShouldHighlight());
155
156 ink_drop()->SetShowHighlightOnHover(false);
157 ink_drop()->SetHovered(false);
158 ink_drop()->SetShowHighlightOnFocus(true);
159 ink_drop()->SetFocused(true);
160 EXPECT_TRUE(test_api()->ShouldHighlight());
161
162 test_api()->SetShouldHighlight(false);
163 EXPECT_FALSE(test_api()->ShouldHighlight());
164
165 test_api()->SetShouldHighlight(true);
166 EXPECT_TRUE(test_api()->ShouldHighlight());
109 } 167 }
110 168
111 TEST_F(InkDropImplTest, 169 TEST_F(InkDropImplTest,
112 HighlightDoesntFadeInAfterAnimationWhenHostIsNotHovered) { 170 VerifyInkDropLayersRemovedWhenPresentDuringDestruction) {
113 ink_drop_host_.set_should_show_highlight(false); 171 test_api()->SetShouldHighlight(true);
114 ink_drop_.SetHovered(true); 172 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
115 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); 173 EXPECT_TRUE(AreLayersAddedToHost());
116 test_api_.CompleteAnimations(); 174 DestroyInkDrop();
117 175 EXPECT_FALSE(AreLayersAddedToHost());
118 EXPECT_TRUE(task_runner_->HasPendingTask());
119
120 task_runner_->RunPendingTasks();
121
122 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
123 }
124
125 TEST_F(InkDropImplTest, HoveredStateNotVisibleOrFadingInAfterAnimateToState) {
126 ink_drop_host_.set_should_show_highlight(true);
127
128 ink_drop_.SetHovered(true);
129 test_api_.CompleteAnimations();
130 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
131
132 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
133 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
134 }
135
136 // Verifies that there is not a crash when setting hovered state and the host
137 // returns null for the highlight.
138 TEST_F(InkDropImplTest, SetHoveredFalseWorksWhenNoInkDropHighlightExists) {
139 ink_drop_host_.set_should_show_highlight(false);
140 ink_drop_.SetHovered(true);
141 EXPECT_FALSE(test_api_.highlight());
142 ink_drop_.SetHovered(false);
143 EXPECT_FALSE(test_api_.highlight());
144 }
145
146 TEST_F(InkDropImplTest, HighlightFadesOutOnSnapToActivated) {
147 ink_drop_host_.set_should_show_highlight(true);
148 ink_drop_.SetHovered(true);
149 test_api_.CompleteAnimations();
150
151 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
152
153 ink_drop_.SnapToActivated();
154
155 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
156 }
157
158 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterHighlight) {
159 ink_drop_host_.set_should_show_highlight(true);
160
161 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
162
163 ink_drop_.SetHovered(true);
164 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
165
166 test_api_.CompleteAnimations();
167
168 ink_drop_.SetHovered(false);
169 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
170
171 test_api_.CompleteAnimations();
172 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
173 }
174
175 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterInkDrop) {
176 ink_drop_host_.set_should_show_highlight(true);
177
178 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
179
180 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
181 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
182
183 ink_drop_.AnimateToState(InkDropState::HIDDEN);
184 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
185
186 test_api_.CompleteAnimations();
187 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
188 }
189
190 TEST_F(InkDropImplTest, LayersAddedToHostWhenHighlightOrInkDropVisible) {
191 ink_drop_host_.set_should_show_highlight(true);
192
193 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
194
195 ink_drop_.SetHovered(true);
196 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
197
198 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
199 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
200
201 ink_drop_.AnimateToState(InkDropState::HIDDEN);
202 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
203
204 test_api_.CompleteAnimations();
205 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
206
207 EXPECT_TRUE(task_runner_->HasPendingTask());
208 task_runner_->RunPendingTasks();
209
210 // Highlight should be fading back in.
211 EXPECT_TRUE(test_api_.HasActiveAnimations());
212 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
213 }
214
215 TEST_F(InkDropImplTest, LayersNotAddedToHostWhenHighlightTimeFires) {
216 ink_drop_host_.set_should_show_highlight(true);
217
218 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
219
220 ink_drop_.SetHovered(true);
221 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
222
223 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
224 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
225
226 ink_drop_.AnimateToState(InkDropState::HIDDEN);
227 test_api_.CompleteAnimations();
228 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
229
230 ink_drop_host_.set_should_show_highlight(false);
231
232 EXPECT_TRUE(task_runner_->HasPendingTask());
233 task_runner_->RunPendingTasks();
234
235 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
236 }
237
238 TEST_F(InkDropImplTest, LayersArentRemovedWhenPreemptingFadeOut) {
239 ink_drop_host_.set_should_show_highlight(true);
240
241 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
242
243 ink_drop_.SetHovered(true);
244 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
245
246 test_api_.CompleteAnimations();
247
248 ink_drop_.SetHovered(false);
249 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
250
251 ink_drop_.SetHovered(true);
252 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
253 }
254
255 TEST_F(InkDropImplTest, AnimationWhenDeactivated) {
256 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
257
258 ink_drop_.AnimateToState(InkDropState::ACTIVATED);
259 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
260 test_api_.CompleteAnimations();
261
262 ink_drop_.AnimateToState(InkDropState::DEACTIVATED);
263 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
264 EXPECT_TRUE(test_api_.HasActiveAnimations());
265 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
266 }
267
268 TEST_F(InkDropImplTest, AnimationSkippedWhenFocusedAndDeactivated) {
269 ink_drop_host_.set_should_show_highlight(true);
270
271 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
272
273 ink_drop_.SetFocused(true);
274 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
275
276 ink_drop_.AnimateToState(InkDropState::ACTIVATED);
277 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
278 test_api_.CompleteAnimations();
279
280 ink_drop_.AnimateToState(InkDropState::DEACTIVATED);
281 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
282 EXPECT_FALSE(test_api_.HasActiveAnimations());
283 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
284 EXPECT_EQ(InkDropState::HIDDEN, ink_drop_.GetTargetInkDropState());
285 }
286
287 TEST_F(InkDropImplTest, FocusHighlightComesBackImmediatelyAfterAction) {
288 ink_drop_host_.set_should_show_highlight(true);
289
290 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
291
292 ink_drop_.SetFocused(true);
293 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
294
295 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
296 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
297 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
298
299 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
300 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
301
302 test_api_.CompleteAnimations();
303
304 // No delay (unlike in the hover case).
305 EXPECT_FALSE(task_runner_->HasPendingTask());
306
307 // Highlight should be back.
308 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
309 }
310
311 TEST_F(InkDropImplTest, HighlightCanCoexistWithRipple) {
312 ink_drop_host_.set_should_show_highlight(true);
313 ink_drop_host_.set_ripple_overrides_highlight(false);
314
315 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
316
317 ink_drop_.SetHovered(true);
318 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
319
320 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
321 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
322 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
323
324 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
325 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
326 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
327
328 test_api_.CompleteAnimations();
329
330 // Nothing to fade in because the highlight has always been visible.
331 EXPECT_FALSE(task_runner_->HasPendingTask());
332 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
333
334 // Now try with the ripple showing before the highlight comes in.
335 ink_drop_.AnimateToState(InkDropState::HIDDEN);
336 ink_drop_.SetHovered(false);
337 test_api_.CompleteAnimations();
338 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
339
340 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
341 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
342 ink_drop_.SetHovered(true);
343 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
344 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
345 }
346
347 TEST_F(InkDropImplTest, HighlightCanCoexistWithSnapToActivatedRipple) {
348 ink_drop_host_.set_should_show_highlight(true);
349 ink_drop_host_.set_ripple_overrides_highlight(false);
350
351 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
352
353 ink_drop_.SetHovered(true);
354 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
355
356 ink_drop_.SnapToActivated();
357 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
358 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
359
360 // Now try with the ripple showing before the highlight comes in.
361 ink_drop_.AnimateToState(InkDropState::HIDDEN);
362 ink_drop_.SetHovered(false);
363 test_api_.CompleteAnimations();
364 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
365
366 ink_drop_.SnapToActivated();
367 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
368 ink_drop_.SetHovered(true);
369 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
370 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
371 } 176 }
372 177
373 // Test that (re-)hiding or un-hovering a hidden ink drop doesn't add layers. 178 // Test that (re-)hiding or un-hovering a hidden ink drop doesn't add layers.
374 TEST_F(InkDropImplTest, AlwaysHiddenInkDropHasNoLayers) { 179 TEST_F(InkDropImplTest, AlwaysHiddenInkDropHasNoLayers) {
375 ink_drop_host_.set_should_show_highlight(true); 180 EXPECT_FALSE(AreLayersAddedToHost());
376 181
377 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); 182 ink_drop()->AnimateToState(InkDropState::HIDDEN);
378 183 EXPECT_FALSE(AreLayersAddedToHost());
379 ink_drop_.AnimateToState(InkDropState::HIDDEN); 184
380 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); 185 ink_drop()->SetHovered(false);
381 186 EXPECT_FALSE(AreLayersAddedToHost());
382 ink_drop_.SetHovered(false); 187 }
383 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); 188
189 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterHighlight) {
190 EXPECT_FALSE(AreLayersAddedToHost());
191
192 test_api()->SetShouldHighlight(true);
193 EXPECT_TRUE(AreLayersAddedToHost());
194
195 test_api()->CompleteAnimations();
196
197 test_api()->SetShouldHighlight(false);
198 test_api()->CompleteAnimations();
199 EXPECT_FALSE(AreLayersAddedToHost());
200 }
201
202 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterInkDrop) {
203 EXPECT_FALSE(AreLayersAddedToHost());
204
205 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
206 EXPECT_TRUE(AreLayersAddedToHost());
207
208 test_api()->CompleteAnimations();
209
210 ink_drop()->AnimateToState(InkDropState::HIDDEN);
211 EXPECT_TRUE(AreLayersAddedToHost());
212
213 test_api()->CompleteAnimations();
214 EXPECT_FALSE(AreLayersAddedToHost());
215 }
216
217 TEST_F(InkDropImplTest, LayersArentRemovedWhenPreemptingFadeOut) {
218 EXPECT_FALSE(AreLayersAddedToHost());
219
220 test_api()->SetShouldHighlight(true);
221 EXPECT_TRUE(AreLayersAddedToHost());
222
223 test_api()->CompleteAnimations();
224
225 ink_drop()->SetHovered(false);
226 EXPECT_TRUE(AreLayersAddedToHost());
227
228 ink_drop()->SetHovered(true);
229 EXPECT_TRUE(AreLayersAddedToHost());
230 }
231
232 #if DCHECK_IS_ON()
233 TEST_F(InkDropImplTest, SettingHighlightStateDuringStateExitIsntAllowed) {
234 test::InkDropImplTestApi::SetStateOnExitHighlightState::Install(
235 test_api()->state_factory());
236 ASSERT_DEATH_IF_SUPPORTED(
237 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install(
238 test_api()->state_factory()),
239 ".*HighlightStates should not be changed within a call to "
240 "HighlightState::Exit\\(\\)\\..*");
241 }
242 #endif
243
244 // Verifies there is no use after free errors.
245 TEST_F(InkDropImplTest,
246 TearingDownHighlightStateThatAccessesTheStateFactoryIsSafe) {
247 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install(
248 test_api()->state_factory());
249 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install(
250 test_api()->state_factory());
251 }
252
253 ////////////////////////////////////////////////////////////////////////////////
254 //
255 // Common AutoHighlightMode tests
256 //
257
258 typedef InkDropImplAutoHighlightTest InkDropImplCommonAutoHighlightTest;
259 // Note: First argument is optional and intentionally left blank.
260 // (it's a prefix for the generated test cases)
261 INSTANTIATE_TEST_CASE_P(
262 ,
263 InkDropImplCommonAutoHighlightTest,
264 testing::Values(InkDropImpl::AutoHighlightMode::NONE,
265 InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE,
266 InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE));
267
268 // Verifies InkDropImplTestApi::SetShouldHighlight() works as expected.
269 TEST_P(InkDropImplCommonAutoHighlightTest,
270 ShouldHighlightCausesHighlightToBeVisible) {
271 test_api()->SetShouldHighlight(true);
272 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
273
274 test_api()->SetShouldHighlight(false);
275 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
276 }
277
278 TEST_P(InkDropImplCommonAutoHighlightTest,
279 HighlightVisibilityForFocusAndHoverStates) {
280 ink_drop()->SetShowHighlightOnHover(true);
281 ink_drop()->SetShowHighlightOnFocus(true);
282
283 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
284
285 ink_drop()->SetFocused(true);
286 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
287
288 ink_drop()->SetHovered(false);
289 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
290
291 ink_drop()->SetHovered(true);
292 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
293
294 ink_drop()->SetFocused(false);
295 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
296
297 ink_drop()->SetHovered(false);
298 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
299 }
300
301 ////////////////////////////////////////////////////////////////////////////////
302 //
303 // InkDropImpl::AutoHighlightMode::NONE specific tests
304 //
305
306 typedef InkDropImplAutoHighlightTest InkDropImplNoAutoHighlightTest;
307 // Note: First argument is optional and intentionally left blank.
308 // (it's a prefix for the generated test cases)
309 INSTANTIATE_TEST_CASE_P(,
310 InkDropImplNoAutoHighlightTest,
311 testing::Values(InkDropImpl::AutoHighlightMode::NONE));
312
313 TEST_P(InkDropImplNoAutoHighlightTest, VisibleHighlightDuringRippleAnimations) {
314 test_api()->SetShouldHighlight(true);
315
316 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
317 test_api()->CompleteAnimations();
318 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
319
320 ink_drop()->AnimateToState(InkDropState::HIDDEN);
321 test_api()->CompleteAnimations();
322 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
323 }
324
325 TEST_P(InkDropImplNoAutoHighlightTest, HiddenHighlightDuringRippleAnimations) {
326 test_api()->SetShouldHighlight(false);
327
328 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
329 test_api()->CompleteAnimations();
330 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
331
332 ink_drop()->AnimateToState(InkDropState::HIDDEN);
333 test_api()->CompleteAnimations();
334 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
335 }
336
337 ////////////////////////////////////////////////////////////////////////////////
338 //
339 // InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE specific tests
340 //
341
342 typedef InkDropImplAutoHighlightTest InkDropImplHideAutoHighlightTest;
343 // Note: First argument is optional and intentionally left blank.
344 // (it's a prefix for the generated test cases)
345 INSTANTIATE_TEST_CASE_P(
346 ,
347 InkDropImplHideAutoHighlightTest,
348 testing::Values(InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE));
349
350 TEST_P(InkDropImplHideAutoHighlightTest,
351 VisibleHighlightDuringRippleAnimations) {
352 test_api()->SetShouldHighlight(true);
353
354 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
355 test_api()->CompleteAnimations();
356 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
357
358 ink_drop()->AnimateToState(InkDropState::HIDDEN);
359 test_api()->CompleteAnimations();
360 RunPendingTasks();
361 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
362 }
363
364 TEST_P(InkDropImplHideAutoHighlightTest,
365 HiddenHighlightDuringRippleAnimations) {
366 test_api()->SetShouldHighlight(false);
367
368 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
369 test_api()->CompleteAnimations();
370 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
371
372 ink_drop()->AnimateToState(InkDropState::HIDDEN);
373 test_api()->CompleteAnimations();
374 RunPendingTasks();
375 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
376 }
377
378 TEST_P(InkDropImplHideAutoHighlightTest, HighlightIsHiddenOnSnapToActivated) {
379 test_api()->SetShouldHighlight(true);
380
381 ink_drop()->SnapToActivated();
382 test_api()->CompleteAnimations();
383 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
384
385 ink_drop()->AnimateToState(InkDropState::HIDDEN);
386 test_api()->CompleteAnimations();
387 RunPendingTasks();
388 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
389 }
390
391 TEST_P(InkDropImplHideAutoHighlightTest,
392 HighlightDoesntFadeInAfterAnimationIfHighlightNotSet) {
393 test_api()->SetShouldHighlight(true);
394
395 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED);
396 test_api()->CompleteAnimations();
397 test_api()->SetShouldHighlight(false);
398 ink_drop()->AnimateToState(InkDropState::HIDDEN);
399 test_api()->CompleteAnimations();
400 RunPendingTasks();
401
402 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
403 }
404
405 TEST_P(InkDropImplHideAutoHighlightTest,
406 HighlightFadesInAfterAnimationIfHovered) {
407 ink_drop()->SetShowHighlightOnHover(true);
408 ink_drop()->SetHovered(true);
409
410 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED);
411 test_api()->CompleteAnimations();
412 ink_drop()->AnimateToState(InkDropState::HIDDEN);
413 test_api()->CompleteAnimations();
414
415 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
416 EXPECT_TRUE(task_runner_->HasPendingTask());
417
418 RunPendingTasks();
419
420 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
421 }
422
423 TEST_P(InkDropImplHideAutoHighlightTest,
424 HighlightSnapsInAfterAnimationWhenHostIsFocused) {
425 ink_drop()->SetShowHighlightOnFocus(true);
426 ink_drop()->SetFocused(true);
427
428 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED);
429 test_api()->CompleteAnimations();
430 ink_drop()->AnimateToState(InkDropState::HIDDEN);
431 test_api()->CompleteAnimations();
432
433 EXPECT_FALSE(task_runner_->HasPendingTask());
434 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
435 }
436
437 TEST_P(InkDropImplHideAutoHighlightTest, DeactivatedAnimatesWhenNotFocused) {
438 test_api()->SetShouldHighlight(false);
439
440 ink_drop()->AnimateToState(InkDropState::ACTIVATED);
441 test_api()->CompleteAnimations();
442
443 ink_drop()->AnimateToState(InkDropState::DEACTIVATED);
444 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
445 EXPECT_TRUE(test_api()->HasActiveAnimations());
446 }
447
448 TEST_P(InkDropImplHideAutoHighlightTest,
449 DeactivatedAnimationSkippedWhenFocused) {
450 ink_drop()->SetShowHighlightOnFocus(true);
451 ink_drop()->SetFocused(true);
452
453 ink_drop()->AnimateToState(InkDropState::ACTIVATED);
454 test_api()->CompleteAnimations();
455
456 ink_drop()->AnimateToState(InkDropState::DEACTIVATED);
457 EXPECT_TRUE(AreLayersAddedToHost());
458
459 test_api()->CompleteAnimations();
460 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
461 EXPECT_EQ(InkDropState::HIDDEN, ink_drop()->GetTargetInkDropState());
462 }
463
464 TEST_P(InkDropImplHideAutoHighlightTest,
465 FocusAndHoverChangesDontShowHighlightWhenRippleIsVisible) {
466 test_api()->SetShouldHighlight(true);
467 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
468 test_api()->CompleteAnimations();
469 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
470
471 ink_drop()->SetHovered(false);
472 ink_drop()->SetFocused(false);
473
474 ink_drop()->SetHovered(true);
475 ink_drop()->SetFocused(true);
476
477 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
478 EXPECT_TRUE(test_api()->ShouldHighlight());
479 }
480
481 ////////////////////////////////////////////////////////////////////////////////
482 //
483 // InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE specific tests
484 //
485
486 typedef InkDropImplAutoHighlightTest InkDropImplShowAutoHighlightTest;
487 // Note: First argument is optional and intentionally left blank.
488 // (it's a prefix for the generated test cases)
489 INSTANTIATE_TEST_CASE_P(
490 ,
491 InkDropImplShowAutoHighlightTest,
492 testing::Values(InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE));
493
494 TEST_P(InkDropImplShowAutoHighlightTest,
495 VisibleHighlightDuringRippleAnimations) {
496 test_api()->SetShouldHighlight(true);
497
498 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
499 test_api()->CompleteAnimations();
500 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
501
502 ink_drop()->AnimateToState(InkDropState::HIDDEN);
503 test_api()->CompleteAnimations();
504 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
505 }
506
507 TEST_P(InkDropImplShowAutoHighlightTest,
508 HiddenHighlightDuringRippleAnimations) {
509 test_api()->SetShouldHighlight(false);
510
511 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
512 test_api()->CompleteAnimations();
513 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
514
515 ink_drop()->AnimateToState(InkDropState::HIDDEN);
516 test_api()->CompleteAnimations();
517 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible());
518 }
519
520 TEST_P(InkDropImplShowAutoHighlightTest,
521 FocusAndHoverChangesDontHideHighlightWhenRippleIsVisible) {
522 test_api()->SetShouldHighlight(true);
523 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
524 test_api()->CompleteAnimations();
525 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
526
527 ink_drop()->SetHovered(false);
528 ink_drop()->SetFocused(false);
529
530 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible());
531 EXPECT_FALSE(test_api()->ShouldHighlight());
384 } 532 }
385 533
386 } // namespace views 534 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/animation/ink_drop_impl.cc ('k') | ui/views/animation/ink_drop_ripple.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698