diff --git a/ArchiSteamFarm.Tests/Bot.cs b/ArchiSteamFarm.Tests/Bot.cs index e0902ae3b..42e0c37ec 100644 --- a/ArchiSteamFarm.Tests/Bot.cs +++ b/ArchiSteamFarm.Tests/Bot.cs @@ -471,7 +471,7 @@ internal sealed class Bot { HashSet itemsToSend = GetItemsForFullBadge(items, 2, appID); - Assert.IsTrue(itemsToSend.Count <= Steam.Exchange.Trading.MaxItemsPerTrade); + Assert.IsLessThanOrEqualTo(Steam.Exchange.Trading.MaxItemsPerTrade, itemsToSend.Count); } [TestMethod] @@ -495,7 +495,7 @@ internal sealed class Bot { HashSet itemsToSend = GetItemsForFullBadge(items, itemsPerSet); - Assert.IsTrue(itemsToSend.Count <= Steam.Exchange.Trading.MaxItemsPerTrade); + Assert.IsLessThanOrEqualTo(Steam.Exchange.Trading.MaxItemsPerTrade, itemsToSend.Count); } [TestMethod] diff --git a/ArchiSteamFarm.Tests/IGitHubPluginUpdates.cs b/ArchiSteamFarm.Tests/IGitHubPluginUpdates.cs index a1e6d7fdd..0063f0bab 100644 --- a/ArchiSteamFarm.Tests/IGitHubPluginUpdates.cs +++ b/ArchiSteamFarm.Tests/IGitHubPluginUpdates.cs @@ -30,6 +30,7 @@ using ArchiSteamFarm.Storage; using ArchiSteamFarm.Web; using ArchiSteamFarm.Web.GitHub; using ArchiSteamFarm.Web.GitHub.Data; +using JetBrains.Annotations; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace ArchiSteamFarm.Tests; @@ -40,6 +41,15 @@ internal sealed class IGitHubPluginUpdates { private const string PluginName = "ArchiSteamFarm.OfficialPlugins.Monitoring"; private const string Repository = "JustArchiNET/ArchiSteamFarm"; + private readonly TestContext TestContext; + + [UsedImplicitly] + public IGitHubPluginUpdates(TestContext testContext) { + ArgumentNullException.ThrowIfNull(testContext); + + TestContext = testContext; + } + [TestCategory("Manual")] [TestMethod] internal async Task DoesNotOfferPointlessUpdatesWhenMultipleAssetsAreFound() { @@ -47,7 +57,7 @@ internal sealed class IGitHubPluginUpdates { typeof(ASF).GetProperty(nameof(ASF.WebBrowser))?.SetValue(null, webBrowser); - ReleaseResponse? response = await GitHubService.GetLatestRelease(Repository).ConfigureAwait(false); + ReleaseResponse? response = await GitHubService.GetLatestRelease(Repository, cancellationToken: TestContext.CancellationTokenSource.Token).ConfigureAwait(false); if (response == null) { Assert.Inconclusive(Strings.FormatWarningFailedWithError(nameof(response))); diff --git a/ArchiSteamFarm.Tests/SteamChatMessage.cs b/ArchiSteamFarm.Tests/SteamChatMessage.cs index 8e91bb99c..d781a88a5 100644 --- a/ArchiSteamFarm.Tests/SteamChatMessage.cs +++ b/ArchiSteamFarm.Tests/SteamChatMessage.cs @@ -26,6 +26,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.VisualStudio.TestTools.UnitTesting; using static ArchiSteamFarm.Steam.Integration.SteamChatMessage; @@ -34,6 +35,15 @@ namespace ArchiSteamFarm.Tests; #pragma warning disable CA1812 // False positive, the class is used during MSTest [TestClass] internal sealed class SteamChatMessage { + private readonly TestContext TestContext; + + [UsedImplicitly] + public SteamChatMessage(TestContext testContext) { + ArgumentNullException.ThrowIfNull(testContext); + + TestContext = testContext; + } + [TestMethod] internal async Task CanSplitEvenWithStupidlyLongPrefix() { string prefix = new('x', MaxMessagePrefixBytes); @@ -41,9 +51,9 @@ internal sealed class SteamChatMessage { const string emoji = "😎"; const string message = $"{emoji}{emoji}{emoji}{emoji}"; - List output = await GetMessageParts(message, prefix, true).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, prefix, true).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(4, output.Count); + Assert.HasCount(4, output); Assert.AreEqual($"{prefix}{emoji}{ContinuationCharacter}", output[0]); Assert.AreEqual($"{prefix}{ContinuationCharacter}{emoji}{ContinuationCharacter}", output[1]); @@ -58,9 +68,9 @@ internal sealed class SteamChatMessage { internal async Task DoesntSkipEmptyNewlines() { string message = $"asdf{Environment.NewLine}{Environment.NewLine}asdf"; - List output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual(message, output.First()); } @@ -76,9 +86,9 @@ internal sealed class SteamChatMessage { string longSequence = new('a', longLineLength - 1); string message = $"{longSequence}{emoji}"; - List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(2, output.Count); + Assert.HasCount(2, output); Assert.AreEqual($"{longSequence}{ContinuationCharacter}", output[0]); Assert.AreEqual($"{ContinuationCharacter}{emoji}", output[1]); @@ -89,9 +99,9 @@ internal sealed class SteamChatMessage { const string message = "abcdef["; const string escapedMessage = @"abcdef\["; - List output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual(escapedMessage, output.First()); } @@ -105,9 +115,9 @@ internal sealed class SteamChatMessage { string longLine = new('a', longLineLength - 2); string message = $@"{longLine}\"; - List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual($@"{message}\", output.First()); } @@ -121,9 +131,9 @@ internal sealed class SteamChatMessage { string longLine = new('a', longLineLength - 1); string message = $"{longLine}["; - List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(2, output.Count); + Assert.HasCount(2, output); Assert.AreEqual($"{longLine}{ContinuationCharacter}", output[0]); Assert.AreEqual($@"{ContinuationCharacter}\[", output[1]); @@ -133,9 +143,9 @@ internal sealed class SteamChatMessage { internal async Task NoNeedForAnySplittingWithNewlines() { string message = $"abcdef{Environment.NewLine}ghijkl{Environment.NewLine}mnopqr"; - List output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual(message, output.First()); } @@ -143,23 +153,23 @@ internal sealed class SteamChatMessage { internal async Task NoNeedForAnySplittingWithoutNewlines() { const string message = "abcdef"; - List output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual(message, output.First()); } [TestMethod] - internal void ParagraphCharacterSizeIsLessOrEqualToContinuationCharacterSize() => Assert.IsTrue(ContinuationCharacterBytes >= Encoding.UTF8.GetByteCount(ParagraphCharacter.ToString())); + internal void ParagraphCharacterSizeIsLessOrEqualToContinuationCharacterSize() => Assert.IsGreaterThanOrEqualTo(Encoding.UTF8.GetByteCount(ParagraphCharacter.ToString()), ContinuationCharacterBytes); [TestMethod] internal async Task ProperlyEscapesCharacters() { const string message = @"[b]bold[/b] \n"; const string escapedMessage = @"\[b]bold\[/b] \\n"; - List output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual(escapedMessage, output.First()); } @@ -170,9 +180,9 @@ internal sealed class SteamChatMessage { const string message = "asdf"; - List output = await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, prefix).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(1, output.Count); + Assert.HasCount(1, output); Assert.AreEqual($"{escapedPrefix}{message}", output.First()); } @@ -186,9 +196,9 @@ internal sealed class SteamChatMessage { string longLine = new('a', longLineLength); string message = $"{longLine}{longLine}{longLine}{longLine}"; - List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(4, output.Count); + Assert.HasCount(4, output); Assert.AreEqual($"{longLine}{ContinuationCharacter}", output[0]); Assert.AreEqual($"{ContinuationCharacter}{longLine}{ContinuationCharacter}", output[1]); @@ -260,9 +270,9 @@ internal sealed class SteamChatMessage { 1/1 ботов уже имеют игру app/304930 | Unturned. """; - List output = await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, prefix).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(2, output.Count); + Assert.HasCount(2, output); foreach (string messagePart in output) { if ((messagePart.Length <= prefix.Length) || !messagePart.StartsWith(prefix, StringComparison.Ordinal)) { @@ -304,9 +314,9 @@ internal sealed class SteamChatMessage { string newlinePart = newlinePartBuilder.ToString(); string message = $"{newlinePart}{Environment.NewLine}{newlinePart}{Environment.NewLine}{newlinePart}{Environment.NewLine}{newlinePart}"; - List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false); + List output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false); - Assert.AreEqual(4, output.Count); + Assert.HasCount(4, output); Assert.AreEqual($"{newlinePart}{ParagraphCharacter}", output[0]); Assert.AreEqual($"{newlinePart}{ParagraphCharacter}", output[1]); @@ -320,7 +330,7 @@ internal sealed class SteamChatMessage { const string message = "asdf"; - await Assert.ThrowsExactlyAsync(async () => await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false)).ConfigureAwait(false); + await Assert.ThrowsExactlyAsync(async () => await GetMessageParts(message, prefix).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false)).ConfigureAwait(false); } [TestMethod] @@ -329,7 +339,7 @@ internal sealed class SteamChatMessage { const string message = "asdf"; - await Assert.ThrowsExactlyAsync(async () => await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false)).ConfigureAwait(false); + await Assert.ThrowsExactlyAsync(async () => await GetMessageParts(message, prefix).ToListAsync(TestContext.CancellationTokenSource.Token).ConfigureAwait(false)).ConfigureAwait(false); } } #pragma warning restore CA1812 // False positive, the class is used during MSTest diff --git a/ArchiSteamFarm/NLog/Targets/SteamTarget.cs b/ArchiSteamFarm/NLog/Targets/SteamTarget.cs index 086f46c11..782a1eac1 100644 --- a/ArchiSteamFarm/NLog/Targets/SteamTarget.cs +++ b/ArchiSteamFarm/NLog/Targets/SteamTarget.cs @@ -22,7 +22,6 @@ // limitations under the License. using System; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -36,7 +35,6 @@ using SteamKit2; namespace ArchiSteamFarm.NLog.Targets; -[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] [Target("Steam")] internal sealed class SteamTarget : AsyncTaskTarget { // This is NLog config property, it must have public get() and set() capabilities @@ -54,6 +52,7 @@ internal sealed class SteamTarget : AsyncTaskTarget { // This parameter-less constructor is intentionally public, as NLog uses it for creating targets // It must stay like this as we want to have our targets defined in our NLog.config // Keeping date in default layout also doesn't make much sense (Steam offers that), so we remove it by default + [UsedImplicitly] public SteamTarget() => Layout = "${level:uppercase=true}|${logger}|${message}"; protected override void InitializeTarget() {