using System; using System.Collections.Generic; using System.Linq; using IRCStates; using IRCTokens; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace IRCSharp.Tests.State { [TestClass] public class Channel { private Server _server; [TestInitialize] public void TestInitialize() { _server = new Server("test"); _server.Parse(new Line("001 nickname")); _server.Parse(new Line(":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 {chan.NameLower}, user.Channels.ToList()); } [TestMethod] public void JoinOther() { _server.Parse(new Line(":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 {channel.NameLower}, user.Channels.ToList()); } [TestMethod] public void PartSelf() { _server.Parse(new Line(":nickname PART #chan")); Assert.AreEqual(0, _server.Users.Count); Assert.AreEqual(0, _server.Channels.Count); } [TestMethod] public void PartOther() { _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":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 {{"nickname", user}}, _server.Users); CollectionAssert.AreEqual(new Dictionary {{"#chan", channel}}, _server.Channels); CollectionAssert.AreEqual(new Dictionary {{"nickname", chanUser}}, channel.Users); } [TestMethod] public void KickSelf() { _server.Parse(new Line(":nickname KICK #chan nickname")); Assert.AreEqual(0, _server.Users.Count); Assert.AreEqual(0, _server.Channels.Count); } [TestMethod] public void KickOther() { _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":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 {{user.NickNameLower, chanUser}}, channel.Users); } [TestMethod] public void QuitSelf() { _server.Parse(new Line("QUIT :i'm outta here")); Assert.IsFalse(_server.Users.Any()); Assert.IsFalse(_server.Channels.Any()); } [TestMethod] public void QuitSelfWithSource() { _server.Parse(new Line(":nickname QUIT :i'm outta here")); Assert.IsFalse(_server.Users.Any()); Assert.IsFalse(_server.Channels.Any()); } [TestMethod] public void QuitOther() { _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":other QUIT :see ya")); Assert.IsFalse(_server.Users.ContainsKey("other")); } [TestMethod] public void TopicText() { _server.Parse(new Line("332 * #chan :test")); Assert.AreEqual("test", _server.Channels["#chan"].Topic); } [TestMethod] public void TopicSetByAt() { var dt = DateTimeOffset.FromUnixTimeSeconds(1584023277).DateTime; _server.Parse(new Line("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 Line("TOPIC #chan :hello there")); Assert.AreEqual("hello there", _server.Channels["#chan"].Topic); } [TestMethod] public void CreationDate() { _server.Parse(new Line("329 * #chan 1584041889")); Assert.AreEqual(DateTimeOffset.FromUnixTimeSeconds(1584041889).DateTime, _server.Channels["#chan"].Created); } [TestMethod] public void NamesCommand() { _server.Parse(new Line("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 {"o", "v"}, chanUser1.Modes); Assert.AreEqual(channel.NameLower, user.Channels.Single()); } [TestMethod] public void UserhostInNames() { _server.Parse(new Line("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 Line(":nickname NICK nickname2")); CollectionAssert.AreEqual(new Dictionary {{user.NickNameLower, chanUser}}, channel.Users); } } }