IRC parsing, tokenization, and state handling in C#
1namespace IRCSharp.Tests.State;
2
3public class Emit
4{
5 private readonly Server _server = new("test");
6
7 public Emit()
8 {
9 _server.Parse(new Line("001 nickname"));
10 }
11
12 [Test]
13 public async Task EmitJoin()
14 {
15 var emit = _server.Parse(new Line(":nickname JOIN #chan"));
16
17 await Assert.That(emit.Command).IsEqualTo("JOIN");
18 await Assert.That(emit.Self).IsTrue();
19 await Assert.That(emit.User).IsEqualTo(_server.Users["nickname"]);
20 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]);
21
22 emit = _server.Parse(new Line(":other JOIN #chan"));
23 await Assert.That(emit).IsNotNull();
24 await Assert.That(emit.Command).IsEqualTo("JOIN");
25 await Assert.That(emit.Self).IsFalse();
26 await Assert.That(emit.User).IsEqualTo(_server.Users["other"]);
27 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]);
28 }
29
30 [Test]
31 public async Task EmitPrivmsg()
32 {
33 _server.Parse(new Line(":nickname JOIN #chan"));
34 var emit = _server.Parse(new Line(":nickname PRIVMSG #chan :hello"));
35
36 await Assert.That(emit).IsNotNull();
37 await Assert.That(emit.Command).IsEqualTo("PRIVMSG");
38 await Assert.That(emit.Text).IsEqualTo("hello");
39 await Assert.That(emit.SelfSource).IsTrue();
40 await Assert.That(emit.User).IsEqualTo(_server.Users["nickname"]);
41 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]);
42
43 _server.Parse(new Line(":other JOIN #chan"));
44 emit = _server.Parse(new Line(":other PRIVMSG #chan :hello2"));
45
46 await Assert.That(emit).IsNotNull();
47 await Assert.That(emit.Command).IsEqualTo("PRIVMSG");
48 await Assert.That(emit.Text).IsEqualTo("hello2");
49 await Assert.That(emit.SelfSource).IsFalse();
50 await Assert.That(emit.User).IsEqualTo(_server.Users["other"]);
51 await Assert.That(emit.Channel).IsEqualTo(_server.Channels["#chan"]);
52 }
53
54 [Test]
55 public async Task EmitPrivmsgNoJoin()
56 {
57 _server.Parse(new Line(":nickname JOIN #chan"));
58 var emit = _server.Parse(new Line(":other PRIVMSG #chan :hello"));
59
60 await Assert.That(emit).IsNotNull();
61 await Assert.That(emit.Command).IsEqualTo("PRIVMSG");
62 await Assert.That(emit.Text).IsEqualTo("hello");
63 await Assert.That(emit.SelfSource).IsFalse();
64 await Assert.That(emit.User).IsNotNull();
65
66 var channel = _server.Channels["#chan"];
67 await Assert.That(emit.Channel).IsEqualTo(channel);
68 }
69
70 [Test]
71 public async Task EmitKick()
72 {
73 _server.Parse(new Line(":nickname JOIN #chan"));
74
75 var user = _server.Users["nickname"];
76 var channel = _server.Channels["#chan"];
77 _server.Parse(new Line(":other JOIN #chan"));
78 var userOther = _server.Users["other"];
79 var emit = _server.Parse(new Line(":nickname KICK #chan other :reason"));
80
81 await Assert.That(emit).IsNotNull();
82 await Assert.That(emit.Command).IsEqualTo("KICK");
83 await Assert.That(emit.Text).IsEqualTo("reason");
84 await Assert.That(emit.SelfSource).IsTrue();
85 await Assert.That(emit.UserSource).IsEqualTo(user);
86 await Assert.That(emit.UserTarget).IsEqualTo(userOther);
87 await Assert.That(emit.Channel).IsEqualTo(channel);
88 }
89
90 [Test]
91 public async Task EmitMode()
92 {
93 var emit = _server.Parse(new Line("MODE nickname x+i-i+wi-wi"));
94
95 await Assert.That(emit).IsNotNull();
96 await Assert.That(emit.Command).IsEqualTo("MODE");
97 await Assert.That(emit.SelfTarget).IsTrue();
98 await Assert.That(emit.Tokens).IsEquivalentTo(["+x", "+i", "-i", "+w", "+i", "-w", "-i"]);
99 }
100}