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