OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium 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 "ui/chromeos/touch_accessibility_enabler.h" | |
6 | |
7 #include "base/macros.h" | |
8 #include "base/test/simple_test_tick_clock.h" | |
9 #include "base/time/time.h" | |
10 #include "ui/aura/test/aura_test_base.h" | |
11 #include "ui/aura/window.h" | |
12 #include "ui/events/event.h" | |
13 #include "ui/events/event_utils.h" | |
14 #include "ui/events/gestures/gesture_provider_aura.h" | |
15 #include "ui/events/test/event_generator.h" | |
16 #include "ui/events/test/events_test_utils.h" | |
17 #include "ui/gfx/geometry/point.h" | |
18 | |
19 namespace ui { | |
20 | |
21 namespace { | |
22 | |
23 class MockTouchAccessibilityEnablerDelegate | |
24 : public ui::TouchAccessibilityEnablerDelegate { | |
25 public: | |
26 MockTouchAccessibilityEnablerDelegate() {} | |
27 ~MockTouchAccessibilityEnablerDelegate() override {} | |
28 | |
29 void PlaySpokenFeedbackToggleCountdown(int tick_count) override { | |
30 ++feedback_progress_sound_count_; | |
31 } | |
32 void ToggleSpokenFeedback() override { toggle_spoken_feedback_ = true; } | |
33 | |
34 size_t feedback_progress_sound_count() const { | |
35 return feedback_progress_sound_count_; | |
36 } | |
37 bool toggle_spoken_feedback() const { return toggle_spoken_feedback_; } | |
38 | |
39 private: | |
40 size_t feedback_progress_sound_count_ = 0; | |
41 bool toggle_spoken_feedback_ = false; | |
42 | |
43 DISALLOW_COPY_AND_ASSIGN(MockTouchAccessibilityEnablerDelegate); | |
44 }; | |
45 | |
46 class TouchAccessibilityEnablerTest : public aura::test::AuraTestBase { | |
47 public: | |
48 TouchAccessibilityEnablerTest() {} | |
49 ~TouchAccessibilityEnablerTest() override {} | |
50 | |
51 void SetUp() override { | |
52 aura::test::AuraTestBase::SetUp(); | |
53 | |
54 generator_.reset(new test::EventGenerator(root_window())); | |
55 | |
56 simulated_clock_ = new base::SimpleTestTickClock(); | |
57 // Tests fail if time is ever 0. | |
58 simulated_clock_->Advance(base::TimeDelta::FromMilliseconds(10)); | |
59 // ui takes ownership of the tick clock. | |
60 ui::SetEventTickClockForTesting( | |
61 std::unique_ptr<base::TickClock>(simulated_clock_)); | |
62 | |
63 enabler_.reset(new TouchAccessibilityEnabler(root_window(), &delegate_)); | |
64 } | |
65 | |
66 void TearDown() override { | |
67 enabler_.reset(nullptr); | |
68 ui::SetEventTickClockForTesting(nullptr); | |
69 aura::test::AuraTestBase::TearDown(); | |
70 } | |
71 | |
72 protected: | |
73 base::TimeTicks Now() { | |
74 // This is the same as what EventTimeForNow() does, but here we do it | |
75 // with our simulated clock. | |
76 return simulated_clock_->NowTicks(); | |
77 } | |
78 | |
79 std::unique_ptr<test::EventGenerator> generator_; | |
80 // Owned by |ui|. | |
81 base::SimpleTestTickClock* simulated_clock_ = nullptr; | |
82 MockTouchAccessibilityEnablerDelegate delegate_; | |
83 std::unique_ptr<TouchAccessibilityEnabler> enabler_; | |
84 ui::GestureDetector::Config gesture_detector_config_; | |
85 | |
86 DISALLOW_COPY_AND_ASSIGN(TouchAccessibilityEnablerTest); | |
87 }; | |
88 | |
89 } // namespace | |
90 | |
91 TEST_F(TouchAccessibilityEnablerTest, EntersOneFingerDownMode) { | |
92 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
93 EXPECT_FALSE(enabler_->IsInOneFingerDownForTesting()); | |
94 generator_->set_current_location(gfx::Point(11, 12)); | |
95 generator_->PressTouch(); | |
96 | |
97 EXPECT_FALSE(enabler_->IsInNoFingersDownForTesting()); | |
98 EXPECT_TRUE(enabler_->IsInOneFingerDownForTesting()); | |
99 } | |
100 | |
101 TEST_F(TouchAccessibilityEnablerTest, EntersTwoFingersDownMode) { | |
102 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
103 generator_->set_current_location(gfx::Point(11, 12)); | |
104 generator_->PressTouchId(1); | |
105 | |
106 generator_->set_current_location(gfx::Point(22, 34)); | |
107 generator_->PressTouchId(2); | |
108 | |
109 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting()); | |
110 } | |
111 | |
112 TEST_F(TouchAccessibilityEnablerTest, PlaysProgressSound) { | |
113 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
114 generator_->set_current_location(gfx::Point(11, 12)); | |
115 generator_->PressTouchId(1); | |
116 | |
117 generator_->set_current_location(gfx::Point(22, 34)); | |
118 generator_->PressTouchId(2); | |
119 | |
120 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting()); | |
121 EXPECT_EQ(0U, delegate_.feedback_progress_sound_count()); | |
122 | |
123 enabler_->TriggerOnTimerForTesting(); | |
124 EXPECT_EQ(0U, delegate_.feedback_progress_sound_count()); | |
125 | |
126 simulated_clock_->Advance(base::TimeDelta::FromMilliseconds(3000)); | |
127 enabler_->TriggerOnTimerForTesting(); | |
128 EXPECT_EQ(1U, delegate_.feedback_progress_sound_count()); | |
129 } | |
130 | |
131 TEST_F(TouchAccessibilityEnablerTest, TogglesSpokenFeedback) { | |
132 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
133 generator_->set_current_location(gfx::Point(11, 12)); | |
134 generator_->PressTouchId(1); | |
135 | |
136 generator_->set_current_location(gfx::Point(22, 34)); | |
137 generator_->PressTouchId(2); | |
138 | |
139 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting()); | |
140 EXPECT_FALSE(delegate_.toggle_spoken_feedback()); | |
141 | |
142 enabler_->TriggerOnTimerForTesting(); | |
143 EXPECT_FALSE(delegate_.toggle_spoken_feedback()); | |
144 | |
145 simulated_clock_->Advance(base::TimeDelta::FromMilliseconds(5000)); | |
146 enabler_->TriggerOnTimerForTesting(); | |
147 EXPECT_TRUE(delegate_.toggle_spoken_feedback()); | |
148 } | |
149 | |
150 TEST_F(TouchAccessibilityEnablerTest, ThreeFingersCancelsDetection) { | |
151 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
152 generator_->set_current_location(gfx::Point(11, 12)); | |
153 generator_->PressTouchId(1); | |
154 | |
155 generator_->set_current_location(gfx::Point(22, 34)); | |
156 generator_->PressTouchId(2); | |
157 | |
158 EXPECT_TRUE(enabler_->IsInTwoFingersDownForTesting()); | |
159 | |
160 generator_->set_current_location(gfx::Point(33, 56)); | |
161 generator_->PressTouchId(3); | |
162 | |
163 EXPECT_TRUE(enabler_->IsInWaitForNoFingersForTesting()); | |
164 } | |
165 | |
166 TEST_F(TouchAccessibilityEnablerTest, MovingFingerPastSlopCancelsDetection) { | |
167 EXPECT_TRUE(enabler_->IsInNoFingersDownForTesting()); | |
168 generator_->set_current_location(gfx::Point(11, 12)); | |
169 generator_->PressTouch(); | |
170 | |
171 int slop = gesture_detector_config_.double_tap_slop; | |
172 int half_slop = slop / 2; | |
173 | |
174 generator_->MoveTouch(gfx::Point(11 + half_slop, 12)); | |
175 EXPECT_TRUE(enabler_->IsInOneFingerDownForTesting()); | |
176 | |
177 generator_->MoveTouch(gfx::Point(11 + slop + 1, 12)); | |
178 EXPECT_TRUE(enabler_->IsInWaitForNoFingersForTesting()); | |
179 } | |
180 | |
181 } // namespace ui | |
OLD | NEW |