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 public 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_yfrogTest()
58 using (var twitter = new Twitter())
59 using (var mediaSelector = new MediaSelector())
61 twitter.Initialize("", "", "", 0L);
62 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "yfrog");
64 // 投稿先に yfrog が選択されている
65 Assert.Equal("yfrog", 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 var eventCalled = false;
86 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
88 mediaSelector.BeginSelection();
90 Assert.True(eventCalled);
92 Assert.True(mediaSelector.Visible);
93 Assert.True(mediaSelector.Enabled);
96 var pages = mediaSelector.ImagePageCombo.Items;
97 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
100 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
101 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
102 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
107 public void BeginSelection_FilePathTest()
109 using (var twitter = new Twitter())
110 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
112 twitter.Initialize("", "", "", 0L);
113 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
115 var eventCalled = false;
116 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
118 var images = new[] { "Resources/re.gif" };
119 mediaSelector.BeginSelection(images);
121 Assert.True(eventCalled);
123 Assert.True(mediaSelector.Visible);
124 Assert.True(mediaSelector.Enabled);
127 var pages = mediaSelector.ImagePageCombo.Items;
128 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
131 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
132 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
134 using (var imageStream = File.OpenRead("Resources/re.gif"))
135 using (var image = MemoryImage.CopyFromStream(imageStream))
137 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
143 public void BeginSelection_MemoryImageTest()
145 using (var twitter = new Twitter())
146 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
148 twitter.Initialize("", "", "", 0L);
149 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
151 var eventCalled = false;
152 mediaSelector.BeginSelecting += (o, e) => eventCalled = true;
154 using (var bitmap = new Bitmap(width: 200, height: 200))
156 mediaSelector.BeginSelection(bitmap);
159 Assert.True(eventCalled);
161 Assert.True(mediaSelector.Visible);
162 Assert.True(mediaSelector.Enabled);
165 var pages = mediaSelector.ImagePageCombo.Items;
166 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
169 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
170 Assert.True(Regex.IsMatch(mediaSelector.ImagefilePathText.Text, @"^<>MemoryImage://\d+.png$"));
172 using (var bitmap = new Bitmap(width: 200, height: 200))
173 using (var image = MemoryImage.CopyFromImage(bitmap))
175 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
181 public void BeginSelection_MultiImageTest()
183 using (var twitter = new Twitter())
184 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
186 twitter.Initialize("", "", "", 0L);
187 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
189 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
190 mediaSelector.BeginSelection(images);
193 var pages = mediaSelector.ImagePageCombo.Items;
194 Assert.Equal(new[] { "1", "2", "3" }, pages.Cast<object>().Select(x => x.ToString()));
197 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
198 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
200 using (var imageStream = File.OpenRead("Resources/re.gif"))
201 using (var image = MemoryImage.CopyFromStream(imageStream))
203 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
209 public void EndSelection_Test()
211 using (var twitter = new Twitter())
212 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
214 twitter.Initialize("", "", "", 0L);
215 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
216 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
218 var displayImage = mediaSelector.ImageSelectedPicture.Image; // 表示中の画像
220 var eventCalled = false;
221 mediaSelector.EndSelecting += (o, e) => eventCalled = true;
223 mediaSelector.EndSelection();
225 Assert.True(eventCalled);
227 Assert.False(mediaSelector.Visible);
228 Assert.False(mediaSelector.Enabled);
230 Assert.True(displayImage.IsDisposed);
235 public void PageChange_Test()
237 using (var twitter = new Twitter())
238 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
240 twitter.Initialize("", "", "", 0L);
241 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
243 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
244 mediaSelector.BeginSelection(images);
246 mediaSelector.ImagePageCombo.SelectedIndex = 0;
249 Assert.Equal("1", mediaSelector.ImagePageCombo.Text);
250 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.ImagefilePathText.Text);
252 using (var imageStream = File.OpenRead("Resources/re.gif"))
253 using (var image = MemoryImage.CopyFromStream(imageStream))
255 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
258 mediaSelector.ImagePageCombo.SelectedIndex = 1;
261 Assert.Equal("2", mediaSelector.ImagePageCombo.Text);
262 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.ImagefilePathText.Text);
264 using (var imageStream = File.OpenRead("Resources/re1.png"))
265 using (var image = MemoryImage.CopyFromStream(imageStream))
267 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
270 mediaSelector.ImagePageCombo.SelectedIndex = 2;
273 Assert.Equal("3", mediaSelector.ImagePageCombo.Text);
274 Assert.Equal("", mediaSelector.ImagefilePathText.Text);
275 Assert.Null(mediaSelector.ImageSelectedPicture.Image);
280 public void PageChange_AlternativeTextTest()
282 using (var twitter = new Twitter())
283 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
285 twitter.Initialize("", "", "", 0L);
286 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
288 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
289 mediaSelector.BeginSelection(images);
292 mediaSelector.ImagePageCombo.SelectedIndex = 0;
293 mediaSelector.AlternativeTextBox.Text = "Page 1";
294 mediaSelector.ValidateChildren();
297 mediaSelector.ImagePageCombo.SelectedIndex = 1;
298 mediaSelector.AlternativeTextBox.Text = "Page 2";
299 mediaSelector.ValidateChildren();
302 mediaSelector.ImagePageCombo.SelectedIndex = 2;
303 mediaSelector.AlternativeTextBox.Text = "Page 3";
304 mediaSelector.ValidateChildren();
306 mediaSelector.ImagePageCombo.SelectedIndex = 0;
307 Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
309 mediaSelector.ImagePageCombo.SelectedIndex = 1;
310 Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
312 // 画像が指定されていないページは入力した代替テキストも保持されない
313 mediaSelector.ImagePageCombo.SelectedIndex = 2;
314 Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
319 public void PageChange_ImageDisposeTest()
321 using (var twitter = new Twitter())
322 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
324 twitter.Initialize("", "", "", 0L);
325 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
327 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
328 mediaSelector.BeginSelection(images);
330 mediaSelector.ImagePageCombo.SelectedIndex = 0;
333 var page1Image = mediaSelector.ImageSelectedPicture.Image;
335 mediaSelector.ImagePageCombo.SelectedIndex = 1;
338 var page2Image = mediaSelector.ImageSelectedPicture.Image;
339 Assert.True(page1Image.IsDisposed); // 前ページの画像が破棄されているか
341 mediaSelector.ImagePageCombo.SelectedIndex = 2;
344 Assert.True(page2Image.IsDisposed); // 前ページの画像が破棄されているか
349 public void ImagePathInput_Test()
351 using (var twitter = new Twitter())
352 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
354 twitter.Initialize("", "", "", 0L);
355 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
356 mediaSelector.BeginSelection();
359 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
360 TestUtils.Validate(mediaSelector.ImagefilePathText);
363 using (var imageStream = File.OpenRead("Resources/re1.png"))
364 using (var image = MemoryImage.CopyFromStream(imageStream))
366 Assert.Equal(image, mediaSelector.ImageSelectedPicture.Image);
370 var pages = mediaSelector.ImagePageCombo.Items;
371 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
376 public void ImagePathInput_ReplaceFileMediaItemTest()
378 using (var twitter = new Twitter())
379 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
381 twitter.Initialize("", "", "", 0L);
382 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
384 mediaSelector.BeginSelection(new[] { "Resources/re.gif" });
386 // 既に入力されているファイルパスの画像
387 var image1 = mediaSelector.ImageSelectedPicture.Image;
390 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
391 TestUtils.Validate(mediaSelector.ImagefilePathText);
394 using (var imageStream = File.OpenRead("Resources/re1.png"))
395 using (var image2 = MemoryImage.CopyFromStream(imageStream))
397 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
400 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
401 Assert.True(image1.IsDisposed);
406 public void ImagePathInput_ReplaceMemoryImageMediaItemTest()
408 using (var twitter = new Twitter())
409 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
411 twitter.Initialize("", "", "", 0L);
412 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
414 using (var bitmap = new Bitmap(width: 200, height: 200))
416 mediaSelector.BeginSelection(bitmap);
419 // 既に入力されているファイルパスの画像
420 var image1 = mediaSelector.ImageSelectedPicture.Image;
422 // 内部で保持されている MemoryImageMediaItem を取り出す
423 var selectedMedia = mediaSelector.ImagePageCombo.SelectedItem;
424 var mediaProperty = selectedMedia.GetType().GetProperty("Item");
425 var mediaItem = (MemoryImageMediaItem)mediaProperty.GetValue(selectedMedia);
428 mediaSelector.ImagefilePathText.Text = Path.GetFullPath("Resources/re1.png");
429 TestUtils.Validate(mediaSelector.ImagefilePathText);
432 using (var imageStream = File.OpenRead("Resources/re1.png"))
433 using (var image2 = MemoryImage.CopyFromStream(imageStream))
435 Assert.Equal(image2, mediaSelector.ImageSelectedPicture.Image);
438 // 最初に入力されていたファイルパスの表示用の MemoryImage は破棄される
439 Assert.True(image1.IsDisposed);
441 // 参照されなくなった MemoryImageMediaItem も破棄される
442 Assert.True(mediaItem.IsDisposed);
447 public void ImageServiceChange_Test()
449 using (var twitter = new Twitter())
450 using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
452 twitter.Initialize("", "", "", 0L);
453 mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
455 Assert.Equal("Twitter", mediaSelector.ServiceName);
457 mediaSelector.BeginSelection(new[] { "Resources/re.gif", "Resources/re1.png" });
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);
464 var eventCalled = false;
465 mediaSelector.SelectedServiceChanged += (o, e) => eventCalled = true;
468 mediaSelector.ImageServiceCombo.SelectedIndex =
469 mediaSelector.ImageServiceCombo.Items.IndexOf("yfrog");
471 Assert.True(eventCalled); // SelectedServiceChanged イベントが呼ばれる
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);
479 mediaSelector.ImageServiceCombo.SelectedIndex =
480 mediaSelector.ImageServiceCombo.Items.IndexOf("Twitter");
483 pages = mediaSelector.ImagePageCombo.Items;
484 Assert.Equal(new[] { "1", "2" }, pages.Cast<object>().Select(x => x.ToString()));
485 Assert.True(mediaSelector.ImagePageCombo.Enabled);