namespace IRCSharp.Tests.Tokenization; public class StatefulDecoder { private IRCTokens.StatefulDecoder _decoder = new(); [Test] public async Task Partial() { var lines = _decoder.Push("PRIVMSG "); await Assert.That(lines).IsEmpty(); lines = _decoder.Push("#channel hello\r\n"); await Assert.That(lines).HasCount(1); var line = new Line("PRIVMSG #channel hello"); await Assert.That(lines).Contains(line); } [Test] public async Task Multiple() { var lines = _decoder.Push("PRIVMSG #channel1 hello\r\nPRIVMSG #channel2 hello\r\n"); await Assert.That(lines).HasCount(2); await Assert.That(lines[0]).IsEqualTo(new Line("PRIVMSG #channel1 hello")); await Assert.That(lines[1]).IsEqualTo(new Line("PRIVMSG #channel2 hello")); } [Test] public async Task EncodingIso8859() { var iso8859 = Encoding.Latin1; var decoder = new IRCTokens.StatefulDecoder {Encoding = iso8859}; var bytes = iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n"); var lines = decoder.Push(bytes, bytes.Length); var line = new Line("PRIVMSG #channel :hello Ç"); await Assert.That(lines[0]).IsEqualTo(line); } [Test] public async Task EncodingFallback() { var latin1 = Encoding.Latin1; var decoder = new IRCTokens.StatefulDecoder {Encoding = null, Fallback = latin1}; var bytes = latin1.GetBytes("PRIVMSG #channel hélló\r\n"); var lines = decoder.Push(bytes, bytes.Length); await Assert.That(lines).HasCount(1); await Assert.That(lines[0]).IsEqualTo(new Line("PRIVMSG #channel hélló")); } [Test] public async Task Empty() { var lines = _decoder.Push(string.Empty); await Assert.That(lines).IsEmpty(); } [Test] public async Task BufferUnfinished() { _decoder.Push("PRIVMSG #channel hello"); var lines = _decoder.Push(string.Empty); await Assert.That(lines).IsEmpty(); } [Test] public async Task Clear() { _decoder.Push("PRIVMSG "); _decoder.Clear(); await Assert.That(_decoder.Pending).IsEmpty(); } }