diff --git a/CHANGELOG.md b/CHANGELOG.md index eb88270..77c9538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,11 +29,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- X10D: `DateTime.Age(DateTime)` and `DateTimeOffset.Age(DateTimeOffset)` parameter renamed from `asOf` to `referenceDate`. +- X10D: DateTime.Age(DateTime) and DateTimeOffset.Age(DateTimeOffset) parameter renamed from asOf to referenceDate. ### Removed -- X10D: Removed `IEnumerable.ConcatOne` - this functionality already exists with `Append`. +- X10D: Removed `IEnumerable.ConcatOne` - this functionality already exists with `Append`. + +## [3.2.2] - 2023-06-05 + +### Added + +- X10D.DSharpPlus: Added support for new usernames. See https://discord.com/blog/usernames + +## 3.2.1 - 2023-06-05 + +ERRONEOUS RELEASE. ## [3.2.0] - 2023-04-03 @@ -597,7 +607,8 @@ please [open an issue](https://github.com/oliverbooth/X10D/issues)! Earlier versions of this package are undocumented and unlisted from package results. -[unreleased]: https://github.com/oliverbooth/X10D/compare/v3.2.0...main +[unreleased]: https://github.com/oliverbooth/X10D/compare/v3.2.2...main +[3.2.2]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.2 [3.2.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.2.0 [3.1.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.1.0 [3.0.0]: https://github.com/oliverbooth/X10D/releases/tag/v3.0.0 diff --git a/X10D.DSharpPlus/src/DiscordUserExtensions.cs b/X10D.DSharpPlus/src/DiscordUserExtensions.cs index adfd477..33eaa6e 100644 --- a/X10D.DSharpPlus/src/DiscordUserExtensions.cs +++ b/X10D.DSharpPlus/src/DiscordUserExtensions.cs @@ -68,6 +68,12 @@ public static class DiscordUserExtensions throw new ArgumentNullException(nameof(user)); } + if (user.Discriminator == "0") + { + // user has a new username. see: https://discord.com/blog/usernames + return user.Username; + } + return $"{user.Username}#{user.Discriminator}"; } diff --git a/X10D.Tests/X10D.Tests.csproj b/X10D.Tests/X10D.Tests.csproj index 00ea605..aa5bbd2 100644 --- a/X10D.Tests/X10D.Tests.csproj +++ b/X10D.Tests/X10D.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAll.cs b/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAll.cs index ebce1e4..3330de8 100644 --- a/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAll.cs +++ b/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAll.cs @@ -1,5 +1,5 @@ using System.Collections.ObjectModel; -using Moq; +using NSubstitute; using NUnit.Framework; using X10D.Collections; @@ -13,16 +13,17 @@ public partial class CollectionTests [Test] public void ClearAndDisposeAll_ShouldClearAndDisposeAllItems_WhenCalledWithValidList() { - var mock1 = new Mock(); - var mock2 = new Mock(); - var mock3 = new Mock(); - var list = new List {mock1.Object, mock2.Object, mock3.Object}; + var substitute1 = Substitute.For(); + var substitute2 = Substitute.For(); + var substitute3 = Substitute.For(); + var list = new List {substitute1, substitute2, substitute3}; list.ClearAndDisposeAll(); - mock1.Verify(i => i.Dispose(), Times.Once); - mock2.Verify(i => i.Dispose(), Times.Once); - mock3.Verify(i => i.Dispose(), Times.Once); + substitute1.Received(1).Dispose(); + substitute2.Received(1).Dispose(); + substitute3.Received(1).Dispose(); + Assert.That(list, Is.Empty); } @@ -36,8 +37,8 @@ public partial class CollectionTests [Test] public void ClearAndDisposeAll_ShouldThrowInvalidOperationException_WhenCalledWithReadOnlyList() { - var mock = new Mock(); - var list = new ReadOnlyCollection(new List {mock.Object}); + var substitute = Substitute.For(); + var list = new ReadOnlyCollection(new List {substitute}); Assert.Throws(() => list.ClearAndDisposeAll()); } diff --git a/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAllAsync.cs b/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAllAsync.cs index 560eac7..c8b3c6a 100644 --- a/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAllAsync.cs +++ b/X10D.Tests/src/Collections/CollectionTests.ClearAndDisposeAllAsync.cs @@ -1,5 +1,5 @@ using System.Collections.ObjectModel; -using Moq; +using NSubstitute; using NUnit.Framework; using X10D.Collections; @@ -13,16 +13,17 @@ public partial class CollectionTests [Test] public async Task ClearAndDisposeAllAsync_ShouldClearAndDisposeAllItems_WhenCalledWithValidList() { - var mock1 = new Mock(); - var mock2 = new Mock(); - var mock3 = new Mock(); - var list = new List {mock1.Object, mock2.Object, mock3.Object}; + var substitute1 = Substitute.For(); + var substitute2 = Substitute.For(); + var substitute3 = Substitute.For(); + var list = new List {substitute1, substitute2, substitute3}; await list.ClearAndDisposeAllAsync().ConfigureAwait(false); - mock1.Verify(i => i.DisposeAsync(), Times.Once); - mock2.Verify(i => i.DisposeAsync(), Times.Once); - mock3.Verify(i => i.DisposeAsync(), Times.Once); + await substitute1.Received(1).DisposeAsync(); + await substitute2.Received(1).DisposeAsync(); + await substitute3.Received(1).DisposeAsync(); + Assert.That(list, Is.Empty); } @@ -36,8 +37,8 @@ public partial class CollectionTests [Test] public void ClearAndDisposeAllAsync_ShouldThrowInvalidOperationException_WhenCalledWithReadOnlyList() { - var mock = new Mock(); - var list = new ReadOnlyCollection(new List {mock.Object}); + var substitute = Substitute.For(); + var list = new ReadOnlyCollection(new List {substitute}); Assert.ThrowsAsync(list.ClearAndDisposeAllAsync); } diff --git a/X10D.Tests/src/Collections/EnumerableTests.DisposeAll.cs b/X10D.Tests/src/Collections/EnumerableTests.DisposeAll.cs index d5a4b8e..a402ceb 100644 --- a/X10D.Tests/src/Collections/EnumerableTests.DisposeAll.cs +++ b/X10D.Tests/src/Collections/EnumerableTests.DisposeAll.cs @@ -1,4 +1,4 @@ -using Moq; +using NSubstitute; using NUnit.Framework; using X10D.Collections; @@ -12,16 +12,16 @@ public partial class EnumerableTests [Test] public void DisposeAll_ShouldDisposeAllItems_WhenCalledWithValidList() { - var mock1 = new Mock(); - var mock2 = new Mock(); - var mock3 = new Mock(); - var list = new List {mock1.Object, mock2.Object, null!, mock3.Object}; + var substitute1 = Substitute.For(); + var substitute2 = Substitute.For(); + var substitute3 = Substitute.For(); + var list = new List { substitute1, substitute2, null!, substitute3 }; list.DisposeAll(); - mock1.Verify(i => i.Dispose(), Times.Once); - mock2.Verify(i => i.Dispose(), Times.Once); - mock3.Verify(i => i.Dispose(), Times.Once); + substitute1.Received(1).Dispose(); + substitute2.Received(1).Dispose(); + substitute3.Received(1).Dispose(); } [Test] diff --git a/X10D.Tests/src/Collections/EnumerableTests.DisposeAllAsync.cs b/X10D.Tests/src/Collections/EnumerableTests.DisposeAllAsync.cs index 867006e..1510338 100644 --- a/X10D.Tests/src/Collections/EnumerableTests.DisposeAllAsync.cs +++ b/X10D.Tests/src/Collections/EnumerableTests.DisposeAllAsync.cs @@ -1,4 +1,4 @@ -using Moq; +using NSubstitute; using NUnit.Framework; using X10D.Collections; @@ -12,16 +12,16 @@ public partial class EnumerableTests [Test] public async Task DisposeAllAsync_ShouldDisposeAllItems_WhenCalledWithValidList() { - var mock1 = new Mock(); - var mock2 = new Mock(); - var mock3 = new Mock(); - var list = new List {mock1.Object, mock2.Object, null!, mock3.Object}; + var substitute1 = Substitute.For(); + var substitute2 = Substitute.For(); + var substitute3 = Substitute.For(); + var list = new List { substitute1, substitute2, null!, substitute3 }; await list.DisposeAllAsync().ConfigureAwait(false); - mock1.Verify(i => i.DisposeAsync(), Times.Once); - mock2.Verify(i => i.DisposeAsync(), Times.Once); - mock3.Verify(i => i.DisposeAsync(), Times.Once); + await substitute1.Received(1).DisposeAsync(); + await substitute2.Received(1).DisposeAsync(); + await substitute3.Received(1).DisposeAsync(); } [Test]