IRC parsing, tokenization, and state handling in C#
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}