OSDN Git Service

投稿欄にメンション以外の文字列が含まれていない場合は投稿時に警告ダイアログを表示する
[opentween/open-tween.git] / OpenTween.Tests / TweenMainTest.cs
1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
4 //
5 // This file is part of OpenTween.
6 //
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)
10 // any later version.
11 //
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
15 // for more details.
16 //
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.
21
22 using System;
23 using System.Collections.Generic;
24 using System.IO;
25 using System.Linq;
26 using System.Text;
27 using System.Windows.Forms;
28 using OpenTween.Api.DataModel;
29 using Xunit;
30 using Xunit.Extensions;
31
32 namespace OpenTween
33 {
34     public class TweenMainTest
35     {
36         [Fact]
37         public void GetUrlFromDataObject_XMozUrlTest()
38         {
39             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\nTwitter\0");
40             using (var memstream = new MemoryStream(dataBytes))
41             {
42                 var data = new DataObject("text/x-moz-url", memstream);
43
44                 var expected = ("https://twitter.com/", "Twitter");
45                 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
46             }
47         }
48
49         [Fact]
50         public void GetUrlFromDataObject_IESiteModeToUrlTest()
51         {
52             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0Twitter\0");
53             using (var memstream = new MemoryStream(dataBytes))
54             {
55                 var data = new DataObject("IESiteModeToUrl", memstream);
56
57                 var expected = ("https://twitter.com/", "Twitter");
58                 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
59             }
60         }
61
62         [Fact]
63         public void GetUrlFromDataObject_UniformResourceLocatorWTest()
64         {
65             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0");
66             using (var memstream = new MemoryStream(dataBytes))
67             {
68                 var data = new DataObject("UniformResourceLocatorW", memstream);
69
70                 var expected = ("https://twitter.com/", (string)null);
71                 Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
72             }
73         }
74
75         [Fact]
76         public void GetUrlFromDataObject_UnknownFormatTest()
77         {
78             using (var memstream = new MemoryStream(new byte[0]))
79             {
80                 var data = new DataObject("application/x-hogehoge", memstream);
81
82                 Assert.Throws<NotSupportedException>(() => TweenMain.GetUrlFromDataObject(data));
83             }
84         }
85
86         [Fact]
87         public void CreateRetweetUnofficial_UrlTest()
88         {
89             var statusText = "<a href=\"http://t.co/KYi7vMZzRt\" title=\"http://twitter.com/\">twitter.com</a>";
90
91             Assert.Equal("http://twitter.com/", TweenMain.CreateRetweetUnofficial(statusText, false));
92         }
93
94         [Fact]
95         public void CreateRetweetUnofficial_MentionTest()
96         {
97             var statusText = "<a class=\"mention\" href=\"https://twitter.com/twitterapi\">@TwitterAPI</a>";
98
99             Assert.Equal("@TwitterAPI", TweenMain.CreateRetweetUnofficial(statusText, false));
100         }
101
102         [Fact]
103         public void CreateRetweetUnofficial_HashtagTest()
104         {
105             var statusText = "<a class=\"hashtag\" href=\"https://twitter.com/search?q=%23OpenTween\">#OpenTween</a>";
106
107             Assert.Equal("#OpenTween", TweenMain.CreateRetweetUnofficial(statusText, false));
108         }
109
110         [Fact]
111         public void CreateRetweetUnofficial_SingleLineTest()
112         {
113             var statusText = "123<br>456<br>789";
114
115             Assert.Equal("123 456 789", TweenMain.CreateRetweetUnofficial(statusText, false));
116         }
117
118         [Fact]
119         public void CreateRetweetUnofficial_MultiLineTest()
120         {
121             var statusText = "123<br>456<br>789";
122
123             Assert.Equal("123" + Environment.NewLine + "456" + Environment.NewLine + "789", TweenMain.CreateRetweetUnofficial(statusText, true));
124         }
125
126         [Fact]
127         public void CreateRetweetUnofficial_DecodeTest()
128         {
129             var statusText = "&lt;&gt;&quot;&#39;&nbsp;";
130
131             Assert.Equal("<>\"' ", TweenMain.CreateRetweetUnofficial(statusText, false));
132         }
133
134         [Fact]
135         public void CreateRetweetUnofficial_WithFormatterTest()
136         {
137             // TweetFormatterでHTMLに整形 → CreateRetweetUnofficialで復元 までの動作が正しく行えているか
138
139             var text = "#てすと @TwitterAPI \n http://t.co/KYi7vMZzRt";
140             var entities = new TwitterEntity[]
141             {
142                 new TwitterEntityHashtag
143                 {
144                     Indices = new[] { 0, 4 },
145                     Text = "てすと",
146                 },
147                 new TwitterEntityMention
148                 {
149                     Indices = new[] { 5, 16 },
150                     Id = 6253282L,
151                     Name = "Twitter API",
152                     ScreenName = "twitterapi",
153                 },
154                 new TwitterEntityUrl
155                 {
156                     Indices = new[] { 19, 41 },
157                     DisplayUrl = "twitter.com",
158                     ExpandedUrl = "http://twitter.com/",
159                     Url = "http://t.co/KYi7vMZzRt",
160                 },
161             };
162
163             var html = TweetFormatter.AutoLinkHtml(text, entities);
164
165             var expected = "#てすと @TwitterAPI " + Environment.NewLine + " http://twitter.com/";
166             Assert.Equal(expected, TweenMain.CreateRetweetUnofficial(html, true));
167         }
168
169         [Theory]
170         [InlineData("", true)]
171         [InlineData("hoge", false)]
172         [InlineData("@twitterapi ", true)]
173         [InlineData("@twitterapi @opentween ", true)]
174         [InlineData("@twitterapi @opentween hoge", false)]
175         public void TextContainsOnlyMentions_Test(string input, bool expected)
176             => Assert.Equal(expected, TweenMain.TextContainsOnlyMentions(input));
177     }
178 }