diff --git a/src/vstest.console/Internal/ConsoleLogger.cs b/src/vstest.console/Internal/ConsoleLogger.cs index 230626260d..40eaabe21c 100644 --- a/src/vstest.console/Internal/ConsoleLogger.cs +++ b/src/vstest.console/Internal/ConsoleLogger.cs @@ -180,7 +180,7 @@ private static void PrintTimeSpan(TimeSpan timeSpan) } /// - /// Constructs a well formatted string using the given prefix before every message content on each line. + /// Constructs a well formatted string using the given prefix before every message content on each line. /// private static string GetFormattedOutput(Collection testMessageCollection) { @@ -190,8 +190,12 @@ private static string GetFormattedOutput(Collection testMessa foreach (var message in testMessageCollection) { var prefix = String.Format(CultureInfo.CurrentCulture, "{0}{1}", Environment.NewLine, TestMessageFormattingPrefix); - var messageText = message.Text.Replace(Environment.NewLine, prefix).TrimEnd(TestMessageFormattingPrefix.ToCharArray()); - sb.AppendFormat(CultureInfo.CurrentCulture, "{0}{1}", TestMessageFormattingPrefix, messageText); + var messageText = message.Text?.Replace(Environment.NewLine, prefix).TrimEnd(TestMessageFormattingPrefix.ToCharArray()); + + if (!string.IsNullOrWhiteSpace(messageText)) + { + sb.AppendFormat(CultureInfo.CurrentCulture, "{0}{1}", TestMessageFormattingPrefix, messageText); + } } return sb.ToString(); } @@ -238,8 +242,12 @@ private static void DisplayFullInformation(TestResult result) { addAdditionalNewLine = false; var stdOutMessages = GetFormattedOutput(stdOutMessagesCollection); - Output.Information(CommandLineResources.StdOutMessagesBanner); - Output.Information(stdOutMessages); + + if (!string.IsNullOrEmpty(stdOutMessages)) + { + Output.Information(CommandLineResources.StdOutMessagesBanner); + Output.Information(stdOutMessages); + } } var stdErrMessagesCollection = GetTestMessages(result.Messages, TestResultMessage.StandardErrorCategory); @@ -247,17 +255,25 @@ private static void DisplayFullInformation(TestResult result) { addAdditionalNewLine = false; var stdErrMessages = GetFormattedOutput(stdErrMessagesCollection); - Output.Information(ConsoleColor.Red, CommandLineResources.StdErrMessagesBanner); - Output.Information(ConsoleColor.Red, stdErrMessages); + + if (!string.IsNullOrEmpty(stdErrMessages)) + { + Output.Information(ConsoleColor.Red, CommandLineResources.StdErrMessagesBanner); + Output.Information(ConsoleColor.Red, stdErrMessages); + } } var addnlInfoMessagesCollection = GetTestMessages(result.Messages, TestResultMessage.AdditionalInfoCategory); if (addnlInfoMessagesCollection.Count > 0) { addAdditionalNewLine = false; - Output.Information(CommandLineResources.AddnlInfoMessagesBanner); var addnlInfoMessages = GetFormattedOutput(addnlInfoMessagesCollection); - Output.Information(addnlInfoMessages); + + if (!string.IsNullOrEmpty(addnlInfoMessages)) + { + Output.Information(CommandLineResources.AddnlInfoMessagesBanner); + Output.Information(addnlInfoMessages); + } } if (addAdditionalNewLine) { diff --git a/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs b/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs index 4975ada8fa..7ed71f56f8 100644 --- a/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs +++ b/test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs @@ -145,6 +145,156 @@ public void TestResultHandlerShouldThowExceptionIfEventArgsIsNull() }); } + [TestMethod] + public void TestResultHandlerShouldShowStdOutMessagesBannerIfStdOutIsNotEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + string message = "Dummy message"; + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.StandardOutCategory, message); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.StdOutMessagesBanner, OutputLevel.Information), Times.Once()); + this.mockOutput.Verify(o => o.WriteLine(" " + message, OutputLevel.Information), Times.Once()); + } + + [TestMethod] + public void TestResultHandlerShouldNotShowStdOutMessagesBannerIfStdOutIsEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.StandardOutCategory, null); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.StdOutMessagesBanner, OutputLevel.Information), Times.Never()); + } + + [TestMethod] + public void TestResultHandlerShouldShowStdErrMessagesBannerIfStdErrIsNotEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + string message = "Dummy message"; + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.StandardErrorCategory, message); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.StdErrMessagesBanner, OutputLevel.Information), Times.Once()); + this.mockOutput.Verify(o => o.WriteLine(" " + message, OutputLevel.Information), Times.Once()); + } + + [TestMethod] + public void TestResultHandlerShouldNotShowStdErrMessagesBannerIfStdErrIsEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.StandardErrorCategory, null); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.StdErrMessagesBanner, OutputLevel.Information), Times.Never()); + } + + [TestMethod] + public void TestResultHandlerShouldShowAdditionalInfoBannerIfAdditionalInfoIsNotEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + string message = "Dummy message"; + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.AdditionalInfoCategory, message); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.AddnlInfoMessagesBanner, OutputLevel.Information), Times.Once()); + this.mockOutput.Verify(o => o.WriteLine(" " + message, OutputLevel.Information), Times.Once()); + } + + [TestMethod] + public void TestResultHandlerShouldNotShowAdditionalInfoBannerIfAdditionalInfoIsEmpty() + { + var parameters = new Dictionary(); + parameters.Add("verbosity", "normal"); + this.consoleLogger.Initialize(this.events.Object, parameters); + + var testcase = new TestCase("TestName", new Uri("some://uri"), "TestSource"); + + TestResultMessage testResultMessage = new TestResultMessage(TestResultMessage.AdditionalInfoCategory, null); + + var testresult = new ObjectModel.TestResult(testcase); + testresult.Outcome = TestOutcome.Failed; + testresult.Messages.Add(testResultMessage); + + var eventArgs = new TestRunChangedEventArgs(null, new List { testresult }, null); + + // Raise an event on mock object + this.testRunRequest.Raise(m => m.OnRunStatsChange += null, eventArgs); + this.FlushLoggerMessages(); + + this.mockOutput.Verify(o => o.WriteLine(CommandLineResources.AddnlInfoMessagesBanner, OutputLevel.Information), Times.Never()); + } + [TestMethod] public void TestResultHandlerShouldWriteToConsoleShouldShowPassedTestsForNormalVebosity() {