OSDN Git Service

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