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

Side by Side Diff: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm

Issue 2005443002: Implement bluetooth chooser for Chrome Apps on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor_chooser_bubble_ui_cocoa
Patch Set: rebase and address comments Created 4 years, 6 months 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
OLDNEW
(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 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h"
6
7 #import <Cocoa/Cocoa.h>
8
9 #include <memory>
10 #include <vector>
11
12 #include "base/strings/utf_string_conversions.h"
13 #import "chrome/browser/ui/cocoa/chooser_content_view.h"
14 #import "chrome/browser/ui/cocoa/cocoa_profile_test.h"
15 #include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
16 #import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h"
17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 #include "testing/gtest_mac.h"
20
21 namespace {
22
23 class MockChooserController : public ChooserController {
24 public:
25 explicit MockChooserController(content::RenderFrameHost* owner)
26 : ChooserController(owner) {}
27 ~MockChooserController() override {}
28
29 // ChooserController:
30 size_t NumOptions() const override { return option_names_.size(); }
31
32 // ChooserController:
33 const base::string16& GetOption(size_t index) const override {
34 return option_names_[index];
35 }
36
37 // ChooserController:
38 MOCK_METHOD1(Select, void(size_t index));
39
40 // ChooserController:
41 MOCK_METHOD0(Cancel, void());
42
43 // ChooserController:
44 MOCK_METHOD0(Close, void());
45
46 // ChooserController:
47 MOCK_CONST_METHOD0(OpenHelpCenterUrl, void());
48
49 void OptionAdded(const base::string16 option_name) {
50 option_names_.push_back(option_name);
51 if (observer())
52 observer()->OnOptionAdded(option_names_.size() - 1);
53 }
54
55 void OptionRemoved(const base::string16 option_name) {
56 for (auto it = option_names_.begin(); it != option_names_.end(); ++it) {
57 if (*it == option_name) {
58 size_t index = it - option_names_.begin();
59 option_names_.erase(it);
60 if (observer())
61 observer()->OnOptionRemoved(index);
62 return;
63 }
64 }
65 }
66
67 private:
68 std::vector<base::string16> option_names_;
69
70 DISALLOW_COPY_AND_ASSIGN(MockChooserController);
71 };
72
73 } // namespace
74
75 class ChooserDialogCocoaControllerTest : public CocoaProfileTest {
76 protected:
77 ChooserDialogCocoaControllerTest() {}
78 ~ChooserDialogCocoaControllerTest() override {}
79
80 void SetUp() override {
81 CocoaProfileTest::SetUp();
82 ASSERT_TRUE(browser());
83 }
84
85 // Create a ChooserDialogCocoa.
86 void CreateChooserDialog() {
87 content::WebContents* web_contents =
88 content::WebContents::Create(content::WebContents::CreateParams(
89 profile(), content::SiteInstance::Create(profile())));
90 ASSERT_TRUE(web_contents);
91 chooser_controller_.reset(
92 new MockChooserController(web_contents->GetMainFrame()));
93 ASSERT_TRUE(chooser_controller_);
94 chooser_dialog_.reset(
95 new ChooserDialogCocoa(web_contents, chooser_controller_.get()));
96 ASSERT_TRUE(chooser_dialog_);
97 chooser_dialog_controller_ =
98 chooser_dialog_->chooser_dialog_cocoa_controller_.get();
99 ASSERT_TRUE(chooser_dialog_controller_);
100 chooser_content_view_ = [chooser_dialog_controller_ chooserContentView];
101 ASSERT_TRUE(chooser_content_view_);
102 table_view_ = [chooser_content_view_ tableView];
103 ASSERT_TRUE(table_view_);
104 connect_button_ = [chooser_content_view_ connectButton];
105 ASSERT_TRUE(connect_button_);
106 cancel_button_ = [chooser_content_view_ cancelButton];
107 ASSERT_TRUE(cancel_button_);
108 help_button_ = [chooser_content_view_ helpButton];
109 ASSERT_TRUE(help_button_);
110 }
111
112 std::unique_ptr<MockChooserController> chooser_controller_;
113 std::unique_ptr<ChooserDialogCocoa> chooser_dialog_;
114
115 ChooserDialogCocoaController* chooser_dialog_controller_;
116 ChooserContentView* chooser_content_view_;
117 NSTableView* table_view_;
118 NSButton* connect_button_;
119 NSButton* cancel_button_;
120 NSButton* help_button_;
121
122 private:
123 DISALLOW_COPY_AND_ASSIGN(ChooserDialogCocoaControllerTest);
124 };
125
126 TEST_F(ChooserDialogCocoaControllerTest, InitialState) {
127 CreateChooserDialog();
128
129 // Since "No devices found." needs to be displayed on the |table_view_|,
130 // the number of rows is 1.
131 EXPECT_EQ(table_view_.numberOfRows, 1);
132 EXPECT_EQ(table_view_.numberOfColumns, 1);
133 // |table_view_| should be disabled since there is no option shown.
134 ASSERT_FALSE(table_view_.enabled);
135 // No option selected.
136 EXPECT_EQ(table_view_.selectedRow, -1);
137 // |connect_button_| should be disabled since no option selected.
138 ASSERT_FALSE(connect_button_.enabled);
139 ASSERT_TRUE(cancel_button_.enabled);
140 ASSERT_TRUE(help_button_.enabled);
141 }
142
143 TEST_F(ChooserDialogCocoaControllerTest, AddOption) {
144 CreateChooserDialog();
145
146 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
147 EXPECT_EQ(table_view_.numberOfRows, 1);
148 EXPECT_EQ(table_view_.numberOfColumns, 1);
149 // |table_view_| should be enabled since there is an option.
150 ASSERT_TRUE(table_view_.enabled);
151 EXPECT_EQ(table_view_.selectedRow, -1);
152 ASSERT_FALSE(connect_button_.enabled);
153 ASSERT_TRUE(cancel_button_.enabled);
154 ASSERT_TRUE(help_button_.enabled);
155
156 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
157 EXPECT_EQ(table_view_.numberOfRows, 2);
158 EXPECT_EQ(table_view_.numberOfColumns, 1);
159 ASSERT_TRUE(table_view_.enabled);
160 EXPECT_EQ(table_view_.selectedRow, -1);
161
162 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
163 EXPECT_EQ(table_view_.numberOfRows, 3);
164 EXPECT_EQ(table_view_.numberOfColumns, 1);
165 ASSERT_TRUE(table_view_.enabled);
166 EXPECT_EQ(table_view_.selectedRow, -1);
167 }
168
169 TEST_F(ChooserDialogCocoaControllerTest, RemoveOption) {
170 CreateChooserDialog();
171
172 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
173 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
174 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
175
176 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
177 EXPECT_EQ(table_view_.numberOfRows, 2);
178 EXPECT_EQ(table_view_.numberOfColumns, 1);
179 ASSERT_TRUE(table_view_.enabled);
180 EXPECT_EQ(table_view_.selectedRow, -1);
181
182 // Remove a non-existent option, the number of rows should not change.
183 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("non-existent"));
184 EXPECT_EQ(table_view_.numberOfRows, 2);
185 EXPECT_EQ(table_view_.numberOfColumns, 1);
186 ASSERT_TRUE(table_view_.enabled);
187 EXPECT_EQ(table_view_.selectedRow, -1);
188
189 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
190 EXPECT_EQ(table_view_.numberOfRows, 1);
191 EXPECT_EQ(table_view_.numberOfColumns, 1);
192 ASSERT_TRUE(table_view_.enabled);
193 EXPECT_EQ(table_view_.selectedRow, -1);
194
195 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a"));
196 // There is no option shown now. But since "No devices found."
197 // needs to be displayed on the |table_view_|, the number of rows is 1.
198 EXPECT_EQ(table_view_.numberOfRows, 1);
199 EXPECT_EQ(table_view_.numberOfColumns, 1);
200 // |table_view_| should be disabled since all options are removed.
201 ASSERT_FALSE(table_view_.enabled);
202 EXPECT_EQ(table_view_.selectedRow, -1);
203 }
204
205 TEST_F(ChooserDialogCocoaControllerTest, AddAndRemoveOption) {
206 CreateChooserDialog();
207
208 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
209 EXPECT_EQ(table_view_.numberOfRows, 1);
210 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
211 EXPECT_EQ(table_view_.numberOfRows, 2);
212 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
213 EXPECT_EQ(table_view_.numberOfRows, 1);
214 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
215 EXPECT_EQ(table_view_.numberOfRows, 2);
216 chooser_controller_->OptionAdded(base::ASCIIToUTF16("d"));
217 EXPECT_EQ(table_view_.numberOfRows, 3);
218 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("d"));
219 EXPECT_EQ(table_view_.numberOfRows, 2);
220 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
221 // There is no option shown now. But since "No devices found."
222 // needs to be displayed on the |table_view_|, the number of rows is 1.
223 EXPECT_EQ(table_view_.numberOfRows, 1);
224 }
225
226 TEST_F(ChooserDialogCocoaControllerTest, SelectAndDeselectAnOption) {
227 CreateChooserDialog();
228
229 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
230 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
231 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
232
233 // Select option 0.
234 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
235 byExtendingSelection:NO];
236 EXPECT_EQ(table_view_.selectedRow, 0);
237 ASSERT_TRUE(connect_button_.enabled);
238
239 // Disselect option 0.
240 [table_view_ deselectRow:0];
241 EXPECT_EQ(table_view_.selectedRow, -1);
242 ASSERT_FALSE(connect_button_.enabled);
243
244 // Select option 1.
245 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
246 byExtendingSelection:NO];
247 EXPECT_EQ(table_view_.selectedRow, 1);
248 ASSERT_TRUE(connect_button_.enabled);
249
250 // Disselect option 1.
251 [table_view_ deselectRow:1];
252 EXPECT_EQ(table_view_.selectedRow, -1);
253 ASSERT_FALSE(connect_button_.enabled);
254 }
255
256 TEST_F(ChooserDialogCocoaControllerTest,
257 SelectAnOptionAndThenSelectAnotherOption) {
258 CreateChooserDialog();
259
260 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
261 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
262 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
263
264 // Select option 0.
265 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
266 byExtendingSelection:NO];
267 EXPECT_EQ(table_view_.selectedRow, 0);
268 ASSERT_TRUE(connect_button_.enabled);
269
270 // Select option 1.
271 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
272 byExtendingSelection:NO];
273 EXPECT_EQ(table_view_.selectedRow, 1);
274 ASSERT_TRUE(connect_button_.enabled);
275
276 // Select option 2.
277 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
278 byExtendingSelection:NO];
279 EXPECT_EQ(table_view_.selectedRow, 2);
280 ASSERT_TRUE(connect_button_.enabled);
281 }
282
283 TEST_F(ChooserDialogCocoaControllerTest,
284 SelectAnOptionAndRemoveTheSelectedOption) {
285 CreateChooserDialog();
286
287 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
288 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
289 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
290
291 // Select option 1.
292 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
293 byExtendingSelection:NO];
294 EXPECT_EQ(table_view_.numberOfRows, 3);
295 EXPECT_EQ(table_view_.selectedRow, 1);
296 ASSERT_TRUE(connect_button_.enabled);
297
298 // Remove option 1
299 chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
300 EXPECT_EQ(table_view_.numberOfRows, 2);
301 // No option selected.
302 EXPECT_EQ(table_view_.selectedRow, -1);
303 // Since no option selected, the "Connect" button should be disabled.
304 ASSERT_FALSE(connect_button_.enabled);
305 }
306
307 TEST_F(ChooserDialogCocoaControllerTest, NoOptionSelectedAndPressCancelButton) {
308 CreateChooserDialog();
309
310 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
311 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
312 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
313
314 EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
315 EXPECT_CALL(*chooser_controller_, Cancel()).Times(1);
316 [cancel_button_ performClick:chooser_dialog_controller_];
317 }
318
319 TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressConnectButton) {
320 CreateChooserDialog();
321
322 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
323 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
324 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
325
326 // Select option 0 and press "Connect" button.
327 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
328 byExtendingSelection:NO];
329 EXPECT_CALL(*chooser_controller_, Select(0)).Times(1);
330 EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
331 [connect_button_ performClick:chooser_dialog_controller_];
332
333 // Select option 2 and press "Connect" button.
334 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
335 byExtendingSelection:NO];
336 EXPECT_CALL(*chooser_controller_, Select(2)).Times(1);
337 EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
338 [connect_button_ performClick:chooser_dialog_controller_];
339 }
340
341 TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressCancelButton) {
342 CreateChooserDialog();
343
344 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
345 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
346 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
347
348 // Select option 0 and press "Cancel" button.
349 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
350 byExtendingSelection:NO];
351 EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
352 EXPECT_CALL(*chooser_controller_, Cancel()).Times(1);
353 [cancel_button_ performClick:chooser_dialog_controller_];
354 }
355
356 TEST_F(ChooserDialogCocoaControllerTest, PressHelpButton) {
357 CreateChooserDialog();
358
359 chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
360 chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
361 chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
362
363 // Select option 0 and press "Get help" button.
364 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
365 byExtendingSelection:NO];
366 EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
367 EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
368 EXPECT_CALL(*chooser_controller_, OpenHelpCenterUrl()).Times(1);
369 [help_button_ performClick:chooser_dialog_controller_];
370 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698