ircsharp/IRCSharp.Tests/States/Channel.cs

194 lines
6.2 KiB
C#

namespace IRCSharp.Tests.States;
[TestClass]
public class Channel
{
private Server _server;
[TestInitialize]
public void TestInitialize()
{
_server = new("test");
_server.Parse(new("001 nickname"));
_server.Parse(new(":nickname JOIN #chan"));
}
[TestMethod]
public void JoinSelf()
{
Assert.IsTrue(_server.Channels.ContainsKey("#chan"));
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
Assert.AreEqual(1, _server.Channels.Count);
Assert.AreEqual(1, _server.Users.Count);
var user = _server.Users["nickname"];
var chan = _server.Channels["#chan"];
Assert.IsTrue(chan.Users.ContainsKey(user.NickNameLower));
CollectionAssert.AreEqual(new List<string> {chan.NameLower}, user.Channels.ToList());
}
[TestMethod]
public void JoinOther()
{
_server.Parse(new(":other JOIN #chan"));
Assert.AreEqual(2, _server.Users.Count);
Assert.IsTrue(_server.Users.ContainsKey("other"));
var channel = _server.Channels["#chan"];
Assert.AreEqual(2, channel.Users.Count);
var user = _server.Users["other"];
CollectionAssert.AreEqual(new List<string> {channel.NameLower}, user.Channels.ToList());
}
[TestMethod]
public void PartSelf()
{
_server.Parse(new(":nickname PART #chan"));
Assert.AreEqual(0, _server.Users.Count);
Assert.AreEqual(0, _server.Channels.Count);
}
[TestMethod]
public void PartOther()
{
_server.Parse(new(":other JOIN #chan"));
_server.Parse(new(":other PART #chan"));
var user = _server.Users["nickname"];
var channel = _server.Channels["#chan"];
var chanUser = channel.Users[user.NickNameLower];
Assert.AreEqual(channel.NameLower, user.Channels.Single());
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.User> {{"nickname", user}}, _server.Users);
CollectionAssert.AreEqual(new Dictionary<string, IRCStates.Channel> {{"#chan", channel}}, _server.Channels);
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{"nickname", chanUser}}, channel.Users);
}
[TestMethod]
public void KickSelf()
{
_server.Parse(new(":nickname KICK #chan nickname"));
Assert.AreEqual(0, _server.Users.Count);
Assert.AreEqual(0, _server.Channels.Count);
}
[TestMethod]
public void KickOther()
{
_server.Parse(new(":other JOIN #chan"));
_server.Parse(new(":nickname KICK #chan other"));
var user = _server.Users["nickname"];
var channel = _server.Channels["#chan"];
var chanUser = channel.Users[user.NickNameLower];
Assert.AreEqual(1, _server.Users.Count);
Assert.AreEqual(1, _server.Channels.Count);
Assert.AreEqual(channel.NameLower, user.Channels.Single());
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
channel.Users);
}
[TestMethod]
public void QuitSelf()
{
_server.Parse(new("QUIT :i'm outta here"));
Assert.AreEqual(0, _server.Users.Count);
Assert.AreEqual(0, _server.Channels.Count);
}
[TestMethod]
public void QuitSelfWithSource()
{
_server.Parse(new(":nickname QUIT :i'm outta here"));
Assert.AreEqual(0, _server.Users.Count);
Assert.AreEqual(0, _server.Channels.Count);
}
[TestMethod]
public void QuitOther()
{
_server.Parse(new(":other JOIN #chan"));
_server.Parse(new(":other QUIT :see ya"));
Assert.IsFalse(_server.Users.ContainsKey("other"));
}
[TestMethod]
public void TopicText()
{
_server.Parse(new("332 * #chan :test"));
Assert.AreEqual("test", _server.Channels["#chan"].Topic);
}
[TestMethod]
public void TopicSetByAt()
{
var dt = DateTimeOffset.FromUnixTimeSeconds(1584023277).DateTime;
_server.Parse(new("333 * #chan other 1584023277"));
var channel = _server.Channels["#chan"];
Assert.AreEqual("other", channel.TopicSetter);
Assert.AreEqual(dt, channel.TopicTime);
}
[TestMethod]
public void TopicCommand()
{
_server.Parse(new("TOPIC #chan :hello there"));
Assert.AreEqual("hello there", _server.Channels["#chan"].Topic);
}
[TestMethod]
public void CreationDate()
{
_server.Parse(new("329 * #chan 1584041889"));
Assert.AreEqual(DateTimeOffset.FromUnixTimeSeconds(1584041889).DateTime, _server.Channels["#chan"].Created);
}
[TestMethod]
public void NamesCommand()
{
_server.Parse(new("353 * * #chan :nickname @+other"));
Assert.IsTrue(_server.Users.ContainsKey("nickname"));
Assert.IsTrue(_server.Users.ContainsKey("other"));
var user = _server.Users["other"];
var channel = _server.Channels["#chan"];
var chanUser1 = channel.Users[user.NickNameLower];
var chanUser2 = channel.Users[_server.NickNameLower];
Assert.AreEqual(2, channel.Users.Count);
CollectionAssert.AreEqual(chanUser1.Modes, channel.Users[user.NickNameLower].Modes);
CollectionAssert.AreEqual(chanUser2.Modes, channel.Users[_server.NickNameLower].Modes);
CollectionAssert.AreEqual(new List<string> {"o", "v"}, chanUser1.Modes);
Assert.AreEqual(channel.NameLower, user.Channels.Single());
}
[TestMethod]
public void UserhostInNames()
{
_server.Parse(new("353 * * #chan :nickname!user@host other!user2@host2"));
Assert.AreEqual("user", _server.UserName);
Assert.AreEqual("host", _server.HostName);
var user = _server.Users["other"];
Assert.AreEqual("user2", user.UserName);
Assert.AreEqual("host2", user.HostName);
}
[TestMethod]
public void NickAfterJoin()
{
var user = _server.Users["nickname"];
var channel = _server.Channels["#chan"];
var chanUser = channel.Users[user.NickNameLower];
_server.Parse(new(":nickname NICK nickname2"));
CollectionAssert.AreEqual(new Dictionary<string, ChannelUser> {{user.NickNameLower, chanUser}},
channel.Users);
}
}