diff options
Diffstat (limited to 'IrcTokens')
-rw-r--r-- | IrcTokens/Hostmask.cs | 30 | ||||
-rw-r--r-- | IrcTokens/Line.cs | 47 | ||||
-rw-r--r-- | IrcTokens/Protocol.cs | 2 | ||||
-rw-r--r-- | IrcTokens/StatefulDecoder.cs | 8 | ||||
-rw-r--r-- | IrcTokens/StatefulEncoder.cs | 4 | ||||
-rw-r--r-- | IrcTokens/Tests/Format.cs (renamed from IrcTokens/Tests/FormatTests.cs) | 36 | ||||
-rw-r--r-- | IrcTokens/Tests/Hostmask.cs (renamed from IrcTokens/Tests/HostmaskTests.cs) | 12 | ||||
-rw-r--r-- | IrcTokens/Tests/Parser.cs (renamed from IrcTokens/Tests/ParserTests.cs) | 10 | ||||
-rw-r--r-- | IrcTokens/Tests/StatefulDecoder.cs (renamed from IrcTokens/Tests/StatefulDecoderTests.cs) | 17 | ||||
-rw-r--r-- | IrcTokens/Tests/StatefulEncoder.cs (renamed from IrcTokens/Tests/StatefulEncoderTests.cs) | 11 | ||||
-rw-r--r-- | IrcTokens/Tests/Tokenization.cs (renamed from IrcTokens/Tests/TokenizationTests.cs) | 14 |
11 files changed, 124 insertions, 67 deletions
diff --git a/IrcTokens/Hostmask.cs b/IrcTokens/Hostmask.cs index 0b07f80..01fe7d5 100644 --- a/IrcTokens/Hostmask.cs +++ b/IrcTokens/Hostmask.cs @@ -5,29 +5,45 @@ namespace IrcTokens /// <summary> /// Represents the three parts of a hostmask. Parse with the constructor. /// </summary> - public class Hostmask + public class Hostmask : IEquatable<Hostmask> { public string NickName { get; set; } public string UserName { get; set; } public string HostName { get; set; } - public override string ToString() => _source; + public override string ToString() + { + return _source; + } - public override int GetHashCode() => _source.GetHashCode(StringComparison.Ordinal); + public override int GetHashCode() + { + return _source.GetHashCode(StringComparison.Ordinal); + } - public override bool Equals(object obj) + public bool Equals(Hostmask other) { - if (obj == null || GetType() != obj.GetType()) + if (other == null) + { return false; + } - return _source == ((Hostmask) obj)._source; + return _source == other._source; + } + + public override bool Equals(object obj) + { + return Equals(obj as Hostmask); } private readonly string _source; public Hostmask(string source) { - if (source == null) return; + if (source == null) + { + return; + } _source = source; diff --git a/IrcTokens/Line.cs b/IrcTokens/Line.cs index 9056097..24efe4a 100644 --- a/IrcTokens/Line.cs +++ b/IrcTokens/Line.cs @@ -8,7 +8,7 @@ namespace IrcTokens /// <summary> /// Tools to represent, parse, and format IRC lines /// </summary> - public class Line + public class Line : IEquatable<Line> { public Dictionary<string, string> Tags { get; set; } public string Source { get; set; } @@ -16,32 +16,52 @@ namespace IrcTokens public List<string> Params { get; set; } private Hostmask _hostmask; - private readonly string _rawLine; public override string ToString() { var vars = new List<string>(); if (Command != null) + { vars.Add($"command={Command}"); + } + if (Source != null) + { vars.Add($"source={Source}"); + } + if (Params != null && Params.Any()) + { vars.Add($"params=[{string.Join(",", Params)}]"); + } + if (Tags != null && Tags.Any()) + { vars.Add($"tags=[{string.Join(";", Tags.Select(kvp => $"{kvp.Key}={kvp.Value}"))}]"); + } return $"Line({string.Join(", ", vars)})"; } - public override int GetHashCode() => Format().GetHashCode(StringComparison.Ordinal); + public override int GetHashCode() + { + return Format().GetHashCode(StringComparison.Ordinal); + } - public override bool Equals(object obj) + public bool Equals(Line other) { - if (obj == null || GetType() != obj.GetType()) + if (other == null) + { return false; + } - return Format() == ((Line) obj).Format(); + return Format() == other.Format(); + } + + public override bool Equals(object obj) + { + return Equals(obj as Line); } public Hostmask Hostmask => @@ -56,9 +76,10 @@ namespace IrcTokens public Line(string line) { if (string.IsNullOrWhiteSpace(line)) + { throw new ArgumentNullException(nameof(line)); + } - _rawLine = line; string[] split; if (line.StartsWith('@')) @@ -97,7 +118,7 @@ namespace IrcTokens Params = line.Contains(' ', StringComparison.Ordinal) ? line.Split(' ', StringSplitOptions.RemoveEmptyEntries).ToList() - : new List<string> {line}; + : new List<string> { line }; if (Params[0].StartsWith(':')) { @@ -135,7 +156,9 @@ namespace IrcTokens } if (Source != null) + { outs.Add($":{Source}"); + } outs.Add(Command); @@ -147,14 +170,22 @@ namespace IrcTokens foreach (var p in Params) { if (p.Contains(' ', StringComparison.Ordinal)) + { throw new ArgumentException(@"non-last parameters cannot have spaces", p); + } + if (p.StartsWith(':')) + { throw new ArgumentException(@"non-last parameters cannot start with colon", p); + } } outs.AddRange(Params); if (string.IsNullOrWhiteSpace(last) || last.Contains(' ', StringComparison.Ordinal) || last.StartsWith(':')) + { last = $":{last}"; + } + outs.Add(last); } diff --git a/IrcTokens/Protocol.cs b/IrcTokens/Protocol.cs index 3769ea3..6ddb079 100644 --- a/IrcTokens/Protocol.cs +++ b/IrcTokens/Protocol.cs @@ -50,7 +50,9 @@ namespace IrcTokens } } else + { unescaped.Append(current); + } } return unescaped.ToString(); diff --git a/IrcTokens/StatefulDecoder.cs b/IrcTokens/StatefulDecoder.cs index 2304431..47106d9 100644 --- a/IrcTokens/StatefulDecoder.cs +++ b/IrcTokens/StatefulDecoder.cs @@ -18,8 +18,10 @@ namespace IrcTokens set { if (value != null) + { _encoding = Encoding.GetEncoding(value.CodePage, EncoderFallback.ExceptionFallback, DecoderFallback.ReplacementFallback); + } } } @@ -30,8 +32,10 @@ namespace IrcTokens set { if (value != null) - _encoding = Encoding.GetEncoding(value.CodePage, EncoderFallback.ReplacementFallback, + { + _fallback = Encoding.GetEncoding(value.CodePage, EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback); + } } } @@ -55,7 +59,9 @@ namespace IrcTokens public List<Line> Push(byte[] data) { if (data == null || data.Length == 0) + { return null; + } _buffer = _buffer.Concat(data).ToArray(); diff --git a/IrcTokens/StatefulEncoder.cs b/IrcTokens/StatefulEncoder.cs index 17295eb..c036400 100644 --- a/IrcTokens/StatefulEncoder.cs +++ b/IrcTokens/StatefulEncoder.cs @@ -16,8 +16,10 @@ namespace IrcTokens set { if (value != null) + { _encoding = Encoding.GetEncoding(value.CodePage, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); + } } } @@ -52,7 +54,9 @@ namespace IrcTokens public void Push(Line line) { if (line == null) + { throw new ArgumentNullException(nameof(line)); + } PendingBytes = PendingBytes.Concat(Encoding.GetBytes($"{line.Format()}\r\n")).ToArray(); _bufferedLines.Enqueue(line); diff --git a/IrcTokens/Tests/FormatTests.cs b/IrcTokens/Tests/Format.cs index a804c1d..64f974a 100644 --- a/IrcTokens/Tests/FormatTests.cs +++ b/IrcTokens/Tests/Format.cs @@ -5,16 +5,16 @@ using System.Collections.Generic; namespace IrcTokens.Tests { [TestClass] - public class FormatTests + public class Format { [TestMethod] public void TestTags() { var line = new Line { - Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello"}, - Tags = new Dictionary<string, string> {{"id", "\\" + " " + ";" + "\r\n"}} + Command = "PRIVMSG", + Params = new List<string> { "#channel", "hello" }, + Tags = new Dictionary<string, string> { { "id", "\\" + " " + ";" + "\r\n" } } }.Format(); Assert.AreEqual("@id=\\\\\\s\\:\\r\\n PRIVMSG #channel hello", line); @@ -25,8 +25,8 @@ namespace IrcTokens.Tests { var line = new Line { - Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello"} + Command = "PRIVMSG", + Params = new List<string> { "#channel", "hello" } }.Format(); Assert.AreEqual("PRIVMSG #channel hello", line); @@ -38,8 +38,8 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello"}, - Tags = new Dictionary<string, string> {{"a", null}} + Params = new List<string> { "#channel", "hello" }, + Tags = new Dictionary<string, string> { { "a", null } } }.Format(); Assert.AreEqual("@a PRIVMSG #channel hello", line); @@ -51,8 +51,8 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello"}, - Tags = new Dictionary<string, string> {{"a", ""}} + Params = new List<string> { "#channel", "hello" }, + Tags = new Dictionary<string, string> { { "a", "" } } }.Format(); Assert.AreEqual("@a PRIVMSG #channel hello", line); @@ -64,7 +64,7 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello"}, + Params = new List<string> { "#channel", "hello" }, Source = "nick!user@host" }.Format(); @@ -74,14 +74,14 @@ namespace IrcTokens.Tests [TestMethod] public void TestCommandLowercase() { - var line = new Line {Command = "privmsg"}.Format(); + var line = new Line { Command = "privmsg" }.Format(); Assert.AreEqual("privmsg", line); } [TestMethod] public void TestCommandUppercase() { - var line = new Line {Command = "PRIVMSG"}.Format(); + var line = new Line { Command = "PRIVMSG" }.Format(); Assert.AreEqual("PRIVMSG", line); } @@ -91,7 +91,7 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", "hello world"} + Params = new List<string> { "#channel", "hello world" } }.Format(); Assert.AreEqual("PRIVMSG #channel :hello world", line); @@ -103,7 +103,7 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", "helloworld"} + Params = new List<string> { "#channel", "helloworld" } }.Format(); Assert.AreEqual("PRIVMSG #channel helloworld", line); @@ -115,7 +115,7 @@ namespace IrcTokens.Tests var line = new Line { Command = "PRIVMSG", - Params = new List<string> {"#channel", ":helloworld"} + Params = new List<string> { "#channel", ":helloworld" } }.Format(); Assert.AreEqual("PRIVMSG #channel ::helloworld", line); @@ -129,7 +129,7 @@ namespace IrcTokens.Tests new Line { Command = "USER", - Params = new List<string> {"user", "0 *", "real name"} + Params = new List<string> { "user", "0 *", "real name" } }.Format(); }); } @@ -142,7 +142,7 @@ namespace IrcTokens.Tests new Line { Command = "PRIVMSG", - Params = new List<string> {":#channel", "hello"} + Params = new List<string> { ":#channel", "hello" } }.Format(); }); } diff --git a/IrcTokens/Tests/HostmaskTests.cs b/IrcTokens/Tests/Hostmask.cs index 78b8a54..51bc182 100644 --- a/IrcTokens/Tests/HostmaskTests.cs +++ b/IrcTokens/Tests/Hostmask.cs @@ -3,12 +3,12 @@ namespace IrcTokens.Tests { [TestClass] - public class HostmaskTests + public class Hostmask { [TestMethod] public void TestHostmask() { - var hostmask = new Hostmask("nick!user@host"); + var hostmask = new IrcTokens.Hostmask("nick!user@host"); Assert.AreEqual("nick", hostmask.NickName); Assert.AreEqual("user", hostmask.UserName); Assert.AreEqual("host", hostmask.HostName); @@ -17,7 +17,7 @@ namespace IrcTokens.Tests [TestMethod] public void TestNoHostName() { - var hostmask = new Hostmask("nick!user"); + var hostmask = new IrcTokens.Hostmask("nick!user"); Assert.AreEqual("nick", hostmask.NickName); Assert.AreEqual("user", hostmask.UserName); Assert.IsNull(hostmask.HostName); @@ -26,7 +26,7 @@ namespace IrcTokens.Tests [TestMethod] public void TestNoUserName() { - var hostmask = new Hostmask("nick@host"); + var hostmask = new IrcTokens.Hostmask("nick@host"); Assert.AreEqual("nick", hostmask.NickName); Assert.IsNull(hostmask.UserName); Assert.AreEqual("host", hostmask.HostName); @@ -35,7 +35,7 @@ namespace IrcTokens.Tests [TestMethod] public void TestOnlyNickName() { - var hostmask = new Hostmask("nick"); + var hostmask = new IrcTokens.Hostmask("nick"); Assert.AreEqual("nick", hostmask.NickName); Assert.IsNull(hostmask.UserName); Assert.IsNull(hostmask.HostName); @@ -45,7 +45,7 @@ namespace IrcTokens.Tests public void TestHostmaskFromLine() { var line = new Line(":nick!user@host PRIVMSG #channel hello"); - var hostmask = new Hostmask("nick!user@host"); + var hostmask = new IrcTokens.Hostmask("nick!user@host"); Assert.AreEqual(hostmask.ToString(), line.Hostmask.ToString()); Assert.AreEqual("nick", line.Hostmask.NickName); Assert.AreEqual("user", line.Hostmask.UserName); diff --git a/IrcTokens/Tests/ParserTests.cs b/IrcTokens/Tests/Parser.cs index ad734cf..df70b92 100644 --- a/IrcTokens/Tests/ParserTests.cs +++ b/IrcTokens/Tests/Parser.cs @@ -1,15 +1,15 @@ -using System.Collections.Generic; +using IrcTokens.Tests.Data; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Collections.Generic; using System.Globalization; using System.IO; -using IrcTokens.Tests.Data; -using Microsoft.VisualStudio.TestTools.UnitTesting; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; namespace IrcTokens.Tests { [TestClass] - public class ParserTests + public class Parser { private static T LoadYaml<T>(string path) { @@ -46,7 +46,7 @@ namespace IrcTokens.Tests { Command = atoms.Verb, Params = atoms.Params, - Source = atoms.Source ?? null, + Source = atoms.Source, Tags = atoms.Tags }.Format(); diff --git a/IrcTokens/Tests/StatefulDecoderTests.cs b/IrcTokens/Tests/StatefulDecoder.cs index 3e6a078..209a6cf 100644 --- a/IrcTokens/Tests/StatefulDecoderTests.cs +++ b/IrcTokens/Tests/StatefulDecoder.cs @@ -1,19 +1,18 @@ -using System.Collections.Generic; -using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Collections.Generic; using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; namespace IrcTokens.Tests { [TestClass] - public class StatefulDecoderTests + public class StatefulDecoder { - private StatefulDecoder _decoder; + private IrcTokens.StatefulDecoder _decoder; [TestInitialize] public void TestInitialize() { - _decoder = new StatefulDecoder(); + _decoder = new IrcTokens.StatefulDecoder(); } [TestMethod] @@ -26,7 +25,7 @@ namespace IrcTokens.Tests Assert.AreEqual(1, lines.Count); var line = new Line("PRIVMSG #channel hello"); - CollectionAssert.AreEqual(new List<Line> {line}, lines); + CollectionAssert.AreEqual(new List<Line> { line }, lines); } [TestMethod] @@ -45,7 +44,7 @@ namespace IrcTokens.Tests public void TestEncoding() { var iso8859 = Encoding.GetEncoding("iso-8859-1"); - _decoder = new StatefulDecoder {Encoding = iso8859}; + _decoder = new IrcTokens.StatefulDecoder { Encoding = iso8859 }; var lines = _decoder.Push(iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n")); var line = new Line("PRIVMSG #channel :hello Ç"); Assert.IsTrue(line.Equals(lines[0])); @@ -55,7 +54,7 @@ namespace IrcTokens.Tests public void TestEncodingFallback() { var latin1 = Encoding.GetEncoding("iso-8859-1"); - _decoder = new StatefulDecoder {Encoding = null, Fallback = latin1}; + _decoder = new IrcTokens.StatefulDecoder { Encoding = null, Fallback = latin1 }; var lines = _decoder.Push(latin1.GetBytes("PRIVMSG #channel hélló\r\n")); Assert.AreEqual(1, lines.Count); Assert.IsTrue(new Line("PRIVMSG #channel hélló").Equals(lines[0])); diff --git a/IrcTokens/Tests/StatefulEncoderTests.cs b/IrcTokens/Tests/StatefulEncoder.cs index 477b38d..e3ed70d 100644 --- a/IrcTokens/Tests/StatefulEncoderTests.cs +++ b/IrcTokens/Tests/StatefulEncoder.cs @@ -1,18 +1,17 @@ -using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; namespace IrcTokens.Tests { [TestClass] - public class StatefulEncoderTests + public class StatefulEncoder { - private StatefulEncoder _encoder; + private IrcTokens.StatefulEncoder _encoder; [TestInitialize] public void TestInitialize() { - _encoder = new StatefulEncoder(); + _encoder = new IrcTokens.StatefulEncoder(); } [TestMethod] @@ -64,7 +63,7 @@ namespace IrcTokens.Tests public void TestEncoding() { var iso8859 = Encoding.GetEncoding("iso-8859-1"); - _encoder = new StatefulEncoder {Encoding = iso8859}; + _encoder = new IrcTokens.StatefulEncoder { Encoding = iso8859 }; _encoder.Push(new Line("PRIVMSG #channel :hello Ç")); CollectionAssert.AreEqual(iso8859.GetBytes("PRIVMSG #channel :hello Ç\r\n"), _encoder.PendingBytes); } diff --git a/IrcTokens/Tests/TokenizationTests.cs b/IrcTokens/Tests/Tokenization.cs index 6d8a69d..c4970ed 100644 --- a/IrcTokens/Tests/TokenizationTests.cs +++ b/IrcTokens/Tests/Tokenization.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Collections.Generic; namespace IrcTokens.Tests { [TestClass] - public class TokenizationTests + public class Tokenization { [TestMethod] public void TestTagsMissing() @@ -87,14 +87,14 @@ namespace IrcTokens.Tests public void TestParamsTrailing() { var line = new Line("PRIVMSG #channel :hello world"); - CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params); + CollectionAssert.AreEqual(new List<string> { "#channel", "hello world" }, line.Params); } [TestMethod] public void TestParamsOnlyTrailing() { var line = new Line("PRIVMSG :hello world"); - CollectionAssert.AreEqual(new List<string> {"hello world"}, line.Params); + CollectionAssert.AreEqual(new List<string> { "hello world" }, line.Params); } [TestMethod] @@ -109,10 +109,10 @@ namespace IrcTokens.Tests public void TestAllTokens() { var line = new Line("@id=123 :nick!user@host PRIVMSG #channel :hello world"); - CollectionAssert.AreEqual(new Dictionary<string, string> {{"id", "123"}}, line.Tags); + CollectionAssert.AreEqual(new Dictionary<string, string> { { "id", "123" } }, line.Tags); Assert.AreEqual("nick!user@host", line.Source); Assert.AreEqual("PRIVMSG", line.Command); - CollectionAssert.AreEqual(new List<string> {"#channel", "hello world"}, line.Params); + CollectionAssert.AreEqual(new List<string> { "#channel", "hello world" }, line.Params); } } } |