IRC parsing, tokenization, and state handling in C#
1namespace IRCSharp.Tests.States;
2
3[TestClass]
4public class Emit
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 EmitJoin()
17 {
18 var emit = _server.Parse(new(":nickname JOIN #chan"));
19
20 Assert.AreEqual("JOIN", emit.Command);
21 Assert.IsTrue(emit.Self);
22 Assert.AreEqual(_server.Users["nickname"], emit.User);
23 Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
24
25 emit = _server.Parse(new(":other JOIN #chan"));
26 Assert.IsNotNull(emit);
27 Assert.AreEqual("JOIN", emit.Command);
28 Assert.IsFalse(emit.Self);
29 Assert.AreEqual(_server.Users["other"], emit.User);
30 Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
31 }
32
33 [TestMethod]
34 public void EmitPrivmsg()
35 {
36 _server.Parse(new(":nickname JOIN #chan"));
37 var emit = _server.Parse(new(":nickname PRIVMSG #chan :hello"));
38
39 Assert.IsNotNull(emit);
40 Assert.AreEqual("PRIVMSG", emit.Command);
41 Assert.AreEqual("hello", emit.Text);
42 Assert.IsTrue(emit.SelfSource);
43 Assert.AreEqual(_server.Users["nickname"], emit.User);
44 Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
45
46 _server.Parse(new(":other JOIN #chan"));
47 emit = _server.Parse(new(":other PRIVMSG #chan :hello2"));
48
49 Assert.IsNotNull(emit);
50 Assert.AreEqual("PRIVMSG", emit.Command);
51 Assert.AreEqual("hello2", emit.Text);
52 Assert.IsFalse(emit.SelfSource);
53 Assert.AreEqual(_server.Users["other"], emit.User);
54 Assert.AreEqual(_server.Channels["#chan"], emit.Channel);
55 }
56
57 [TestMethod]
58 public void EmitPrivmsgNoJoin()
59 {
60 _server.Parse(new(":nickname JOIN #chan"));
61 var emit = _server.Parse(new(":other PRIVMSG #chan :hello"));
62
63 Assert.IsNotNull(emit);
64 Assert.AreEqual("PRIVMSG", emit.Command);
65 Assert.AreEqual("hello", emit.Text);
66 Assert.IsFalse(emit.SelfSource);
67 Assert.IsNotNull(emit.User);
68
69 var channel = _server.Channels["#chan"];
70 Assert.AreEqual(channel, emit.Channel);
71 }
72
73 [TestMethod]
74 public void EmitKick()
75 {
76 _server.Parse(new(":nickname JOIN #chan"));
77
78 var user = _server.Users["nickname"];
79 var channel = _server.Channels["#chan"];
80 _server.Parse(new(":other JOIN #chan"));
81 var userOther = _server.Users["other"];
82 var emit = _server.Parse(new(":nickname KICK #chan other :reason"));
83
84 Assert.IsNotNull(emit);
85 Assert.AreEqual("KICK", emit.Command);
86 Assert.AreEqual("reason", emit.Text);
87 Assert.IsTrue(emit.SelfSource);
88 Assert.AreEqual(user, emit.UserSource);
89 Assert.AreEqual(userOther, emit.UserTarget);
90 Assert.AreEqual(channel, emit.Channel);
91 }
92
93 [TestMethod]
94 public void EmitMode()
95 {
96 var emit = _server.Parse(new("MODE nickname x+i-i+wi-wi"));
97
98 Assert.IsNotNull(emit);
99 Assert.AreEqual("MODE", emit.Command);
100 Assert.IsTrue(emit.SelfTarget);
101 CollectionAssert.AreEqual(new List<string>
102 {
103 "+x",
104 "+i",
105 "-i",
106 "+w",
107 "+i",
108 "-w",
109 "-i"
110 }, emit.Tokens);
111 }
112}