Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 25 additions & 9 deletions src/vstest.console/Internal/ConsoleLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ private static void PrintTimeSpan(TimeSpan timeSpan)
}

/// <summary>
/// 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.
/// </summary>
private static string GetFormattedOutput(Collection<TestResultMessage> testMessageCollection)
{
Expand All @@ -190,8 +190,12 @@ private static string GetFormattedOutput(Collection<TestResultMessage> 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();
}
Expand Down Expand Up @@ -238,26 +242,38 @@ 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);
if (stdErrMessagesCollection.Count > 0)
{
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)
{
Expand Down
150 changes: 150 additions & 0 deletions test/vstest.console.UnitTests/Internal/ConsoleLoggerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,156 @@ public void TestResultHandlerShouldThowExceptionIfEventArgsIsNull()
});
}

[TestMethod]
public void TestResultHandlerShouldShowStdOutMessagesBannerIfStdOutIsNotEmpty()
{
var parameters = new Dictionary<string, string>();
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<ObjectModel.TestResult> { 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<string, string>();
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<ObjectModel.TestResult> { 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<string, string>();
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<ObjectModel.TestResult> { 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<string, string>();
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<ObjectModel.TestResult> { 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<string, string>();
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<ObjectModel.TestResult> { 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<string, string>();
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<ObjectModel.TestResult> { 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()
{
Expand Down