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