OSDN Git Service

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