OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013 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/autofill/autofill_section_container.h" | |
6 | |
7 #include "base/mac/foundation_util.h" | |
8 #include "base/mac/scoped_nsobject.h" | |
9 #include "base/strings/utf_string_conversions.h" | |
10 #include "chrome/browser/ui/autofill/autofill_dialog_models.h" | |
11 #include "chrome/browser/ui/autofill/mock_autofill_dialog_view_delegate.h" | |
12 #import "chrome/browser/ui/cocoa/autofill/autofill_input_field.h" | |
13 #import "chrome/browser/ui/cocoa/autofill/layout_view.h" | |
14 #import "chrome/browser/ui/cocoa/menu_button.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 #include "testing/gtest_mac.h" | |
17 #include "testing/platform_test.h" | |
18 #include "ui/base/models/combobox_model.h" | |
19 #include "ui/base/models/simple_menu_model.h" | |
20 #import "ui/gfx/test/ui_cocoa_test_helper.h" | |
21 | |
22 using base::ASCIIToUTF16; | |
23 | |
24 namespace { | |
25 | |
26 class AutofillSectionContainerTest : public ui::CocoaTest { | |
27 public: | |
28 AutofillSectionContainerTest() : section_(autofill::SECTION_BILLING) {} | |
29 virtual void SetUp() { | |
30 CocoaTest::SetUp(); | |
31 ResetContainer(); | |
32 } | |
33 | |
34 void ResetContainer() { | |
35 container_.reset( | |
36 [[AutofillSectionContainer alloc] | |
37 initWithDelegate:&delegate_ | |
38 forSection:section_]); | |
39 [[test_window() contentView] setSubviews:@[ [container_ view] ]]; | |
40 } | |
41 | |
42 protected: | |
43 base::scoped_nsobject<AutofillSectionContainer> container_; | |
44 testing::NiceMock<autofill::MockAutofillDialogViewDelegate> delegate_; | |
45 autofill::DialogSection section_; | |
46 }; | |
47 | |
48 } // namespace | |
49 | |
50 TEST_VIEW(AutofillSectionContainerTest, [container_ view]) | |
51 | |
52 TEST_F(AutofillSectionContainerTest, HasSubviews) { | |
53 bool hasLayoutView = false; | |
54 bool hasTextField = false; | |
55 bool hasSuggestButton = false; | |
56 bool hasSuggestionView = false; | |
57 | |
58 ASSERT_EQ(4U, [[[container_ view] subviews] count]); | |
59 for (NSView* view in [[container_ view] subviews]) { | |
60 if ([view isKindOfClass:[NSTextField class]]) { | |
61 hasTextField = true; | |
62 } else if ([view isKindOfClass:[LayoutView class]]) { | |
63 hasLayoutView = true; | |
64 } else if ([view isKindOfClass:[MenuButton class]]) { | |
65 hasSuggestButton = true; | |
66 } else if ([view isKindOfClass:[NSView class]]) { | |
67 hasSuggestionView = true; | |
68 } | |
69 } | |
70 | |
71 EXPECT_TRUE(hasSuggestButton); | |
72 EXPECT_TRUE(hasLayoutView); | |
73 EXPECT_TRUE(hasTextField); | |
74 EXPECT_TRUE(hasSuggestionView); | |
75 } | |
76 | |
77 TEST_F(AutofillSectionContainerTest, ModelsPopulateComboboxes) { | |
78 using namespace autofill; | |
79 using namespace testing; | |
80 | |
81 const DetailInput kTestInputs[] = { | |
82 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH }, | |
83 { DetailInput::SHORT, CREDIT_CARD_EXP_4_DIGIT_YEAR }, | |
84 }; | |
85 | |
86 DetailInputs inputs; | |
87 inputs.push_back(kTestInputs[0]); | |
88 inputs.push_back(kTestInputs[1]); | |
89 | |
90 autofill::MonthComboboxModel monthComboModel; | |
91 autofill::YearComboboxModel yearComboModel; | |
92 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_)) | |
93 .WillOnce(ReturnRef(inputs)); | |
94 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH)) | |
95 .WillRepeatedly(Return(&monthComboModel)); | |
96 EXPECT_CALL( | |
97 delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR)) | |
98 .WillRepeatedly(Return(&yearComboModel)); | |
99 ResetContainer(); | |
100 | |
101 NSPopUpButton* popup = base::mac::ObjCCastStrict<NSPopUpButton>( | |
102 [container_ getField:CREDIT_CARD_EXP_MONTH]); | |
103 EXPECT_EQ(13, [popup numberOfItems]); | |
104 EXPECT_NSEQ(@"Month", [popup itemTitleAtIndex:0]); | |
105 EXPECT_NSEQ(@"01", [popup itemTitleAtIndex:1]); | |
106 EXPECT_NSEQ(@"02", [popup itemTitleAtIndex:2]); | |
107 EXPECT_NSEQ(@"03", [popup itemTitleAtIndex:3]); | |
108 EXPECT_NSEQ(@"12", [popup itemTitleAtIndex:12]); | |
109 | |
110 NSPopUpButton* yearPopup = base::mac::ObjCCastStrict<NSPopUpButton>( | |
111 [container_ getField:CREDIT_CARD_EXP_4_DIGIT_YEAR]); | |
112 EXPECT_EQ(11, [yearPopup numberOfItems]); | |
113 EXPECT_NSEQ(@"Year", [yearPopup itemTitleAtIndex:0]); | |
114 }; | |
115 | |
116 TEST_F(AutofillSectionContainerTest, OutputMatchesDefinition) { | |
117 using namespace autofill; | |
118 using namespace testing; | |
119 | |
120 const DetailInput kTestInputs[] = { | |
121 { DetailInput::LONG, EMAIL_ADDRESS }, | |
122 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH }, | |
123 }; | |
124 autofill::MonthComboboxModel comboModel; | |
125 DetailInputs inputs; | |
126 inputs.push_back(kTestInputs[0]); | |
127 inputs.push_back(kTestInputs[1]); | |
128 | |
129 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_)) | |
130 .WillOnce(ReturnRef(inputs)); | |
131 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS)) | |
132 .WillRepeatedly(ReturnNull()); | |
133 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH)) | |
134 .WillRepeatedly(Return(&comboModel)); | |
135 | |
136 ResetContainer(); | |
137 | |
138 NSPopUpButton* popup = base::mac::ObjCCastStrict<NSPopUpButton>( | |
139 [container_ getField:CREDIT_CARD_EXP_MONTH]); | |
140 [popup selectItemWithTitle:@"02"]; | |
141 [[container_ getField:EMAIL_ADDRESS] setStringValue:@"magic@example.org"]; | |
142 | |
143 autofill::FieldValueMap output; | |
144 [container_ getInputs:&output]; | |
145 | |
146 ASSERT_EQ(inputs.size(), output.size()); | |
147 EXPECT_EQ(ASCIIToUTF16("magic@example.org"), output[inputs[0].type]); | |
148 EXPECT_EQ(ASCIIToUTF16("02"), output[inputs[1].type]); | |
149 } | |
150 | |
151 TEST_F(AutofillSectionContainerTest, SuggestionsPopulatedByController) { | |
152 ui::SimpleMenuModel model(NULL); | |
153 model.AddItem(10, ASCIIToUTF16("a")); | |
154 model.AddItem(11, ASCIIToUTF16("b")); | |
155 | |
156 using namespace autofill; | |
157 using namespace testing; | |
158 | |
159 EXPECT_CALL(delegate_, MenuModelForSection(section_)) | |
160 .WillOnce(Return(&model)); | |
161 | |
162 ResetContainer(); | |
163 MenuButton* button = nil; | |
164 for (id item in [[container_ view] subviews]) { | |
165 if ([item isKindOfClass:[MenuButton class]]) { | |
166 button = item; | |
167 break; | |
168 } | |
169 } | |
170 | |
171 NSMenu* menu = [button attachedMenu]; | |
172 // Expect _three_ items - popup menus need an empty first item. | |
173 ASSERT_EQ(3, [menu numberOfItems]); | |
174 | |
175 EXPECT_NSEQ(@"a", [[menu itemAtIndex:1] title]); | |
176 EXPECT_NSEQ(@"b", [[menu itemAtIndex:2] title]); | |
177 } | |
178 | |
179 TEST_F(AutofillSectionContainerTest, FieldsAreInitiallyValid) { | |
180 using namespace autofill; | |
181 using namespace testing; | |
182 | |
183 const DetailInput kTestInputs[] = { | |
184 { DetailInput::LONG, EMAIL_ADDRESS }, | |
185 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH }, | |
186 }; | |
187 | |
188 MonthComboboxModel comboModel; | |
189 DetailInputs inputs; | |
190 inputs.push_back(kTestInputs[0]); | |
191 inputs.push_back(kTestInputs[1]); | |
192 | |
193 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_)) | |
194 .WillOnce(ReturnRef(inputs)); | |
195 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS)) | |
196 .WillRepeatedly(ReturnNull()); | |
197 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH)) | |
198 .WillRepeatedly(Return(&comboModel)); | |
199 | |
200 ResetContainer(); | |
201 NSControl<AutofillInputField>* field = [container_ getField:EMAIL_ADDRESS]; | |
202 EXPECT_FALSE([field invalid]); | |
203 field = [container_ getField:CREDIT_CARD_EXP_MONTH]; | |
204 EXPECT_FALSE([field invalid]); | |
205 } | |
206 | |
207 TEST_F(AutofillSectionContainerTest, ControllerInformsValidity) { | |
208 using namespace autofill; | |
209 using namespace testing; | |
210 | |
211 const DetailInput kTestInputs[] = { | |
212 { DetailInput::LONG, EMAIL_ADDRESS }, | |
213 { DetailInput::SHORT, CREDIT_CARD_EXP_MONTH }, | |
214 }; | |
215 | |
216 MonthComboboxModel comboModel; | |
217 DetailInputs inputs; | |
218 inputs.push_back(kTestInputs[0]); | |
219 inputs.push_back(kTestInputs[1]); | |
220 | |
221 ValidityMessages validity, validity2; | |
222 | |
223 validity.Set(EMAIL_ADDRESS, | |
224 ValidityMessage(ASCIIToUTF16("Some error message"), false)); | |
225 validity2.Set(CREDIT_CARD_EXP_MONTH, | |
226 ValidityMessage(ASCIIToUTF16("Some other error message"), false)); | |
227 EXPECT_CALL(delegate_, RequestedFieldsForSection(section_)) | |
228 .WillOnce(ReturnRef(inputs)); | |
229 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(EMAIL_ADDRESS)) | |
230 .WillRepeatedly(ReturnNull()); | |
231 EXPECT_CALL(delegate_, ComboboxModelForAutofillType(CREDIT_CARD_EXP_MONTH)) | |
232 .WillRepeatedly(Return(&comboModel)); | |
233 | |
234 ResetContainer(); | |
235 autofill::FieldValueMap output; | |
236 [container_ getInputs:&output]; | |
237 EXPECT_CALL(delegate_, InputsAreValid(section_, output)) | |
238 .WillOnce(Return(validity)) | |
239 .WillOnce(Return(validity2)); | |
240 | |
241 [container_ validateFor:VALIDATE_FINAL]; | |
242 NSControl<AutofillInputField>* field = [container_ getField:EMAIL_ADDRESS]; | |
243 EXPECT_TRUE([field invalid]); | |
244 field = [container_ getField:CREDIT_CARD_EXP_MONTH]; | |
245 EXPECT_FALSE([field invalid]); | |
246 | |
247 [container_ validateFor:VALIDATE_FINAL]; | |
248 field = [container_ getField:EMAIL_ADDRESS]; | |
249 EXPECT_FALSE([field invalid]); | |
250 field = [container_ getField:CREDIT_CARD_EXP_MONTH]; | |
251 EXPECT_TRUE([field invalid]); | |
252 } | |
OLD | NEW |