- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / media_picker / desktop_media_picker_controller_unittest.mm
1 // Copyright 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/media_picker/desktop_media_picker_controller.h"
6
7 #include "base/bind.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/run_loop.h"
10 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
11 #include "content/public/test/test_browser_thread_bundle.h"
12 #include "testing/gtest_mac.h"
13
14 @interface DesktopMediaPickerController (ExposedForTesting)
15 - (IKImageBrowserView*)sourceBrowser;
16 - (NSButton*)okButton;
17 - (NSArray*)items;
18 @end
19
20 @implementation DesktopMediaPickerController (ExposedForTesting)
21 - (IKImageBrowserView*)sourceBrowser {
22   return sourceBrowser_;
23 }
24
25 - (NSButton*)okButton {
26   return okButton_;
27 }
28
29 - (NSButton*)cancelButton {
30   return cancelButton_;
31 }
32
33 - (NSArray*)items {
34   return items_;
35 }
36 @end
37
38 class FakeDesktopMediaPickerModel : public DesktopMediaPickerModel {
39  public:
40   FakeDesktopMediaPickerModel() : observer_(NULL) {
41   }
42
43   void AddSource(int id) {
44     Source source(
45         content::DesktopMediaID(content::DesktopMediaID::TYPE_WINDOW, id),
46         base::Int64ToString16(id));
47
48     sources_.push_back(source);
49     observer_->OnSourceAdded(sources_.size() - 1);
50   }
51
52   void RemoveSource(int index) {
53     sources_.erase(sources_.begin() + index);
54     observer_->OnSourceRemoved(sources_.size() - 1);
55   }
56
57   void SetSourceThumbnail(int index) {
58     sources_[index].thumbnail = thumbnail_;
59     observer_->OnSourceThumbnailChanged(index);
60   }
61
62   void SetSourceName(int index, string16 name) {
63     sources_[index].name = name;
64     observer_->OnSourceNameChanged(index);
65   }
66
67   // DesktopMediaPickerModel implementation:
68   virtual void SetUpdatePeriod(base::TimeDelta period) OVERRIDE {
69   }
70
71   virtual void SetThumbnailSize(const gfx::Size& thumbnail_size) OVERRIDE {
72   }
73
74   virtual void SetViewDialogWindowId(
75       content::DesktopMediaID::Id dialog_id) OVERRIDE {
76   }
77
78   virtual void StartUpdating(Observer* observer) OVERRIDE {
79     observer_ = observer;
80
81     SkBitmap bitmap;
82     bitmap.setConfig(SkBitmap::kARGB_8888_Config, 150, 150);
83     bitmap.allocPixels();
84     bitmap.eraseRGB(0, 255, 0);
85     thumbnail_ = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
86   }
87
88   virtual int source_count() const OVERRIDE {
89     return sources_.size();
90   }
91
92   virtual const Source& source(int index) const OVERRIDE {
93     return sources_[index];
94   }
95
96  private:
97   std::vector<Source> sources_;
98   Observer* observer_;
99   gfx::ImageSkia thumbnail_;
100 };
101
102 class DesktopMediaPickerControllerTest : public CocoaTest {
103  public:
104   DesktopMediaPickerControllerTest() : callback_called_(false), model_(NULL) {
105   }
106
107   virtual void SetUp() OVERRIDE {
108     CocoaTest::SetUp();
109
110     model_ = new FakeDesktopMediaPickerModel();
111
112     DesktopMediaPicker::DoneCallback callback =
113         base::Bind(&DesktopMediaPickerControllerTest::OnResult,
114                    base::Unretained(this));
115
116     controller_.reset(
117         [[DesktopMediaPickerController alloc]
118             initWithModel:scoped_ptr<DesktopMediaPickerModel>(model_)
119                  callback:callback
120                   appName:ASCIIToUTF16("Screenshare Test")]);
121   }
122
123   virtual void TearDown() OVERRIDE {
124     controller_.reset();
125     CocoaTest::TearDown();
126   }
127
128   bool WaitForCallback() {
129     if (!callback_called_) {
130       base::RunLoop().RunUntilIdle();
131     }
132     return callback_called_;
133   }
134
135  protected:
136   void OnResult(content::DesktopMediaID source) {
137     EXPECT_FALSE(callback_called_);
138     callback_called_ = true;
139     source_reported_ = source;
140   }
141
142   content::TestBrowserThreadBundle thread_bundle_;
143   bool callback_called_;
144   content::DesktopMediaID source_reported_;
145   FakeDesktopMediaPickerModel* model_;
146   base::scoped_nsobject<DesktopMediaPickerController> controller_;
147 };
148
149 TEST_F(DesktopMediaPickerControllerTest, ShowAndDismiss) {
150   [controller_ showWindow:nil];
151
152   model_->AddSource(0);
153   model_->AddSource(1);
154   model_->SetSourceThumbnail(1);
155
156   NSArray* items = [controller_ items];
157   EXPECT_EQ(2U, [items count]);
158   EXPECT_NSEQ(@"0", [[items objectAtIndex:0] imageTitle]);
159   EXPECT_EQ(nil, [[items objectAtIndex:0] imageRepresentation]);
160   EXPECT_NSEQ(@"1", [[items objectAtIndex:1] imageTitle]);
161   EXPECT_TRUE([[items objectAtIndex:1] imageRepresentation] != nil);
162 }
163
164 TEST_F(DesktopMediaPickerControllerTest, ClickOK) {
165   [controller_ showWindow:nil];
166
167   model_->AddSource(0);
168   model_->SetSourceThumbnail(0);
169   model_->AddSource(1);
170   model_->SetSourceThumbnail(1);
171
172   EXPECT_EQ(2U, [[controller_ items] count]);
173   EXPECT_FALSE([[controller_ okButton] isEnabled]);
174
175   NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:1];
176   [[controller_ sourceBrowser] setSelectionIndexes:indexSet
177                               byExtendingSelection:NO];
178   EXPECT_TRUE([[controller_ okButton] isEnabled]);
179
180   [[controller_ okButton] performClick:nil];
181   EXPECT_TRUE(WaitForCallback());
182   EXPECT_EQ(model_->source(1).id, source_reported_);
183 }
184
185 TEST_F(DesktopMediaPickerControllerTest, ClickCancel) {
186   [controller_ showWindow:nil];
187
188   model_->AddSource(0);
189   model_->SetSourceThumbnail(0);
190   model_->AddSource(1);
191   model_->SetSourceThumbnail(1);
192
193   [[controller_ cancelButton] performClick:nil];
194   EXPECT_TRUE(WaitForCallback());
195   EXPECT_EQ(content::DesktopMediaID(), source_reported_);
196 }
197
198 TEST_F(DesktopMediaPickerControllerTest, CloseWindow) {
199   [controller_ showWindow:nil];
200
201   model_->AddSource(0);
202   model_->SetSourceThumbnail(0);
203   model_->AddSource(1);
204   model_->SetSourceThumbnail(1);
205
206   [controller_ close];
207   EXPECT_TRUE(WaitForCallback());
208   EXPECT_EQ(content::DesktopMediaID(), source_reported_);
209 }
210
211 TEST_F(DesktopMediaPickerControllerTest, UpdateThumbnail) {
212   [controller_ showWindow:nil];
213
214   model_->AddSource(0);
215   model_->SetSourceThumbnail(0);
216   model_->AddSource(1);
217   model_->SetSourceThumbnail(1);
218
219   NSArray* items = [controller_ items];
220   EXPECT_EQ(2U, [items count]);
221   NSUInteger version = [[items objectAtIndex:0] imageVersion];
222
223   model_->SetSourceThumbnail(0);
224   EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
225 }
226
227 TEST_F(DesktopMediaPickerControllerTest, UpdateName) {
228   [controller_ showWindow:nil];
229
230   model_->AddSource(0);
231   model_->SetSourceThumbnail(0);
232   model_->AddSource(1);
233   model_->SetSourceThumbnail(1);
234
235   NSArray* items = [controller_ items];
236   EXPECT_EQ(2U, [items count]);
237   NSUInteger version = [[items objectAtIndex:0] imageVersion];
238
239   model_->SetSourceThumbnail(0);
240   EXPECT_NE(version, [[items objectAtIndex:0] imageVersion]);
241 }
242
243 TEST_F(DesktopMediaPickerControllerTest, RemoveSource) {
244   [controller_ showWindow:nil];
245
246   model_->AddSource(0);
247   model_->AddSource(1);
248   model_->AddSource(2);
249   model_->SetSourceName(1, ASCIIToUTF16("foo"));
250
251   NSArray* items = [controller_ items];
252   EXPECT_EQ(3U, [items count]);
253   EXPECT_NSEQ(@"foo", [[items objectAtIndex:1] imageTitle]);
254 }