| 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 |