2 using System.Collections.Generic;
3 using System.ComponentModel;
7 using System.Reflection;
8 using System.Runtime.InteropServices;
10 using System.Text.RegularExpressions;
12 using OpenTween.Api.DataModel;
17 public class MediaSelectorTest
19 public MediaSelectorTest()
20 => this.MyCommonSetup();
22 private void MyCommonSetup()
24 var mockAssembly = new Mock<_Assembly>();
25 mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
27 MyCommon.EntryAssembly = mockAssembly.Object;
31 public void Initialize_TwitterTest()
33 using var twitter = new Twitter();
34 using var mediaSelector = new MediaSelector();
35 twitter.Initialize("", "", "", 0L);
36 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
38 Assert.NotEqual(-1, mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter"));
40 // 投稿先に Twitter が選択されている
41 Assert.Equal("Twitter", mediaSelector.ImageServiceCombo.Text);
44 var pages = mediaSelector.ImagePageCombo.Items;
45 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
48 Assert.True(mediaSelector.AlternativeTextPanel.Visible);
52 public void Initialize_ImgurTest()
54 using var twitter = new Twitter();
55 using var mediaSelector = new MediaSelector();
56 twitter.Initialize("", "", "", 0L);
57 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Imgur");
59 // 投稿先に Imgur が選択されている
60 Assert.Equal("Imgur", mediaSelector.ImageServiceCombo.Text);
63 var pages = mediaSelector.ImagePageCombo.Items;
64 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
67 Assert.False(mediaSelector.AlternativeTextPanel.Visible);
71 public void BeginSelection_BlankTest()
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");
78 Assert.Raises<EventArgs>(
79 x => mediaSelector.BeginSelecting += x,
80 x => mediaSelector.BeginSelecting -= x,
81 () => mediaSelector.BeginSelection()
84 Assert.True(mediaSelector.Visible);
85 Assert.True(mediaSelector.Enabled);
88 var pages = mediaSelector.ImagePageCombo.Items;
89 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
92 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
93 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
94 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
98 public void BeginSelection_FilePathTest()
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");
105 var images = new[] { "Resources/re.gif" };
107 Assert.Raises<EventArgs>(
108 x => mediaSelector.BeginSelecting += x,
109 x => mediaSelector.BeginSelecting -= x,
110 () => mediaSelector.BeginSelection(images)
113 Assert.True(mediaSelector.Visible);
114 Assert.True(mediaSelector.Enabled);
117 var pages = mediaSelector.ImagePageCombo.Items;
118 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
121 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
122 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
124 using var imageStream = File.OpenRead("Resources/re.gif");
125 using var image = MemoryImage.CopyFromStream(imageStream);
126 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
130 public void BeginSelection_MemoryImageTest()
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");
137 using (var bitmap = new Bitmap(width: 200, height: 200))
139 Assert.Raises<EventArgs>(
140 x => mediaSelector.BeginSelecting += x,
141 x => mediaSelector.BeginSelecting -= x,
142 () => mediaSelector.BeginSelection(bitmap)
146 Assert.True(mediaSelector.Visible);
147 Assert.True(mediaSelector.Enabled);
150 var pages = mediaSelector.ImagePageCombo.Items;
151 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
154 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
155 Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.ImagefilePathText.Text);
157 using (var bitmap = new Bitmap(width: 200, height: 200))
159 using var image = MemoryImage.CopyFromImage(bitmap);
160 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
165 public void BeginSelection_MultiImageTest()
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");
172 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
173 mediaSelector.BeginSelection(images);
176 var pages = mediaSelector.ImagePageCombo.Items;
177 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
180 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
181 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
183 using var imageStream = File.OpenRead("Resources/re.gif");
184 using var image = MemoryImage.CopyFromStream(imageStream);
185 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
189 public void EndSelection_Test()
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" });
197 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
199 Assert.Raises<EventArgs>(
200 x => mediaSelector.EndSelecting += x,
201 x => mediaSelector.EndSelecting -= x,
202 () => mediaSelector.EndSelection()
205 Assert.False(mediaSelector.Visible);
206 Assert.False(mediaSelector.Enabled);
208 Assert.True(displayImage.IsDisposed);
212 public void PageChange_Test()
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");
219 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
220 mediaSelector.BeginSelection(images);
222 mediaSelector.ImagePageCombo.SelectedIndex = 0;
225 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
226 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
228 using (var imageStream = File.OpenRead("Resources/re.gif"))
230 using var image = MemoryImage.CopyFromStream(imageStream);
231 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
234 mediaSelector.ImagePageCombo.SelectedIndex = 1;
237 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
238 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
240 using (var imageStream = File.OpenRead("Resources/re1.png"))
242 using var image = MemoryImage.CopyFromStream(imageStream);
243 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
246 mediaSelector.ImagePageCombo.SelectedIndex = 2;
249 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
250 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
251 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
255 public void PageChange_AlternativeTextTest()
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");
262 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
263 mediaSelector.BeginSelection(images);
266 mediaSelector.ImagePageCombo.SelectedIndex = 0;
267 mediaSelector.AlternativeTextBox.Text = "Page 1";
268 mediaSelector.ValidateChildren();
271 mediaSelector.ImagePageCombo.SelectedIndex = 1;
272 mediaSelector.AlternativeTextBox.Text = "Page 2";
273 mediaSelector.ValidateChildren();
276 mediaSelector.ImagePageCombo.SelectedIndex = 2;
277 mediaSelector.AlternativeTextBox.Text = "Page 3";
278 mediaSelector.ValidateChildren();
280 mediaSelector.ImagePageCombo.SelectedIndex = 0;
281 Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
283 mediaSelector.ImagePageCombo.SelectedIndex = 1;
284 Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
286 // 画像が指定されていないページは入力した代替テキストも保持されない
287 mediaSelector.ImagePageCombo.SelectedIndex = 2;
288 Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
292 public void PageChange_ImageDisposeTest()
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");
299 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
300 mediaSelector.BeginSelection(images);
302 mediaSelector.ImagePageCombo.SelectedIndex = 0;
305 var page1Image = mediaSelector.ImageSelectedPicture.Image;
307 mediaSelector.ImagePageCombo.SelectedIndex = 1;
310 var page2Image = mediaSelector.ImageSelectedPicture.Image;
311 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
313 mediaSelector.ImagePageCombo.SelectedIndex = 2;
316 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
320 public void ImagePathInput_Test()
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();
329 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
330 TestUtils.Validate(mediaSelector.ImagefilePathText);
333 using (var imageStream = File.OpenRead("Resources/re1.png"))
335 using var image = MemoryImage.CopyFromStream(imageStream);
336 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
340 var pages = mediaSelector.ImagePageCombo.Items;
341 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
345 public void ImagePathInput_ReplaceFileMediaItemTest()
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");
352 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
354 // 既に入力されているファイルパスの画像
355 var image1 = mediaSelector.ImageSelectedPicture.Image;
358 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
359 TestUtils.Validate(mediaSelector.ImagefilePathText);
362 using (var imageStream = File.OpenRead("Resources/re1.png"))
364 using var image2 = MemoryImage.CopyFromStream(imageStream);
365 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
368 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
369 Assert.True(image1.IsDisposed);
373 public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
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");
380 using (var bitmap = new Bitmap(width: 200, height: 200))
382 mediaSelector.BeginSelection(bitmap);
385 // 既に入力されているファイルパスの画像
386 var image1 = mediaSelector.ImageSelectedPicture.Image;
388 // 内部で保持されている MemoryImageMediaItem を取り出す
389 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
390 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
391 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
394 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
395 TestUtils.Validate(mediaSelector.ImagefilePathText);
398 using (var imageStream = File.OpenRead("Resources/re1.png"))
400 using var image2 = MemoryImage.CopyFromStream(imageStream);
401 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
404 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
405 Assert.True(image1.IsDisposed);
407 // 参照されなくなった MemoryImageMediaItem も破棄される
408 Assert.True(mediaItem.IsDisposed);
412 public void ImageServiceChange_Test()
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");
419 Assert.Equal("Twitter", mediaSelector.ServiceName);
421 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
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);
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
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);
442 mediaSelector.ImageServiceCombo.SelectedIndex =
443 mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
446 pages = mediaSelector.ImagePageCombo.Items;
447 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
448 Assert.True(mediaSelector.ImagePageCombo.Enabled);