diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 9565c361..72e8d959 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -213,7 +213,7 @@ public string Add(QueryString other) /// True if both PathString values are equal public bool Equals(PathString other) { - return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + return Equals(other, StringComparison.OrdinalIgnoreCase); } /// @@ -224,6 +224,10 @@ public bool Equals(PathString other) /// True if both PathString values are equal public bool Equals(PathString other, StringComparison comparisonType) { + if (!HasValue && !other.HasValue) + { + return true; + } return string.Equals(_value, other._value, comparisonType); } @@ -236,9 +240,9 @@ public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { - return false; + return !HasValue; } - return obj is PathString && Equals((PathString)obj, StringComparison.OrdinalIgnoreCase); + return obj is PathString && Equals((PathString)obj); } /// @@ -247,7 +251,7 @@ public override bool Equals(object obj) /// The hash code public override int GetHashCode() { - return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + return (HasValue ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); } /// @@ -258,7 +262,7 @@ public override int GetHashCode() /// True if both PathString values are equal public static bool operator ==(PathString left, PathString right) { - return left.Equals(right, StringComparison.OrdinalIgnoreCase); + return left.Equals(right); } /// @@ -269,7 +273,7 @@ public override int GetHashCode() /// True if both PathString values are not equal public static bool operator !=(PathString left, PathString right) { - return !left.Equals(right, StringComparison.OrdinalIgnoreCase); + return !left.Equals(right); } /// diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index e1be9d98..6aa15216 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -16,6 +16,44 @@ public void CtorThrows_IfPathDoesNotHaveLeadingSlash() ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", "The path in 'value' must start with '/'."); } + [Fact] + public void Equals_EmptyPathStringAndDefaultPathString() + { + // Act and Assert + Assert.Equal(PathString.Empty, default(PathString)); + Assert.Equal(default(PathString), PathString.Empty); + Assert.True(PathString.Empty == default(PathString)); + Assert.True(default(PathString) == PathString.Empty); + Assert.True(PathString.Empty.Equals(default(PathString))); + Assert.True(default(PathString).Equals(PathString.Empty)); + } + + [Fact] + public void NotEquals_DefaultPathStringAndNonNullPathString() + { + // Arrange + var pathString = new PathString("/hello"); + + // Act and Assert + Assert.NotEqual(pathString, default(PathString)); + } + + [Fact] + public void NotEquals_EmptyPathStringAndNonNullPathString() + { + // Arrange + var pathString = new PathString("/hello"); + + // Act and Assert + Assert.NotEqual(pathString, PathString.Empty); + } + + [Fact] + public void HashCode_CheckNullAndEmptyHaveSameHashcodes() + { + Assert.Equal(PathString.Empty.GetHashCode(), default(PathString).GetHashCode()); + } + [Theory] [InlineData(null, null)] [InlineData("", null)]