| OLD | NEW |
| (Empty) |
| 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 #include "base/utf_string_conversions.h" | |
| 6 #include "chrome/browser/ui/intents/web_intent_picker_model.h" | |
| 7 #include "chrome/browser/ui/intents/web_intent_picker_model_observer.h" | |
| 8 #include "testing/gmock/include/gmock/gmock.h" | |
| 9 #include "testing/gtest/include/gtest/gtest.h" | |
| 10 #include "ui/gfx/image/image.h" | |
| 11 #include "ui/gfx/image/image_unittest_util.h" | |
| 12 | |
| 13 namespace { | |
| 14 | |
| 15 const string16 kTitle1(ASCIIToUTF16("Foo")); | |
| 16 const string16 kTitle2(ASCIIToUTF16("Bar")); | |
| 17 const string16 kTitle3(ASCIIToUTF16("Baz")); | |
| 18 const string16 kTitle4(ASCIIToUTF16("Biff")); | |
| 19 const string16 kTitle5(ASCIIToUTF16("Max")); | |
| 20 const string16 kTitle6(ASCIIToUTF16("Lulz")); | |
| 21 const GURL kUrl1("http://www.example.com/foo"); | |
| 22 const GURL kUrl2("http://www.example.com/bar"); | |
| 23 const GURL kUrl3("http://www.example.com/baz"); | |
| 24 const std::string kId1("nhkckhebbbncbkefhcpcgepcgfaclehe"); | |
| 25 const std::string kId2("hcpcgepcgfaclehenhkckhebbbncbkef"); | |
| 26 const std::string kId3("aclehenhkckhebbbncbkefhcpcgepcgf"); | |
| 27 const std::string kId4("bclehenhkckhebbbncbkefhcpcgepcgf"); | |
| 28 const std::string kId5("cclehenhkckhebbbncbkefhcpcgepcgf"); | |
| 29 const std::string kId6("dclehenhkckhebbbncbkefhcpcgepcgf"); | |
| 30 const webkit_glue::WebIntentServiceData::Disposition kWindowDisposition( | |
| 31 webkit_glue::WebIntentServiceData::DISPOSITION_WINDOW); | |
| 32 const webkit_glue::WebIntentServiceData::Disposition kInlineDisposition( | |
| 33 webkit_glue::WebIntentServiceData::DISPOSITION_INLINE); | |
| 34 | |
| 35 } | |
| 36 | |
| 37 class WebIntentPickerModelObserverMock : public WebIntentPickerModelObserver { | |
| 38 public: | |
| 39 MOCK_METHOD1(OnModelChanged, void(WebIntentPickerModel* model)); | |
| 40 MOCK_METHOD2(OnFaviconChanged, | |
| 41 void(WebIntentPickerModel* model, size_t index)); | |
| 42 MOCK_METHOD2(OnExtensionIconChanged, | |
| 43 void(WebIntentPickerModel* model, | |
| 44 const std::string& extension_id)); | |
| 45 MOCK_METHOD2(OnInlineDisposition, | |
| 46 void(const string16& title, const GURL& url)); | |
| 47 }; | |
| 48 | |
| 49 class WebIntentPickerModelTest : public testing::Test { | |
| 50 public: | |
| 51 typedef WebIntentPickerModel::SuggestedExtension SuggestedExtension; | |
| 52 WebIntentPickerModelTest() {} | |
| 53 | |
| 54 virtual void SetUp() { | |
| 55 testing::Test::SetUp(); | |
| 56 model_.set_observer(&observer_); | |
| 57 } | |
| 58 | |
| 59 WebIntentPickerModel model_; | |
| 60 WebIntentPickerModelObserverMock observer_; | |
| 61 }; | |
| 62 | |
| 63 TEST_F(WebIntentPickerModelTest, AddInstalledService) { | |
| 64 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(2); | |
| 65 | |
| 66 EXPECT_EQ(0U, model_.GetInstalledServiceCount()); | |
| 67 | |
| 68 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 69 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 70 | |
| 71 EXPECT_EQ(2U, model_.GetInstalledServiceCount()); | |
| 72 EXPECT_EQ(kUrl1, model_.GetInstalledServiceAt(0).url); | |
| 73 EXPECT_EQ(kUrl2, model_.GetInstalledServiceAt(1).url); | |
| 74 } | |
| 75 | |
| 76 // Test that AddInstalledServices() is idempotent. | |
| 77 TEST_F(WebIntentPickerModelTest, AddInstalledServiceIsIdempotent) { | |
| 78 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(2); | |
| 79 | |
| 80 EXPECT_EQ(0U, model_.GetInstalledServiceCount()); | |
| 81 | |
| 82 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 83 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 84 | |
| 85 EXPECT_EQ(2U, model_.GetInstalledServiceCount()); | |
| 86 EXPECT_EQ(kUrl1, model_.GetInstalledServiceAt(0).url); | |
| 87 EXPECT_EQ(kUrl2, model_.GetInstalledServiceAt(1).url); | |
| 88 | |
| 89 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 90 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 91 | |
| 92 EXPECT_EQ(2U, model_.GetInstalledServiceCount()); | |
| 93 EXPECT_EQ(kUrl1, model_.GetInstalledServiceAt(0).url); | |
| 94 EXPECT_EQ(kUrl2, model_.GetInstalledServiceAt(1).url); | |
| 95 } | |
| 96 | |
| 97 | |
| 98 TEST_F(WebIntentPickerModelTest, RemoveInstalledServiceAt) { | |
| 99 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(4); | |
| 100 | |
| 101 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 102 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 103 model_.AddInstalledService(kTitle3, kUrl3, kWindowDisposition); | |
| 104 | |
| 105 EXPECT_EQ(3U, model_.GetInstalledServiceCount()); | |
| 106 | |
| 107 model_.RemoveInstalledServiceAt(1); | |
| 108 | |
| 109 EXPECT_EQ(2U, model_.GetInstalledServiceCount()); | |
| 110 EXPECT_EQ(kUrl1, model_.GetInstalledServiceAt(0).url); | |
| 111 EXPECT_EQ(kUrl3, model_.GetInstalledServiceAt(1).url); | |
| 112 } | |
| 113 | |
| 114 TEST_F(WebIntentPickerModelTest, Clear) { | |
| 115 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(testing::AtLeast(3)); | |
| 116 | |
| 117 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 118 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 119 | |
| 120 EXPECT_EQ(2U, model_.GetInstalledServiceCount()); | |
| 121 | |
| 122 model_.Clear(); | |
| 123 | |
| 124 EXPECT_EQ(0U, model_.GetInstalledServiceCount()); | |
| 125 } | |
| 126 | |
| 127 TEST_F(WebIntentPickerModelTest, GetInstalledServiceWithURL) { | |
| 128 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(2); | |
| 129 | |
| 130 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 131 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 132 | |
| 133 EXPECT_EQ(kTitle2, model_.GetInstalledServiceWithURL(kUrl2)->title); | |
| 134 EXPECT_EQ(NULL, model_.GetInstalledServiceWithURL(kUrl3)); | |
| 135 } | |
| 136 | |
| 137 TEST_F(WebIntentPickerModelTest, UpdateFaviconForServiceWithURL) { | |
| 138 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(2); | |
| 139 EXPECT_CALL(observer_, OnFaviconChanged(&model_, 1U)).Times(1); | |
| 140 | |
| 141 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 142 model_.AddInstalledService(kTitle2, kUrl2, kWindowDisposition); | |
| 143 gfx::Image image(gfx::test::CreateImage()); | |
| 144 model_.UpdateFaviconForServiceWithURL(kUrl2, image); | |
| 145 | |
| 146 EXPECT_FALSE(gfx::test::IsEqual( | |
| 147 image, model_.GetInstalledServiceAt(0).favicon)); | |
| 148 EXPECT_TRUE(gfx::test::IsEqual( | |
| 149 image, model_.GetInstalledServiceAt(1).favicon)); | |
| 150 } | |
| 151 | |
| 152 TEST_F(WebIntentPickerModelTest, AddSuggestedExtensions) { | |
| 153 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(1); | |
| 154 | |
| 155 EXPECT_EQ(0U, model_.GetSuggestedExtensionCount()); | |
| 156 | |
| 157 std::vector<WebIntentPickerModel::SuggestedExtension> suggestions; | |
| 158 suggestions.push_back( | |
| 159 WebIntentPickerModel::SuggestedExtension(kTitle1, kId1, 3.0)); | |
| 160 suggestions.push_back( | |
| 161 WebIntentPickerModel::SuggestedExtension(kTitle2, kId2, 4.0)); | |
| 162 model_.AddSuggestedExtensions(suggestions); | |
| 163 | |
| 164 EXPECT_EQ(2U, model_.GetSuggestedExtensionCount()); | |
| 165 EXPECT_EQ(kId1, model_.GetSuggestedExtensionAt(0).id); | |
| 166 EXPECT_EQ(kId2, model_.GetSuggestedExtensionAt(1).id); | |
| 167 | |
| 168 EXPECT_EQ(string16(), model_.GetSuggestionsLinkText()); | |
| 169 } | |
| 170 | |
| 171 TEST_F(WebIntentPickerModelTest, MaxSuggestedExtensions) { | |
| 172 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(1); | |
| 173 | |
| 174 std::vector<SuggestedExtension> suggestions; | |
| 175 suggestions.push_back(SuggestedExtension(kTitle1, kId1, 3.0)); | |
| 176 suggestions.push_back(SuggestedExtension(kTitle2, kId2, 4.3)); | |
| 177 suggestions.push_back(SuggestedExtension(kTitle3, kId3, 4.4)); | |
| 178 suggestions.push_back(SuggestedExtension(kTitle4, kId4, 4.5)); | |
| 179 suggestions.push_back(SuggestedExtension(kTitle5, kId5, 4.6)); | |
| 180 suggestions.push_back(SuggestedExtension(kTitle6, kId6, 4.7)); | |
| 181 model_.AddSuggestedExtensions(suggestions); | |
| 182 | |
| 183 // Max to show currently set to 5. | |
| 184 EXPECT_EQ(5U, model_.GetSuggestedExtensionCount()); | |
| 185 EXPECT_NE(string16(), model_.GetSuggestionsLinkText()); | |
| 186 } | |
| 187 | |
| 188 TEST_F(WebIntentPickerModelTest, SetSuggestedExtensionIconWithId) { | |
| 189 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(1); | |
| 190 EXPECT_CALL(observer_, OnExtensionIconChanged(&model_, kId2)).Times(1); | |
| 191 | |
| 192 std::vector<SuggestedExtension> suggestions; | |
| 193 suggestions.push_back(SuggestedExtension(kTitle1, kId1, 3.0)); | |
| 194 suggestions.push_back(SuggestedExtension(kTitle2, kId2, 4.3)); | |
| 195 model_.AddSuggestedExtensions(suggestions); | |
| 196 | |
| 197 gfx::Image image(gfx::test::CreateImage()); | |
| 198 model_.SetSuggestedExtensionIconWithId(kId2, image); | |
| 199 | |
| 200 EXPECT_FALSE(gfx::test::IsEqual( | |
| 201 image, model_.GetSuggestedExtensionAt(0).icon)); | |
| 202 EXPECT_TRUE(gfx::test::IsEqual( | |
| 203 image, model_.GetSuggestedExtensionAt(1).icon)); | |
| 204 } | |
| 205 | |
| 206 TEST_F(WebIntentPickerModelTest, SetInlineDisposition) { | |
| 207 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(testing::AtLeast(3)); | |
| 208 EXPECT_CALL(observer_, OnInlineDisposition(kTitle2, testing::_)).Times(1); | |
| 209 | |
| 210 EXPECT_FALSE(model_.IsInlineDisposition()); | |
| 211 EXPECT_EQ(GURL::EmptyGURL(), model_.inline_disposition_url()); | |
| 212 | |
| 213 model_.AddInstalledService(kTitle1, kUrl1, kWindowDisposition); | |
| 214 model_.AddInstalledService(kTitle2, kUrl2, kInlineDisposition); | |
| 215 model_.SetInlineDisposition(kUrl2); | |
| 216 | |
| 217 EXPECT_TRUE(model_.IsInlineDisposition()); | |
| 218 EXPECT_EQ(kUrl2, model_.inline_disposition_url()); | |
| 219 | |
| 220 model_.Clear(); | |
| 221 EXPECT_FALSE(model_.IsInlineDisposition()); | |
| 222 EXPECT_EQ(GURL::EmptyGURL(), model_.inline_disposition_url()); | |
| 223 } | |
| 224 | |
| 225 | |
| 226 TEST_F(WebIntentPickerModelTest, WaitingForSuggestions) { | |
| 227 // Default status is that "waiting for suggestions". | |
| 228 EXPECT_TRUE(model_.IsWaitingForSuggestions()); | |
| 229 | |
| 230 // "waiting" status can be toggled manually. | |
| 231 EXPECT_CALL(observer_, OnModelChanged(&model_)).Times(2); | |
| 232 model_.SetWaitingForSuggestions(false); | |
| 233 EXPECT_FALSE(model_.IsWaitingForSuggestions()); | |
| 234 model_.SetWaitingForSuggestions(true); | |
| 235 EXPECT_TRUE(model_.IsWaitingForSuggestions()); | |
| 236 } | |
| OLD | NEW |