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 twitter.Initialize(new TwitterCredentialNone(), "", 0L);
53 using var tweenMain = new TweenMain(settings, tabinfo, twitter, imageCache, iconAssets, thumbnailGenerator);
57 public void GetUrlFromDataObject_XMozUrlTest()
59 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\nTwitter\0");
60 using var memstream = new MemoryStream(dataBytes);
61 var data = new DataObject("text/x-moz-url", memstream);
63 var expected = ("https://twitter.com/", "Twitter");
64 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
68 public void GetUrlFromDataObject_IESiteModeToUrlTest()
70 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0Twitter\0");
71 using var memstream = new MemoryStream(dataBytes);
72 var data = new DataObject("IESiteModeToUrl", memstream);
74 var expected = ("https://twitter.com/", "Twitter");
75 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
79 public void GetUrlFromDataObject_UniformResourceLocatorWTest()
81 var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0");
82 using var memstream = new MemoryStream(dataBytes);
83 var data = new DataObject("UniformResourceLocatorW", memstream);
85 var expected = ("https://twitter.com/", (string?)null);
86 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
90 public void GetUrlFromDataObject_UnknownFormatTest()
92 using var memstream = new MemoryStream(Array.Empty<byte>());
93 var data = new DataObject("application/x-hogehoge", memstream);
95 Assert.Throws<NotSupportedException>(() => TweenMain.GetUrlFromDataObject(data));
99 public void CreateRetweetUnofficial_UrlTest()
101 var statusText = """<a href="http://t.co/KYi7vMZzRt" title="http://twitter.com/">twitter.com</a>""";
103 Assert.Equal("http://twitter.com/", TweenMain.CreateRetweetUnofficial(statusText, false));
107 public void CreateRetweetUnofficial_MentionTest()
109 var statusText = """<a class="mention" href="https://twitter.com/twitterapi">@TwitterAPI</a>""";
111 Assert.Equal("@TwitterAPI", TweenMain.CreateRetweetUnofficial(statusText, false));
115 public void CreateRetweetUnofficial_HashtagTest()
117 var statusText = """<a class="hashtag" href="https://twitter.com/search?q=%23OpenTween">#OpenTween</a>""";
119 Assert.Equal("#OpenTween", TweenMain.CreateRetweetUnofficial(statusText, false));
123 public void CreateRetweetUnofficial_SingleLineTest()
125 var statusText = "123<br>456<br>789";
127 Assert.Equal("123 456 789", TweenMain.CreateRetweetUnofficial(statusText, false));
131 public void CreateRetweetUnofficial_MultiLineTest()
133 var statusText = "123<br>456<br>789";
135 Assert.Equal("123" + Environment.NewLine + "456" + Environment.NewLine + "789", TweenMain.CreateRetweetUnofficial(statusText, true));
139 public void CreateRetweetUnofficial_DecodeTest()
141 var statusText = "<>"' ";
143 Assert.Equal("<>\"' ", TweenMain.CreateRetweetUnofficial(statusText, false));
147 public void CreateRetweetUnofficial_WithFormatterTest()
149 // TweetFormatterでHTMLに整形 → CreateRetweetUnofficialで復元 までの動作が正しく行えているか
151 var text = "#てすと @TwitterAPI \n http://t.co/KYi7vMZzRt";
152 var entities = new TwitterEntity[]
154 new TwitterEntityHashtag
156 Indices = new[] { 0, 4 },
159 new TwitterEntityMention
161 Indices = new[] { 5, 16 },
163 Name = "Twitter API",
164 ScreenName = "twitterapi",
168 Indices = new[] { 19, 41 },
169 DisplayUrl = "twitter.com",
170 ExpandedUrl = "http://twitter.com/",
171 Url = "http://t.co/KYi7vMZzRt",
175 var html = TweetFormatter.AutoLinkHtml(text, entities);
177 var expected = "#てすと @TwitterAPI " + Environment.NewLine + " http://twitter.com/";
178 Assert.Equal(expected, TweenMain.CreateRetweetUnofficial(html, true));
182 [InlineData("", true)]
183 [InlineData("hoge", false)]
184 [InlineData("@twitterapi ", true)]
185 [InlineData("@twitterapi @opentween ", true)]
186 [InlineData("@twitterapi @opentween hoge", false)]
187 public void TextContainsOnlyMentions_Test(string input, bool expected)
188 => Assert.Equal(expected, TweenMain.TextContainsOnlyMentions(input));