// ReSharper disable StringLiteralTypo namespace IRCSharp.Tests.State; public class Mode { private readonly Server _server = new("test"); public Mode() { _server.Parse(new Line("001 nickname")); } [Test] public async Task UModeAdd() { _server.Parse(new Line("MODE nickname +i")); await Assert.That(_server.Modes).IsEquivalentTo(["i"]); } [Test] public async Task UModeRemove() { _server.Parse(new Line("MODE nickname +i")); _server.Parse(new Line("MODE nickname -i")); await Assert.That(_server.Modes).IsEmpty(); } [Test] public async Task PrefixAdd() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +ov nickname nickname")); var user = _server.Users["nickname"]; var channel = _server.Channels["#chan"]; var channelUser = channel.Users[user.NickNameLower]; await Assert.That(channelUser.Modes).IsEquivalentTo(["o", "v"]); } [Test] public async Task PrefixRemove() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +ov nickname nickname")); _server.Parse(new Line("MODE #chan -ov nickname nickname")); var user = _server.Users["nickname"]; var channel = _server.Channels["#chan"]; var channelUser = channel.Users[user.NickNameLower]; await Assert.That(channelUser.Modes).IsEmpty(); } [Test] public async Task ChannelListAdd() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +b asd!*@*")); var channel = _server.Channels["#chan"]; await Assert.That(channel.ListModes["b"]).IsEquivalentTo(["asd!*@*"]); } [Test] public async Task ChannelListRemove() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +b asd!*@*")); _server.Parse(new Line("MODE #chan -b asd!*@*")); var channel = _server.Channels["#chan"]; await Assert.That(channel.ListModes).IsEmpty(); } [Test] public async Task ChannelTypeBAdd() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +k password")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary { { "k", "password" } }); } [Test] public async Task ChannelTypeBRemove() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +k password")); _server.Parse(new Line("MODE #chan -k *")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEmpty(); } [Test] public async Task ChannelTypeCAdd() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +l 100")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary { { "l", "100" } }); } [Test] public async Task ChannelTypeCRemove() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +l 100")); _server.Parse(new Line("MODE #chan -l")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEmpty(); } [Test] public async Task ChannelTypeDAdd() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +i")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary { { "i", null } }); } [Test] public async Task ChannelTypeDRemove() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("MODE #chan +i")); _server.Parse(new Line("MODE #chan -i")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEmpty(); } [Test] public async Task ChannelNumeric() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("324 * #chan +bkli *!*@* pass 10")); var channel = _server.Channels["#chan"]; var expectedModes = new Dictionary { { "k", "pass" }, { "l", "10" }, { "i", null } }; await Assert.That(channel.Modes).IsEquivalentTo(expectedModes); await Assert.That(channel.ListModes["b"]).IsEquivalentTo(["*!*@*"]); } [Test] public async Task ChannelNumericWithoutPlus() { _server.Parse(new Line(":nickname JOIN #chan")); _server.Parse(new Line("324 * #chan il 10")); var channel = _server.Channels["#chan"]; await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary { { "i", null }, { "l", "10" } }); } [Test] public async Task UserNumeric() { _server.Parse(new Line("221 * +iw")); await Assert.That(_server.Modes).IsEquivalentTo(["i", "w"]); } [Test] public async Task UserNumericWithoutPlus() { _server.Parse(new Line("221 * iw")); await Assert.That(_server.Modes).IsEquivalentTo(["i", "w"]); } }