OSDN Git Service

完了状態のTaskを生成するために Task.CompletedTask を使用する
[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         private 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                 Assert.True(mediaSelector.AlternativeTextPanel.Visible);
52             }
53         }
54
55         [Fact]
56         public void Initialize_ImgurTest()
57         {
58             using (var twitter = new Twitter())
59             using (var mediaSelector = new MediaSelector())
60             {
61                 twitter.Initialize("", "", "", 0L);
62                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Imgur");
63
64                 // 投稿先に Imgur が選択されている
65                 Assert.Equal("Imgur", mediaSelector.ImageServiceCombo.Text);
66
67                 // ページ番号が初期化された状態
68                 var pages = mediaSelector.ImagePageCombo.Items;
69                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
70
71                 // 代替テキストの入力欄が非表示の状態
72                 Assert.False(mediaSelector.AlternativeTextPanel.Visible);
73             }
74         }
75
76         [Fact]
77         public void BeginSelection_BlankTest()
78         {
79             using (var twitter = new Twitter())
80             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
81             {
82                 twitter.Initialize("", "", "", 0L);
83                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
84
85                 Assert.Raises<EventArgs>(
86                     x => mediaSelector.BeginSelecting += x,
87                     x => mediaSelector.BeginSelecting -= x,
88                     () => mediaSelector.BeginSelection()
89                 );
90
91                 Assert.True(mediaSelector.Visible);
92                 Assert.True(mediaSelector.Enabled);
93
94                 // 1 ページ目のみ選択可能な状態
95                 var pages = mediaSelector.ImagePageCombo.Items;
96                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
97
98                 // 1 ページ目が表示されている
99                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
100                 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
101                 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
102             }
103         }
104
105         [Fact]
106         public void BeginSelection_FilePathTest()
107         {
108             using (var twitter = new Twitter())
109             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
110             {
111                 twitter.Initialize("", "", "", 0L);
112                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
113
114                 var images = new[] { "Resources/re.gif" };
115
116                 Assert.Raises<EventArgs>(
117                     x => mediaSelector.BeginSelecting += x,
118                     x => mediaSelector.BeginSelecting -= x,
119                     () => mediaSelector.BeginSelection(images)
120                 );
121
122                 Assert.True(mediaSelector.Visible);
123                 Assert.True(mediaSelector.Enabled);
124
125                 // 2 ページ目まで選択可能な状態
126                 var pages = mediaSelector.ImagePageCombo.Items;
127                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
128
129                 // 1 ページ目が表示されている
130                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
131                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
132
133                 using (var imageStream = File.OpenRead("Resources/re.gif"))
134                 using (var image = MemoryImage.CopyFromStream(imageStream))
135                 {
136                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
137                 }
138             }
139         }
140
141         [Fact]
142         public void BeginSelection_MemoryImageTest()
143         {
144             using (var twitter = new Twitter())
145             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
146             {
147                 twitter.Initialize("", "", "", 0L);
148                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
149
150                 using (var bitmap = new Bitmap(width: 200, height: 200))
151                 {
152                     Assert.Raises<EventArgs>(
153                         x => mediaSelector.BeginSelecting += x,
154                         x => mediaSelector.BeginSelecting -= x,
155                         () => mediaSelector.BeginSelection(bitmap)
156                     );
157                 }
158
159                 Assert.True(mediaSelector.Visible);
160                 Assert.True(mediaSelector.Enabled);
161
162                 // 2 ページ目まで選択可能な状態
163                 var pages = mediaSelector.ImagePageCombo.Items;
164                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
165
166                 // 1 ページ目が表示されている
167                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
168                 Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.ImagefilePathText.Text);
169
170                 using (var bitmap = new Bitmap(width: 200, height: 200))
171                 using (var image = MemoryImage.CopyFromImage(bitmap))
172                 {
173                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
174                 }
175             }
176         }
177
178         [Fact]
179         public void BeginSelection_MultiImageTest()
180         {
181             using (var twitter = new Twitter())
182             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
183             {
184                 twitter.Initialize("", "", "", 0L);
185                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
186
187                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
188                 mediaSelector.BeginSelection(images);
189
190                 // 3 ページ目まで選択可能な状態
191                 var pages = mediaSelector.ImagePageCombo.Items;
192                 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
193
194                 // 1 ページ目が表示されている
195                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
196                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
197
198                 using (var imageStream = File.OpenRead("Resources/re.gif"))
199                 using (var image = MemoryImage.CopyFromStream(imageStream))
200                 {
201                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
202                 }
203             }
204         }
205
206         [Fact]
207         public void EndSelection_Test()
208         {
209             using (var twitter = new Twitter())
210             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
211             {
212                 twitter.Initialize("", "", "", 0L);
213                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
214                 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
215
216                 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
217
218                 Assert.Raises<EventArgs>(
219                     x => mediaSelector.EndSelecting += x,
220                     x => mediaSelector.EndSelecting -= x,
221                     () => mediaSelector.EndSelection()
222                 );
223
224                 Assert.False(mediaSelector.Visible);
225                 Assert.False(mediaSelector.Enabled);
226
227                 Assert.True(displayImage.IsDisposed);
228             }
229         }
230
231         [Fact]
232         public void PageChange_Test()
233         {
234             using (var twitter = new Twitter())
235             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
236             {
237                 twitter.Initialize("", "", "", 0L);
238                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
239
240                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
241                 mediaSelector.BeginSelection(images);
242
243                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
244
245                 // 1 ページ目
246                 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
247                 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
248
249                 using (var imageStream = File.OpenRead("Resources/re.gif"))
250                 using (var image = MemoryImage.CopyFromStream(imageStream))
251                 {
252                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
253                 }
254
255                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
256
257                 // 2 ページ目
258                 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
259                 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
260
261                 using (var imageStream = File.OpenRead("Resources/re1.png"))
262                 using (var image = MemoryImage.CopyFromStream(imageStream))
263                 {
264                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
265                 }
266
267                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
268
269                 // 3 ページ目 (新規ページ)
270                 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
271                 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
272                 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
273             }
274         }
275
276         [Fact]
277         public void PageChange_AlternativeTextTest()
278         {
279             using (var twitter = new Twitter())
280             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
281             {
282                 twitter.Initialize("", "", "", 0L);
283                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
284
285                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
286                 mediaSelector.BeginSelection(images);
287
288                 // 1 ページ目
289                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
290                 mediaSelector.AlternativeTextBox.Text = "Page 1";
291                 mediaSelector.ValidateChildren();
292
293                 // 2 ページ目
294                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
295                 mediaSelector.AlternativeTextBox.Text = "Page 2";
296                 mediaSelector.ValidateChildren();
297
298                 // 3 ページ目 (新規ページ)
299                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
300                 mediaSelector.AlternativeTextBox.Text = "Page 3";
301                 mediaSelector.ValidateChildren();
302
303                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
304                 Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
305
306                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
307                 Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
308
309                 // 画像が指定されていないページは入力した代替テキストも保持されない
310                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
311                 Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
312             }
313         }
314
315         [Fact]
316         public void PageChange_ImageDisposeTest()
317         {
318             using (var twitter = new Twitter())
319             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
320             {
321                 twitter.Initialize("", "", "", 0L);
322                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
323
324                 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
325                 mediaSelector.BeginSelection(images);
326
327                 mediaSelector.ImagePageCombo.SelectedIndex = 0;
328
329                 // 1 ページ目
330                 var page1Image = mediaSelector.ImageSelectedPicture.Image;
331
332                 mediaSelector.ImagePageCombo.SelectedIndex = 1;
333
334                 // 2 ページ目
335                 var page2Image = mediaSelector.ImageSelectedPicture.Image;
336                 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
337
338                 mediaSelector.ImagePageCombo.SelectedIndex = 2;
339
340                 // 3 ページ目 (新規ページ)
341                 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
342             }
343         }
344
345         [Fact]
346         public void ImagePathInput_Test()
347         {
348             using (var twitter = new Twitter())
349             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
350             {
351                 twitter.Initialize("", "", "", 0L);
352                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
353                 mediaSelector.BeginSelection();
354
355                 // 画像のファイルパスを入力
356                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
357                 TestUtils.Validate(mediaSelector.ImagefilePathText);
358
359                 // 入力したパスの画像が表示される
360                 using (var imageStream = File.OpenRead("Resources/re1.png"))
361                 using (var image = MemoryImage.CopyFromStream(imageStream))
362                 {
363                     Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
364                 }
365
366                 // 2 ページ目まで選択可能な状態
367                 var pages = mediaSelector.ImagePageCombo.Items;
368                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
369             }
370         }
371
372         [Fact]
373         public void ImagePathInput_ReplaceFileMediaItemTest()
374         {
375             using (var twitter = new Twitter())
376             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
377             {
378                 twitter.Initialize("", "", "", 0L);
379                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
380
381                 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
382
383                 // 既に入力されているファイルパスの画像
384                 var image1 = mediaSelector.ImageSelectedPicture.Image;
385
386                 // 別の画像のファイルパスを入力
387                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
388                 TestUtils.Validate(mediaSelector.ImagefilePathText);
389
390                 // 入力したパスの画像が表示される
391                 using (var imageStream = File.OpenRead("Resources/re1.png"))
392                 using (var image2 = MemoryImage.CopyFromStream(imageStream))
393                 {
394                     Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
395                 }
396
397                 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
398                 Assert.True(image1.IsDisposed);
399             }
400         }
401
402         [Fact]
403         public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
404         {
405             using (var twitter = new Twitter())
406             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
407             {
408                 twitter.Initialize("", "", "", 0L);
409                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
410
411                 using (var bitmap = new Bitmap(width: 200, height: 200))
412                 {
413                     mediaSelector.BeginSelection(bitmap);
414                 }
415
416                 // 既に入力されているファイルパスの画像
417                 var image1 = mediaSelector.ImageSelectedPicture.Image;
418
419                 // 内部で保持されている MemoryImageMediaItem を取り出す
420                 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
421                 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
422                 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
423
424                 // 別の画像のファイルパスを入力
425                 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
426                 TestUtils.Validate(mediaSelector.ImagefilePathText);
427
428                 // 入力したパスの画像が表示される
429                 using (var imageStream = File.OpenRead("Resources/re1.png"))
430                 using (var image2 = MemoryImage.CopyFromStream(imageStream))
431                 {
432                     Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
433                 }
434
435                 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
436                 Assert.True(image1.IsDisposed);
437
438                 // 参照されなくなった MemoryImageMediaItem も破棄される
439                 Assert.True(mediaItem.IsDisposed);
440             }
441         }
442
443         [Fact]
444         public void ImageServiceChange_Test()
445         {
446             using (var twitter = new Twitter())
447             using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
448             {
449                 twitter.Initialize("", "", "", 0L);
450                 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
451
452                 Assert.Equal("Twitter", mediaSelector.ServiceName);
453
454                 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
455
456                 // 3 ページ目まで選択可能な状態
457                 var pages = mediaSelector.ImagePageCombo.Items;
458                 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
459                 Assert.True(mediaSelector.ImagePageCombo.Enabled);
460
461                 // 投稿先を Imgur に変更
462                 var imgurIndex = mediaSelector.ImageServiceCombo.Items.IndexOf("Imgur");
463                 Assert.Raises<EventArgs>(
464                     x => mediaSelector.SelectedServiceChanged += x,
465                     x => mediaSelector.SelectedServiceChanged -= x,
466                     () => mediaSelector.ImageServiceCombo.SelectedIndex = imgurIndex
467                 );
468
469                 // 1 ページ目のみ選択可能な状態 (Disabled)
470                 pages = mediaSelector.ImagePageCombo.Items;
471                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
472                 Assert.False(mediaSelector.ImagePageCombo.Enabled);
473
474                 // 投稿先を Twitter に変更
475                 mediaSelector.ImageServiceCombo.SelectedIndex =
476                     mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
477
478                 // 2 ページ目まで選択可能な状態
479                 pages = mediaSelector.ImagePageCombo.Items;
480                 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
481                 Assert.True(mediaSelector.ImagePageCombo.Enabled);
482             }
483         }
484     }
485 }