about summary refs log blame commit diff
path: root/IRCSharp.Tests/State/Channel.cs
blob: 6868e0f56fcac220db900788d4c1d0a60445f71c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11


                                 
                
                                                   
 
                         



                        





                                         

                                                            



















                                                                                                 
                                                         













                                                                                                    
                                                            







                                                       

                                                         





                                                                       

                                                                                                                        





                                                                                                                   
                                                                     







                                                       

                                                                  












                                                                                                           























                                                                      

                               
                                                         






                                                                             
                                                                    









                                                          
                                                                





                                                                            
                                                              





                                                                                                                        
                                                                       







                                                                 


                                                                                                   






                                                                                    
                                                                                           



                                                      
                                                    








                                                             
                                                                


                                                                                                           

     
using System;
using System.Collections.Generic;
using System.Linq;
using IRCTokens;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace IRCStates.Tests
{
    [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));
            var chanUser = chan.Users[user.NickNameLower];
            CollectionAssert.AreEqual(new List<string> {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<string> {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<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 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<string, ChannelUser> {{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<string> {"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<string, ChannelUser> {{user.NickNameLower, chanUser}},
                channel.Users);
        }
    }
}