OSDN Git Service

MediaSelectorクラスにWinFormsに依存しない処理を分離
[opentween/open-tween.git] / OpenTween.Tests / MediaSelectorTest.cs
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.
5 //
6 // This file is part of OpenTween.
7 //
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)
11 // any later version.
12 //
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
16 // for more details.
17 //
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.
22
23 using System;
24 using System.Collections.Generic;
25 using System.Drawing;
26 using System.IO;
27 using System.Linq;
28 using System.Reflection;
29 using System.Runtime.InteropServices;
30 using System.Text;
31 using Moq;
32 using OpenTween.Api;
33 using OpenTween.Api.DataModel;
34 using Xunit;
35
36 namespace OpenTween
37 {
38     public class MediaSelectorTest
39     {
40         public MediaSelectorTest()
41             => this.MyCommonSetup();
42
43         private void MyCommonSetup()
44         {
45             var mockAssembly = new Mock<_Assembly>();
46             mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
47
48             MyCommon.EntryAssembly = mockAssembly.Object;
49         }
50
51         [Fact]
52         public void SelectMediaService_TwitterTest()
53         {
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");
60
61             Assert.Contains(mediaSelector.MediaServices, x => x.Key == "Twitter");
62
63             // 投稿先に Twitter が選択されている
64             Assert.Equal("Twitter", mediaSelector.SelectedMediaServiceName);
65
66             // 代替テキストが入力可能な状態
67             Assert.True(mediaSelector.CanUseAltText);
68         }
69
70         [Fact]
71         public void SelectMediaService_ImgurTest()
72         {
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");
79
80             // 投稿先に Imgur が選択されている
81             Assert.Equal("Imgur", mediaSelector.SelectedMediaServiceName);
82
83             // 代替テキストが入力できない状態
84             Assert.False(mediaSelector.CanUseAltText);
85         }
86
87         [Fact]
88         public void AddMediaItem_FilePath_SingleTest()
89         {
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");
96
97             var images = new[] { "Resources/re.gif" };
98             mediaSelector.AddMediaItemFromFilePath(images);
99
100             // 画像が 1 つ追加された状態
101             Assert.Single(mediaSelector.MediaItems);
102
103             // 1 枚目の画像が表示されている
104             Assert.Equal(0, mediaSelector.SelectedMediaItemIndex);
105             Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.SelectedMediaItem!.Path);
106
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);
111         }
112
113         [Fact]
114         public void AddMediaItem_MemoryImageTest()
115         {
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");
122
123             using (var bitmap = new Bitmap(width: 200, height: 200))
124                 mediaSelector.AddMediaItemFromImage(bitmap);
125
126             // 画像が 1 つ追加された状態
127             Assert.Single(mediaSelector.MediaItems);
128
129             // 1 枚目の画像が表示されている
130             Assert.Equal(0, mediaSelector.SelectedMediaItemIndex);
131             Assert.Matches(@"^<>MemoryImage://\d+.png$", mediaSelector.SelectedMediaItem!.Path);
132
133             using (var bitmap = new Bitmap(width: 200, height: 200))
134             {
135                 using var expectedImage = MemoryImage.CopyFromImage(bitmap);
136                 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
137                 Assert.Equal(expectedImage, actualImage);
138             }
139         }
140
141         [Fact]
142         public void AddMediaItem_FilePath_MultipleTest()
143         {
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");
150
151             var images = new[] { "Resources/re.gif", "Resources/re1.png" };
152             mediaSelector.AddMediaItemFromFilePath(images);
153
154             // 画像が 2 つ追加された状態
155             Assert.Equal(2, mediaSelector.MediaItems.Count);
156
157             // 最後の画像(2 枚目)が表示されている
158             Assert.Equal(1, mediaSelector.SelectedMediaItemIndex);
159             Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.SelectedMediaItem!.Path);
160
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);
165         }
166
167         [Fact]
168         public void ClearMediaItems_Test()
169         {
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");
176
177             mediaSelector.AddMediaItemFromFilePath(new[] { "Resources/re.gif" });
178
179             var thumbnailImages = mediaSelector.ThumbnailList.ToArray(); // 表示中の画像
180
181             mediaSelector.ClearMediaItems();
182
183             Assert.True(thumbnailImages.All(x => x.IsDisposed));
184         }
185
186         [Fact]
187         public void DetachMediaItems_Test()
188         {
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");
195
196             mediaSelector.AddMediaItemFromFilePath(new[] { "Resources/re.gif" });
197
198             var thumbnailImages = mediaSelector.ThumbnailList.ToArray();
199
200             var detachedMediaItems = mediaSelector.DetachMediaItems();
201
202             Assert.Empty(mediaSelector.MediaItems);
203             Assert.True(thumbnailImages.All(x => x.IsDisposed));
204
205             // DetachMediaItems で切り離された MediaItem は破棄しない
206             Assert.True(detachedMediaItems.All(x => !x.IsDisposed));
207         }
208
209         [Fact]
210         public void SelectedMediaItemChange_Test()
211         {
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");
218
219             var images = new[] { "Resources/re.gif", "Resources/re1.png" };
220             mediaSelector.AddMediaItemFromFilePath(images);
221
222             mediaSelector.SelectedMediaItemIndex = 0;
223
224             // 1 ページ目
225             Assert.Equal(Path.GetFullPath("Resources/re.gif"), mediaSelector.SelectedMediaItem!.Path);
226
227             using (var imageStream = File.OpenRead("Resources/re.gif"))
228             {
229                 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
230                 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
231                 Assert.Equal(expectedImage, actualImage);
232             }
233
234             mediaSelector.SelectedMediaItemIndex = 1;
235
236             // 2 ページ目
237             Assert.Equal(Path.GetFullPath("Resources/re1.png"), mediaSelector.SelectedMediaItem!.Path);
238
239             using (var imageStream = File.OpenRead("Resources/re1.png"))
240             {
241                 using var expectedImage = MemoryImage.CopyFromStream(imageStream);
242                 using var actualImage = mediaSelector.SelectedMediaItem.CreateImage();
243                 Assert.Equal(expectedImage, actualImage);
244             }
245         }
246
247         [Fact]
248         public void SetSelectedMediaAltText_Test()
249         {
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");
256
257             var images = new[] { "Resources/re.gif", "Resources/re1.png" };
258             mediaSelector.AddMediaItemFromFilePath(images);
259
260             // 1 ページ目
261             mediaSelector.SelectedMediaItemIndex = 0;
262             mediaSelector.SetSelectedMediaAltText("Page 1");
263
264             // 2 ページ目
265             mediaSelector.SelectedMediaItemIndex = 1;
266             mediaSelector.SetSelectedMediaAltText("Page 2");
267
268             Assert.Equal("Page 1", mediaSelector.MediaItems[0].AltText);
269             Assert.Equal("Page 2", mediaSelector.MediaItems[1].AltText);
270         }
271     }
272 }