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