OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_control ler.h" | 5 #import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_control ler.h" |
6 | 6 |
7 #include <unordered_set> | 7 #include <unordered_set> |
8 | 8 |
9 #import "base/mac/foundation_util.h" | 9 #import "base/mac/foundation_util.h" |
10 #include "base/mac/scoped_nsobject.h" | |
11 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
12 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
13 #include "base/strings/sys_string_conversions.h" | 12 #include "base/strings/sys_string_conversions.h" |
14 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
15 #include "base/time/default_clock.h" | 14 #include "base/time/default_clock.h" |
16 #include "components/favicon/core/large_icon_service.h" | 15 #include "components/favicon/core/large_icon_service.h" |
17 #include "components/favicon/core/test/mock_favicon_service.h" | 16 #include "components/favicon/core/test/mock_favicon_service.h" |
18 #include "components/reading_list/core/reading_list_model.h" | 17 #include "components/reading_list/core/reading_list_model.h" |
19 #include "components/reading_list/core/reading_list_model_impl.h" | 18 #include "components/reading_list/core/reading_list_model_impl.h" |
20 #include "components/reading_list/core/reading_list_model_storage.h" | 19 #include "components/reading_list/core/reading_list_model_storage.h" |
21 #include "components/url_formatter/url_formatter.h" | 20 #include "components/url_formatter/url_formatter.h" |
22 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" | 21 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
23 #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" | 22 #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" |
24 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" | 23 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
25 #import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h" | 24 #import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h" |
26 #import "ios/chrome/browser/ui/reading_list/reading_list_mediator.h" | 25 #import "ios/chrome/browser/ui/reading_list/reading_list_mediator.h" |
27 #include "ios/web/public/test/test_web_thread_bundle.h" | 26 #include "ios/web/public/test/test_web_thread_bundle.h" |
28 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
30 #include "testing/platform_test.h" | 29 #include "testing/platform_test.h" |
31 #import "third_party/ocmock/OCMock/OCMock.h" | 30 #import "third_party/ocmock/OCMock/OCMock.h" |
32 #import "third_party/ocmock/gtest_support.h" | 31 #import "third_party/ocmock/gtest_support.h" |
33 | 32 |
33 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
34 #error "This file requires ARC support." | |
35 #endif | |
36 | |
34 using favicon::PostReply; | 37 using favicon::PostReply; |
35 using testing::_; | 38 using testing::_; |
36 | 39 |
37 #pragma mark - ReadingListCollectionViewControllerTest | 40 #pragma mark - ReadingListCollectionViewControllerTest |
38 | 41 |
39 class ReadingListCollectionViewControllerTest : public testing::Test { | 42 class ReadingListCollectionViewControllerTest : public testing::Test { |
40 public: | 43 public: |
41 ReadingListCollectionViewControllerTest() {} | 44 ReadingListCollectionViewControllerTest() {} |
42 ~ReadingListCollectionViewControllerTest() override {} | 45 ~ReadingListCollectionViewControllerTest() override {} |
43 | 46 |
44 testing::StrictMock<favicon::MockFaviconService> mock_favicon_service_; | 47 testing::StrictMock<favicon::MockFaviconService> mock_favicon_service_; |
45 std::unique_ptr<ReadingListModelImpl> reading_list_model_; | 48 std::unique_ptr<ReadingListModelImpl> reading_list_model_; |
46 base::scoped_nsobject<ReadingListMediator> mediator_; | 49 ReadingListMediator* mediator_; |
47 std::unique_ptr<favicon::LargeIconService> large_icon_service_; | 50 std::unique_ptr<favicon::LargeIconService> large_icon_service_; |
48 | 51 |
49 base::scoped_nsobject<ReadingListCollectionViewController> | 52 ReadingListCollectionViewController* reading_list_view_controller_; |
50 reading_list_view_controller_; | |
51 id mock_delegate_; | 53 id mock_delegate_; |
stkhapugin
2017/06/02 09:52:33
This has gone from bare pointer to strong, is this
pkl (ping after 24h if needed)
2017/06/02 15:32:55
As discussed on IRC, mock_delegate_ should have be
| |
52 | 54 |
53 void SetUp() override { | 55 void SetUp() override { |
54 testing::Test::SetUp(); | 56 testing::Test::SetUp(); |
55 | 57 |
56 EXPECT_CALL(mock_favicon_service_, | 58 EXPECT_CALL(mock_favicon_service_, |
57 GetLargestRawFaviconForPageURL(_, _, _, _, _)) | 59 GetLargestRawFaviconForPageURL(_, _, _, _, _)) |
58 .WillRepeatedly(PostReply<5>(favicon_base::FaviconRawBitmapResult())); | 60 .WillRepeatedly(PostReply<5>(favicon_base::FaviconRawBitmapResult())); |
59 | 61 |
60 reading_list_model_.reset(new ReadingListModelImpl( | 62 reading_list_model_.reset(new ReadingListModelImpl( |
61 nullptr, nullptr, base::MakeUnique<base::DefaultClock>())); | 63 nullptr, nullptr, base::MakeUnique<base::DefaultClock>())); |
62 mediator_.reset( | 64 mediator_ = |
63 [[ReadingListMediator alloc] initWithModel:reading_list_model_.get()]); | 65 [[ReadingListMediator alloc] initWithModel:reading_list_model_.get()]; |
64 large_icon_service_.reset(new favicon::LargeIconService( | 66 large_icon_service_.reset(new favicon::LargeIconService( |
65 &mock_favicon_service_, base::ThreadTaskRunnerHandle::Get(), | 67 &mock_favicon_service_, base::ThreadTaskRunnerHandle::Get(), |
66 /*image_fetcher=*/nullptr)); | 68 /*image_fetcher=*/nullptr)); |
67 reading_list_view_controller_.reset( | 69 reading_list_view_controller_ = [[ReadingListCollectionViewController alloc] |
68 [[ReadingListCollectionViewController alloc] | 70 initWithDataSource:mediator_ |
69 initWithDataSource:mediator_ | 71 largeIconService:large_icon_service_.get() |
70 largeIconService:large_icon_service_.get() | 72 toolbar:nil]; |
71 toolbar:nil]); | |
72 | 73 |
73 mock_delegate_ = [OCMockObject | 74 mock_delegate_ = [OCMockObject |
74 niceMockForProtocol:@protocol( | 75 niceMockForProtocol:@protocol( |
75 ReadingListCollectionViewControllerDelegate)]; | 76 ReadingListCollectionViewControllerDelegate)]; |
76 [reading_list_view_controller_ setDelegate:mock_delegate_]; | 77 [reading_list_view_controller_ setDelegate:mock_delegate_]; |
77 } | 78 } |
78 | 79 |
79 private: | 80 private: |
80 web::TestWebThreadBundle thread_bundle_; | 81 web::TestWebThreadBundle thread_bundle_; |
81 DISALLOW_COPY_AND_ASSIGN(ReadingListCollectionViewControllerTest); | 82 DISALLOW_COPY_AND_ASSIGN(ReadingListCollectionViewControllerTest); |
82 }; | 83 }; |
83 | 84 |
84 // Tests that reading list items are displayed. | 85 // Tests that reading list items are displayed. |
85 TEST_F(ReadingListCollectionViewControllerTest, DisplaysItems) { | 86 TEST_F(ReadingListCollectionViewControllerTest, DisplaysItems) { |
86 // Prefill some items. | 87 // Prefill some items. |
87 reading_list_model_->AddEntry(GURL("https://chromium.org"), "news", | 88 reading_list_model_->AddEntry(GURL("https://chromium.org"), "news", |
88 reading_list::ADDED_VIA_CURRENT_APP); | 89 reading_list::ADDED_VIA_CURRENT_APP); |
89 reading_list_model_->AddEntry(GURL("https://mail.chromium.org"), "mail", | 90 reading_list_model_->AddEntry(GURL("https://mail.chromium.org"), "mail", |
90 reading_list::ADDED_VIA_CURRENT_APP); | 91 reading_list::ADDED_VIA_CURRENT_APP); |
91 reading_list_model_->AddEntry(GURL("https://foo.bar"), "Foo", | 92 reading_list_model_->AddEntry(GURL("https://foo.bar"), "Foo", |
92 reading_list::ADDED_VIA_CURRENT_APP); | 93 reading_list::ADDED_VIA_CURRENT_APP); |
93 reading_list_model_->SetReadStatus(GURL("https://foo.bar"), true); | 94 reading_list_model_->SetReadStatus(GURL("https://foo.bar"), true); |
94 | 95 |
95 // Load view. | 96 // Load view. |
96 [reading_list_view_controller_ view]; | 97 [reading_list_view_controller_ view]; |
97 | 98 |
98 // There are two sections: Read and Unread. | 99 // There are two sections: Read and Unread. |
99 DCHECK( | 100 DCHECK([reading_list_view_controller_.collectionView numberOfSections] == 2); |
100 [reading_list_view_controller_.get().collectionView numberOfSections] == | |
101 2); | |
102 // There are two unread articles. | 101 // There are two unread articles. |
103 DCHECK([reading_list_view_controller_.get().collectionView | 102 DCHECK([reading_list_view_controller_.collectionView |
104 numberOfItemsInSection:0] == 2); | 103 numberOfItemsInSection:0] == 2); |
105 // There is one read article. | 104 // There is one read article. |
106 DCHECK([reading_list_view_controller_.get().collectionView | 105 DCHECK([reading_list_view_controller_.collectionView |
107 numberOfItemsInSection:1] == 1); | 106 numberOfItemsInSection:1] == 1); |
108 } | 107 } |
109 | 108 |
110 // Tests that the view controller is dismissed when Done button is pressed. | 109 // Tests that the view controller is dismissed when Done button is pressed. |
111 TEST_F(ReadingListCollectionViewControllerTest, GetsDismissed) { | 110 TEST_F(ReadingListCollectionViewControllerTest, GetsDismissed) { |
112 // Load view. | 111 // Load view. |
113 [reading_list_view_controller_ view]; | 112 [reading_list_view_controller_ view]; |
114 | 113 |
115 [[mock_delegate_ expect] | 114 [[mock_delegate_ expect] |
116 dismissReadingListCollectionViewController:reading_list_view_controller_ | 115 dismissReadingListCollectionViewController:reading_list_view_controller_]; |
117 .get()]; | |
118 | 116 |
119 // Simulate tap on "Done" button. | 117 // Simulate tap on "Done" button. |
120 UIBarButtonItem* done = | 118 UIBarButtonItem* done = |
121 reading_list_view_controller_.get().navigationItem.rightBarButtonItem; | 119 reading_list_view_controller_.navigationItem.rightBarButtonItem; |
120 #pragma clang diagnostic push | |
121 #pragma clang diagnostic ignored "-Warc-performSelector-leaks" | |
122 // Since @selector stored in done.action is a method returning void, there is | |
123 // no potential for memory leak. It is OK to ignore this warning here. | |
122 [done.target performSelector:done.action]; | 124 [done.target performSelector:done.action]; |
125 #pragma clang diagnostic pop | |
123 | 126 |
124 EXPECT_OCMOCK_VERIFY(mock_delegate_); | 127 EXPECT_OCMOCK_VERIFY(mock_delegate_); |
125 } | 128 } |
126 | 129 |
127 // Tests that when an item is selected, the article is opened with UrlLoader and | 130 // Tests that when an item is selected, the article is opened with UrlLoader and |
128 // the view controller is dismissed. | 131 // the view controller is dismissed. |
129 TEST_F(ReadingListCollectionViewControllerTest, OpensItems) { | 132 TEST_F(ReadingListCollectionViewControllerTest, OpensItems) { |
130 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:1 inSection:0]; | 133 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:1 inSection:0]; |
131 | 134 |
132 GURL url("https://chromium.org"); | 135 GURL url("https://chromium.org"); |
133 GURL url2("https://chromium.org/2"); | 136 GURL url2("https://chromium.org/2"); |
134 reading_list_model_->AddEntry(url, "chromium", | 137 reading_list_model_->AddEntry(url, "chromium", |
135 reading_list::ADDED_VIA_CURRENT_APP); | 138 reading_list::ADDED_VIA_CURRENT_APP); |
136 reading_list_model_->AddEntry(url2, "chromium - 2", | 139 reading_list_model_->AddEntry(url2, "chromium - 2", |
137 reading_list::ADDED_VIA_CURRENT_APP); | 140 reading_list::ADDED_VIA_CURRENT_APP); |
138 | 141 |
139 ReadingListCollectionViewItem* readingListItem = | 142 ReadingListCollectionViewItem* readingListItem = |
140 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( | 143 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( |
141 [[reading_list_view_controller_ collectionViewModel] | 144 [[reading_list_view_controller_ collectionViewModel] |
142 itemAtIndexPath:indexPath]); | 145 itemAtIndexPath:indexPath]); |
143 | 146 |
144 [[mock_delegate_ expect] | 147 [[mock_delegate_ expect] |
145 readingListCollectionViewController:reading_list_view_controller_.get() | 148 readingListCollectionViewController:reading_list_view_controller_ |
146 openItem:readingListItem]; | 149 openItem:readingListItem]; |
147 | 150 |
148 // Simulate touch on second cell. | 151 // Simulate touch on second cell. |
149 [reading_list_view_controller_ | 152 [reading_list_view_controller_ |
150 collectionView:reading_list_view_controller_.get() | 153 collectionView:reading_list_view_controller_.collectionView |
151 .collectionView | |
152 didSelectItemAtIndexPath:indexPath]; | 154 didSelectItemAtIndexPath:indexPath]; |
153 | 155 |
154 EXPECT_OCMOCK_VERIFY(mock_delegate_); | 156 EXPECT_OCMOCK_VERIFY(mock_delegate_); |
155 } | 157 } |
156 | 158 |
157 // Tests that the ReadingListCollectionView is creating | 159 // Tests that the ReadingListCollectionView is creating |
158 // ReadingListCollectionViewItem with the correct informations. | 160 // ReadingListCollectionViewItem with the correct informations. |
159 TEST_F(ReadingListCollectionViewControllerTest, | 161 TEST_F(ReadingListCollectionViewControllerTest, |
160 TestItemInitializationUndistilled) { | 162 TestItemInitializationUndistilled) { |
161 // Setup. | 163 // Setup. |
162 GURL url("https://chromium.org"); | 164 GURL url("https://chromium.org"); |
163 std::string title("Chromium"); | 165 std::string title("Chromium"); |
164 reading_list_model_->AddEntry(url, title, | 166 reading_list_model_->AddEntry(url, title, |
165 reading_list::ADDED_VIA_CURRENT_APP); | 167 reading_list::ADDED_VIA_CURRENT_APP); |
166 // Load view. | 168 // Load view. |
167 [reading_list_view_controller_ view]; | 169 [reading_list_view_controller_ view]; |
168 DCHECK([reading_list_view_controller_.get().collectionView | 170 DCHECK([reading_list_view_controller_.collectionView |
169 numberOfItemsInSection:0] == 1); | 171 numberOfItemsInSection:0] == 1); |
170 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; | 172 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; |
171 ReadingListCollectionViewItem* readingListItem = | 173 ReadingListCollectionViewItem* readingListItem = |
172 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( | 174 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( |
173 [[reading_list_view_controller_ collectionViewModel] | 175 [[reading_list_view_controller_ collectionViewModel] |
174 itemAtIndexPath:indexPath]); | 176 itemAtIndexPath:indexPath]); |
175 EXPECT_EQ(base::SysNSStringToUTF8([readingListItem title]), title); | 177 EXPECT_EQ(base::SysNSStringToUTF8([readingListItem title]), title); |
176 EXPECT_EQ([readingListItem url], url); | 178 EXPECT_EQ([readingListItem url], url); |
177 EXPECT_EQ(base::SysNSStringToUTF16([readingListItem subtitle]), | 179 EXPECT_EQ(base::SysNSStringToUTF16([readingListItem subtitle]), |
178 url_formatter::FormatUrl(url)); | 180 url_formatter::FormatUrl(url)); |
(...skipping 12 matching lines...) Expand all Loading... | |
191 std::string title("Chromium"); | 193 std::string title("Chromium"); |
192 GURL distilled_url("https://chromium.org/distilled"); | 194 GURL distilled_url("https://chromium.org/distilled"); |
193 base::FilePath distilled_path("/distilled/path"); | 195 base::FilePath distilled_path("/distilled/path"); |
194 reading_list_model_->AddEntry(url, title, | 196 reading_list_model_->AddEntry(url, title, |
195 reading_list::ADDED_VIA_CURRENT_APP); | 197 reading_list::ADDED_VIA_CURRENT_APP); |
196 int64_t size = 50; | 198 int64_t size = 50; |
197 reading_list_model_->SetEntryDistilledInfo(url, distilled_path, distilled_url, | 199 reading_list_model_->SetEntryDistilledInfo(url, distilled_path, distilled_url, |
198 size, base::Time::FromTimeT(100)); | 200 size, base::Time::FromTimeT(100)); |
199 // Load view. | 201 // Load view. |
200 [reading_list_view_controller_ view]; | 202 [reading_list_view_controller_ view]; |
201 DCHECK([reading_list_view_controller_.get().collectionView | 203 DCHECK([reading_list_view_controller_.collectionView |
202 numberOfItemsInSection:0] == 1); | 204 numberOfItemsInSection:0] == 1); |
203 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; | 205 NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; |
204 ReadingListCollectionViewItem* readingListItem = | 206 ReadingListCollectionViewItem* readingListItem = |
205 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( | 207 base::mac::ObjCCastStrict<ReadingListCollectionViewItem>( |
206 [[reading_list_view_controller_ collectionViewModel] | 208 [[reading_list_view_controller_ collectionViewModel] |
207 itemAtIndexPath:indexPath]); | 209 itemAtIndexPath:indexPath]); |
208 EXPECT_EQ(base::SysNSStringToUTF8([readingListItem title]), title); | 210 EXPECT_EQ(base::SysNSStringToUTF8([readingListItem title]), title); |
209 EXPECT_EQ([readingListItem url], url); | 211 EXPECT_EQ([readingListItem url], url); |
210 EXPECT_EQ(base::SysNSStringToUTF16([readingListItem subtitle]), | 212 EXPECT_EQ(base::SysNSStringToUTF16([readingListItem subtitle]), |
211 url_formatter::FormatUrl(url)); | 213 url_formatter::FormatUrl(url)); |
212 EXPECT_EQ([readingListItem faviconPageURL], distilled_url); | 214 EXPECT_EQ([readingListItem faviconPageURL], distilled_url); |
213 EXPECT_EQ([readingListItem distillationState], | 215 EXPECT_EQ([readingListItem distillationState], |
214 ReadingListUIDistillationStatusSuccess); | 216 ReadingListUIDistillationStatusSuccess); |
215 } | 217 } |
OLD | NEW |