OSDN Git Service

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