using System.Threading.Tasks; namespace IRCSharp.Tests.State; public class User { private readonly Server _server = new("test"); public User() { _server.Parse(new Line("001 nickname")); } [Test] public async Task Welcome() { await Assert.That(_server.Name).IsEqualTo("test"); await Assert.That(_server.NickName).IsEqualTo("nickname"); } [Test] public async Task NicknameChange() { _server.Parse(new Line(":nickname NICK nickname2")); await Assert.That(_server.NickName).IsEqualTo("nickname2"); _server.Parse(new Line(":nickname2 JOIN #chan")); _server.Parse(new Line(":other JOIN #chan")); await Assert.That(_server.Users).ContainsKey("other"); _server.Parse(new Line(":other NICK other2")); await Assert.That(_server.Users).DoesNotContainKey("other"); await Assert.That(_server.Users).ContainsKey("other2"); } [Test] public async Task HostmaskJoinBoth() { _server.Parse(new Line(":nickname!user@host JOIN #chan")); await Assert.That(_server.UserName).IsEqualTo("user"); await Assert.That(_server.HostName).IsEqualTo("host"); _server.Parse(new Line(":other!user@host JOIN #chan")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("user"); await Assert.That(user.HostName).IsEqualTo("host"); } [Test] public async Task HostmaskJoinUser() { _server.Parse(new Line(":nickname!user JOIN #chan")); await Assert.That(_server.UserName).IsEqualTo("user"); await Assert.That(_server.HostName).IsNull(); _server.Parse(new Line(":other!user JOIN #chan")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("user"); await Assert.That(user.HostName).IsNull(); } [Test] public async Task HostmaskJoinHost() { _server.Parse(new Line(":nickname@host JOIN #chan")); await Assert.That(_server.UserName).IsNull(); await Assert.That(_server.HostName).IsEqualTo("host"); _server.Parse(new Line(":other@host JOIN #chan")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsNull(); await Assert.That(user.HostName).IsEqualTo("host"); } [Test] public async Task ExtendedJoinWithoutExtendedJoin() { _server.Parse(new Line(":nickname JOIN #chan")); await Assert.That(_server.Account).IsNull(); await Assert.That(_server.RealName).IsNull(); _server.Parse(new Line(":other JOIN #chan")); var user = _server.Users["other"]; await Assert.That(user.Account).IsNull(); await Assert.That(user.RealName).IsNull(); } [Test] public async Task ExtendedJoinWithAccount() { _server.Parse(new Line(":nickname JOIN #chan acc :realname")); await Assert.That(_server.Account).IsEqualTo("acc"); await Assert.That(_server.RealName).IsEqualTo("realname"); _server.Parse(new Line(":other JOIN #chan acc2 :realname2")); var user = _server.Users["other"]; await Assert.That(user.Account).IsEqualTo("acc2"); await Assert.That(user.RealName).IsEqualTo("realname2"); } [Test] public async Task ExtendedJoinWithoutAccount() { _server.Parse(new Line(":nickname JOIN #chan * :realname")); await Assert.That(_server.Account).IsEqualTo(""); await Assert.That(_server.RealName).IsEqualTo("realname"); _server.Parse(new Line(":other JOIN #chan * :realname2")); var user = _server.Users["other"]; await Assert.That(user.Account).IsEqualTo(""); await Assert.That(user.RealName).IsEqualTo("realname2"); } [Test] public async Task AccountNotifyWithAccount() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":nickname ACCOUNT acc")); await Assert.That(_server.Account).IsEqualTo("acc"); _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":other ACCOUNT acc2")); var user = _server.Users["other"]; await Assert.That(user.Account).IsEqualTo("acc2"); } [Test] public async Task AccountNotifyWithoutAccount() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":nickname ACCOUNT *")); await Assert.That(_server.Account).IsEqualTo(""); _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":other ACCOUNT *")); var user = _server.Users["other"]; await Assert.That(user.Account).IsEqualTo(""); } [Test] public async Task HostmaskPrivmsgBoth() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":nickname!user@host PRIVMSG #chan :hi")); await Assert.That(_server.UserName).IsEqualTo("user"); await Assert.That(_server.HostName).IsEqualTo("host"); _server.Parse(new Line(":other!user@host PRIVMSG #chan :hi")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("user"); await Assert.That(user.HostName).IsEqualTo("host"); } [Test] public async Task HostmaskPrivmsgUser() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":nickname!user PRIVMSG #chan :hi")); await Assert.That(_server.UserName).IsEqualTo("user"); await Assert.That(_server.HostName).IsNull(); _server.Parse(new Line(":other!user PRIVMSG #chan :hi")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("user"); await Assert.That(user.HostName).IsNull(); } [Test] public async Task HostmaskPrivmsgHost() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":nickname@host PRIVMSG #chan :hi")); await Assert.That(_server.UserName).IsNull(); await Assert.That(_server.HostName).IsEqualTo("host"); _server.Parse(new Line(":other@host PRIVMSG #chan :hi")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsNull(); await Assert.That(user.HostName).IsEqualTo("host"); } [Test] public async Task VisibleHostWithoutUsername() { _server.Parse(new Line("396 * hostname")); await Assert.That(_server.UserName).IsNull(); await Assert.That(_server.HostName).IsEqualTo("hostname"); } [Test] public async Task VisibleHostWithUsername() { _server.Parse(new Line("396 * username@hostname")); await Assert.That(_server.UserName).IsEqualTo("username"); await Assert.That(_server.HostName).IsEqualTo("hostname"); } [Test] public async Task Who() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line("352 * #chan user host * nickname * :0 real")); _server.Parse(new Line("352 * #chan user2 host2 * other * :0 real2")); await Assert.That(_server.UserName).IsEqualTo("user"); await Assert.That(_server.HostName).IsEqualTo("host"); await Assert.That(_server.RealName).IsEqualTo("real"); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("user2"); await Assert.That(user.HostName).IsEqualTo("host2"); await Assert.That(user.RealName).IsEqualTo("real2"); } [Test] public async Task Chghost() { _server.Parse(new Line(":nickname!user@host JOIN #chan")); _server.Parse(new Line(":nickname CHGHOST u h")); await Assert.That(_server.UserName).IsEqualTo("u"); await Assert.That(_server.HostName).IsEqualTo("h"); _server.Parse(new Line(":other!user2@host2 JOIN #chan")); _server.Parse(new Line(":other CHGHOST u2 h2")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("u2"); await Assert.That(user.HostName).IsEqualTo("h2"); } [Test] public async Task Whois() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("311 * nickname u h * :r")); await Assert.That(_server.UserName).IsEqualTo("u"); await Assert.That(_server.HostName).IsEqualTo("h"); await Assert.That(_server.RealName).IsEqualTo("r"); _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":other CHGHOST u2 h2")); _server.Parse(new Line("311 * other u2 h2 * :r2")); var user = _server.Users["other"]; await Assert.That(user.UserName).IsEqualTo("u2"); await Assert.That(user.HostName).IsEqualTo("h2"); await Assert.That(user.RealName).IsEqualTo("r2"); } [Test] public async Task AwaySet() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":other JOIN #chan")); var user = _server.Users["other"]; await Assert.That(_server.Away).IsNull(); await Assert.That(user.Away).IsNull(); _server.Parse(new Line(":nickname AWAY :bye bye")); _server.Parse(new Line(":other AWAY :ich geh weg")); await Assert.That(_server.Away).IsEqualTo("bye bye"); await Assert.That(user.Away).IsEqualTo("ich geh weg"); } [Test] public async Task AwayUnset() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":other JOIN #chan")); _server.Parse(new Line(":nickname AWAY :bye bye")); _server.Parse(new Line(":nickname AWAY")); _server.Parse(new Line(":other AWAY :ich geh weg")); _server.Parse(new Line(":other AWAY")); var user = _server.Users["other"]; await Assert.That(_server.Away).IsNull(); await Assert.That(user.Away).IsNull(); } [Test] public async Task Setname() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line(":other JOIN #chan")); var user = _server.Users["other"]; await Assert.That(user.RealName).IsNull(); await Assert.That(_server.RealName).IsNull(); _server.Parse(new Line(":nickname SETNAME :new now know how")); _server.Parse(new Line(":other SETNAME :tyrannosaurus hex")); await Assert.That(_server.RealName).IsEqualTo("new now know how"); await Assert.That(user.RealName).IsEqualTo("tyrannosaurus hex"); } }