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