IRC parsing, tokenization, and state handling in C#
1// ReSharper disable StringLiteralTypo
2namespace IRCSharp.Tests.States;
3
4[TestClass]
5public class Mode
6{
7 private Server _server;
8
9 [TestInitialize]
10 public void TestInitialize()
11 {
12 _server = new("test");
13 _server.Parse(new("001 nickname"));
14 }
15
16 [TestMethod]
17 public void UModeAdd()
18 {
19 _server.Parse(new("MODE nickname +i"));
20 CollectionAssert.AreEqual(new List<string> {"i"}, _server.Modes);
21 }
22
23 [TestMethod]
24 public void UModeRemove()
25 {
26 _server.Parse(new("MODE nickname +i"));
27 _server.Parse(new("MODE nickname -i"));
28 CollectionAssert.AreEqual(new List<string>(), _server.Modes);
29 }
30
31 [TestMethod]
32 public void PrefixAdd()
33 {
34 _server.Parse(new(":nickname JOIN #chan"));
35 _server.Parse(new("MODE #chan +ov nickname nickname"));
36
37 var user = _server.Users["nickname"];
38 var channel = _server.Channels["#chan"];
39 var channelUser = channel.Users[user.NickNameLower];
40 CollectionAssert.AreEqual(new List<string> {"o", "v"}, channelUser.Modes);
41 }
42
43 [TestMethod]
44 public void PrefixRemove()
45 {
46 _server.Parse(new(":nickname JOIN #chan"));
47 _server.Parse(new("MODE #chan +ov nickname nickname"));
48 _server.Parse(new("MODE #chan -ov nickname nickname"));
49
50 var user = _server.Users["nickname"];
51 var channel = _server.Channels["#chan"];
52 var channelUser = channel.Users[user.NickNameLower];
53 CollectionAssert.AreEqual(new List<string>(), channelUser.Modes);
54 }
55
56 [TestMethod]
57 public void ChannelListAdd()
58 {
59 _server.Parse(new(":nickname JOIN #chan"));
60 _server.Parse(new("MODE #chan +b asd!*@*"));
61
62 var channel = _server.Channels["#chan"];
63 CollectionAssert.AreEqual(new List<string> {"asd!*@*"}, channel.ListModes["b"]);
64 }
65
66 [TestMethod]
67 public void ChannelListRemove()
68 {
69 _server.Parse(new(":nickname JOIN #chan"));
70 _server.Parse(new("MODE #chan +b asd!*@*"));
71 _server.Parse(new("MODE #chan -b asd!*@*"));
72
73 var channel = _server.Channels["#chan"];
74 CollectionAssert.AreEqual(new Dictionary<string, List<string>>(), channel.ListModes);
75 }
76
77 [TestMethod]
78 public void ChannelTypeBAdd()
79 {
80 _server.Parse(new(":nickname JOIN #chan"));
81 _server.Parse(new("MODE #chan +k password"));
82
83 var channel = _server.Channels["#chan"];
84 CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "password"}}, channel.Modes);
85 }
86
87 [TestMethod]
88 public void ChannelTypeBRemove()
89 {
90 _server.Parse(new(":nickname JOIN #chan"));
91 _server.Parse(new("MODE #chan +k password"));
92 _server.Parse(new("MODE #chan -k *"));
93
94 var channel = _server.Channels["#chan"];
95 CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
96 }
97
98 [TestMethod]
99 public void ChannelTypeCAdd()
100 {
101 _server.Parse(new(":nickname JOIN #chan"));
102 _server.Parse(new("MODE #chan +l 100"));
103
104 var channel = _server.Channels["#chan"];
105 CollectionAssert.AreEqual(new Dictionary<string, string> {{"l", "100"}}, channel.Modes);
106 }
107
108 [TestMethod]
109 public void ChannelTypeCRemove()
110 {
111 _server.Parse(new(":nickname JOIN #chan"));
112 _server.Parse(new("MODE #chan +l 100"));
113 _server.Parse(new("MODE #chan -l"));
114
115 var channel = _server.Channels["#chan"];
116 CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
117 }
118
119 [TestMethod]
120 public void ChannelTypeDAdd()
121 {
122 _server.Parse(new(":nickname JOIN #chan"));
123 _server.Parse(new("MODE #chan +i"));
124
125 var channel = _server.Channels["#chan"];
126 CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}}, channel.Modes);
127 }
128
129 [TestMethod]
130 public void ChannelTypeDRemove()
131 {
132 _server.Parse(new(":nickname JOIN #chan"));
133 _server.Parse(new("MODE #chan +i"));
134 _server.Parse(new("MODE #chan -i"));
135
136 var channel = _server.Channels["#chan"];
137 CollectionAssert.AreEqual(new Dictionary<string, string>(), channel.Modes);
138 }
139
140 [TestMethod]
141 public void ChannelNumeric()
142 {
143 _server.Parse(new(":nickname JOIN #chan"));
144 _server.Parse(new("324 * #chan +bkli *!*@* pass 10"));
145
146 var channel = _server.Channels["#chan"];
147 CollectionAssert.AreEqual(new Dictionary<string, string> {{"k", "pass"}, {"l", "10"}, {"i", null}},
148 channel.Modes);
149 CollectionAssert.AreEqual(new List<string> {"*!*@*"}, channel.ListModes["b"]);
150 }
151
152 [TestMethod]
153 public void ChannelNumericWithoutPlus()
154 {
155 _server.Parse(new(":nickname JOIN #chan"));
156 _server.Parse(new("324 * #chan il 10"));
157
158 var channel = _server.Channels["#chan"];
159 CollectionAssert.AreEqual(new Dictionary<string, string> {{"i", null}, {"l", "10"}}, channel.Modes);
160 }
161
162 [TestMethod]
163 public void UserNumeric()
164 {
165 _server.Parse(new("221 * +iw"));
166 CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
167 }
168
169 [TestMethod]
170 public void UserNumericWithoutPlus()
171 {
172 _server.Parse(new("221 * iw"));
173 CollectionAssert.AreEqual(new List<string> {"i", "w"}, _server.Modes);
174 }
175}