From c503a31ff3294d02bb38e276fc306d2bacd4db78 Mon Sep 17 00:00:00 2001 From: Roni Nevalainen Date: Thu, 23 Jul 2020 22:00:23 +0300 Subject: [PATCH] Replaced string.Compare Replaced string.Compare in Microsoft.Extensions.Primitives.StringSegment string.Compare caused issues in StringSegment.EndsWith when the Buffer is only one character long. Fix #39140 --- .../src/StringSegment.cs | 27 ++++++------- .../tests/StringSegmentTest.cs | 39 +++++++++++++++++++ 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs index 288b0e773b3172..a5ca79b0b0e7e0 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs @@ -310,15 +310,14 @@ public bool StartsWith(string text, StringComparison comparisonType) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.text); } - bool result = false; - int textLength = text.Length; - - if (HasValue && Length >= textLength) + if (HasValue) { - result = string.Compare(Buffer, Offset, text, 0, textLength, comparisonType) == 0; + return this.AsSpan().StartsWith(text.AsSpan(), comparisonType); + } + else + { + return false; } - - return result; } /// @@ -338,16 +337,14 @@ public bool EndsWith(string text, StringComparison comparisonType) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.text); } - bool result = false; - int textLength = text.Length; - int comparisonLength = Offset + Length - textLength; - - if (HasValue && comparisonLength > 0) + if (HasValue) { - result = string.Compare(Buffer, comparisonLength, text, 0, textLength, comparisonType) == 0; + return this.AsSpan().EndsWith(text.AsSpan(), comparisonType); + } + else + { + return false; } - - return result; } /// diff --git a/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs b/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs index 3c7c941c338a2a..667bc958210608 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs @@ -258,6 +258,19 @@ public void StringSegment_EndsWith_Valid(string candidate, StringComparison comp Assert.Equal(expectedResult, result); } + [Fact] + public void StringSegment_EndsWith_Slash() + { + // Arrange + var segment = new StringSegment("/"); + + // Act + var result = segment.EndsWith("/", StringComparison.Ordinal); + + // Assert + Assert.True(result); + } + [Fact] public void StringSegment_EndsWith_Invalid() { @@ -586,6 +599,32 @@ public void StringSegment_Equals_StringSegment_Valid(StringSegment candidate, St Assert.Equal(expectedResult, result); } + [Fact] + public void StringSegment_Equals_InvariantCultureIgnoreCase() + { + // Arrange + var segment = new StringSegment("xaex", 1, 2); + + // Act + var result = segment.Equals("\u00C6", StringComparison.InvariantCultureIgnoreCase); + + // Assert + Assert.True(result); + } + + [Fact] + public void StringSegment_Equals_InvariantCultureIgnoreCase_StringSegment() + { + // Arrange + var segment = new StringSegment("xaex", 1, 2); + + // Act + var result = segment.Equals(new StringSegment("\u00C6"), StringComparison.InvariantCultureIgnoreCase); + + // Assert + Assert.True(result); + } + [Fact] public void StringSegment_EqualsStringSegment_Invalid() {