File: Sinks\DiagnosticMessageSink.cs
Web Access
Project: src\src\Microsoft.DotNet.XUnitConsoleRunner\src\Microsoft.DotNet.XUnitConsoleRunner.csproj (xunit.console)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Xunit.Abstractions;
 
namespace Xunit.ConsoleClient
{
    public class DiagnosticMessageSink : MarshalByRefObject, IMessageSink
    {
        readonly string assemblyDisplayName;
        readonly object consoleLock;
        readonly ConsoleColor displayColor;
        readonly bool noColor;
        readonly bool showDiagnostics;
 
        DiagnosticMessageSink(object consoleLock, string assemblyDisplayName, bool showDiagnostics, bool noColor, ConsoleColor displayColor)
        {
            this.consoleLock = consoleLock;
            this.assemblyDisplayName = assemblyDisplayName;
            this.noColor = noColor;
            this.displayColor = displayColor;
            this.showDiagnostics = showDiagnostics;
        }
 
        public static DiagnosticMessageSink ForDiagnostics(object consoleLock, string assemblyDisplayName, bool showDiagnostics, bool noColor)
            => new DiagnosticMessageSink(consoleLock, assemblyDisplayName, showDiagnostics, noColor, ConsoleColor.Yellow);
 
        public static DiagnosticMessageSink ForInternalDiagnostics(object consoleLock, bool showDiagnostics, bool noColor)
            => new DiagnosticMessageSink(consoleLock, null, showDiagnostics, noColor, ConsoleColor.DarkGray);
 
        public static DiagnosticMessageSink ForInternalDiagnostics(object consoleLock, string assemblyDisplayName, bool showDiagnostics, bool noColor)
            => new DiagnosticMessageSink(consoleLock, assemblyDisplayName, showDiagnostics, noColor, ConsoleColor.DarkGray);
 
        public bool OnMessage(IMessageSinkMessage message)
        {
            if (showDiagnostics && message is IDiagnosticMessage diagnosticMessage)
            {
                lock (consoleLock)
                {
                    if (!noColor)
                        ConsoleHelper.SetForegroundColor(displayColor);
 
                    if (assemblyDisplayName != null)
                        Console.WriteLine($"   {assemblyDisplayName}: {diagnosticMessage.Message}");
                    else
                        Console.WriteLine($"   {diagnosticMessage.Message}");
 
                    if (!noColor)
                        ConsoleHelper.ResetColor();
                }
            }
 
            return true;
        }
    }
}