OSDN Git Service

Merge pull request #34 from opentween/async-twitterapi
[opentween/open-tween.git] / OpenTween.Tests / MediaSelectorTest.cs
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.IO;
6 using System.Linq;
7 using System.Reflection;
8 using System.Runtime.InteropServices;
9 using System.Text;
10 using System.Text.RegularExpressions;
11 using Moq;
12 using OpenTween.Api.DataModel;
13 using Xunit;
14
15 namespace OpenTween
16 {
17     public class MediaSelectorTest
18     {
19         public MediaSelectorTest()
20         {
21             this.MyCommonSetup();
22         }
23
24         public void MyCommonSetup()
25         {
26             var mockAssembly = new Mock<_Assembly>();
27             mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
28
29             MyCommon.EntryAssembly = mockAssembly.Object;
30         }
31
32         [Fact]
33         public void Initialize_TwitterTest()
34         {
35             using (var twitter = new Twitter())
36             using (var mediaSelector = new MediaSelector())
37             {
38                 twitter.Initialize("", "", "", 0L);
39                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
40
41                 Assert.NotEqual(-1, mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter"));
42
43                 // 投稿先に Twitter が選択されている
44                 Assert.Equal("Twitter", mediaSelector.ImageServiceCombo.Text);
45
46                 // ページ番号が初期化された状態
47                 var pages = mediaSelector.ImagePageCombo.Items;
48                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
49             }
50         }
51
52         [Fact]
53         public void Initialize_yfrogTest()
54         {
55             using (var twitter = new Twitter())
56             using (var mediaSelector = new MediaSelector())
57             {
58                 twitter.Initialize("", "", "", 0L);
59                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "yfrog");
60
61                 // 投稿先に yfrog が選択されている
62                 Assert.Equal("yfrog", mediaSelector.ImageServiceCombo.Text);
63
64                 // ページ番号が初期化された状態
65                 var pages = mediaSelector.ImagePageCombo.Items;
66                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
67             }
68         }
69
70         [Fact]
71         public void BeginSelection_BlankTest()
72         {
73             using (var twitter = new Twitter())
74             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
75             {
76                 twitter.Initialize("", "", "", 0L);
77                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
78
79                 var eventCalled = false;
80                 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
81
82                 mediaSelector.BeginSelection();
83
84                 Assert.True(eventCalled);
85
86                 Assert.True(mediaSelector.Visible);
87                 Assert.True(mediaSelector.Enabled);
88
89                 // 1 ページ目のみ選択可能な状態
90                 var pages = mediaSelector.ImagePageCombo.Items;
91                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
92
93                 // 1 ページ目が表示されている
94                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
95                 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
96                 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
97             }
98         }
99
100         [Fact]
101         public void BeginSelection_FilePathTest()
102         {
103             using (var twitter = new Twitter())
104             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
105             {
106                 twitter.Initialize("", "", "", 0L);
107                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
108
109                 var eventCalled = false;
110                 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
111
112                 var images = new[] { "Resources/re.gif" };
113                 mediaSelector.BeginSelection(images);
114
115                 Assert.True(eventCalled);
116
117                 Assert.True(mediaSelector.Visible);
118                 Assert.True(mediaSelector.Enabled);
119
120                 // 2 ページ目まで選択可能な状態
121                 var pages = mediaSelector.ImagePageCombo.Items;
122                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
123
124                 // 1 ページ目が表示されている
125                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
126                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
127
128                 using (var imageStream = File.OpenRead("Resources/re.gif"))
129                 using (var image = MemoryImage.CopyFromStream(imageStream))
130                 {
131                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
132                 }
133             }
134         }
135
136         [Fact]
137         public void BeginSelection_MemoryImageTest()
138         {
139             using (var twitter = new Twitter())
140             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
141             {
142                 twitter.Initialize("", "", "", 0L);
143                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
144
145                 var eventCalled = false;
146                 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
147
148                 using (var bitmap = new Bitmap(width: 200, height: 200))
149                 {
150                     mediaSelector.BeginSelection(bitmap);
151                 }
152
153                 Assert.True(eventCalled);
154
155                 Assert.True(mediaSelector.Visible);
156                 Assert.True(mediaSelector.Enabled);
157
158                 // 2 ページ目まで選択可能な状態
159                 var pages = mediaSelector.ImagePageCombo.Items;
160                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
161
162                 // 1 ページ目が表示されている
163                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
164                 Assert.True(Regex.IsMatch(mediaSelector.ImagefilePathText.Text, @"^<>MemoryImage://\d+.png$"));
165
166                 using (var bitmap = new Bitmap(width: 200, height: 200))
167                 using (var image = MemoryImage.CopyFromImage(bitmap))
168                 {
169                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
170                 }
171             }
172         }
173
174         [Fact]
175         public void BeginSelection_MultiImageTest()
176         {
177             using (var twitter = new Twitter())
178             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
179             {
180                 twitter.Initialize("", "", "", 0L);
181                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
182
183                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
184                 mediaSelector.BeginSelection(images);
185
186                 // 3 ページ目まで選択可能な状態
187                 var pages = mediaSelector.ImagePageCombo.Items;
188                 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
189
190                 // 1 ページ目が表示されている
191                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
192                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
193
194                 using (var imageStream = File.OpenRead("Resources/re.gif"))
195                 using (var image = MemoryImage.CopyFromStream(imageStream))
196                 {
197                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
198                 }
199             }
200         }
201
202         [Fact]
203         public void EndSelection_Test()
204         {
205             using (var twitter = new Twitter())
206             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
207             {
208                 twitter.Initialize("", "", "", 0L);
209                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
210                 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
211
212                 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
213
214                 var eventCalled = false;
215                 mediaSelector.EndSelecting += (o, e) => eventCalled = true;
216
217                 mediaSelector.EndSelection();
218
219                 Assert.True(eventCalled);
220
221                 Assert.False(mediaSelector.Visible);
222                 Assert.False(mediaSelector.Enabled);
223
224                 Assert.True(displayImage.IsDisposed);
225             }
226         }
227
228         [Fact]
229         public void PageChange_Test()
230         {
231             using (var twitter = new Twitter())
232             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
233             {
234                 twitter.Initialize("", "", "", 0L);
235                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
236
237                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
238                 mediaSelector.BeginSelection(images);
239
240                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
241
242                 // 1 ページ目
243                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
244                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
245
246                 using (var imageStream = File.OpenRead("Resources/re.gif"))
247                 using (var image = MemoryImage.CopyFromStream(imageStream))
248                 {
249                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
250                 }
251
252                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
253
254                 // 2 ページ目
255                 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
256                 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
257
258                 using (var imageStream = File.OpenRead("Resources/re1.png"))
259                 using (var image = MemoryImage.CopyFromStream(imageStream))
260                 {
261                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
262                 }
263
264                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
265
266                 // 3 ページ目 (新規ページ)
267                 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
268                 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
269                 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
270             }
271         }
272
273         [Fact]
274         public void PageChange_ImageDisposeTest()
275         {
276             using (var twitter = new Twitter())
277             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
278             {
279                 twitter.Initialize("", "", "", 0L);
280                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
281
282                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
283                 mediaSelector.BeginSelection(images);
284
285                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
286
287                 // 1 ページ目
288                 var page1Image = mediaSelector.ImageSelectedPicture.Image;
289
290                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
291
292                 // 2 ページ目
293                 var page2Image = mediaSelector.ImageSelectedPicture.Image;
294                 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
295
296                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
297
298                 // 3 ページ目 (新規ページ)
299                 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
300             }
301         }
302
303         [Fact]
304         public void ImagePathInput_Test()
305         {
306             using (var twitter = new Twitter())
307             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
308             {
309                 twitter.Initialize("", "", "", 0L);
310                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
311                 mediaSelector.BeginSelection();
312
313                 // 画像のファイルパスを入力
314                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
315                 TestUtils.Validate(mediaSelector.ImagefilePathText);
316
317                 // 入力したパスの画像が表示される
318                 using (var imageStream = File.OpenRead("Resources/re1.png"))
319                 using (var image = MemoryImage.CopyFromStream(imageStream))
320                 {
321                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
322                 }
323
324                 // 2 ページ目まで選択可能な状態
325                 var pages = mediaSelector.ImagePageCombo.Items;
326                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
327             }
328         }
329
330         [Fact]
331         public void ImagePathInput_ReplaceFileMediaItemTest()
332         {
333             using (var twitter = new Twitter())
334             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
335             {
336                 twitter.Initialize("", "", "", 0L);
337                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
338
339                 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
340
341                 // 既に入力されているファイルパスの画像
342                 var image1 = mediaSelector.ImageSelectedPicture.Image;
343
344                 // 別の画像のファイルパスを入力
345                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
346                 TestUtils.Validate(mediaSelector.ImagefilePathText);
347
348                 // 入力したパスの画像が表示される
349                 using (var imageStream = File.OpenRead("Resources/re1.png"))
350                 using (var image2 = MemoryImage.CopyFromStream(imageStream))
351                 {
352                     Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
353                 }
354
355                 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
356                 Assert.True(image1.IsDisposed);
357             }
358         }
359
360         [Fact]
361         public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
362         {
363             using (var twitter = new Twitter())
364             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
365             {
366                 twitter.Initialize("", "", "", 0L);
367                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
368
369                 using (var bitmap = new Bitmap(width: 200, height: 200))
370                 {
371                     mediaSelector.BeginSelection(bitmap);
372                 }
373
374                 // 既に入力されているファイルパスの画像
375                 var image1 = mediaSelector.ImageSelectedPicture.Image;
376
377                 // 内部で保持されている MemoryImageMediaItem を取り出す
378                 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
379                 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
380                 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
381
382                 // 別の画像のファイルパスを入力
383                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
384                 TestUtils.Validate(mediaSelector.ImagefilePathText);
385
386                 // 入力したパスの画像が表示される
387                 using (var imageStream = File.OpenRead("Resources/re1.png"))
388                 using (var image2 = MemoryImage.CopyFromStream(imageStream))
389                 {
390                     Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
391                 }
392
393                 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
394                 Assert.True(image1.IsDisposed);
395
396                 // 参照されなくなった MemoryImageMediaItem も破棄される
397                 Assert.True(mediaItem.IsDisposed);
398             }
399         }
400
401         [Fact]
402         public void ImageServiceChange_Test()
403         {
404             using (var twitter = new Twitter())
405             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
406             {
407                 twitter.Initialize("", "", "", 0L);
408                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
409
410                 Assert.Equal("Twitter", mediaSelector.ServiceName);
411
412                 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
413
414                 // 3 ページ目まで選択可能な状態
415                 var pages = mediaSelector.ImagePageCombo.Items;
416                 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
417                 Assert.True(mediaSelector.ImagePageCombo.Enabled);
418
419                 var eventCalled = false;
420                 mediaSelector.SelectedServiceChanged += (o, e) => eventCalled = true;
421
422                 // 投稿先を yfrog に変更
423                 mediaSelector.ImageServiceCombo.SelectedIndex =
424                     mediaSelector.ImageServiceCombo.Items.IndexOf("yfrog");
425
426                 Assert.True(eventCalled); // SelectedServiceChanged イベントが呼ばれる
427
428                 // 1 ページ目のみ選択可能な状態 (Disabled)
429                 pages = mediaSelector.ImagePageCombo.Items;
430                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
431                 Assert.False(mediaSelector.ImagePageCombo.Enabled);
432
433                 // 投稿先を Twitter に変更
434                 mediaSelector.ImageServiceCombo.SelectedIndex =
435                     mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
436
437                 // 2 ページ目まで選択可能な状態
438                 pages = mediaSelector.ImagePageCombo.Items;
439                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
440                 Assert.True(mediaSelector.ImagePageCombo.Enabled);
441             }
442         }
443     }
444 }