using System.Runtime.CompilerServices; using AyCode.Core.Enums; using AyCode.Core.Loggers; namespace AyCode.Core.Tests.TestModels; /// /// Test logger that captures log messages for assertions. /// Does not require configuration or log writers. /// public class TestLogger : AcLoggerBase { public List Logs { get; } = []; public TestLogger() : base(AppType.Server, LogLevel.Detail, "TestLogger") { } public override void Detail(string? text, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Detail, text, categoryName, memberName)); public override void Debug(string? text, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Debug, text, categoryName, memberName)); public override void Info(string? text, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Info, text, categoryName, memberName)); public override void Warning(string? text, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Warning, text, categoryName, memberName)); public override void Suggest(string? text, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Suggest, text, categoryName, memberName)); public override void Error(string? text, Exception? ex = null, string? categoryName = null, [CallerMemberName] string? memberName = null) => Logs.Add(new LogEntry(LogLevel.Error, text, categoryName, memberName, ex)); public void Clear() => Logs.Clear(); public bool HasErrorLogs => Logs.Any(l => l.Level == LogLevel.Error); public bool HasWarningLogs => Logs.Any(l => l.Level == LogLevel.Warning); public IEnumerable ErrorLogs => Logs.Where(l => l.Level == LogLevel.Error); public IEnumerable WarningLogs => Logs.Where(l => l.Level == LogLevel.Warning); public IEnumerable GetErrorMessages() => ErrorLogs.Select(l => $"{l.Text} {l.Exception?.Message}"); public IEnumerable GetAllMessages() => Logs.Select(l => l.ToString()); } public record LogEntry( LogLevel Level, string? Text, string? CategoryName = null, string? MemberName = null, Exception? Exception = null) { public override string ToString() => $"[{Level}] {Text}"; }