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