1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
23 using System.Collections.Generic;
27 using System.Windows.Forms;
29 using OpenTween.Api.DataModel;
30 using OpenTween.Connection;
31 using OpenTween.Models;
32 using OpenTween.Setting;
33 using OpenTween.Thumbnail;
35 using Xunit.Extensions;
39 public class TweenMainTest
42 public void Initialize_Test()
44 var settings = new SettingManager("");
45 var tabinfo = new TabInformations();
46 using var twitterApi = new TwitterApi();
47 using var twitter = new Twitter(twitterApi);
48 using var imageCache = new ImageCache();
49 using var iconAssets = new IconAssetsManager();
50 var thumbnailGenerator = new ThumbnailGenerator(new(autoupdate: false));
51 var twitterAppToken = new TwitterAppToken
53 AuthType = APIAuthType.OAuth1,
54 OAuth1CustomConsumerKey = ApiKey.Create("aaa"),
55 OAuth1CustomConsumerSecret = ApiKey.Create("bbb"),
57 twitter.Initialize(twitterAppToken, "", "", "", 0L);
59 using var tweenMain = new TweenMain(settings, tabinfo, twitter, imageCache, iconAssets, thumbnailGenerator);
63 public void GetUrlFromDataObject_XMozUrlTest()
65 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\nTwitter\0");
66 using var memstream = new MemoryStream(dataBytes);
67 var data = new DataObject("text/x-moz-url", memstream);
69 var expected = ("https://twitter.com/", "Twitter");
70 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
74 public void GetUrlFromDataObject_IESiteModeToUrlTest()
76 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0Twitter\0");
77 using var memstream = new MemoryStream(dataBytes);
78 var data = new DataObject("IESiteModeToUrl", memstream);
80 var expected = ("https://twitter.com/", "Twitter");
81 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
85 public void GetUrlFromDataObject_UniformResourceLocatorWTest()
87 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0");
88 using var memstream = new MemoryStream(dataBytes);
89 var data = new DataObject("UniformResourceLocatorW", memstream);
91 var expected = ("https://twitter.com/", (string?)null);
92 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
96 public void GetUrlFromDataObject_UnknownFormatTest()
98 using var memstream = new MemoryStream(Array.Empty<byte>());
99 var data = new DataObject("application/x-hogehoge", memstream);
101 Assert.Throws<NotSupportedException>(() => TweenMain.GetUrlFromDataObject(data));
105 public void CreateRetweetUnofficial_UrlTest()
107 var statusText = """<a href="http://t.co/KYi7vMZzRt" title="http://twitter.com/">twitter.com</a>""";
109 Assert.Equal("http://twitter.com/", TweenMain.CreateRetweetUnofficial(statusText, false));
113 public void CreateRetweetUnofficial_MentionTest()
115 var statusText = """<a class="mention" href="https://twitter.com/twitterapi">@TwitterAPI</a>""";
117 Assert.Equal("@TwitterAPI", TweenMain.CreateRetweetUnofficial(statusText, false));
121 public void CreateRetweetUnofficial_HashtagTest()
123 var statusText = """<a class="hashtag" href="https://twitter.com/search?q=%23OpenTween">#OpenTween</a>""";
125 Assert.Equal("#OpenTween", TweenMain.CreateRetweetUnofficial(statusText, false));
129 public void CreateRetweetUnofficial_SingleLineTest()
131 var statusText = "123<br>456<br>789";
133 Assert.Equal("123 456 789", TweenMain.CreateRetweetUnofficial(statusText, false));
137 public void CreateRetweetUnofficial_MultiLineTest()
139 var statusText = "123<br>456<br>789";
141 Assert.Equal("123" + Environment.NewLine + "456" + Environment.NewLine + "789", TweenMain.CreateRetweetUnofficial(statusText, true));
145 public void CreateRetweetUnofficial_DecodeTest()
147 var statusText = "<>"' ";
149 Assert.Equal("<>\"' ", TweenMain.CreateRetweetUnofficial(statusText, false));
153 public void CreateRetweetUnofficial_WithFormatterTest()
155 // TweetFormatterでHTMLに整形 → CreateRetweetUnofficialで復元 までの動作が正しく行えているか
157 var text = "#てすと @TwitterAPI \n http://t.co/KYi7vMZzRt";
158 var entities = new TwitterEntity[]
160 new TwitterEntityHashtag
162 Indices = new[] { 0, 4 },
165 new TwitterEntityMention
167 Indices = new[] { 5, 16 },
169 Name = "Twitter API",
170 ScreenName = "twitterapi",
174 Indices = new[] { 19, 41 },
175 DisplayUrl = "twitter.com",
176 ExpandedUrl = "http://twitter.com/",
177 Url = "http://t.co/KYi7vMZzRt",
181 var html = TweetFormatter.AutoLinkHtml(text, entities);
183 var expected = "#てすと @TwitterAPI " + Environment.NewLine + " http://twitter.com/";
184 Assert.Equal(expected, TweenMain.CreateRetweetUnofficial(html, true));
188 [InlineData("", true)]
189 [InlineData("hoge", false)]
190 [InlineData("@twitterapi ", true)]
191 [InlineData("@twitterapi @opentween ", true)]
192 [InlineData("@twitterapi @opentween hoge", false)]
193 public void TextContainsOnlyMentions_Test(string input, bool expected)
194 => Assert.Equal(expected, TweenMain.TextContainsOnlyMentions(input));