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 #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 optionNames_.size(); } | |
31 | |
32 // ChooserController: | |
33 const base::string16& GetOption(size_t index) const override { | |
34 return optionNames_[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 optionName) { | |
50 optionNames_.push_back(optionName); | |
51 if (observer()) | |
52 observer()->OnOptionAdded(optionNames_.size() - 1); | |
53 } | |
54 | |
55 void OptionRemoved(const base::string16 optionName) { | |
56 for (auto it = optionNames_.begin(); it != optionNames_.end(); ++it) { | |
57 if (*it == optionName) { | |
58 size_t index = it - optionNames_.begin(); | |
59 optionNames_.erase(it); | |
60 if (observer()) | |
61 observer()->OnOptionRemoved(index); | |
62 return; | |
63 } | |
64 } | |
65 } | |
66 | |
67 private: | |
68 std::vector<base::string16> optionNames_; | |
Robert Sesek
2016/05/31 17:27:51
nit: names in C++ classes should use under_scores,
juncai
2016/05/31 20:45:02
Done.
| |
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 an 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 chooserController_.reset( | |
92 new MockChooserController(web_contents->GetMainFrame())); | |
93 ASSERT_TRUE(chooserController_); | |
94 chooserDialog_.reset( | |
95 new ChooserDialogCocoa(web_contents, chooserController_.get())); | |
96 ASSERT_TRUE(chooserDialog_); | |
97 chooserDialogController_ = | |
98 chooserDialog_->chooser_dialog_cocoa_controller_.get(); | |
99 ASSERT_TRUE(chooserDialogController_); | |
100 chooserContentView_ = [chooserDialogController_ chooserContentView]; | |
101 ASSERT_TRUE(chooserContentView_); | |
102 tableView_ = [chooserContentView_ tableView]; | |
103 ASSERT_TRUE(tableView_); | |
104 connectButton_ = [chooserContentView_ connectButton]; | |
105 ASSERT_TRUE(connectButton_); | |
106 cancelButton_ = [chooserContentView_ cancelButton]; | |
107 ASSERT_TRUE(cancelButton_); | |
108 helpButton_ = [chooserContentView_ helpButton]; | |
109 ASSERT_TRUE(helpButton_); | |
110 } | |
111 | |
112 std::unique_ptr<MockChooserController> chooserController_; | |
113 std::unique_ptr<ChooserDialogCocoa> chooserDialog_; | |
114 | |
115 ChooserDialogCocoaController* chooserDialogController_; | |
116 ChooserContentView* chooserContentView_; | |
117 NSTableView* tableView_; | |
118 NSButton* connectButton_; | |
119 NSButton* cancelButton_; | |
120 NSButton* helpButton_; | |
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 |tableView_|, | |
130 // the number of rows is 1. | |
131 EXPECT_EQ(tableView_.numberOfRows, 1); | |
132 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
133 // |tableView_| should be disabled since there is no option shown. | |
134 ASSERT_FALSE(tableView_.enabled); | |
135 // No option selected. | |
136 EXPECT_EQ(tableView_.selectedRow, -1); | |
137 // |connectButton_| should be disabled since no option selected. | |
138 ASSERT_FALSE(connectButton_.enabled); | |
139 ASSERT_TRUE(cancelButton_.enabled); | |
140 ASSERT_TRUE(helpButton_.enabled); | |
141 } | |
142 | |
143 TEST_F(ChooserDialogCocoaControllerTest, AddOption) { | |
144 CreateChooserDialog(); | |
145 | |
146 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
147 EXPECT_EQ(tableView_.numberOfRows, 1); | |
148 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
149 // |tableView_| should be enabled since there is an option. | |
150 ASSERT_TRUE(tableView_.enabled); | |
151 EXPECT_EQ(tableView_.selectedRow, -1); | |
152 ASSERT_FALSE(connectButton_.enabled); | |
153 ASSERT_TRUE(cancelButton_.enabled); | |
154 ASSERT_TRUE(helpButton_.enabled); | |
155 | |
156 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
157 EXPECT_EQ(tableView_.numberOfRows, 2); | |
158 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
159 ASSERT_TRUE(tableView_.enabled); | |
160 EXPECT_EQ(tableView_.selectedRow, -1); | |
161 | |
162 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
163 EXPECT_EQ(tableView_.numberOfRows, 3); | |
164 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
165 ASSERT_TRUE(tableView_.enabled); | |
166 EXPECT_EQ(tableView_.selectedRow, -1); | |
167 } | |
168 | |
169 TEST_F(ChooserDialogCocoaControllerTest, RemoveOption) { | |
170 CreateChooserDialog(); | |
171 | |
172 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
173 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
174 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
175 | |
176 chooserController_->OptionRemoved(base::ASCIIToUTF16("b")); | |
177 EXPECT_EQ(tableView_.numberOfRows, 2); | |
178 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
179 ASSERT_TRUE(tableView_.enabled); | |
180 EXPECT_EQ(tableView_.selectedRow, -1); | |
181 | |
182 // Remove a non-existent option, the number of rows should not change. | |
183 chooserController_->OptionRemoved(base::ASCIIToUTF16("non-existent")); | |
184 EXPECT_EQ(tableView_.numberOfRows, 2); | |
185 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
186 ASSERT_TRUE(tableView_.enabled); | |
187 EXPECT_EQ(tableView_.selectedRow, -1); | |
188 | |
189 chooserController_->OptionRemoved(base::ASCIIToUTF16("c")); | |
190 EXPECT_EQ(tableView_.numberOfRows, 1); | |
191 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
192 ASSERT_TRUE(tableView_.enabled); | |
193 EXPECT_EQ(tableView_.selectedRow, -1); | |
194 | |
195 chooserController_->OptionRemoved(base::ASCIIToUTF16("a")); | |
196 // There is no option shown now. But since "No devices found." | |
197 // needs to be displayed on the |tableView_|, the number of rows is 1. | |
198 EXPECT_EQ(tableView_.numberOfRows, 1); | |
199 EXPECT_EQ(tableView_.numberOfColumns, 1); | |
200 // |tableView_| should be disabled since all options are removed. | |
201 ASSERT_FALSE(tableView_.enabled); | |
202 EXPECT_EQ(tableView_.selectedRow, -1); | |
203 } | |
204 | |
205 TEST_F(ChooserDialogCocoaControllerTest, AddAndRemoveOption) { | |
206 CreateChooserDialog(); | |
207 | |
208 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
209 EXPECT_EQ(tableView_.numberOfRows, 1); | |
210 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
211 EXPECT_EQ(tableView_.numberOfRows, 2); | |
212 chooserController_->OptionRemoved(base::ASCIIToUTF16("b")); | |
213 EXPECT_EQ(tableView_.numberOfRows, 1); | |
214 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
215 EXPECT_EQ(tableView_.numberOfRows, 2); | |
216 chooserController_->OptionAdded(base::ASCIIToUTF16("d")); | |
217 EXPECT_EQ(tableView_.numberOfRows, 3); | |
218 chooserController_->OptionRemoved(base::ASCIIToUTF16("d")); | |
219 EXPECT_EQ(tableView_.numberOfRows, 2); | |
220 chooserController_->OptionRemoved(base::ASCIIToUTF16("c")); | |
221 // There is no option shown now. But since "No devices found." | |
222 // needs to be displayed on the |tableView_|, the number of rows is 1. | |
223 EXPECT_EQ(tableView_.numberOfRows, 1); | |
224 } | |
225 | |
226 TEST_F(ChooserDialogCocoaControllerTest, SelectAndDeselectAnOption) { | |
227 CreateChooserDialog(); | |
228 | |
229 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
230 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
231 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
232 | |
233 // Select option 0. | |
234 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0] | |
235 byExtendingSelection:NO]; | |
236 EXPECT_EQ(tableView_.selectedRow, 0); | |
237 ASSERT_TRUE(connectButton_.enabled); | |
238 | |
239 // Disselect option 0. | |
240 [tableView_ deselectRow:0]; | |
241 EXPECT_EQ(tableView_.selectedRow, -1); | |
242 ASSERT_FALSE(connectButton_.enabled); | |
243 | |
244 // Select option 1. | |
245 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1] | |
246 byExtendingSelection:NO]; | |
247 EXPECT_EQ(tableView_.selectedRow, 1); | |
248 ASSERT_TRUE(connectButton_.enabled); | |
249 | |
250 // Disselect option 1. | |
251 [tableView_ deselectRow:1]; | |
252 EXPECT_EQ(tableView_.selectedRow, -1); | |
253 ASSERT_FALSE(connectButton_.enabled); | |
254 } | |
255 | |
256 TEST_F(ChooserDialogCocoaControllerTest, | |
257 SelectAnOptionAndThenSelectAnotherOption) { | |
258 CreateChooserDialog(); | |
259 | |
260 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
261 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
262 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
263 | |
264 // Select option 0. | |
265 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0] | |
266 byExtendingSelection:NO]; | |
267 EXPECT_EQ(tableView_.selectedRow, 0); | |
268 ASSERT_TRUE(connectButton_.enabled); | |
269 | |
270 // Select option 1. | |
271 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1] | |
272 byExtendingSelection:NO]; | |
273 EXPECT_EQ(tableView_.selectedRow, 1); | |
274 ASSERT_TRUE(connectButton_.enabled); | |
275 | |
276 // Select option 2. | |
277 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2] | |
278 byExtendingSelection:NO]; | |
279 EXPECT_EQ(tableView_.selectedRow, 2); | |
280 ASSERT_TRUE(connectButton_.enabled); | |
281 } | |
282 | |
283 TEST_F(ChooserDialogCocoaControllerTest, | |
284 SelectAnOptionAndRemoveTheSelectedOption) { | |
285 CreateChooserDialog(); | |
286 | |
287 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
288 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
289 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
290 | |
291 // Select option 1. | |
292 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1] | |
293 byExtendingSelection:NO]; | |
294 EXPECT_EQ(tableView_.numberOfRows, 3); | |
295 EXPECT_EQ(tableView_.selectedRow, 1); | |
296 ASSERT_TRUE(connectButton_.enabled); | |
297 | |
298 // Remove option 1 | |
299 chooserController_->OptionRemoved(base::ASCIIToUTF16("b")); | |
300 EXPECT_EQ(tableView_.numberOfRows, 2); | |
301 // No option selected. | |
302 EXPECT_EQ(tableView_.selectedRow, -1); | |
303 // Since no option selected, the "Connect" button should be disabled. | |
304 ASSERT_FALSE(connectButton_.enabled); | |
305 } | |
306 | |
307 TEST_F(ChooserDialogCocoaControllerTest, NoOptionSelectedAndPressCancelButton) { | |
308 CreateChooserDialog(); | |
309 | |
310 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
311 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
312 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
313 | |
314 EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0); | |
315 EXPECT_CALL(*chooserController_, Cancel()).Times(1); | |
316 [cancelButton_ performClick:chooserDialogController_]; | |
317 } | |
318 | |
319 TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressConnectButton) { | |
320 CreateChooserDialog(); | |
321 | |
322 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
323 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
324 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
325 | |
326 // Select option 0 and press "Connect" button. | |
327 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0] | |
328 byExtendingSelection:NO]; | |
329 EXPECT_CALL(*chooserController_, Select(0)).Times(1); | |
330 EXPECT_CALL(*chooserController_, Cancel()).Times(0); | |
331 [connectButton_ performClick:chooserDialogController_]; | |
332 | |
333 // Select option 2 and press "Connect" button. | |
334 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2] | |
335 byExtendingSelection:NO]; | |
336 EXPECT_CALL(*chooserController_, Select(2)).Times(1); | |
337 EXPECT_CALL(*chooserController_, Cancel()).Times(0); | |
338 [connectButton_ performClick:chooserDialogController_]; | |
339 } | |
340 | |
341 TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressCancelButton) { | |
342 CreateChooserDialog(); | |
343 | |
344 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
345 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
346 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
347 | |
348 // Select option 0 and press "Cancel" button. | |
349 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0] | |
350 byExtendingSelection:NO]; | |
351 EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0); | |
352 EXPECT_CALL(*chooserController_, Cancel()).Times(1); | |
353 [cancelButton_ performClick:chooserDialogController_]; | |
354 } | |
355 | |
356 TEST_F(ChooserDialogCocoaControllerTest, PressHelpButton) { | |
357 CreateChooserDialog(); | |
358 | |
359 chooserController_->OptionAdded(base::ASCIIToUTF16("a")); | |
360 chooserController_->OptionAdded(base::ASCIIToUTF16("b")); | |
361 chooserController_->OptionAdded(base::ASCIIToUTF16("c")); | |
362 | |
363 // Select option 0 and press "Get help" button. | |
364 [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0] | |
365 byExtendingSelection:NO]; | |
366 EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0); | |
367 EXPECT_CALL(*chooserController_, Cancel()).Times(0); | |
368 EXPECT_CALL(*chooserController_, OpenHelpCenterUrl()).Times(1); | |
369 [helpButton_ performClick:chooserDialogController_]; | |
370 } | |
OLD | NEW |