IRC parsing, tokenization, and state handling in C#
at tunit 74 lines 2.2 kB view raw
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}