IRC parsing, tokenization, and state handling in C#
1// ReSharper disable InconsistentNaming
2// ReSharper disable StringLiteralTypo
3namespace IRCSharp.Tests.States;
4
5[TestClass]
6public class ISupport
7{
8 private Server _server;
9
10 [TestInitialize]
11 public void TestInitialize()
12 {
13 _server = new("test");
14 _server.Parse(new("001 nickname"));
15 }
16
17 [TestMethod]
18 public void ChanModes()
19 {
20 CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.ListModes);
21 CollectionAssert.AreEqual(new List<string> {"k"}, _server.ISupport.ChanModes.SettingBModes);
22 CollectionAssert.AreEqual(new List<string> {"l"}, _server.ISupport.ChanModes.SettingCModes);
23 CollectionAssert.AreEqual(new List<string>
24 {
25 "i",
26 "m",
27 "n",
28 "p",
29 "s",
30 "t"
31 }, _server.ISupport.ChanModes.SettingDModes);
32
33 _server.Parse(new("005 * CHANMODES=a,b,c,d *"));
34
35 CollectionAssert.AreEqual(new List<string> {"a"}, _server.ISupport.ChanModes.ListModes);
36 CollectionAssert.AreEqual(new List<string> {"b"}, _server.ISupport.ChanModes.SettingBModes);
37 CollectionAssert.AreEqual(new List<string> {"c"}, _server.ISupport.ChanModes.SettingCModes);
38 CollectionAssert.AreEqual(new List<string> {"d"}, _server.ISupport.ChanModes.SettingDModes);
39 }
40
41 [TestMethod]
42 public void Prefix()
43 {
44 CollectionAssert.AreEqual(new List<string> {"o", "v"}, _server.ISupport.Prefix.Modes);
45 CollectionAssert.AreEqual(new List<string> {"@", "+"}, _server.ISupport.Prefix.Prefixes);
46
47 Assert.AreEqual("@", _server.ISupport.Prefix.FromMode("o"));
48 Assert.IsNull(_server.ISupport.Prefix.FromMode("a"));
49 Assert.AreEqual("o", _server.ISupport.Prefix.FromPrefix("@"));
50 Assert.IsNull(_server.ISupport.Prefix.FromPrefix("&"));
51
52 _server.Parse(new("005 * PREFIX=(qaohv)~&@%+ *"));
53 CollectionAssert.AreEqual(new List<string>
54 {
55 "q",
56 "a",
57 "o",
58 "h",
59 "v"
60 }, _server.ISupport.Prefix.Modes);
61 CollectionAssert.AreEqual(new List<string>
62 {
63 "~",
64 "&",
65 "@",
66 "%",
67 "+"
68 }, _server.ISupport.Prefix.Prefixes);
69 Assert.AreEqual("&", _server.ISupport.Prefix.FromMode("a"));
70 Assert.AreEqual("a", _server.ISupport.Prefix.FromPrefix("&"));
71 }
72
73 [TestMethod]
74 public void ChanTypes()
75 {
76 CollectionAssert.AreEqual(new List<string> {"#"}, _server.ISupport.ChanTypes);
77 _server.Parse(new("005 * CHANTYPES=#& *"));
78 CollectionAssert.AreEqual(new List<string> {"#", "&"}, _server.ISupport.ChanTypes);
79 }
80
81 [TestMethod]
82 public void Modes()
83 {
84 Assert.AreEqual(3, _server.ISupport.Modes);
85
86 _server.Parse(new("005 * MODES *"));
87 Assert.AreEqual(-1, _server.ISupport.Modes);
88
89 _server.Parse(new("005 * MODES=5 *"));
90 Assert.AreEqual(5, _server.ISupport.Modes);
91 }
92
93 [TestMethod]
94 public void Rfc1459()
95 {
96 Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
97 _server.Parse(new("005 * CASEMAPPING=rfc1459 *"));
98 Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
99 var lower = _server.CaseFold(@"ÀTEST[]~\");
100 Assert.AreEqual("Àtest{}^|", lower);
101 }
102
103 [TestMethod]
104 public void Ascii()
105 {
106 _server.Parse(new("005 * CASEMAPPING=ascii *"));
107 Assert.AreEqual(IRCStates.Casemap.CaseMapping.Ascii, _server.ISupport.CaseMapping);
108 var lower = _server.CaseFold(@"ÀTEST[]~\");
109 Assert.AreEqual(@"Àtest[]~\", lower);
110 }
111
112 [TestMethod]
113 public void FallbackToRfc1459()
114 {
115 _server.Parse(new("005 * CASEMAPPING=nonexistent *"));
116 Assert.AreEqual(IRCStates.Casemap.CaseMapping.Rfc1459, _server.ISupport.CaseMapping);
117 var lower = _server.CaseFold(@"ÀTEST[]~\");
118 Assert.AreEqual("Àtest{}^|", lower);
119 }
120
121 [TestMethod]
122 public void Network()
123 {
124 Assert.IsNull(_server.ISupport.Network);
125 _server.Parse(new("005 * NETWORK=testnet *"));
126 Assert.AreEqual("testnet", _server.ISupport.Network);
127 }
128
129 [TestMethod]
130 public void StatusMsg()
131 {
132 CollectionAssert.AreEqual(new List<string>(), _server.ISupport.StatusMsg);
133 _server.Parse(new("005 * STATUSMSG=&@ *"));
134 CollectionAssert.AreEqual(new List<string> {"&", "@"}, _server.ISupport.StatusMsg);
135 }
136
137 [TestMethod]
138 public void CallerId()
139 {
140 Assert.IsNull(_server.ISupport.CallerId);
141
142 _server.Parse(new("005 * CALLERID=U *"));
143 Assert.AreEqual("U", _server.ISupport.CallerId);
144
145 _server.Parse(new("005 * CALLERID *"));
146 Assert.AreEqual("g", _server.ISupport.CallerId);
147 }
148
149 [TestMethod]
150 public void Excepts()
151 {
152 Assert.IsNull(_server.ISupport.Excepts);
153
154 _server.Parse(new("005 * EXCEPTS=U *"));
155 Assert.AreEqual("U", _server.ISupport.Excepts);
156
157 _server.Parse(new("005 * EXCEPTS *"));
158 Assert.AreEqual("e", _server.ISupport.Excepts);
159 }
160
161 [TestMethod]
162 public void Invex()
163 {
164 Assert.IsNull(_server.ISupport.Invex);
165
166 _server.Parse(new("005 * INVEX=U *"));
167 Assert.AreEqual("U", _server.ISupport.Invex);
168
169 _server.Parse(new("005 * INVEX *"));
170 Assert.AreEqual("I", _server.ISupport.Invex);
171 }
172
173 [TestMethod]
174 public void Whox()
175 {
176 Assert.IsFalse(_server.ISupport.Whox);
177
178 _server.Parse(new("005 * WHOX *"));
179 Assert.IsTrue(_server.ISupport.Whox);
180 }
181
182 [TestMethod]
183 public void Monitor()
184 {
185 Assert.IsNull(_server.ISupport.Monitor);
186
187 _server.Parse(new("005 * MONITOR=123 *"));
188 Assert.AreEqual(123, _server.ISupport.Monitor);
189
190 _server.Parse(new("005 * MONITOR *"));
191 Assert.AreEqual(-1, _server.ISupport.Monitor);
192 }
193
194 [TestMethod]
195 public void Watch()
196 {
197 Assert.IsNull(_server.ISupport.Watch);
198
199 _server.Parse(new("005 * WATCH=123 *"));
200 Assert.AreEqual(123, _server.ISupport.Watch);
201
202 _server.Parse(new("005 * WATCH *"));
203 Assert.AreEqual(-1, _server.ISupport.Watch);
204 }
205}