namespace IRCSharp.Tests.Tokenization; public class Tokenization { [Test] public async Task TagsMissing() { var line = new Line("PRIVMSG #channel"); await Assert.That(line.Tags).IsNull(); } [Test] public async Task TagsMissingValue() { var line = new Line("@id= PRIVMSG #channel"); await Assert.That(line.Tags["id"]).IsEmpty(); } [Test] public async Task TagsMissingEqual() { var line = new Line("@id PRIVMSG #channel"); await Assert.That(line.Tags["id"]).IsNull(); } [Test] public async Task TagsUnescape() { var line = new Line(@"@id=1\\\:\r\n\s2 PRIVMSG #channel"); await Assert.That(line.Tags["id"]).IsEqualTo("1\\;\r\n 2"); } [Test] public async Task TagsOverlap() { var line = new Line(@"@id=1\\\s\\s PRIVMSG #channel"); await Assert.That(line.Tags["id"]).IsEqualTo(@"1\ \s"); } [Test] public async Task TagsLoneEndSlash() { var line = new Line("@id=1\\ PRIVMSG #channel"); await Assert.That(line.Tags["id"]).IsEqualTo("1"); } [Test] public async Task SourceWithoutTags() { var line = new Line(":nick!user@host PRIVMSG #channel"); await Assert.That(line.Source).IsEqualTo("nick!user@host"); } [Test] public async Task SourceWithTags() { var line = new Line("@id=123 :nick!user@host PRIVMSG #channel"); await Assert.That(line.Source).IsEqualTo("nick!user@host"); } [Test] public async Task SourceMissingWithoutTags() { var line = new Line("PRIVMSG #channel"); await Assert.That(line.Source).IsNull(); } [Test] public async Task SourceMissingWithTags() { var line = new Line("@id=123 PRIVMSG #channel"); await Assert.That(line.Source).IsNull(); } [Test] public async Task Command() { var line = new Line("privmsg #channel"); await Assert.That(line.Command).IsEqualTo("PRIVMSG"); } [Test] public async Task ParamsTrailing() { var line = new Line("PRIVMSG #channel :hello world"); await Assert.That(line.Params).IsEquivalentTo(["#channel", "hello world"]); } [Test] public async Task ParamsOnlyTrailing() { var line = new Line("PRIVMSG :hello world"); await Assert.That(line.Params).IsEquivalentTo(["hello world"]); } [Test] public async Task ParamsMissing() { var line = new Line("PRIVMSG"); await Assert.That(line.Command).IsEqualTo("PRIVMSG"); await Assert.That(line.Params).IsEmpty(); } [Test] public async Task AllTokens() { var line = new Line("@id=123 :nick!user@host PRIVMSG #channel :hello world"); await Assert.That(line.Tags).IsEquivalentTo(new Dictionary { { "id", "123" } }); await Assert.That(line.Source).IsEqualTo("nick!user@host"); await Assert.That(line.Command).IsEqualTo("PRIVMSG"); await Assert.That(line.Params).IsEquivalentTo(["#channel", "hello world"]); } [Test] public async Task NulByte() { var decoder = new IRCTokens.StatefulDecoder(); var bytes = ":nick!user@host PRIVMSG #channel :hello\0world"u8; var line = decoder.Push(bytes.ToArray(), bytes.Length).First(); await Assert.That(line.Params).IsEquivalentTo(["#channel", "hello"]); } }