From 63c92047a19444301dbbb7c3dd72bca56a3b971f Mon Sep 17 00:00:00 2001 From: Tyrrrz Date: Mon, 19 Jul 2021 23:13:52 +0300 Subject: [PATCH] Test improvements --- DiscordChatExporter.Cli.Tests/EmbedSpecs.cs | 119 +++++++++++++++++- DiscordChatExporter.Cli.Tests/MentionSpecs.cs | 31 ++--- DiscordChatExporter.Cli.Tests/ReplySpecs.cs | 11 +- DiscordChatExporter.Core/Discord/AuthToken.cs | 4 +- .../Discord/Data/Attachment.cs | 2 + .../Discord/Data/Channel.cs | 4 +- .../Discord/Data/ChannelCategory.cs | 4 +- .../Discord/Data/Common/FileSize.cs | 2 + .../Discord/Data/Embed.cs | 2 + .../Discord/Data/EmbedAuthor.cs | 2 + .../Discord/Data/EmbedField.cs | 2 + .../Discord/Data/EmbedFooter.cs | 2 + .../Discord/Data/Emoji.cs | 4 +- .../Discord/Data/Guild.cs | 4 +- .../Discord/Data/Member.cs | 2 + .../Discord/Data/Message.cs | 2 + .../Discord/Data/MessageReference.cs | 2 + .../Discord/Data/Reaction.cs | 4 +- DiscordChatExporter.Core/Discord/Data/Role.cs | 4 +- DiscordChatExporter.Core/Discord/Data/User.cs | 2 + .../Data/YouTubeVideoEmbedProjection.cs | 16 +-- DiscordChatExporter.Core/Discord/Snowflake.cs | 2 + .../Markdown/EmojiNode.cs | 4 +- .../Markdown/FormattedNode.cs | 2 + .../Markdown/InlineCodeBlockNode.cs | 5 +- DiscordChatExporter.Core/Markdown/LinkNode.cs | 5 +- .../Markdown/MentionNode.cs | 5 +- .../Markdown/MultiLineCodeBlockNode.cs | 5 +- DiscordChatExporter.Core/Markdown/TextNode.cs | 5 +- .../Markdown/UnixTimestampNode.cs | 2 + .../Utils/Extensions/SuperpowerExtensions.cs | 5 +- 31 files changed, 208 insertions(+), 57 deletions(-) diff --git a/DiscordChatExporter.Cli.Tests/EmbedSpecs.cs b/DiscordChatExporter.Cli.Tests/EmbedSpecs.cs index abce8aa0..9a86b70e 100644 --- a/DiscordChatExporter.Cli.Tests/EmbedSpecs.cs +++ b/DiscordChatExporter.Cli.Tests/EmbedSpecs.cs @@ -1,5 +1,8 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; using System.Threading.Tasks; +using AngleSharp.Dom; using CliFx.Infrastructure; using DiscordChatExporter.Cli.Commands; using DiscordChatExporter.Cli.Tests.Fixtures; @@ -9,6 +12,7 @@ using DiscordChatExporter.Cli.Tests.Utils; using DiscordChatExporter.Core.Discord; using DiscordChatExporter.Core.Exporting; using FluentAssertions; +using JsonExtensions; using Xunit; using Xunit.Abstractions; @@ -25,6 +29,116 @@ namespace DiscordChatExporter.Cli.Tests _tempOutput = tempOutput; } + [Fact] + public async Task Message_with_an_embed_is_rendered_correctly_in_JSON() + { + // Arrange + var outputFilePath = _tempOutput.GetTempFilePath("json"); + + // Act + var jsonData = await GlobalCache.WrapAsync("embed-specs-output-json", async () => + { + await new ExportChannelsCommand + { + TokenValue = Secrets.DiscordToken, + IsBotToken = Secrets.IsDiscordTokenBot, + ChannelIds = new[] {Snowflake.Parse(ChannelIds.EmbedTestCases)}, + ExportFormat = ExportFormat.Json, + OutputPath = outputFilePath + }.ExecuteAsync(new FakeConsole()); + + return await File.ReadAllTextAsync(outputFilePath); + }); + + _testOutput.WriteLine(jsonData); + + var json = Json.Parse(jsonData); + + var messageJson = json + .GetProperty("messages") + .EnumerateArray() + .Single(j => string.Equals( + j.GetProperty("id").GetString(), + "866769910729146400", + StringComparison.OrdinalIgnoreCase + )); + + var embed = messageJson + .GetProperty("embeds") + .EnumerateArray() + .Single(); + + var embedAuthor = embed.GetProperty("author"); + var embedThumbnail = embed.GetProperty("thumbnail"); + var embedFooter = embed.GetProperty("footer"); + var embedFields = embed.GetProperty("fields").EnumerateArray().ToArray(); + + // Assert + embed.GetProperty("title").GetString().Should().Be("Embed title"); + embed.GetProperty("url").GetString().Should().Be("https://example.com"); + embed.GetProperty("timestamp").GetString().Should().Be("2021-07-14T21:00:00+00:00"); + embed.GetProperty("description").GetString().Should().Be("**Embed** _description_"); + embed.GetProperty("color").GetString().Should().Be("#58B9FF"); + embedAuthor.GetProperty("name").GetString().Should().Be("Embed author"); + embedAuthor.GetProperty("url").GetString().Should().Be("https://example.com/author"); + embedAuthor.GetProperty("iconUrl").GetString().Should().NotBeNullOrWhiteSpace(); + embedThumbnail.GetProperty("url").GetString().Should().NotBeNullOrWhiteSpace(); + embedThumbnail.GetProperty("width").GetInt32().Should().Be(120); + embedThumbnail.GetProperty("height").GetInt32().Should().Be(120); + embedFooter.GetProperty("text").GetString().Should().Be("Embed footer"); + embedFooter.GetProperty("iconUrl").GetString().Should().NotBeNullOrWhiteSpace(); + embedFields.Should().HaveCount(3); + embedFields[0].GetProperty("name").GetString().Should().Be("Field 1"); + embedFields[0].GetProperty("value").GetString().Should().Be("Value 1"); + embedFields[0].GetProperty("isInline").GetBoolean().Should().BeTrue(); + embedFields[1].GetProperty("name").GetString().Should().Be("Field 2"); + embedFields[1].GetProperty("value").GetString().Should().Be("Value 2"); + embedFields[1].GetProperty("isInline").GetBoolean().Should().BeTrue(); + embedFields[2].GetProperty("name").GetString().Should().Be("Field 3"); + embedFields[2].GetProperty("value").GetString().Should().Be("Value 3"); + embedFields[2].GetProperty("isInline").GetBoolean().Should().BeTrue(); + } + + [Fact] + public async Task Message_with_an_embed_is_rendered_correctly_in_HTML() + { + // Arrange + var outputFilePath = _tempOutput.GetTempFilePath("html"); + + // Act + var htmlData = await GlobalCache.WrapAsync("embed-specs-output-html", async () => + { + await new ExportChannelsCommand + { + TokenValue = Secrets.DiscordToken, + IsBotToken = Secrets.IsDiscordTokenBot, + ChannelIds = new[] {Snowflake.Parse(ChannelIds.EmbedTestCases)}, + ExportFormat = ExportFormat.HtmlDark, + OutputPath = outputFilePath + }.ExecuteAsync(new FakeConsole()); + + return await File.ReadAllTextAsync(outputFilePath); + }); + + _testOutput.WriteLine(htmlData); + + var html = Html.Parse(htmlData); + + var messageHtml = html.QuerySelector("#message-866769910729146400"); + var messageText = messageHtml?.Text(); + + // Assert + messageText.Should().ContainAll( + "Embed author", + "Embed title", + "Embed description", + "Field 1", "Value 1", + "Field 2", "Value 2", + "Field 3", "Value 3", + "Embed footer" + ); + } + [Fact] public async Task Message_with_YouTube_video_is_rendered_using_an_iframe_player_in_HTML() { @@ -52,11 +166,10 @@ namespace DiscordChatExporter.Cli.Tests var messageHtml = html.QuerySelector("#message-866472508588294165"); var iframeHtml = messageHtml?.QuerySelector("iframe"); - var iframeSrc = iframeHtml?.GetAttribute("src"); // Assert iframeHtml.Should().NotBeNull(); - iframeSrc.Should().StartWithEquivalent("https://www.youtube.com/embed/qOWW4OlgbvE"); + iframeHtml?.GetAttribute("src").Should().StartWithEquivalent("https://www.youtube.com/embed/qOWW4OlgbvE"); } } } \ No newline at end of file diff --git a/DiscordChatExporter.Cli.Tests/MentionSpecs.cs b/DiscordChatExporter.Cli.Tests/MentionSpecs.cs index b03fd7c1..06716ce8 100644 --- a/DiscordChatExporter.Cli.Tests/MentionSpecs.cs +++ b/DiscordChatExporter.Cli.Tests/MentionSpecs.cs @@ -63,19 +63,14 @@ namespace DiscordChatExporter.Cli.Tests StringComparison.OrdinalIgnoreCase )); - var content = messageJson - .GetProperty("content") - .GetString(); + // Assert + messageJson.GetProperty("content").GetString().Should().Be("User mention: @Tyrrrz"); - var mentionedUserIds = messageJson + messageJson .GetProperty("mentions") .EnumerateArray() .Select(j => j.GetProperty("id").GetString()) - .ToArray(); - - // Assert - content.Should().Be("User mention: @Tyrrrz"); - mentionedUserIds.Should().Contain("128178626683338752"); + .Should().Contain("128178626683338752"); } [Fact] @@ -145,12 +140,8 @@ namespace DiscordChatExporter.Cli.Tests StringComparison.OrdinalIgnoreCase )); - var content = messageJson - .GetProperty("content") - .GetString(); - // Assert - content.Should().Be("Text channel mention: #mention-tests"); + messageJson.GetProperty("content").GetString().Should().Be("Text channel mention: #mention-tests"); } [Fact] @@ -219,12 +210,8 @@ namespace DiscordChatExporter.Cli.Tests StringComparison.OrdinalIgnoreCase )); - var content = messageJson - .GetProperty("content") - .GetString(); - // Assert - content.Should().Be("Voice channel mention: #chaos-vc [voice]"); + messageJson.GetProperty("content").GetString().Should().Be("Voice channel mention: #chaos-vc [voice]"); } [Fact] @@ -293,12 +280,8 @@ namespace DiscordChatExporter.Cli.Tests StringComparison.OrdinalIgnoreCase )); - var content = messageJson - .GetProperty("content") - .GetString(); - // Assert - content.Should().Be("Role mention: @Role 1"); + messageJson.GetProperty("content").GetString().Should().Be("Role mention: @Role 1"); } [Fact] diff --git a/DiscordChatExporter.Cli.Tests/ReplySpecs.cs b/DiscordChatExporter.Cli.Tests/ReplySpecs.cs index 44b0eaf5..42e7bf81 100644 --- a/DiscordChatExporter.Cli.Tests/ReplySpecs.cs +++ b/DiscordChatExporter.Cli.Tests/ReplySpecs.cs @@ -52,12 +52,11 @@ namespace DiscordChatExporter.Cli.Tests var html = Html.Parse(htmlData); var messageHtml = html.QuerySelector("#message-866460738239725598"); - var referenceHtml = messageHtml?.QuerySelector(".chatlog__reference-link"); // Assert messageHtml.Should().NotBeNull(); messageHtml?.Text().Trim().Should().Be("reply to original"); - referenceHtml?.Text().Trim().Should().Be("original"); + messageHtml?.QuerySelector(".chatlog__reference-link")?.Text().Trim().Should().Be("original"); } [Fact] @@ -86,12 +85,12 @@ namespace DiscordChatExporter.Cli.Tests var html = Html.Parse(htmlData); var messageHtml = html.QuerySelector("#message-866460975388819486"); - var referenceHtml = messageHtml?.QuerySelector(".chatlog__reference-link"); // Assert messageHtml.Should().NotBeNull(); messageHtml?.Text().Trim().Should().Be("reply to deleted"); - referenceHtml?.Text().Trim().Should().Be("Original message was deleted or could not be loaded."); + messageHtml?.QuerySelector(".chatlog__reference-link")?.Text().Trim().Should() + .Be("Original message was deleted or could not be loaded."); } [Fact] @@ -120,12 +119,12 @@ namespace DiscordChatExporter.Cli.Tests var html = Html.Parse(htmlData); var messageHtml = html.QuerySelector("#message-866462470335627294"); - var referenceHtml = messageHtml?.QuerySelector(".chatlog__reference-link"); // Assert messageHtml.Should().NotBeNull(); messageHtml?.Text().Trim().Should().Be("reply to attachment"); - referenceHtml?.Text().Trim().Should().Be("Click to see attachment 🖼️"); + messageHtml?.QuerySelector(".chatlog__reference-link")?.Text().Trim().Should() + .Be("Click to see attachment 🖼️"); } } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Discord/AuthToken.cs b/DiscordChatExporter.Core/Discord/AuthToken.cs index b8870f58..332b01e9 100644 --- a/DiscordChatExporter.Core/Discord/AuthToken.cs +++ b/DiscordChatExporter.Core/Discord/AuthToken.cs @@ -1,4 +1,5 @@ -using System.Net.Http.Headers; +using System.Diagnostics.CodeAnalysis; +using System.Net.Http.Headers; namespace DiscordChatExporter.Core.Discord { @@ -20,6 +21,7 @@ namespace DiscordChatExporter.Core.Discord _ => new AuthenticationHeaderValue(Value) }; + [ExcludeFromCodeCoverage] public override string ToString() => Value; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Discord/Data/Attachment.cs b/DiscordChatExporter.Core/Discord/Data/Attachment.cs index d46e52ee..15de93bb 100644 --- a/DiscordChatExporter.Core/Discord/Data/Attachment.cs +++ b/DiscordChatExporter.Core/Discord/Data/Attachment.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; @@ -49,6 +50,7 @@ namespace DiscordChatExporter.Core.Discord.Data FileSize = fileSize; } + [ExcludeFromCodeCoverage] public override string ToString() => FileName; } diff --git a/DiscordChatExporter.Core/Discord/Data/Channel.cs b/DiscordChatExporter.Core/Discord/Data/Channel.cs index 58fb03eb..5978df27 100644 --- a/DiscordChatExporter.Core/Discord/Data/Channel.cs +++ b/DiscordChatExporter.Core/Discord/Data/Channel.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; @@ -51,6 +52,7 @@ namespace DiscordChatExporter.Core.Discord.Data Topic = topic; } + [ExcludeFromCodeCoverage] public override string ToString() => Name; } diff --git a/DiscordChatExporter.Core/Discord/Data/ChannelCategory.cs b/DiscordChatExporter.Core/Discord/Data/ChannelCategory.cs index a4184038..1bdf86cc 100644 --- a/DiscordChatExporter.Core/Discord/Data/ChannelCategory.cs +++ b/DiscordChatExporter.Core/Discord/Data/ChannelCategory.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; using JsonExtensions.Reading; @@ -20,6 +21,7 @@ namespace DiscordChatExporter.Core.Discord.Data Position = position; } + [ExcludeFromCodeCoverage] public override string ToString() => Name; } diff --git a/DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs b/DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs index 9f941566..efac8f80 100644 --- a/DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs +++ b/DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; namespace DiscordChatExporter.Core.Discord.Data.Common { @@ -41,6 +42,7 @@ namespace DiscordChatExporter.Core.Discord.Data.Common return "bytes"; } + [ExcludeFromCodeCoverage] public override string ToString() => $"{GetLargestWholeNumberValue():0.##} {GetLargestWholeNumberSymbol()}"; } diff --git a/DiscordChatExporter.Core/Discord/Data/Embed.cs b/DiscordChatExporter.Core/Discord/Data/Embed.cs index 9a726796..21a29f1d 100644 --- a/DiscordChatExporter.Core/Discord/Data/Embed.cs +++ b/DiscordChatExporter.Core/Discord/Data/Embed.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; using System.Text.Json; @@ -57,6 +58,7 @@ namespace DiscordChatExporter.Core.Discord.Data public YouTubeVideoEmbedProjection? TryGetYouTubeVideo() => YouTubeVideoEmbedProjection.TryResolve(this); + [ExcludeFromCodeCoverage] public override string ToString() => Title ?? ""; } diff --git a/DiscordChatExporter.Core/Discord/Data/EmbedAuthor.cs b/DiscordChatExporter.Core/Discord/Data/EmbedAuthor.cs index ed3d19f7..825bfa0e 100644 --- a/DiscordChatExporter.Core/Discord/Data/EmbedAuthor.cs +++ b/DiscordChatExporter.Core/Discord/Data/EmbedAuthor.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using JsonExtensions.Reading; @@ -22,6 +23,7 @@ namespace DiscordChatExporter.Core.Discord.Data IconProxyUrl = iconProxyUrl; } + [ExcludeFromCodeCoverage] public override string ToString() => Name ?? ""; } diff --git a/DiscordChatExporter.Core/Discord/Data/EmbedField.cs b/DiscordChatExporter.Core/Discord/Data/EmbedField.cs index 6fd2776c..39ed9f1e 100644 --- a/DiscordChatExporter.Core/Discord/Data/EmbedField.cs +++ b/DiscordChatExporter.Core/Discord/Data/EmbedField.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using JsonExtensions.Reading; @@ -19,6 +20,7 @@ namespace DiscordChatExporter.Core.Discord.Data IsInline = isInline; } + [ExcludeFromCodeCoverage] public override string ToString() => $"{Name} | {Value}"; } diff --git a/DiscordChatExporter.Core/Discord/Data/EmbedFooter.cs b/DiscordChatExporter.Core/Discord/Data/EmbedFooter.cs index 37fafb83..a405454c 100644 --- a/DiscordChatExporter.Core/Discord/Data/EmbedFooter.cs +++ b/DiscordChatExporter.Core/Discord/Data/EmbedFooter.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using JsonExtensions.Reading; @@ -19,6 +20,7 @@ namespace DiscordChatExporter.Core.Discord.Data IconProxyUrl = iconProxyUrl; } + [ExcludeFromCodeCoverage] public override string ToString() => Text; } diff --git a/DiscordChatExporter.Core/Discord/Data/Emoji.cs b/DiscordChatExporter.Core/Discord/Data/Emoji.cs index fabc707f..e42da43d 100644 --- a/DiscordChatExporter.Core/Discord/Data/Emoji.cs +++ b/DiscordChatExporter.Core/Discord/Data/Emoji.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Text.Json; using DiscordChatExporter.Core.Utils; using DiscordChatExporter.Core.Utils.Extensions; @@ -33,6 +34,7 @@ namespace DiscordChatExporter.Core.Discord.Data ImageUrl = imageUrl; } + [ExcludeFromCodeCoverage] public override string ToString() => Name; } diff --git a/DiscordChatExporter.Core/Discord/Data/Guild.cs b/DiscordChatExporter.Core/Discord/Data/Guild.cs index 5a048f4e..90538b75 100644 --- a/DiscordChatExporter.Core/Discord/Data/Guild.cs +++ b/DiscordChatExporter.Core/Discord/Data/Guild.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; @@ -20,6 +21,7 @@ namespace DiscordChatExporter.Core.Discord.Data IconUrl = iconUrl; } + [ExcludeFromCodeCoverage] public override string ToString() => Name; } diff --git a/DiscordChatExporter.Core/Discord/Data/Member.cs b/DiscordChatExporter.Core/Discord/Data/Member.cs index eea66a8c..d98b9776 100644 --- a/DiscordChatExporter.Core/Discord/Data/Member.cs +++ b/DiscordChatExporter.Core/Discord/Data/Member.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; @@ -26,6 +27,7 @@ namespace DiscordChatExporter.Core.Discord.Data RoleIds = roleIds; } + [ExcludeFromCodeCoverage] public override string ToString() => Nick; } diff --git a/DiscordChatExporter.Core/Discord/Data/Message.cs b/DiscordChatExporter.Core/Discord/Data/Message.cs index 667ae45d..6ea4f403 100644 --- a/DiscordChatExporter.Core/Discord/Data/Message.cs +++ b/DiscordChatExporter.Core/Discord/Data/Message.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; @@ -85,6 +86,7 @@ namespace DiscordChatExporter.Core.Discord.Data ReferencedMessage = referencedMessage; } + [ExcludeFromCodeCoverage] public override string ToString() => Content; } diff --git a/DiscordChatExporter.Core/Discord/Data/MessageReference.cs b/DiscordChatExporter.Core/Discord/Data/MessageReference.cs index d5049928..a2160e45 100644 --- a/DiscordChatExporter.Core/Discord/Data/MessageReference.cs +++ b/DiscordChatExporter.Core/Discord/Data/MessageReference.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using DiscordChatExporter.Core.Utils.Extensions; using JsonExtensions.Reading; @@ -20,6 +21,7 @@ namespace DiscordChatExporter.Core.Discord.Data GuildId = guildId; } + [ExcludeFromCodeCoverage] public override string ToString() => MessageId?.ToString() ?? ""; } diff --git a/DiscordChatExporter.Core/Discord/Data/Reaction.cs b/DiscordChatExporter.Core/Discord/Data/Reaction.cs index 15c9f443..ba2867fa 100644 --- a/DiscordChatExporter.Core/Discord/Data/Reaction.cs +++ b/DiscordChatExporter.Core/Discord/Data/Reaction.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; using DiscordChatExporter.Core.Utils.Extensions; namespace DiscordChatExporter.Core.Discord.Data @@ -16,6 +17,7 @@ namespace DiscordChatExporter.Core.Discord.Data Count = count; } + [ExcludeFromCodeCoverage] public override string ToString() => $"{Emoji} ({Count})"; } diff --git a/DiscordChatExporter.Core/Discord/Data/Role.cs b/DiscordChatExporter.Core/Discord/Data/Role.cs index 773a0f71..f9e22354 100644 --- a/DiscordChatExporter.Core/Discord/Data/Role.cs +++ b/DiscordChatExporter.Core/Discord/Data/Role.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Diagnostics.CodeAnalysis; +using System.Drawing; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; @@ -29,6 +30,7 @@ namespace DiscordChatExporter.Core.Discord.Data Color = color; } + [ExcludeFromCodeCoverage] public override string ToString() => Name; } diff --git a/DiscordChatExporter.Core/Discord/Data/User.cs b/DiscordChatExporter.Core/Discord/Data/User.cs index 77f54ff5..90a7604c 100644 --- a/DiscordChatExporter.Core/Discord/Data/User.cs +++ b/DiscordChatExporter.Core/Discord/Data/User.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; @@ -37,6 +38,7 @@ namespace DiscordChatExporter.Core.Discord.Data AvatarUrl = avatarUrl; } + [ExcludeFromCodeCoverage] public override string ToString() => FullName; } diff --git a/DiscordChatExporter.Core/Discord/Data/YouTubeVideoEmbedProjection.cs b/DiscordChatExporter.Core/Discord/Data/YouTubeVideoEmbedProjection.cs index ea653545..90db28cf 100644 --- a/DiscordChatExporter.Core/Discord/Data/YouTubeVideoEmbedProjection.cs +++ b/DiscordChatExporter.Core/Discord/Data/YouTubeVideoEmbedProjection.cs @@ -1,4 +1,5 @@ -using System.Text.RegularExpressions; +using System.Diagnostics.CodeAnalysis; +using System.Text.RegularExpressions; namespace DiscordChatExporter.Core.Discord.Data { @@ -6,14 +7,11 @@ namespace DiscordChatExporter.Core.Discord.Data { public string VideoId { get; } - public string Url { get; } + public string Url => $"https://www.youtube.com/embed/{VideoId}"; - public YouTubeVideoEmbedProjection(string videoId, string url) - { - VideoId = videoId; - Url = url; - } + public YouTubeVideoEmbedProjection(string videoId) => VideoId = videoId; + [ExcludeFromCodeCoverage] public override string ToString() => Url; } @@ -53,9 +51,7 @@ namespace DiscordChatExporter.Core.Discord.Data if (string.IsNullOrWhiteSpace(videoId)) return null; - var url = $"https://www.youtube.com/embed/{videoId}"; - - return new YouTubeVideoEmbedProjection(videoId, url); + return new YouTubeVideoEmbedProjection(videoId); } } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Discord/Snowflake.cs b/DiscordChatExporter.Core/Discord/Snowflake.cs index 36bd3789..527e032a 100644 --- a/DiscordChatExporter.Core/Discord/Snowflake.cs +++ b/DiscordChatExporter.Core/Discord/Snowflake.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text.RegularExpressions; @@ -14,6 +15,7 @@ namespace DiscordChatExporter.Core.Discord (long) ((Value >> 22) + 1420070400000UL) ).ToLocalTime(); + [ExcludeFromCodeCoverage] public override string ToString() => Value.ToString(CultureInfo.InvariantCulture); } diff --git a/DiscordChatExporter.Core/Markdown/EmojiNode.cs b/DiscordChatExporter.Core/Markdown/EmojiNode.cs index 9e4aebcf..e863edd0 100644 --- a/DiscordChatExporter.Core/Markdown/EmojiNode.cs +++ b/DiscordChatExporter.Core/Markdown/EmojiNode.cs @@ -1,4 +1,5 @@ -using DiscordChatExporter.Core.Utils; +using System.Diagnostics.CodeAnalysis; +using DiscordChatExporter.Core.Utils; namespace DiscordChatExporter.Core.Markdown { @@ -31,6 +32,7 @@ namespace DiscordChatExporter.Core.Markdown { } + [ExcludeFromCodeCoverage] public override string ToString() => $" {Name}"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/FormattedNode.cs b/DiscordChatExporter.Core/Markdown/FormattedNode.cs index c30cad3c..46781e4e 100644 --- a/DiscordChatExporter.Core/Markdown/FormattedNode.cs +++ b/DiscordChatExporter.Core/Markdown/FormattedNode.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace DiscordChatExporter.Core.Markdown { @@ -14,6 +15,7 @@ namespace DiscordChatExporter.Core.Markdown Children = children; } + [ExcludeFromCodeCoverage] public override string ToString() => $"<{Formatting}> (+{Children.Count})"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/InlineCodeBlockNode.cs b/DiscordChatExporter.Core/Markdown/InlineCodeBlockNode.cs index dbb7637d..70502886 100644 --- a/DiscordChatExporter.Core/Markdown/InlineCodeBlockNode.cs +++ b/DiscordChatExporter.Core/Markdown/InlineCodeBlockNode.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Core.Markdown +using System.Diagnostics.CodeAnalysis; + +namespace DiscordChatExporter.Core.Markdown { internal class InlineCodeBlockNode : MarkdownNode { @@ -9,6 +11,7 @@ Code = code; } + [ExcludeFromCodeCoverage] public override string ToString() => $" {Code}"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/LinkNode.cs b/DiscordChatExporter.Core/Markdown/LinkNode.cs index 1b364d1d..c680238b 100644 --- a/DiscordChatExporter.Core/Markdown/LinkNode.cs +++ b/DiscordChatExporter.Core/Markdown/LinkNode.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Core.Markdown +using System.Diagnostics.CodeAnalysis; + +namespace DiscordChatExporter.Core.Markdown { internal class LinkNode : MarkdownNode { @@ -17,6 +19,7 @@ { } + [ExcludeFromCodeCoverage] public override string ToString() => $" {Title}"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/MentionNode.cs b/DiscordChatExporter.Core/Markdown/MentionNode.cs index 646d1c80..424f1e70 100644 --- a/DiscordChatExporter.Core/Markdown/MentionNode.cs +++ b/DiscordChatExporter.Core/Markdown/MentionNode.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Core.Markdown +using System.Diagnostics.CodeAnalysis; + +namespace DiscordChatExporter.Core.Markdown { internal class MentionNode : MarkdownNode { @@ -12,6 +14,7 @@ Kind = kind; } + [ExcludeFromCodeCoverage] public override string ToString() => $"<{Kind} mention> {Id}"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/MultiLineCodeBlockNode.cs b/DiscordChatExporter.Core/Markdown/MultiLineCodeBlockNode.cs index afa3e0df..f89bb93d 100644 --- a/DiscordChatExporter.Core/Markdown/MultiLineCodeBlockNode.cs +++ b/DiscordChatExporter.Core/Markdown/MultiLineCodeBlockNode.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Core.Markdown +using System.Diagnostics.CodeAnalysis; + +namespace DiscordChatExporter.Core.Markdown { internal class MultiLineCodeBlockNode : MarkdownNode { @@ -12,6 +14,7 @@ Code = code; } + [ExcludeFromCodeCoverage] public override string ToString() => $"<{Language}> {Code}"; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/TextNode.cs b/DiscordChatExporter.Core/Markdown/TextNode.cs index 95e7a710..44caaa3c 100644 --- a/DiscordChatExporter.Core/Markdown/TextNode.cs +++ b/DiscordChatExporter.Core/Markdown/TextNode.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Core.Markdown +using System.Diagnostics.CodeAnalysis; + +namespace DiscordChatExporter.Core.Markdown { internal class TextNode : MarkdownNode { @@ -9,6 +11,7 @@ Text = text; } + [ExcludeFromCodeCoverage] public override string ToString() => Text; } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Markdown/UnixTimestampNode.cs b/DiscordChatExporter.Core/Markdown/UnixTimestampNode.cs index aed9a6f9..29ee1102 100644 --- a/DiscordChatExporter.Core/Markdown/UnixTimestampNode.cs +++ b/DiscordChatExporter.Core/Markdown/UnixTimestampNode.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; namespace DiscordChatExporter.Core.Markdown { @@ -8,6 +9,7 @@ namespace DiscordChatExporter.Core.Markdown public UnixTimestampNode(DateTimeOffset value) => Value = value; + [ExcludeFromCodeCoverage] public override string ToString() => Value.ToString(); } } \ No newline at end of file diff --git a/DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs b/DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs index a70296f6..09d4bdf6 100644 --- a/DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs +++ b/DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Superpower; using Superpower.Parsers; @@ -12,7 +13,9 @@ namespace DiscordChatExporter.Core.Utils.Extensions public static TextParser Token(this TextParser parser) => parser.Between(Character.WhiteSpace.IgnoreMany(), Character.WhiteSpace.IgnoreMany()); - // From: https://twitter.com/nblumhardt/status/1389349059786264578 + // Only used for debugging while writing Superpower parsers. + // From https://twitter.com/nblumhardt/status/1389349059786264578 + [ExcludeFromCodeCoverage] public static TextParser Log(this TextParser parser, string description) => i => { Console.WriteLine($"Trying {description} ->");