diff --git a/Projects/Server.Tests/Tests/Geometry/Point2DTests.cs b/Projects/Server.Tests/Tests/Geometry/Point2DTests.cs new file mode 100644 index 000000000..251beff74 --- /dev/null +++ b/Projects/Server.Tests/Tests/Geometry/Point2DTests.cs @@ -0,0 +1,17 @@ +using System; +using Xunit; + +namespace Server.Tests +{ + public class Point2DTests + { + [Fact] + public void TestToString() + { + Assert.Equal("(0, 0)", new Point2D(0, 0).ToString()); + Assert.Equal("(1, 1)", new Point2D(1, 1).ToString()); + Assert.Equal($"({Int32.MaxValue}, {Int32.MaxValue})", new Point2D(Int32.MaxValue, Int32.MaxValue).ToString()); + Assert.Equal($"({Int32.MinValue}, {Int32.MinValue})", new Point2D(Int32.MinValue, Int32.MinValue).ToString()); + } + } +} diff --git a/Projects/Server/Geometry/Point2D.cs b/Projects/Server/Geometry/Point2D.cs index 63bee4c40..b0c407853 100644 --- a/Projects/Server/Geometry/Point2D.cs +++ b/Projects/Server/Geometry/Point2D.cs @@ -20,7 +20,7 @@ namespace Server; [Parsable] public struct Point2D : IPoint2D, IComparable, IComparable, IEquatable, IEquatable, - IEquatable + IEquatable, ISpanFormattable { internal int m_X; internal int m_Y; @@ -51,8 +51,6 @@ public struct Point2D { } - public override string ToString() => $"({m_X}, {m_Y})"; - public static Point2D Parse(string value) { var start = value.IndexOfOrdinal('('); @@ -112,4 +110,26 @@ public struct Point2D var xComparison = m_X.CompareTo(other.X); return xComparison != 0 ? xComparison : m_Y.CompareTo(other.Y); } + + public bool TryFormat(Span destination, out int charsWritten, ReadOnlySpan format, IFormatProvider provider) + { + return destination.TryWrite(provider, $"({m_X}, {m_Y})", out charsWritten); + } + + public override string ToString() { + // Maximum number of characters that are needed to represent this: + // 4 characters for (, ) + // Up to 11 characters to represent each integer + Span span = stackalloc char[4+11*2]; + this.TryFormat(span, out var charsWritten, null, null); + return span.Slice(0, charsWritten).ToString(); + } + + public string ToString(string format, IFormatProvider formatProvider) + { + // format and formatProvider are not doing anything right now, so use the + // default ToString implementation. + return ToString(); + } + }