IRC parsing, tokenization, and state handling in C#
at ircrobotsv2 291 lines 11 kB view raw
1namespace IRCSharp.Tests.State; 2 3public class User 4{ 5 private readonly Server _server = new("test"); 6 7 public User() 8 { 9 _server.Parse(new Line("001 nickname")); 10 } 11 12 [Test] 13 public async Task Welcome() 14 { 15 await Assert.That(_server.Name).IsEqualTo("test"); 16 await Assert.That(_server.NickName).IsEqualTo("nickname"); 17 } 18 19 [Test] 20 public async Task NicknameChange() 21 { 22 _server.Parse(new Line(":nickname NICK nickname2")); 23 await Assert.That(_server.NickName).IsEqualTo("nickname2"); 24 25 _server.Parse(new Line(":nickname2 JOIN #chan")); 26 _server.Parse(new Line(":other JOIN #chan")); 27 await Assert.That(_server.Users).ContainsKey("other"); 28 29 _server.Parse(new Line(":other NICK other2")); 30 await Assert.That(_server.Users).DoesNotContainKey("other"); 31 await Assert.That(_server.Users).ContainsKey("other2"); 32 } 33 34 [Test] 35 public async Task HostmaskJoinBoth() 36 { 37 _server.Parse(new Line(":nickname!user@host JOIN #chan")); 38 await Assert.That(_server.UserName).IsEqualTo("user"); 39 await Assert.That(_server.HostName).IsEqualTo("host"); 40 41 _server.Parse(new Line(":other!user@host JOIN #chan")); 42 var user = _server.Users["other"]; 43 await Assert.That(user.UserName).IsEqualTo("user"); 44 await Assert.That(user.HostName).IsEqualTo("host"); 45 } 46 47 [Test] 48 public async Task HostmaskJoinUser() 49 { 50 _server.Parse(new Line(":nickname!user JOIN #chan")); 51 await Assert.That(_server.UserName).IsEqualTo("user"); 52 await Assert.That(_server.HostName).IsNull(); 53 54 _server.Parse(new Line(":other!user JOIN #chan")); 55 var user = _server.Users["other"]; 56 await Assert.That(user.UserName).IsEqualTo("user"); 57 await Assert.That(user.HostName).IsNull(); 58 } 59 60 [Test] 61 public async Task HostmaskJoinHost() 62 { 63 _server.Parse(new Line(":nickname@host JOIN #chan")); 64 await Assert.That(_server.UserName).IsNull(); 65 await Assert.That(_server.HostName).IsEqualTo("host"); 66 67 _server.Parse(new Line(":other@host JOIN #chan")); 68 var user = _server.Users["other"]; 69 await Assert.That(user.UserName).IsNull(); 70 await Assert.That(user.HostName).IsEqualTo("host"); 71 } 72 73 [Test] 74 public async Task ExtendedJoinWithoutExtendedJoin() 75 { 76 _server.Parse(new Line(":nickname JOIN #chan")); 77 await Assert.That(_server.Account).IsNull(); 78 await Assert.That(_server.RealName).IsNull(); 79 80 _server.Parse(new Line(":other JOIN #chan")); 81 var user = _server.Users["other"]; 82 await Assert.That(user.Account).IsNull(); 83 await Assert.That(user.RealName).IsNull(); 84 } 85 86 [Test] 87 public async Task ExtendedJoinWithAccount() 88 { 89 _server.Parse(new Line(":nickname JOIN #chan acc :realname")); 90 await Assert.That(_server.Account).IsEqualTo("acc"); 91 await Assert.That(_server.RealName).IsEqualTo("realname"); 92 93 _server.Parse(new Line(":other JOIN #chan acc2 :realname2")); 94 var user = _server.Users["other"]; 95 await Assert.That(user.Account).IsEqualTo("acc2"); 96 await Assert.That(user.RealName).IsEqualTo("realname2"); 97 } 98 99 [Test] 100 public async Task ExtendedJoinWithoutAccount() 101 { 102 _server.Parse(new Line(":nickname JOIN #chan * :realname")); 103 await Assert.That(_server.Account).IsEqualTo(""); 104 await Assert.That(_server.RealName).IsEqualTo("realname"); 105 106 _server.Parse(new Line(":other JOIN #chan * :realname2")); 107 var user = _server.Users["other"]; 108 await Assert.That(user.Account).IsEqualTo(""); 109 await Assert.That(user.RealName).IsEqualTo("realname2"); 110 } 111 112 [Test] 113 public async Task AccountNotifyWithAccount() 114 { 115 _server.Parse(new Line(":nickname JOIN #chan")); 116 _server.Parse(new Line(":nickname ACCOUNT acc")); 117 await Assert.That(_server.Account).IsEqualTo("acc"); 118 119 _server.Parse(new Line(":other JOIN #chan")); 120 _server.Parse(new Line(":other ACCOUNT acc2")); 121 var user = _server.Users["other"]; 122 await Assert.That(user.Account).IsEqualTo("acc2"); 123 } 124 125 [Test] 126 public async Task AccountNotifyWithoutAccount() 127 { 128 _server.Parse(new Line(":nickname JOIN #chan")); 129 _server.Parse(new Line(":nickname ACCOUNT *")); 130 await Assert.That(_server.Account).IsEqualTo(""); 131 132 _server.Parse(new Line(":other JOIN #chan")); 133 _server.Parse(new Line(":other ACCOUNT *")); 134 var user = _server.Users["other"]; 135 await Assert.That(user.Account).IsEqualTo(""); 136 } 137 138 [Test] 139 public async Task HostmaskPrivmsgBoth() 140 { 141 _server.Parse(new Line(":nickname JOIN #chan")); 142 _server.Parse(new Line(":nickname!user@host PRIVMSG #chan :hi")); 143 await Assert.That(_server.UserName).IsEqualTo("user"); 144 await Assert.That(_server.HostName).IsEqualTo("host"); 145 146 _server.Parse(new Line(":other!user@host PRIVMSG #chan :hi")); 147 var user = _server.Users["other"]; 148 await Assert.That(user.UserName).IsEqualTo("user"); 149 await Assert.That(user.HostName).IsEqualTo("host"); 150 } 151 152 [Test] 153 public async Task HostmaskPrivmsgUser() 154 { 155 _server.Parse(new Line(":nickname JOIN #chan")); 156 _server.Parse(new Line(":nickname!user PRIVMSG #chan :hi")); 157 await Assert.That(_server.UserName).IsEqualTo("user"); 158 await Assert.That(_server.HostName).IsNull(); 159 160 _server.Parse(new Line(":other!user PRIVMSG #chan :hi")); 161 var user = _server.Users["other"]; 162 await Assert.That(user.UserName).IsEqualTo("user"); 163 await Assert.That(user.HostName).IsNull(); 164 } 165 166 [Test] 167 public async Task HostmaskPrivmsgHost() 168 { 169 _server.Parse(new Line(":nickname JOIN #chan")); 170 _server.Parse(new Line(":nickname@host PRIVMSG #chan :hi")); 171 await Assert.That(_server.UserName).IsNull(); 172 await Assert.That(_server.HostName).IsEqualTo("host"); 173 174 _server.Parse(new Line(":other@host PRIVMSG #chan :hi")); 175 var user = _server.Users["other"]; 176 await Assert.That(user.UserName).IsNull(); 177 await Assert.That(user.HostName).IsEqualTo("host"); 178 } 179 180 [Test] 181 public async Task VisibleHostWithoutUsername() 182 { 183 _server.Parse(new Line("396 * hostname")); 184 await Assert.That(_server.UserName).IsNull(); 185 await Assert.That(_server.HostName).IsEqualTo("hostname"); 186 } 187 188 [Test] 189 public async Task VisibleHostWithUsername() 190 { 191 _server.Parse(new Line("396 * username@hostname")); 192 await Assert.That(_server.UserName).IsEqualTo("username"); 193 await Assert.That(_server.HostName).IsEqualTo("hostname"); 194 } 195 196 [Test] 197 public async Task Who() 198 { 199 _server.Parse(new Line(":nickname JOIN #chan")); 200 _server.Parse(new Line(":other JOIN #chan")); 201 _server.Parse(new Line("352 * #chan user host * nickname * :0 real")); 202 _server.Parse(new Line("352 * #chan user2 host2 * other * :0 real2")); 203 204 await Assert.That(_server.UserName).IsEqualTo("user"); 205 await Assert.That(_server.HostName).IsEqualTo("host"); 206 await Assert.That(_server.RealName).IsEqualTo("real"); 207 208 var user = _server.Users["other"]; 209 await Assert.That(user.UserName).IsEqualTo("user2"); 210 await Assert.That(user.HostName).IsEqualTo("host2"); 211 await Assert.That(user.RealName).IsEqualTo("real2"); 212 } 213 214 [Test] 215 public async Task Chghost() 216 { 217 _server.Parse(new Line(":nickname!user@host JOIN #chan")); 218 _server.Parse(new Line(":nickname CHGHOST u h")); 219 await Assert.That(_server.UserName).IsEqualTo("u"); 220 await Assert.That(_server.HostName).IsEqualTo("h"); 221 222 _server.Parse(new Line(":other!user2@host2 JOIN #chan")); 223 _server.Parse(new Line(":other CHGHOST u2 h2")); 224 var user = _server.Users["other"]; 225 await Assert.That(user.UserName).IsEqualTo("u2"); 226 await Assert.That(user.HostName).IsEqualTo("h2"); 227 } 228 229 [Test] 230 public async Task Whois() 231 { 232 _server.Parse(new Line(":nickname JOIN #chan")); 233 _server.Parse(new Line("311 * nickname u h * :r")); 234 await Assert.That(_server.UserName).IsEqualTo("u"); 235 await Assert.That(_server.HostName).IsEqualTo("h"); 236 await Assert.That(_server.RealName).IsEqualTo("r"); 237 238 _server.Parse(new Line(":other JOIN #chan")); 239 _server.Parse(new Line(":other CHGHOST u2 h2")); 240 _server.Parse(new Line("311 * other u2 h2 * :r2")); 241 var user = _server.Users["other"]; 242 await Assert.That(user.UserName).IsEqualTo("u2"); 243 await Assert.That(user.HostName).IsEqualTo("h2"); 244 await Assert.That(user.RealName).IsEqualTo("r2"); 245 } 246 247 [Test] 248 public async Task AwaySet() 249 { 250 _server.Parse(new Line(":nickname JOIN #chan")); 251 _server.Parse(new Line(":other JOIN #chan")); 252 var user = _server.Users["other"]; 253 await Assert.That(_server.Away).IsNull(); 254 await Assert.That(user.Away).IsNull(); 255 256 _server.Parse(new Line(":nickname AWAY :bye bye")); 257 _server.Parse(new Line(":other AWAY :ich geh weg")); 258 await Assert.That(_server.Away).IsEqualTo("bye bye"); 259 await Assert.That(user.Away).IsEqualTo("ich geh weg"); 260 } 261 262 [Test] 263 public async Task AwayUnset() 264 { 265 _server.Parse(new Line(":nickname JOIN #chan")); 266 _server.Parse(new Line(":other JOIN #chan")); 267 _server.Parse(new Line(":nickname AWAY :bye bye")); 268 _server.Parse(new Line(":nickname AWAY")); 269 _server.Parse(new Line(":other AWAY :ich geh weg")); 270 _server.Parse(new Line(":other AWAY")); 271 272 var user = _server.Users["other"]; 273 await Assert.That(_server.Away).IsNull(); 274 await Assert.That(user.Away).IsNull(); 275 } 276 277 [Test] 278 public async Task Setname() 279 { 280 _server.Parse(new Line(":nickname JOIN #chan")); 281 _server.Parse(new Line(":other JOIN #chan")); 282 var user = _server.Users["other"]; 283 await Assert.That(user.RealName).IsNull(); 284 await Assert.That(_server.RealName).IsNull(); 285 286 _server.Parse(new Line(":nickname SETNAME :new now know how")); 287 _server.Parse(new Line(":other SETNAME :tyrannosaurus hex")); 288 await Assert.That(_server.RealName).IsEqualTo("new now know how"); 289 await Assert.That(user.RealName).IsEqualTo("tyrannosaurus hex"); 290 } 291}