diff --git a/src/BenchmarkDotNet/Extensions/StringAndTextExtensions.cs b/src/BenchmarkDotNet/Extensions/StringAndTextExtensions.cs index c4f18193b8..a32e490faf 100644 --- a/src/BenchmarkDotNet/Extensions/StringAndTextExtensions.cs +++ b/src/BenchmarkDotNet/Extensions/StringAndTextExtensions.cs @@ -128,9 +128,11 @@ internal static StringBuilder AppendArgument(this StringBuilder stringBuilder, s { return stringBuilder; } - argument = " " + argument.Trim(); - stringBuilder.Append(argument); + if (stringBuilder.Length != 0) + stringBuilder.Append(' '); + + stringBuilder.Append(argument.Trim()); return stringBuilder; } diff --git a/tests/BenchmarkDotNet.Tests/StringExtensionsTests.cs b/tests/BenchmarkDotNet.Tests/StringExtensionsTests.cs index 2acb4db3ef..e14c938fe1 100644 --- a/tests/BenchmarkDotNet.Tests/StringExtensionsTests.cs +++ b/tests/BenchmarkDotNet.Tests/StringExtensionsTests.cs @@ -1,3 +1,4 @@ +using AwesomeAssertions; using BenchmarkDotNet.Extensions; using System.Text; @@ -33,29 +34,66 @@ public void HtmlEncodeCharacters() [InlineData(null, "")] [InlineData("", "")] [InlineData(" ", "")] - [InlineData("-n win-x64", " -n win-x64")] - [InlineData(" -n win-x64", " -n win-x64")] - [InlineData("-n win-x64 ", " -n win-x64")] - [InlineData(" -n Win-x64 ", " -n Win-x64")] - [InlineData(" a ", " a")] - [InlineData(" a ", " a")] - [InlineData(" \r\n a \r\n", " a")] - public void AppendArgumentMakesSureOneSpaceBeforeStringArgument(string? input, string expectedOutput) + [InlineData("--test", "--test")] + [InlineData(" --test", "--test")] + [InlineData("--test ", "--test")] + [InlineData("-n win-x64", "-n win-x64")] + [InlineData(" -n win-x64", "-n win-x64")] + [InlineData("-n win-x64 ", "-n win-x64")] + [InlineData(" -n Win-x64 ", "-n Win-x64")] + [InlineData(" a ", "a")] + [InlineData(" a ", "a")] + [InlineData(" \r\n a \r\n", "a")] + public void AppendArgumentWithEmptyStringBuilder(string? input, string expectedOutput) { + // Arrange var stringBuilder = new StringBuilder(); + + // Act var result = stringBuilder.AppendArgument(input).ToString(); - Assert.Equal(expectedOutput, result); + // Assert + result.Should().Be(expectedOutput); + } + + [Theory] + [InlineData(null, "")] + [InlineData("", "")] + [InlineData(" ", "")] + [InlineData("--test", "--test")] + [InlineData(" --test", "--test")] + [InlineData(" --test ", "--test")] + [InlineData("-n win-x64", "-n win-x64")] + [InlineData(" -n win-x64", "-n win-x64")] + [InlineData("-n win-x64 ", "-n win-x64")] + [InlineData(" -n Win-x64 ", "-n Win-x64")] + [InlineData(" a ", "a")] + [InlineData(" a ", "a")] + [InlineData(" \r\n a \r\n", "a")] + public void AppendArgumentMultipleTimes(string? input, string expectedOutput) + { + // Arrange + var stringBuilder = new StringBuilder(); + stringBuilder.AppendArgument("--firstArg"); + + // Act + var result = stringBuilder.AppendArgument(input).ToString(); + + // Assert + if (expectedOutput.IsBlank()) + result.Should().Be($"--firstArg"); + else + result.Should().Be($"--firstArg {expectedOutput}"); } [Theory] [InlineData(null, "")] - [InlineData("http://test.com/", " http://test.com/")] - [InlineData(" http://test.com/", " http://test.com/")] - [InlineData("http://test.com/ ", " http://test.com/")] - [InlineData(" http://test.com/ ", " http://test.com/")] - [InlineData("\r\n http://test.com/ \r\n", " http://test.com/")] - public void AppendArgumentMakesSureOneSpaceBeforeObjectArgument(string? input, string expectedOutput) + [InlineData("http://test.com/", "http://test.com/")] + [InlineData(" http://test.com/", "http://test.com/")] + [InlineData("http://test.com/ ", "http://test.com/")] + [InlineData(" http://test.com/ ", "http://test.com/")] + [InlineData("\r\n http://test.com/ \r\n", "http://test.com/")] + public void AppendArgumentWithObjectArgument(string? input, string expectedOutput) { Uri? uri = input != null ? new Uri(input) : null; // Use Uri for our object type since that is what is used in code var stringBuilder = new StringBuilder();