1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 spx (@5px)
3 // Copyright (c) 2023 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
4 // All rights reserved.
6 // This file is part of OpenTween.
8 // This program is free software; you can redistribute it and/or modify it
9 // under the terms of the GNU General Public License as published by the Free
10 // Software Foundation; either version 3 of the License, or (at your option)
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 // You should have received a copy of the GNU General Public License along
19 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
20 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21 // Boston, MA 02110-1301, USA.
24 using System.Collections.Generic;
28 using System.Reflection;
29 using System.Runtime.InteropServices;
33 using OpenTween.Api.DataModel;
38 public class MediaSelectorTest
40 public MediaSelectorTest()
41 => this.MyCommonSetup();
43 private void MyCommonSetup()
45 var mockAssembly = new Mock<_Assembly>();
46 mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
48 MyCommon.EntryAssembly = mockAssembly.Object;
52 public void SelectMediaService_TwitterTest()
54 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
55 using var twitter = new Twitter(twitterApi);
56 using var mediaSelector = new MediaSelector();
57 twitter.Initialize("", "", "", 0L);
58 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
59 mediaSelector.SelectMediaService("Twitter");
61 Assert.Contains(mediaSelector.MediaServices, x => x.Key == "Twitter");
63 // 投稿先に Twitter が選択されている
64 Assert.Equal("Twitter", mediaSelector.SelectedMediaServiceName);
67 Assert.True(mediaSelector.CanUseAltText);
71 public void SelectMediaService_ImgurTest()
73 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
74 using var twitter = new Twitter(twitterApi);
75 using var mediaSelector = new MediaSelector();
76 twitter.Initialize("", "", "", 0L);
77 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
78 mediaSelector.SelectMediaService("Imgur");
80 // 投稿先に Imgur が選択されている
81 Assert.Equal("Imgur", mediaSelector.SelectedMediaServiceName);
84 Assert.False(mediaSelector.CanUseAltText);
88 public void AddMediaItem_FilePath_SingleTest()
90 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
91 using var twitter = new Twitter(twitterApi);
92 using var mediaSelector = new MediaSelector();
93 twitter.Initialize("", "", "", 0L);
94 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
95 mediaSelector.SelectMediaService("Twitter");
97 var images = new[] { "Resources/re.gif" };
98 mediaSelector.AddMediaItemFromFilePath(images);
101 Assert.Single(mediaSelector.MediaItems);
104 Assert.Equal(0, mediaSelector.SelectedMediaItemIndex);
105 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.SelectedMediaItem!.Path);
107 using var imageStream = File.OpenRead("Resources/re.gif");
108 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
109 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
110 Assert.Equal(expectedImage, actualImage);
114 public void AddMediaItem_MemoryImageTest()
116 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
117 using var twitter = new Twitter(twitterApi);
118 using var mediaSelector = new MediaSelector();
119 twitter.Initialize("", "", "", 0L);
120 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
121 mediaSelector.SelectMediaService("Twitter");
123 using (var bitmap = new Bitmap(width: 200, height: 200))
124 mediaSelector.AddMediaItemFromImage(bitmap);
127 Assert.Single(mediaSelector.MediaItems);
130 Assert.Equal(0, mediaSelector.SelectedMediaItemIndex);
131 Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.SelectedMediaItem!.Path);
133 using (var bitmap = new Bitmap(width: 200, height: 200))
135 using var expectedImage = MemoryImage.CopyFromImage(bitmap);
136 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
137 Assert.Equal(expectedImage, actualImage);
142 public void AddMediaItem_FilePath_MultipleTest()
144 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
145 using var twitter = new Twitter(twitterApi);
146 using var mediaSelector = new MediaSelector();
147 twitter.Initialize("", "", "", 0L);
148 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
149 mediaSelector.SelectMediaService("Twitter");
151 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
152 mediaSelector.AddMediaItemFromFilePath(images);
155 Assert.Equal(2, mediaSelector.MediaItems.Count);
157 // 最後の画像(2 枚目)が表示されている
158 Assert.Equal(1, mediaSelector.SelectedMediaItemIndex);
159 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.SelectedMediaItem!.Path);
161 using var imageStream = File.OpenRead("Resources/re1.png");
162 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
163 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
164 Assert.Equal(expectedImage, actualImage);
168 public void ClearMediaItems_Test()
170 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
171 using var twitter = new Twitter(twitterApi);
172 using var mediaSelector = new MediaSelector();
173 twitter.Initialize("", "", "", 0L);
174 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
175 mediaSelector.SelectMediaService("Twitter");
177 mediaSelector.AddMediaItemFromFilePath(new[] { "Resources/re.gif" });
179 var thumbnailImages = mediaSelector.ThumbnailList.ToArray(); // 表示中の画像
181 mediaSelector.ClearMediaItems();
183 Assert.True(thumbnailImages.All(x => x.IsDisposed));
187 public void DetachMediaItems_Test()
189 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
190 using var twitter = new Twitter(twitterApi);
191 using var mediaSelector = new MediaSelector();
192 twitter.Initialize("", "", "", 0L);
193 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
194 mediaSelector.SelectMediaService("Twitter");
196 mediaSelector.AddMediaItemFromFilePath(new[] { "Resources/re.gif" });
198 var thumbnailImages = mediaSelector.ThumbnailList.ToArray();
200 var detachedMediaItems = mediaSelector.DetachMediaItems();
202 Assert.Empty(mediaSelector.MediaItems);
203 Assert.True(thumbnailImages.All(x => x.IsDisposed));
205 // DetachMediaItems で切り離された MediaItem は破棄しない
206 Assert.True(detachedMediaItems.All(x => !x.IsDisposed));
210 public void SelectedMediaItemChange_Test()
212 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
213 using var twitter = new Twitter(twitterApi);
214 using var mediaSelector = new MediaSelector();
215 twitter.Initialize("", "", "", 0L);
216 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
217 mediaSelector.SelectMediaService("Twitter");
219 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
220 mediaSelector.AddMediaItemFromFilePath(images);
222 mediaSelector.SelectedMediaItemIndex = 0;
225 Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.SelectedMediaItem!.Path);
227 using (var imageStream = File.OpenRead("Resources/re.gif"))
229 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
230 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
231 Assert.Equal(expectedImage, actualImage);
234 mediaSelector.SelectedMediaItemIndex = 1;
237 Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.SelectedMediaItem!.Path);
239 using (var imageStream = File.OpenRead("Resources/re1.png"))
241 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
242 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
243 Assert.Equal(expectedImage, actualImage);
248 public void SetSelectedMediaAltText_Test()
250 using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
251 using var twitter = new Twitter(twitterApi);
252 using var mediaSelector = new MediaSelector();
253 twitter.Initialize("", "", "", 0L);
254 mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
255 mediaSelector.SelectMediaService("Twitter");
257 var images = new[] { "Resources/re.gif", "Resources/re1.png" };
258 mediaSelector.AddMediaItemFromFilePath(images);
261 mediaSelector.SelectedMediaItemIndex = 0;
262 mediaSelector.SetSelectedMediaAltText("Page 1");
265 mediaSelector.SelectedMediaItemIndex = 1;
266 mediaSelector.SetSelectedMediaAltText("Page 2");
268 Assert.Equal("Page 1", mediaSelector.MediaItems[0].AltText);
269 Assert.Equal("Page 2", mediaSelector.MediaItems[1].AltText);