diff --git a/DiscordBotCore.Logging/LogMessage.cs b/DiscordBotCore.Logging/LogMessage.cs index 9d780ba..ab3c05a 100644 --- a/DiscordBotCore.Logging/LogMessage.cs +++ b/DiscordBotCore.Logging/LogMessage.cs @@ -1,76 +1,75 @@ -namespace DiscordBotCore.Logging +namespace DiscordBotCore.Logging; + +internal sealed class LogMessage : ILogMessage { - internal sealed class LogMessage : ILogMessage + private static readonly string _DefaultLogMessageSender = "\b"; + public string Message { get; set; } + public DateTime ThrowTime { get; set; } + public string SenderName { get; set; } + public LogType LogMessageType { get; set; } + + public LogMessage(string message, LogType logMessageType) { - private static readonly string _DefaultLogMessageSender = "\b"; - public string Message { get; set; } - public DateTime ThrowTime { get; set; } - public string SenderName { get; set; } - public LogType LogMessageType { get; set; } - - public LogMessage(string message, LogType logMessageType) - { - Message = message; - LogMessageType = logMessageType; - ThrowTime = DateTime.Now; - SenderName = string.Empty; - } - - public LogMessage(string message, object sender) - { - Message = message; - SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; - ThrowTime = DateTime.Now; - LogMessageType = LogType.Info; - } - - public LogMessage(string message, object sender, DateTime throwTime) - { - Message = message; - SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; - ThrowTime = throwTime; - LogMessageType = LogType.Info; - } - - public LogMessage(string message, object sender, LogType logMessageType) - { - Message = message; - SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; - ThrowTime = DateTime.Now; - LogMessageType = logMessageType; - - } - - public LogMessage(string message, DateTime throwTime, object sender, LogType logMessageType) - { - Message = message; - ThrowTime = throwTime; - SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; - LogMessageType = logMessageType; - } - - public LogMessage WithMessage(string message) - { - this.Message = message; - return this; - } - - public LogMessage WithCurrentThrowTime() - { - this.ThrowTime = DateTime.Now; - return this; - } - - public LogMessage WithMessageType(LogType logType) - { - this.LogMessageType = logType; - return this; - } - - public static LogMessage CreateFromException(Exception exception, object Sender, bool logFullStack) - { - LogMessage message = new LogMessage(logFullStack? exception.ToString() : exception.Message, Sender, LogType.Error); - return message; - } + Message = message; + LogMessageType = logMessageType; + ThrowTime = DateTime.Now; + SenderName = string.Empty; } -} + + public LogMessage(string message, object sender) + { + Message = message; + SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; + ThrowTime = DateTime.Now; + LogMessageType = LogType.Info; + } + + public LogMessage(string message, object sender, DateTime throwTime) + { + Message = message; + SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; + ThrowTime = throwTime; + LogMessageType = LogType.Info; + } + + public LogMessage(string message, object sender, LogType logMessageType) + { + Message = message; + SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; + ThrowTime = DateTime.Now; + LogMessageType = logMessageType; + + } + + public LogMessage(string message, DateTime throwTime, object sender, LogType logMessageType) + { + Message = message; + ThrowTime = throwTime; + SenderName = sender is string && sender as string == string.Empty ? _DefaultLogMessageSender : sender.GetType().FullName ?? sender.GetType().Name; + LogMessageType = logMessageType; + } + + public LogMessage WithMessage(string message) + { + this.Message = message; + return this; + } + + public LogMessage WithCurrentThrowTime() + { + this.ThrowTime = DateTime.Now; + return this; + } + + public LogMessage WithMessageType(LogType logType) + { + this.LogMessageType = logType; + return this; + } + + public static LogMessage CreateFromException(Exception exception, object Sender, bool logFullStack) + { + LogMessage message = new LogMessage(logFullStack? exception.ToString() : exception.Message, Sender, LogType.Error); + return message; + } +} \ No newline at end of file diff --git a/SethDiscordBot.sln b/SethDiscordBot.sln index ae45d6c..00617de 100644 --- a/SethDiscordBot.sln +++ b/SethDiscordBot.sln @@ -37,6 +37,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebUI", "WebUI\WebUI.csproj EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PollMaker", "Plugins\PollMaker\PollMaker.csproj", "{9A4B98C1-00AC-481C-BE55-A70C0B9D3BE7}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{8F27B3EA-F292-40DF-B9B3-4B0E6BEA4E70}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.DiscordBotCore.Logging", "Tests\Tests.DiscordBotCore.Logging\Tests.DiscordBotCore.Logging.csproj", "{94238D37-60C6-4E40-80EC-4B4D242F5914}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -215,6 +219,18 @@ Global {9A4B98C1-00AC-481C-BE55-A70C0B9D3BE7}.Release|ARM64.Build.0 = Release|Any CPU {9A4B98C1-00AC-481C-BE55-A70C0B9D3BE7}.Release|x64.ActiveCfg = Release|Any CPU {9A4B98C1-00AC-481C-BE55-A70C0B9D3BE7}.Release|x64.Build.0 = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|ARM64.Build.0 = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|x64.ActiveCfg = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Debug|x64.Build.0 = Debug|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|Any CPU.Build.0 = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|ARM64.ActiveCfg = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|ARM64.Build.0 = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|x64.ActiveCfg = Release|Any CPU + {94238D37-60C6-4E40-80EC-4B4D242F5914}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -224,6 +240,7 @@ Global {F3C61A47-F758-4145-B496-E3ECCF979D89} = {5CF9AD7B-6BF0-4035-835F-722F989C01E1} {C67908F9-4A55-4DD8-B993-C26C648226F1} = {EA4FA308-7B2C-458E-8485-8747D745DD59} {9A4B98C1-00AC-481C-BE55-A70C0B9D3BE7} = {5CF9AD7B-6BF0-4035-835F-722F989C01E1} + {94238D37-60C6-4E40-80EC-4B4D242F5914} = {8F27B3EA-F292-40DF-B9B3-4B0E6BEA4E70} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3FB3C5DE-ED21-4D2E-ABDD-3A00EE4A2FFF} diff --git a/Tests/Tests.DiscordBotCore.Logging/LoggerTests.cs b/Tests/Tests.DiscordBotCore.Logging/LoggerTests.cs new file mode 100644 index 0000000..9596383 --- /dev/null +++ b/Tests/Tests.DiscordBotCore.Logging/LoggerTests.cs @@ -0,0 +1,46 @@ +using DiscordBotCore.Logging; + +namespace Tests.DiscordBotCore.Logging; + +public class LoggerTests +{ + private readonly string logFolder = Path.GetTempPath(); + private readonly string format = "{Message} | {SenderName} | {LogMessageType}"; + + [Fact] + public void Log_AddsMessageToList() + { + ILogger logger = new Logger(logFolder, format, maxHistorySize: 5); + + logger.Log("Test message"); + + Assert.Single(logger.LogMessages); + Assert.Equal("Test message", logger.LogMessages[0].Message); + } + + [Fact] + public void Log_TriggersOnLogReceived() + { + ILogger logger = new Logger(logFolder, format, maxHistorySize: 5); + bool triggered = false; + logger.OnLogReceived += (_) => triggered = true; + + logger.Log("Test message"); + + Assert.True(triggered); + } + + [Fact] + public void Log_RespectsMaxHistorySize() + { + ILogger logger = new Logger(logFolder, format, maxHistorySize: 3); + + logger.Log("1"); + logger.Log("2"); + logger.Log("3"); + logger.Log("4"); + + Assert.Equal(3, logger.LogMessages.Count); + Assert.DoesNotContain(logger.LogMessages, m => m.Message == "1"); + } +} \ No newline at end of file diff --git a/Tests/Tests.DiscordBotCore.Logging/Tests.DiscordBotCore.Logging.csproj b/Tests/Tests.DiscordBotCore.Logging/Tests.DiscordBotCore.Logging.csproj new file mode 100644 index 0000000..aab6d00 --- /dev/null +++ b/Tests/Tests.DiscordBotCore.Logging/Tests.DiscordBotCore.Logging.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + Tests.DiscordBotCore.Logging + + + + + + + + + + + + + + + + + +