using System;
using System.Collections.Generic;
using Robust.Shared.Log;
namespace Robust.UnitTesting;
///
/// Represents a log manager that spies on logged messages. Use this to check if side effect
/// like logging is being correctly done.
///
public sealed class SpyLogManager : ILogManager
{
private readonly SpyLogger _spyLogger = new();
public ISawmill RootSawmill => _spyLogger;
public ISawmill GetSawmill(string name)
{
return _spyLogger;
}
public IEnumerable AllSawmills => new[]
{
_spyLogger
};
public int CountError => _spyLogger.ErrorMessages.Count;
public void Clear()
{
_spyLogger.Clear();
}
}
///
/// Represents a logger used for spying on log messages.
///
public sealed class SpyLogger : ISawmill
{
public string Name { get; } = "SpyLogger";
public LogLevel? Level { get; set; } = LogLevel.Debug;
public List DebugMessages = new();
public List ErrorMessages = new();
public List WarningMessages = new();
public List InfoMessages = new();
public List FatalMessages = new();
public List VerboseMessages = new();
public void AddHandler(ILogHandler handler)
{
// NOT NEEDED
}
public void RemoveHandler(ILogHandler handler)
{
// NOT NEEDED
}
public void Log(LogLevel level, string message, params object?[] args)
{
Log(level, null, message, args);
}
public void Log(LogLevel level, Exception? exception, string message, params object?[] args)
{
var msg = string.Format(message, args);
var list = level switch
{
LogLevel.Verbose => VerboseMessages,
LogLevel.Debug => DebugMessages,
LogLevel.Info => InfoMessages,
LogLevel.Warning => WarningMessages,
LogLevel.Error => ErrorMessages,
LogLevel.Fatal => FatalMessages,
_ => VerboseMessages,
};
list.Add(msg);
}
public void Log(LogLevel level, string message)
{
Log(level, null, message, []);
}
public void Debug(string message, params object?[] args)
{
Log(LogLevel.Debug, null, message, args);
}
public void Debug(string message)
{
Log(LogLevel.Debug, message);
}
public void Info(string message, params object?[] args)
{
Log(LogLevel.Info, null, message, args);
}
public void Info(string message)
{
Log(LogLevel.Debug, message);
}
public void Warning(string message, params object?[] args)
{
Log(LogLevel.Warning, message, args);
}
public void Warning(string message)
{
Log(LogLevel.Warning, message);
}
public void Error(string message, params object?[] args)
{
Log(LogLevel.Error, message, args);
}
public void Error(string message)
{
Log(LogLevel.Error, message);
}
public void Fatal(string message, params object?[] args)
{
Log(LogLevel.Fatal, message, args);
}
public void Fatal(string message)
{
Log(LogLevel.Fatal, message);
}
public void Clear()
{
DebugMessages.Clear();
ErrorMessages.Clear();
WarningMessages.Clear();
InfoMessages.Clear();
FatalMessages.Clear();
VerboseMessages.Clear();
}
}