IRC parsing, tokenization, and state handling in C#
at tunit 173 lines 5.4 kB view raw
1// ReSharper disable StringLiteralTypo 2 3namespace IRCSharp.Tests.State; 4 5public class Mode 6{ 7 private readonly Server _server = new("test"); 8 9 public Mode() 10 { 11 _server.Parse(new Line("001 nickname")); 12 } 13 14 [Test] 15 public async Task UModeAdd() 16 { 17 _server.Parse(new Line("MODE nickname +i")); 18 await Assert.That(_server.Modes).IsEquivalentTo(["i"]); 19 } 20 21 [Test] 22 public async Task UModeRemove() 23 { 24 _server.Parse(new Line("MODE nickname +i")); 25 _server.Parse(new Line("MODE nickname -i")); 26 await Assert.That(_server.Modes).IsEmpty(); 27 } 28 29 [Test] 30 public async Task PrefixAdd() 31 { 32 _server.Parse(new Line(":nickname JOIN #chan")); 33 _server.Parse(new Line("MODE #chan +ov nickname nickname")); 34 35 var user = _server.Users["nickname"]; 36 var channel = _server.Channels["#chan"]; 37 var channelUser = channel.Users[user.NickNameLower]; 38 await Assert.That(channelUser.Modes).IsEquivalentTo(["o", "v"]); 39 } 40 41 [Test] 42 public async Task PrefixRemove() 43 { 44 _server.Parse(new Line(":nickname JOIN #chan")); 45 _server.Parse(new Line("MODE #chan +ov nickname nickname")); 46 _server.Parse(new Line("MODE #chan -ov nickname nickname")); 47 48 var user = _server.Users["nickname"]; 49 var channel = _server.Channels["#chan"]; 50 var channelUser = channel.Users[user.NickNameLower]; 51 await Assert.That(channelUser.Modes).IsEmpty(); 52 } 53 54 [Test] 55 public async Task ChannelListAdd() 56 { 57 _server.Parse(new Line(":nickname JOIN #chan")); 58 _server.Parse(new Line("MODE #chan +b asd!*@*")); 59 60 var channel = _server.Channels["#chan"]; 61 await Assert.That(channel.ListModes["b"]).IsEquivalentTo(["asd!*@*"]); 62 } 63 64 [Test] 65 public async Task ChannelListRemove() 66 { 67 _server.Parse(new Line(":nickname JOIN #chan")); 68 _server.Parse(new Line("MODE #chan +b asd!*@*")); 69 _server.Parse(new Line("MODE #chan -b asd!*@*")); 70 71 var channel = _server.Channels["#chan"]; 72 await Assert.That(channel.ListModes).IsEmpty(); 73 } 74 75 [Test] 76 public async Task ChannelTypeBAdd() 77 { 78 _server.Parse(new Line(":nickname JOIN #chan")); 79 _server.Parse(new Line("MODE #chan +k password")); 80 81 var channel = _server.Channels["#chan"]; 82 await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary<string, string> { { "k", "password" } }); 83 } 84 85 [Test] 86 public async Task ChannelTypeBRemove() 87 { 88 _server.Parse(new Line(":nickname JOIN #chan")); 89 _server.Parse(new Line("MODE #chan +k password")); 90 _server.Parse(new Line("MODE #chan -k *")); 91 92 var channel = _server.Channels["#chan"]; 93 await Assert.That(channel.Modes).IsEmpty(); 94 } 95 96 [Test] 97 public async Task ChannelTypeCAdd() 98 { 99 _server.Parse(new Line(":nickname JOIN #chan")); 100 _server.Parse(new Line("MODE #chan +l 100")); 101 102 var channel = _server.Channels["#chan"]; 103 await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary<string, string> { { "l", "100" } }); 104 } 105 106 [Test] 107 public async Task ChannelTypeCRemove() 108 { 109 _server.Parse(new Line(":nickname JOIN #chan")); 110 _server.Parse(new Line("MODE #chan +l 100")); 111 _server.Parse(new Line("MODE #chan -l")); 112 113 var channel = _server.Channels["#chan"]; 114 await Assert.That(channel.Modes).IsEmpty(); 115 } 116 117 [Test] 118 public async Task ChannelTypeDAdd() 119 { 120 _server.Parse(new Line(":nickname JOIN #chan")); 121 _server.Parse(new Line("MODE #chan +i")); 122 123 var channel = _server.Channels["#chan"]; 124 await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary<string, string> { { "i", null } }); 125 } 126 127 [Test] 128 public async Task ChannelTypeDRemove() 129 { 130 _server.Parse(new Line(":nickname JOIN #chan")); 131 _server.Parse(new Line("MODE #chan +i")); 132 _server.Parse(new Line("MODE #chan -i")); 133 134 var channel = _server.Channels["#chan"]; 135 await Assert.That(channel.Modes).IsEmpty(); 136 } 137 138 [Test] 139 public async Task ChannelNumeric() 140 { 141 _server.Parse(new Line(":nickname JOIN #chan")); 142 _server.Parse(new Line("324 * #chan +bkli *!*@* pass 10")); 143 var channel = _server.Channels["#chan"]; 144 145 var expectedModes = new Dictionary<string, string> { { "k", "pass" }, { "l", "10" }, { "i", null } }; 146 await Assert.That(channel.Modes).IsEquivalentTo(expectedModes); 147 await Assert.That(channel.ListModes["b"]).IsEquivalentTo(["*!*@*"]); 148 } 149 150 [Test] 151 public async Task ChannelNumericWithoutPlus() 152 { 153 _server.Parse(new Line(":nickname JOIN #chan")); 154 _server.Parse(new Line("324 * #chan il 10")); 155 156 var channel = _server.Channels["#chan"]; 157 await Assert.That(channel.Modes).IsEquivalentTo(new Dictionary<string, string> { { "i", null }, { "l", "10" } }); 158 } 159 160 [Test] 161 public async Task UserNumeric() 162 { 163 _server.Parse(new Line("221 * +iw")); 164 await Assert.That(_server.Modes).IsEquivalentTo(["i", "w"]); 165 } 166 167 [Test] 168 public async Task UserNumericWithoutPlus() 169 { 170 _server.Parse(new Line("221 * iw")); 171 await Assert.That(_server.Modes).IsEquivalentTo(["i", "w"]); 172 } 173}