IRC parsing, tokenization, and state handling in C#
1namespace IRCSharp.Tests.Tokenization;
2
3public class StatefulDecoder
4{
5 private IRCTokens.StatefulDecoder _decoder = new();
6
7 [Test]
8 public async Task Partial()
9 {
10 var lines = _decoder.Push("PRIVMSG ");
11 await Assert.That(lines).IsEmpty();
12
13 lines = _decoder.Push("#channel hello\r\n");
14 await Assert.That(lines).HasCount(1);
15
16 var line = new Line("PRIVMSG #channel hello");
17 await Assert.That(lines).Contains(line);
18 }
19
20 [Test]
21 public async Task Multiple()
22 {
23 var lines = _decoder.Push("PRIVMSG #channel1 hello\r\nPRIVMSG #channel2 hello\r\n");
24 await Assert.That(lines).HasCount(2);
25
26 await Assert.That(lines[0]).IsEqualTo(new Line("PRIVMSG #channel1 hello"));
27 await Assert.That(lines[1]).IsEqualTo(new Line("PRIVMSG #channel2 hello"));
28 }
29
30 [Test]
31 public async Task EncodingIso8859()
32 {
33 var iso8859 = Encoding.Latin1;
34 var decoder = new IRCTokens.StatefulDecoder {Encoding = iso8859};
35 var bytes = iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n");
36 var lines = decoder.Push(bytes, bytes.Length);
37 var line = new Line("PRIVMSG #channel :hello Ç");
38 await Assert.That(lines[0]).IsEqualTo(line);
39 }
40
41 [Test]
42 public async Task EncodingFallback()
43 {
44 var latin1 = Encoding.Latin1;
45 var decoder = new IRCTokens.StatefulDecoder {Encoding = null, Fallback = latin1};
46 var bytes = latin1.GetBytes("PRIVMSG #channel hélló\r\n");
47 var lines = decoder.Push(bytes, bytes.Length);
48 await Assert.That(lines).HasCount(1);
49 await Assert.That(lines[0]).IsEqualTo(new Line("PRIVMSG #channel hélló"));
50 }
51
52 [Test]
53 public async Task Empty()
54 {
55 var lines = _decoder.Push(string.Empty);
56 await Assert.That(lines).IsEmpty();
57 }
58
59 [Test]
60 public async Task BufferUnfinished()
61 {
62 _decoder.Push("PRIVMSG #channel hello");
63 var lines = _decoder.Push(string.Empty);
64 await Assert.That(lines).IsEmpty();
65 }
66
67 [Test]
68 public async Task Clear()
69 {
70 _decoder.Push("PRIVMSG ");
71 _decoder.Clear();
72 await Assert.That(_decoder.Pending).IsEmpty();
73 }
74}