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