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())
36 twitter.Initialize("", "", "", 0L);
37 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
39 Assert.NotEqual(-1, mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter"));
41 // 投稿先に Twitter が選択されている
42 Assert.Equal("Twitter", mediaSelector.ImageServiceCombo.Text);
45 var pages = mediaSelector.ImagePageCombo.Items;
46 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
49 Assert.True(mediaSelector.AlternativeTextPanel.Visible);
54 public void Initialize_ImgurTest()
56 using (var twitter = new Twitter())
57 using (var mediaSelector = new MediaSelector())
59 twitter.Initialize("", "", "", 0L);
60 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Imgur");
62 // 投稿先に Imgur が選択されている
63 Assert.Equal("Imgur", mediaSelector.ImageServiceCombo.Text);
66 var pages = mediaSelector.ImagePageCombo.Items;
67 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
70 Assert.False(mediaSelector.AlternativeTextPanel.Visible);
75 public void BeginSelection_BlankTest()
77 using (var twitter = new Twitter())
78 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
80 twitter.Initialize("", "", "", 0L);
81 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
83 Assert.Raises<EventArgs>(
84 x => mediaSelector.BeginSelecting += x,
85 x => mediaSelector.BeginSelecting -= x,
86 () => mediaSelector.BeginSelection()
89 Assert.True(mediaSelector.Visible);
90 Assert.True(mediaSelector.Enabled);
93 var pages = mediaSelector.ImagePageCombo.Items;
94 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
97 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
98 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
99 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
104 public void BeginSelection_FilePathTest()
106 using (var twitter = new Twitter())
107 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
109 twitter.Initialize("", "", "", 0L);
110 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
112 var images = new[] { "Resources/re.gif" };
114 Assert.Raises<EventArgs>(
115 x => mediaSelector.BeginSelecting += x,
116 x => mediaSelector.BeginSelecting -= x,
117 () => mediaSelector.BeginSelection(images)
120 Assert.True(mediaSelector.Visible);
121 Assert.True(mediaSelector.Enabled);
124 var pages = mediaSelector.ImagePageCombo.Items;
125 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
128 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
129 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
131 using (var imageStream = File.OpenRead("Resources/re.gif"))
132 using (var image = MemoryImage.CopyFromStream(imageStream))
134 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
140 public void BeginSelection_MemoryImageTest()
142 using (var twitter = new Twitter())
143 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
145 twitter.Initialize("", "", "", 0L);
146 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
148 using (var bitmap = new Bitmap(width: 200, height: 200))
150 Assert.Raises<EventArgs>(
151 x => mediaSelector.BeginSelecting += x,
152 x => mediaSelector.BeginSelecting -= x,
153 () => mediaSelector.BeginSelection(bitmap)
157 Assert.True(mediaSelector.Visible);
158 Assert.True(mediaSelector.Enabled);
161 var pages = mediaSelector.ImagePageCombo.Items;
162 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
165 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
166 Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.ImagefilePathText.Text);
168 using (var bitmap = new Bitmap(width: 200, height: 200))
169 using (var image = MemoryImage.CopyFromImage(bitmap))
171 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
177 public void BeginSelection_MultiImageTest()
179 using (var twitter = new Twitter())
180 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
182 twitter.Initialize("", "", "", 0L);
183 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
185 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
186 mediaSelector.BeginSelection(images);
189 var pages = mediaSelector.ImagePageCombo.Items;
190 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
193 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
194 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
196 using (var imageStream = File.OpenRead("Resources/re.gif"))
197 using (var image = MemoryImage.CopyFromStream(imageStream))
199 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
205 public void EndSelection_Test()
207 using (var twitter = new Twitter())
208 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
210 twitter.Initialize("", "", "", 0L);
211 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
212 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
214 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
216 Assert.Raises<EventArgs>(
217 x => mediaSelector.EndSelecting += x,
218 x => mediaSelector.EndSelecting -= x,
219 () => mediaSelector.EndSelection()
222 Assert.False(mediaSelector.Visible);
223 Assert.False(mediaSelector.Enabled);
225 Assert.True(displayImage.IsDisposed);
230 public void PageChange_Test()
232 using (var twitter = new Twitter())
233 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
235 twitter.Initialize("", "", "", 0L);
236 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
238 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
239 mediaSelector.BeginSelection(images);
241 mediaSelector.ImagePageCombo.SelectedIndex = 0;
244 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
245 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
247 using (var imageStream = File.OpenRead("Resources/re.gif"))
248 using (var image = MemoryImage.CopyFromStream(imageStream))
250 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
253 mediaSelector.ImagePageCombo.SelectedIndex = 1;
256 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
257 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
259 using (var imageStream = File.OpenRead("Resources/re1.png"))
260 using (var image = MemoryImage.CopyFromStream(imageStream))
262 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
265 mediaSelector.ImagePageCombo.SelectedIndex = 2;
268 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
269 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
270 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
275 public void PageChange_AlternativeTextTest()
277 using (var twitter = new Twitter())
278 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
280 twitter.Initialize("", "", "", 0L);
281 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
283 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
284 mediaSelector.BeginSelection(images);
287 mediaSelector.ImagePageCombo.SelectedIndex = 0;
288 mediaSelector.AlternativeTextBox.Text = "Page 1";
289 mediaSelector.ValidateChildren();
292 mediaSelector.ImagePageCombo.SelectedIndex = 1;
293 mediaSelector.AlternativeTextBox.Text = "Page 2";
294 mediaSelector.ValidateChildren();
297 mediaSelector.ImagePageCombo.SelectedIndex = 2;
298 mediaSelector.AlternativeTextBox.Text = "Page 3";
299 mediaSelector.ValidateChildren();
301 mediaSelector.ImagePageCombo.SelectedIndex = 0;
302 Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
304 mediaSelector.ImagePageCombo.SelectedIndex = 1;
305 Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
307 // 画像が指定されていないページは入力した代替テキストも保持されない
308 mediaSelector.ImagePageCombo.SelectedIndex = 2;
309 Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
314 public void PageChange_ImageDisposeTest()
316 using (var twitter = new Twitter())
317 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
319 twitter.Initialize("", "", "", 0L);
320 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
322 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
323 mediaSelector.BeginSelection(images);
325 mediaSelector.ImagePageCombo.SelectedIndex = 0;
328 var page1Image = mediaSelector.ImageSelectedPicture.Image;
330 mediaSelector.ImagePageCombo.SelectedIndex = 1;
333 var page2Image = mediaSelector.ImageSelectedPicture.Image;
334 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
336 mediaSelector.ImagePageCombo.SelectedIndex = 2;
339 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
344 public void ImagePathInput_Test()
346 using (var twitter = new Twitter())
347 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
349 twitter.Initialize("", "", "", 0L);
350 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
351 mediaSelector.BeginSelection();
354 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
355 TestUtils.Validate(mediaSelector.ImagefilePathText);
358 using (var imageStream = File.OpenRead("Resources/re1.png"))
359 using (var image = MemoryImage.CopyFromStream(imageStream))
361 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
365 var pages = mediaSelector.ImagePageCombo.Items;
366 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
371 public void ImagePathInput_ReplaceFileMediaItemTest()
373 using (var twitter = new Twitter())
374 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
376 twitter.Initialize("", "", "", 0L);
377 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
379 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
381 // 既に入力されているファイルパスの画像
382 var image1 = mediaSelector.ImageSelectedPicture.Image;
385 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
386 TestUtils.Validate(mediaSelector.ImagefilePathText);
389 using (var imageStream = File.OpenRead("Resources/re1.png"))
390 using (var image2 = MemoryImage.CopyFromStream(imageStream))
392 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
395 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
396 Assert.True(image1.IsDisposed);
401 public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
403 using (var twitter = new Twitter())
404 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
406 twitter.Initialize("", "", "", 0L);
407 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
409 using (var bitmap = new Bitmap(width: 200, height: 200))
411 mediaSelector.BeginSelection(bitmap);
414 // 既に入力されているファイルパスの画像
415 var image1 = mediaSelector.ImageSelectedPicture.Image;
417 // 内部で保持されている MemoryImageMediaItem を取り出す
418 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
419 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
420 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
423 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
424 TestUtils.Validate(mediaSelector.ImagefilePathText);
427 using (var imageStream = File.OpenRead("Resources/re1.png"))
428 using (var image2 = MemoryImage.CopyFromStream(imageStream))
430 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
433 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
434 Assert.True(image1.IsDisposed);
436 // 参照されなくなった MemoryImageMediaItem も破棄される
437 Assert.True(mediaItem.IsDisposed);
442 public void ImageServiceChange_Test()
444 using (var twitter = new Twitter())
445 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
447 twitter.Initialize("", "", "", 0L);
448 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
450 Assert.Equal("Twitter", mediaSelector.ServiceName);
452 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
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);
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
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);
473 mediaSelector.ImageServiceCombo.SelectedIndex =
474 mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
477 pages = mediaSelector.ImagePageCombo.Items;
478 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
479 Assert.True(mediaSelector.ImagePageCombo.Enabled);