From 14dbd518821b854cd7ba05dabbf421a17fcc5c34 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 18 Jul 2026 19:50:41 +1000 Subject: [PATCH] Use ordinal string comparisons Add explicit `StringComparison.Ordinal` to `StartsWith` checks in exception parsing and convention/plugin detection. This avoids culture-sensitive behavior and makes matching of Verify-specific prefixes deterministic. --- src/Verify.ExceptionParsing/Parser.cs | 20 +++++++++---------- .../ConventionCheck/InnerVerifyChecks.cs | 2 +- .../VerifierSettings_PluginConvention.cs | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Verify.ExceptionParsing/Parser.cs b/src/Verify.ExceptionParsing/Parser.cs index b37fdf6767..75cfaec4aa 100644 --- a/src/Verify.ExceptionParsing/Parser.cs +++ b/src/Verify.ExceptionParsing/Parser.cs @@ -42,7 +42,7 @@ static Result InnerParse(IEnumerable lines) var firstLine = enumerator.Current!; //MsTest exception start with "Test method..." so lets swallow them - if (firstLine.StartsWith("Test method")) + if (firstLine.StartsWith("Test method", StringComparison.Ordinal)) { if (!enumerator.MoveNext()) { @@ -62,30 +62,30 @@ static Result InnerParse(IEnumerable lines) continue; } - if (line.StartsWith("FileContent:")) + if (line.StartsWith("FileContent:", StringComparison.Ordinal)) { break; } - if (line.StartsWith("New:")) + if (line.StartsWith("New:", StringComparison.Ordinal)) { lineHandler = (next, scopedEnum) => AddFilePair(directory, next, scopedEnum, @new); continue; } - if (line.StartsWith("NotEqual:")) + if (line.StartsWith("NotEqual:", StringComparison.Ordinal)) { lineHandler = (next, scopedEnum) => AddFilePair(directory, next, scopedEnum, notEqual); continue; } - if (line.StartsWith("Equal:")) + if (line.StartsWith("Equal:", StringComparison.Ordinal)) { lineHandler = (next, scopedEnum) => AddFilePair(directory, next, scopedEnum, equal); continue; } - if (line.StartsWith("Delete:")) + if (line.StartsWith("Delete:", StringComparison.Ordinal)) { lineHandler = (next, _) => { @@ -112,7 +112,7 @@ static void ThrowIfEmpty(string directory) } } - if (firstLine.StartsWith("VerifyException : Directory: ")) + if (firstLine.StartsWith("VerifyException : Directory: ", StringComparison.Ordinal)) { var directory = firstLine[29..]; @@ -122,7 +122,7 @@ static void ThrowIfEmpty(string directory) } // MsTest - if (firstLine.StartsWith("VerifyException: Directory: ")) + if (firstLine.StartsWith("VerifyException: Directory: ", StringComparison.Ordinal)) { var directory = firstLine[28..]; @@ -131,7 +131,7 @@ static void ThrowIfEmpty(string directory) return directory; } - if (firstLine.StartsWith("Directory: ")) + if (firstLine.StartsWith("Directory: ", StringComparison.Ordinal)) { var directory = firstLine[11..]; @@ -145,7 +145,7 @@ static void ThrowIfEmpty(string directory) static string TrimStart(string next, string prefix) { - if (!next.StartsWith(prefix)) + if (!next.StartsWith(prefix, StringComparison.Ordinal)) { throw new ParseException($"Expected line to start with `{prefix}`. Line: {next}"); } diff --git a/src/Verify/ConventionCheck/InnerVerifyChecks.cs b/src/Verify/ConventionCheck/InnerVerifyChecks.cs index 945afdcce8..5970b7ce22 100644 --- a/src/Verify/ConventionCheck/InnerVerifyChecks.cs +++ b/src/Verify/ConventionCheck/InnerVerifyChecks.cs @@ -223,7 +223,7 @@ static bool HasIndentExtension(List extensions) => static bool HasAllExtensions(List extensions, string[] lines) { - var line = lines.FirstOrDefault(_ => _.StartsWith("[*.{received,verified}.")); + var line = lines.FirstOrDefault(_ => _.StartsWith("[*.{received,verified}.", StringComparison.Ordinal)); if (line == null) { return false; diff --git a/src/Verify/VerifierSettings_PluginConvention.cs b/src/Verify/VerifierSettings_PluginConvention.cs index 9ed27e7d36..828d9c143c 100644 --- a/src/Verify/VerifierSettings_PluginConvention.cs +++ b/src/Verify/VerifierSettings_PluginConvention.cs @@ -186,7 +186,7 @@ static void ProcessFile(string file) internal static bool TryGetType(string file, [NotNullWhen(true)] out Type? type) { var assemblyName = Path.GetFileNameWithoutExtension(file); - if (!assemblyName.StartsWith("Verify.")) + if (!assemblyName.StartsWith("Verify.", StringComparison.Ordinal)) { type = null; return false;