- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / browser / edit_search_engine_cocoa_controller_unittest.mm
1 // Copyright (c) 2012 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/browser/edit_search_engine_cocoa_controller.h"
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/search_engines/template_url.h"
9 #include "chrome/browser/search_engines/template_url_service_factory.h"
10 #include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
11 #include "chrome/test/base/testing_profile.h"
12 #include "grit/generated_resources.h"
13 #include "grit/theme_resources.h"
14 #include "grit/ui_resources.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #import "testing/gtest_mac.h"
17 #include "testing/platform_test.h"
18 #include "ui/base/l10n/l10n_util_mac.h"
19 #include "ui/base/resource/resource_bundle.h"
20 #include "ui/gfx/image/image.h"
21
22 @interface FakeEditSearchEngineController : EditSearchEngineCocoaController
23
24 - (NSTextField*)nameField;
25 - (NSTextField*)keywordField;
26 - (NSTextField*)urlField;
27 - (NSImageView*)nameImage;
28 - (NSImageView*)keywordImage;
29 - (NSImageView*)urlImage;
30 - (NSButton*)doneButton;
31
32 - (NSImage*)goodImage;
33 - (NSImage*)badImage;
34
35 @end
36
37 @implementation FakeEditSearchEngineController
38
39 - (NSTextField*)nameField {
40   return nameField_;
41 }
42
43 - (NSTextField*)keywordField {
44   return keywordField_;
45 }
46
47 - (NSTextField*)urlField {
48   return urlField_;
49 }
50
51 - (NSImageView*)nameImage {
52   return nameImage_;
53 }
54
55 - (NSImageView*)keywordImage {
56   return keywordImage_;
57 }
58
59 - (NSImageView*)urlImage {
60   return urlImage_;
61 }
62
63 - (NSButton*)doneButton {
64   return doneButton_;
65 }
66
67 - (NSImage*)goodImage {
68   ui::ResourceBundle& rb = ResourceBundle::GetSharedInstance();
69   return rb.GetNativeImageNamed(IDR_INPUT_GOOD).ToNSImage();
70 }
71
72 - (NSImage*)badImage {
73   ui::ResourceBundle& rb = ResourceBundle::GetSharedInstance();
74   return rb.GetNativeImageNamed(IDR_INPUT_ALERT).ToNSImage();
75 }
76
77 @end
78
79 namespace {
80
81 class EditSearchEngineControllerTest : public CocoaProfileTest {
82  public:
83   virtual void SetUp() {
84     CocoaProfileTest::SetUp();
85     ASSERT_TRUE(profile());
86
87     TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
88         profile(), &TemplateURLServiceFactory::BuildInstanceFor);
89     controller_ =
90        [[FakeEditSearchEngineController alloc] initWithProfile:profile()
91                                                       delegate:nil
92                                                    templateURL:nil];
93   }
94
95   virtual void TearDown() {
96     // Force the window to load so we hit |-awakeFromNib| to register as the
97     // window's delegate so that the controller can clean itself up in
98     // |-windowWillClose:|.
99     ASSERT_TRUE([controller_ window]);
100
101     [controller_ close];
102     CocoaProfileTest::TearDown();
103   }
104
105   FakeEditSearchEngineController* controller_;
106 };
107
108 TEST_F(EditSearchEngineControllerTest, ValidImageOriginals) {
109   EXPECT_TRUE([controller_ window]);  // Force the window to load.
110
111   EXPECT_TRUE([[controller_ goodImage] isKindOfClass:[NSImage class]]);
112   EXPECT_TRUE([[controller_ badImage] isKindOfClass:[NSImage class]]);
113
114   // Test window title is set correctly.
115   NSString* title = l10n_util::GetNSString(
116       IDS_SEARCH_ENGINES_EDITOR_NEW_WINDOW_TITLE);
117   EXPECT_NSEQ(title, [[controller_ window] title]);
118 }
119
120 TEST_F(EditSearchEngineControllerTest, SetImageViews) {
121   EXPECT_TRUE([controller_ window]);  // Force the window to load.
122   EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
123   // An empty keyword is not OK.
124   EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
125   EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
126 }
127
128 // This test ensures that on creating a new keyword, we are in an "invalid"
129 // state that cannot save.
130 TEST_F(EditSearchEngineControllerTest, InvalidState) {
131   EXPECT_TRUE([controller_ window]);  // Force window to load.
132   NSString* toolTip = nil;
133   EXPECT_FALSE([controller_ validateFields]);
134
135   EXPECT_NSEQ(@"", [[controller_ nameField] stringValue]);
136   EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
137   toolTip = l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_TITLE_TT);
138   EXPECT_NSEQ(toolTip, [[controller_ nameField] toolTip]);
139   EXPECT_NSEQ(toolTip, [[controller_ nameImage] toolTip]);
140
141   // Keywords can not be empty strings.
142   EXPECT_NSEQ(@"", [[controller_ keywordField] stringValue]);
143   EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
144   EXPECT_TRUE([[controller_ keywordField] toolTip]);
145   EXPECT_TRUE([[controller_ keywordImage] toolTip]);
146
147   EXPECT_NSEQ(@"", [[controller_ urlField] stringValue]);
148   EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
149   toolTip = l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_URL_TT);
150   EXPECT_NSEQ(toolTip, [[controller_ urlField] toolTip]);
151   EXPECT_NSEQ(toolTip, [[controller_ urlImage] toolTip]);
152 }
153
154 // Tests that the single name field validates.
155 TEST_F(EditSearchEngineControllerTest, ValidateName) {
156   EXPECT_TRUE([controller_ window]);  // Force window to load.
157
158   EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
159   EXPECT_FALSE([controller_ validateFields]);
160   NSString* toolTip =
161       l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_TITLE_TT);
162   EXPECT_NSEQ(toolTip, [[controller_ nameField] toolTip]);
163   EXPECT_NSEQ(toolTip, [[controller_ nameImage] toolTip]);
164   [[controller_ nameField] setStringValue:@"Test Name"];
165   EXPECT_FALSE([controller_ validateFields]);
166   EXPECT_EQ([controller_ goodImage], [[controller_ nameImage] image]);
167   EXPECT_FALSE([[controller_ nameField] toolTip]);
168   EXPECT_FALSE([[controller_ nameImage] toolTip]);
169   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
170 }
171
172 // The keyword field is not valid if it is empty.
173 TEST_F(EditSearchEngineControllerTest, ValidateKeyword) {
174   EXPECT_TRUE([controller_ window]);  // Force window load.
175
176   EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
177   EXPECT_FALSE([controller_ validateFields]);
178   EXPECT_TRUE([[controller_ keywordField] toolTip]);
179   EXPECT_TRUE([[controller_ keywordImage] toolTip]);
180   [[controller_ keywordField] setStringValue:@"foobar"];
181   EXPECT_FALSE([controller_ validateFields]);
182   EXPECT_EQ([controller_ goodImage], [[controller_ keywordImage] image]);
183   EXPECT_FALSE([[controller_ keywordField] toolTip]);
184   EXPECT_FALSE([[controller_ keywordImage] toolTip]);
185   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
186 }
187
188 // Tests that the URL field validates.
189 TEST_F(EditSearchEngineControllerTest, ValidateURL) {
190   EXPECT_TRUE([controller_ window]);  // Force window to load.
191
192   EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
193   EXPECT_FALSE([controller_ validateFields]);
194   NSString* toolTip =
195       l10n_util::GetNSString(IDS_SEARCH_ENGINES_INVALID_URL_TT);
196   EXPECT_NSEQ(toolTip, [[controller_ urlField] toolTip]);
197   EXPECT_NSEQ(toolTip, [[controller_ urlImage] toolTip]);
198   [[controller_ urlField] setStringValue:@"http://foo-bar.com"];
199   EXPECT_FALSE([controller_ validateFields]);
200   EXPECT_EQ([controller_ goodImage], [[controller_ urlImage] image]);
201   EXPECT_FALSE([[controller_ urlField] toolTip]);
202   EXPECT_FALSE([[controller_ urlImage] toolTip]);
203   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
204 }
205
206 // Tests that if the user enters all valid data that the UI reflects that
207 // and that they can save.
208 TEST_F(EditSearchEngineControllerTest, ValidateFields) {
209   EXPECT_TRUE([controller_ window]);  // Force window to load.
210
211   // State before entering data.
212   EXPECT_EQ([controller_ badImage], [[controller_ nameImage] image]);
213   EXPECT_EQ([controller_ badImage], [[controller_ keywordImage] image]);
214   EXPECT_EQ([controller_ badImage], [[controller_ urlImage] image]);
215   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
216   EXPECT_FALSE([controller_ validateFields]);
217
218   [[controller_ nameField] setStringValue:@"Test Name"];
219   EXPECT_FALSE([controller_ validateFields]);
220   EXPECT_EQ([controller_ goodImage], [[controller_ nameImage] image]);
221   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
222
223   [[controller_ keywordField] setStringValue:@"foobar"];
224   EXPECT_FALSE([controller_ validateFields]);
225   EXPECT_EQ([controller_ goodImage], [[controller_ keywordImage] image]);
226   EXPECT_FALSE([[controller_ doneButton] isEnabled]);
227
228   // Once the URL is entered, we should have all 3 valid fields.
229   [[controller_ urlField] setStringValue:@"http://foo-bar.com"];
230   EXPECT_TRUE([controller_ validateFields]);
231   EXPECT_EQ([controller_ goodImage], [[controller_ urlImage] image]);
232   EXPECT_TRUE([[controller_ doneButton] isEnabled]);
233 }
234
235 // Tests editing an existing TemplateURL.
236 TEST_F(EditSearchEngineControllerTest, EditTemplateURL) {
237   TemplateURLData data;
238   data.short_name = ASCIIToUTF16("Foobar");
239   data.SetKeyword(ASCIIToUTF16("keyword"));
240   std::string urlString = TemplateURLRef::DisplayURLToURLRef(
241       ASCIIToUTF16("http://foo-bar.com"));
242   data.SetURL(urlString);
243   TemplateURL url(profile(), data);
244   FakeEditSearchEngineController *controller =
245       [[FakeEditSearchEngineController alloc] initWithProfile:profile()
246                                                      delegate:nil
247                                                   templateURL:&url];
248   EXPECT_TRUE([controller window]);
249   NSString* title = l10n_util::GetNSString(
250       IDS_SEARCH_ENGINES_EDITOR_EDIT_WINDOW_TITLE);
251   EXPECT_NSEQ(title, [[controller window] title]);
252   NSString* nameString = [[controller nameField] stringValue];
253   EXPECT_NSEQ(@"Foobar", nameString);
254   NSString* keywordString = [[controller keywordField] stringValue];
255   EXPECT_NSEQ(@"keyword", keywordString);
256   NSString* urlValueString = [[controller urlField] stringValue];
257   EXPECT_NSEQ(@"http://foo-bar.com", urlValueString);
258   EXPECT_TRUE([controller validateFields]);
259   [controller close];
260 }
261
262 }  // namespace