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()
24 private void MyCommonSetup()
26 var mockAssembly = new Mock<_Assembly>();
27 mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
29 MyCommon.EntryAssembly = mockAssembly.Object;
33 public void Initialize_TwitterTest()
35 using (var twitter = new Twitter())
36 using (var mediaSelector = new MediaSelector())
38 twitter.Initialize("", "", "", 0L);
39 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
41 Assert.NotEqual(-1, mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter"));
43 // 投稿先に Twitter が選択されている
44 Assert.Equal("Twitter", mediaSelector.ImageServiceCombo.Text);
47 var pages = mediaSelector.ImagePageCombo.Items;
48 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
51 Assert.True(mediaSelector.AlternativeTextPanel.Visible);
56 public void Initialize_ImgurTest()
58 using (var twitter = new Twitter())
59 using (var mediaSelector = new MediaSelector())
61 twitter.Initialize("", "", "", 0L);
62 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Imgur");
64 // 投稿先に Imgur が選択されている
65 Assert.Equal("Imgur", mediaSelector.ImageServiceCombo.Text);
68 var pages = mediaSelector.ImagePageCombo.Items;
69 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
72 Assert.False(mediaSelector.AlternativeTextPanel.Visible);
77 public void BeginSelection_BlankTest()
79 using (var twitter = new Twitter())
80 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
82 twitter.Initialize("", "", "", 0L);
83 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
85 Assert.Raises<EventArgs>(
86 x => mediaSelector.BeginSelecting += x,
87 x => mediaSelector.BeginSelecting -= x,
88 () => mediaSelector.BeginSelection()
91 Assert.True(mediaSelector.Visible);
92 Assert.True(mediaSelector.Enabled);
95 var pages = mediaSelector.ImagePageCombo.Items;
96 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
99 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
100 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
101 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
106 public void BeginSelection_FilePathTest()
108 using (var twitter = new Twitter())
109 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
111 twitter.Initialize("", "", "", 0L);
112 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
114 var images = new[] { "Resources/re.gif" };
116 Assert.Raises<EventArgs>(
117 x => mediaSelector.BeginSelecting += x,
118 x => mediaSelector.BeginSelecting -= x,
119 () => mediaSelector.BeginSelection(images)
122 Assert.True(mediaSelector.Visible);
123 Assert.True(mediaSelector.Enabled);
126 var pages = mediaSelector.ImagePageCombo.Items;
127 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
130 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
131 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
133 using (var imageStream = File.OpenRead("Resources/re.gif"))
134 using (var image = MemoryImage.CopyFromStream(imageStream))
136 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
142 public void BeginSelection_MemoryImageTest()
144 using (var twitter = new Twitter())
145 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
147 twitter.Initialize("", "", "", 0L);
148 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
150 using (var bitmap = new Bitmap(width: 200, height: 200))
152 Assert.Raises<EventArgs>(
153 x => mediaSelector.BeginSelecting += x,
154 x => mediaSelector.BeginSelecting -= x,
155 () => mediaSelector.BeginSelection(bitmap)
159 Assert.True(mediaSelector.Visible);
160 Assert.True(mediaSelector.Enabled);
163 var pages = mediaSelector.ImagePageCombo.Items;
164 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
167 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
168 Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.ImagefilePathText.Text);
170 using (var bitmap = new Bitmap(width: 200, height: 200))
171 using (var image = MemoryImage.CopyFromImage(bitmap))
173 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
179 public void BeginSelection_MultiImageTest()
181 using (var twitter = new Twitter())
182 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
184 twitter.Initialize("", "", "", 0L);
185 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
187 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
188 mediaSelector.BeginSelection(images);
191 var pages = mediaSelector.ImagePageCombo.Items;
192 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
195 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
196 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
198 using (var imageStream = File.OpenRead("Resources/re.gif"))
199 using (var image = MemoryImage.CopyFromStream(imageStream))
201 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
207 public void EndSelection_Test()
209 using (var twitter = new Twitter())
210 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
212 twitter.Initialize("", "", "", 0L);
213 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
214 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
216 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
218 Assert.Raises<EventArgs>(
219 x => mediaSelector.EndSelecting += x,
220 x => mediaSelector.EndSelecting -= x,
221 () => mediaSelector.EndSelection()
224 Assert.False(mediaSelector.Visible);
225 Assert.False(mediaSelector.Enabled);
227 Assert.True(displayImage.IsDisposed);
232 public void PageChange_Test()
234 using (var twitter = new Twitter())
235 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
237 twitter.Initialize("", "", "", 0L);
238 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
240 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
241 mediaSelector.BeginSelection(images);
243 mediaSelector.ImagePageCombo.SelectedIndex = 0;
246 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
247 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
249 using (var imageStream = File.OpenRead("Resources/re.gif"))
250 using (var image = MemoryImage.CopyFromStream(imageStream))
252 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
255 mediaSelector.ImagePageCombo.SelectedIndex = 1;
258 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
259 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
261 using (var imageStream = File.OpenRead("Resources/re1.png"))
262 using (var image = MemoryImage.CopyFromStream(imageStream))
264 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
267 mediaSelector.ImagePageCombo.SelectedIndex = 2;
270 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
271 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
272 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
277 public void PageChange_AlternativeTextTest()
279 using (var twitter = new Twitter())
280 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
282 twitter.Initialize("", "", "", 0L);
283 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
285 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
286 mediaSelector.BeginSelection(images);
289 mediaSelector.ImagePageCombo.SelectedIndex = 0;
290 mediaSelector.AlternativeTextBox.Text = "Page 1";
291 mediaSelector.ValidateChildren();
294 mediaSelector.ImagePageCombo.SelectedIndex = 1;
295 mediaSelector.AlternativeTextBox.Text = "Page 2";
296 mediaSelector.ValidateChildren();
299 mediaSelector.ImagePageCombo.SelectedIndex = 2;
300 mediaSelector.AlternativeTextBox.Text = "Page 3";
301 mediaSelector.ValidateChildren();
303 mediaSelector.ImagePageCombo.SelectedIndex = 0;
304 Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
306 mediaSelector.ImagePageCombo.SelectedIndex = 1;
307 Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
309 // 画像が指定されていないページは入力した代替テキストも保持されない
310 mediaSelector.ImagePageCombo.SelectedIndex = 2;
311 Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
316 public void PageChange_ImageDisposeTest()
318 using (var twitter = new Twitter())
319 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
321 twitter.Initialize("", "", "", 0L);
322 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
324 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
325 mediaSelector.BeginSelection(images);
327 mediaSelector.ImagePageCombo.SelectedIndex = 0;
330 var page1Image = mediaSelector.ImageSelectedPicture.Image;
332 mediaSelector.ImagePageCombo.SelectedIndex = 1;
335 var page2Image = mediaSelector.ImageSelectedPicture.Image;
336 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
338 mediaSelector.ImagePageCombo.SelectedIndex = 2;
341 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
346 public void ImagePathInput_Test()
348 using (var twitter = new Twitter())
349 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
351 twitter.Initialize("", "", "", 0L);
352 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
353 mediaSelector.BeginSelection();
356 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
357 TestUtils.Validate(mediaSelector.ImagefilePathText);
360 using (var imageStream = File.OpenRead("Resources/re1.png"))
361 using (var image = MemoryImage.CopyFromStream(imageStream))
363 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
367 var pages = mediaSelector.ImagePageCombo.Items;
368 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
373 public void ImagePathInput_ReplaceFileMediaItemTest()
375 using (var twitter = new Twitter())
376 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
378 twitter.Initialize("", "", "", 0L);
379 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
381 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
383 // 既に入力されているファイルパスの画像
384 var image1 = mediaSelector.ImageSelectedPicture.Image;
387 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
388 TestUtils.Validate(mediaSelector.ImagefilePathText);
391 using (var imageStream = File.OpenRead("Resources/re1.png"))
392 using (var image2 = MemoryImage.CopyFromStream(imageStream))
394 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
397 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
398 Assert.True(image1.IsDisposed);
403 public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
405 using (var twitter = new Twitter())
406 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
408 twitter.Initialize("", "", "", 0L);
409 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
411 using (var bitmap = new Bitmap(width: 200, height: 200))
413 mediaSelector.BeginSelection(bitmap);
416 // 既に入力されているファイルパスの画像
417 var image1 = mediaSelector.ImageSelectedPicture.Image;
419 // 内部で保持されている MemoryImageMediaItem を取り出す
420 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
421 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
422 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
425 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
426 TestUtils.Validate(mediaSelector.ImagefilePathText);
429 using (var imageStream = File.OpenRead("Resources/re1.png"))
430 using (var image2 = MemoryImage.CopyFromStream(imageStream))
432 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
435 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
436 Assert.True(image1.IsDisposed);
438 // 参照されなくなった MemoryImageMediaItem も破棄される
439 Assert.True(mediaItem.IsDisposed);
444 public void ImageServiceChange_Test()
446 using (var twitter = new Twitter())
447 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
449 twitter.Initialize("", "", "", 0L);
450 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
452 Assert.Equal("Twitter", mediaSelector.ServiceName);
454 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
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);
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
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);
475 mediaSelector.ImageServiceCombo.SelectedIndex =
476 mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
479 pages = mediaSelector.ImagePageCombo.Items;
480 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
481 Assert.True(mediaSelector.ImagePageCombo.Enabled);