// OpenTween - Client of Twitter
// Copyright (c) 2014 kim_upsilon (@kim_upsilon)
// All rights reserved.
//
// This file is part of OpenTween.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see , or write to
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenTween.Api;
using OpenTween.Api.DataModel;
using OpenTween.Connection;
using OpenTween.Models;
using OpenTween.Setting;
using OpenTween.Thumbnail;
using Xunit;
using Xunit.Extensions;
namespace OpenTween
{
public class TweenMainTest
{
[WinFormsFact]
public void Initialize_Test()
{
var settings = new SettingManager("");
var tabinfo = new TabInformations();
using var twitterApi = new TwitterApi();
using var twitter = new Twitter(twitterApi);
using var imageCache = new ImageCache();
using var iconAssets = new IconAssetsManager();
var thumbnailGenerator = new ThumbnailGenerator(new(autoupdate: false));
using var tweenMain = new TweenMain(settings, tabinfo, twitter, imageCache, iconAssets, thumbnailGenerator);
}
[Fact]
public void GetUrlFromDataObject_XMozUrlTest()
{
var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\nTwitter\0");
using var memstream = new MemoryStream(dataBytes);
var data = new DataObject("text/x-moz-url", memstream);
var expected = ("https://twitter.com/", "Twitter");
Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
}
[Fact]
public void GetUrlFromDataObject_IESiteModeToUrlTest()
{
var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0Twitter\0");
using var memstream = new MemoryStream(dataBytes);
var data = new DataObject("IESiteModeToUrl", memstream);
var expected = ("https://twitter.com/", "Twitter");
Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
}
[Fact]
public void GetUrlFromDataObject_UniformResourceLocatorWTest()
{
var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0");
using var memstream = new MemoryStream(dataBytes);
var data = new DataObject("UniformResourceLocatorW", memstream);
var expected = ("https://twitter.com/", (string?)null);
Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
}
[Fact]
public void GetUrlFromDataObject_UnknownFormatTest()
{
using var memstream = new MemoryStream(Array.Empty());
var data = new DataObject("application/x-hogehoge", memstream);
Assert.Throws(() => TweenMain.GetUrlFromDataObject(data));
}
[Fact]
public void CreateRetweetUnofficial_UrlTest()
{
var statusText = """twitter.com""";
Assert.Equal("http://twitter.com/", TweenMain.CreateRetweetUnofficial(statusText, false));
}
[Fact]
public void CreateRetweetUnofficial_MentionTest()
{
var statusText = """@TwitterAPI""";
Assert.Equal("@TwitterAPI", TweenMain.CreateRetweetUnofficial(statusText, false));
}
[Fact]
public void CreateRetweetUnofficial_HashtagTest()
{
var statusText = """#OpenTween""";
Assert.Equal("#OpenTween", TweenMain.CreateRetweetUnofficial(statusText, false));
}
[Fact]
public void CreateRetweetUnofficial_SingleLineTest()
{
var statusText = "123
456
789";
Assert.Equal("123 456 789", TweenMain.CreateRetweetUnofficial(statusText, false));
}
[Fact]
public void CreateRetweetUnofficial_MultiLineTest()
{
var statusText = "123
456
789";
Assert.Equal("123" + Environment.NewLine + "456" + Environment.NewLine + "789", TweenMain.CreateRetweetUnofficial(statusText, true));
}
[Fact]
public void CreateRetweetUnofficial_DecodeTest()
{
var statusText = "<>"' ";
Assert.Equal("<>\"' ", TweenMain.CreateRetweetUnofficial(statusText, false));
}
[Fact]
public void CreateRetweetUnofficial_WithFormatterTest()
{
// TweetFormatterでHTMLに整形 → CreateRetweetUnofficialで復元 までの動作が正しく行えているか
var text = "#てすと @TwitterAPI \n http://t.co/KYi7vMZzRt";
var entities = new TwitterEntity[]
{
new TwitterEntityHashtag
{
Indices = new[] { 0, 4 },
Text = "てすと",
},
new TwitterEntityMention
{
Indices = new[] { 5, 16 },
Id = 6253282L,
Name = "Twitter API",
ScreenName = "twitterapi",
},
new TwitterEntityUrl
{
Indices = new[] { 19, 41 },
DisplayUrl = "twitter.com",
ExpandedUrl = "http://twitter.com/",
Url = "http://t.co/KYi7vMZzRt",
},
};
var html = TweetFormatter.AutoLinkHtml(text, entities);
var expected = "#てすと @TwitterAPI " + Environment.NewLine + " http://twitter.com/";
Assert.Equal(expected, TweenMain.CreateRetweetUnofficial(html, true));
}
[Theory]
[InlineData("", true)]
[InlineData("hoge", false)]
[InlineData("@twitterapi ", true)]
[InlineData("@twitterapi @opentween ", true)]
[InlineData("@twitterapi @opentween hoge", false)]
public void TextContainsOnlyMentions_Test(string input, bool expected)
=> Assert.Equal(expected, TweenMain.TextContainsOnlyMentions(input));
}
}