From ad9d692a6fefc137603c6b8787f6f6f5bac84bd3 Mon Sep 17 00:00:00 2001 From: skibitsky Date: Wed, 31 Jan 2024 15:35:41 +0900 Subject: [PATCH] chore: namespace type cleanup and tests --- .../NamespaceTests.cs | 97 +++++++++++++++++++ WalletConnectSharp.Sign/Models/Namespace.cs | 34 ++++--- .../Models/ProposedNamespace.cs | 17 ++-- 3 files changed, 129 insertions(+), 19 deletions(-) create mode 100644 Tests/WalletConnectSharp.Sign.Test/NamespaceTests.cs diff --git a/Tests/WalletConnectSharp.Sign.Test/NamespaceTests.cs b/Tests/WalletConnectSharp.Sign.Test/NamespaceTests.cs new file mode 100644 index 0000000..dafdc56 --- /dev/null +++ b/Tests/WalletConnectSharp.Sign.Test/NamespaceTests.cs @@ -0,0 +1,97 @@ +using Xunit; +using WalletConnectSharp.Sign.Models; + +namespace WalletConnectSharp.Sign.Test; + +public class NamespaceTests +{ + [Fact, Trait("Category", "unit")] + public void WithMethod_AppendsNewMethod() + { + var ns = new Namespace(); + ns.WithMethod("newMethod"); + + Assert.Contains("newMethod", ns.Methods); + } + + [Fact, Trait("Category", "unit"), Trait("Category", "unit")] + public void WithChain_AppendsNewChain_WhenChainsIsNull() + { + var ns = new Namespace(); + ns.WithChain("newChain"); + + Assert.Contains("newChain", ns.Chains); + } + + [Fact, Trait("Category", "unit"), Trait("Category", "unit")] + public void WithChain_AppendsNewChain_WhenChainsIsNotNull() + { + var ns = new Namespace(); + ns.WithChain("existingChain"); + ns.WithChain("newChain"); + + Assert.Contains("newChain", ns.Chains); + } + + [Fact, Trait("Category", "unit")] + public void WithEvent_AppendsNewEvent_WhenEventsIsNull() + { + var ns = new Namespace(); + ns.WithEvent("newEvent"); + + Assert.Contains("newEvent", ns.Events); + } + + [Fact, Trait("Category", "unit")] + public void WithEvent_AppendsNewEvent_WhenEventsIsNotNull() + { + var ns = new Namespace(); + ns.WithEvent("existingEvent"); + ns.WithEvent("newEvent"); + + Assert.Contains("newEvent", ns.Events); + } + + [Fact, Trait("Category", "unit")] + public void WithAccount_AppendsNewAccount_WhenAccountsIsNull() + { + var ns = new Namespace(); + ns.WithAccount("newAccount"); + + Assert.Contains("newAccount", ns.Accounts); + } + + [Fact, Trait("Category", "unit")] + public void WithAccount_AppendsNewAccount_WhenAccountsIsNotNull() + { + var ns = new Namespace(); + ns.WithAccount("existingAccount"); + ns.WithAccount("newAccount"); + + Assert.Contains("newAccount", ns.Accounts); + } + + [Fact, Trait("Category", "unit")] + public void Equals_ReturnsTrue_WhenNamespacesAreIdentical() + { + var ns1 = new Namespace(); + ns1.WithMethod("method").WithChain("chain").WithEvent("event").WithAccount("account"); + + var ns2 = new Namespace(); + ns2.WithMethod("method").WithChain("chain").WithEvent("event").WithAccount("account"); + + Assert.True(ns1.Equals(ns2)); + } + + [Fact, Trait("Category", "unit")] + public void Equals_ReturnsFalse_WhenNamespacesAreDifferent() + { + var ns1 = new Namespace(); + ns1.WithMethod("method1").WithChain("chain1").WithEvent("event1").WithAccount("account1"); + + var ns2 = new Namespace(); + ns2.WithMethod("method2").WithChain("chain2").WithEvent("event2").WithAccount("account2"); + + Assert.False(ns1.Equals(ns2)); + } +} diff --git a/WalletConnectSharp.Sign/Models/Namespace.cs b/WalletConnectSharp.Sign/Models/Namespace.cs index 1dbd6e0..6dc436c 100644 --- a/WalletConnectSharp.Sign/Models/Namespace.cs +++ b/WalletConnectSharp.Sign/Models/Namespace.cs @@ -6,7 +6,7 @@ namespace WalletConnectSharp.Sign.Models /// A namespace that holds accounts, methods and events enabled. Also includes /// extension namespaces that are enabled /// - public class Namespace + public sealed class Namespace { public Namespace(ProposedNamespace proposedNamespace) { @@ -22,13 +22,13 @@ public Namespace() { } /// [JsonProperty("accounts")] public string[] Accounts; - + /// /// An array of all methods enabled in this namespace /// [JsonProperty("methods")] public string[] Methods; - + /// /// An array of all events enabled in this namespace /// @@ -42,36 +42,45 @@ public Namespace() { } public Namespace WithMethod(string method) { - Methods = Methods.Append(method).ToArray(); + Methods = Methods == null + ? [method] + : Methods.Append(method).ToArray(); return this; } public Namespace WithChain(string chain) { - Chains = Chains.Append(chain).ToArray(); + Chains = Chains == null + ? [chain] + : Chains.Append(chain).ToArray(); return this; } - + public Namespace WithEvent(string @event) { - Events = Events.Append(@event).ToArray(); + Events = Events == null + ? [@event] + : Events.Append(@event).ToArray(); return this; } public Namespace WithAccount(string account) { - Accounts = Accounts.Append(account).ToArray(); + Accounts = Accounts == null + ? [account] + : Accounts.Append(account).ToArray(); return this; } - - protected bool ArrayEquals(string[] a, string[] b) + + protected static bool ArrayEquals(string[] a, string[] b) { return a.Length == b.Length && a.All(b.Contains) && b.All(a.Contains); } protected bool Equals(Namespace other) { - return ArrayEquals(Accounts, other.Accounts) && ArrayEquals(Methods, other.Methods) && ArrayEquals(Events, other.Events); + return ArrayEquals(Accounts, other.Accounts) && ArrayEquals(Methods, other.Methods) && + ArrayEquals(Events, other.Events); } public override bool Equals(object obj) @@ -123,7 +132,8 @@ public bool Equals(Namespace x, Namespace y) return false; } - return x.Accounts.SequenceEqual(y.Accounts) && x.Methods.SequenceEqual(y.Methods) && x.Events.SequenceEqual(y.Events); + return x.Accounts.SequenceEqual(y.Accounts) && x.Methods.SequenceEqual(y.Methods) && + x.Events.SequenceEqual(y.Events); } public int GetHashCode(Namespace obj) diff --git a/WalletConnectSharp.Sign/Models/ProposedNamespace.cs b/WalletConnectSharp.Sign/Models/ProposedNamespace.cs index f2611db..d46b370 100644 --- a/WalletConnectSharp.Sign/Models/ProposedNamespace.cs +++ b/WalletConnectSharp.Sign/Models/ProposedNamespace.cs @@ -7,20 +7,20 @@ namespace WalletConnectSharp.Sign.Models /// /// A required namespace that holds chains, methods and events enabled. /// - public class ProposedNamespace + public sealed class ProposedNamespace { /// /// A list of all chains that are required to be enabled in this namespace /// [JsonProperty("chains")] public string[] Chains; - + /// /// A list of all methods that are required to be enabled in this namespace /// [JsonProperty("methods")] public string[] Methods; - + /// /// A list of all events that are required to be enabled in this namespace /// @@ -58,7 +58,7 @@ public ProposedNamespace WithMethod(string method) Methods = Methods.Append(method).ToArray(); return this; } - + /// /// Add an event as required in this namespace /// @@ -82,7 +82,8 @@ protected bool ArrayEquals(string[] a, string[] b) protected bool Equals(ProposedNamespace other) { - return ArrayEquals(Chains, other.Chains) && ArrayEquals(Methods, other.Methods) && ArrayEquals(Events, other.Events); + return ArrayEquals(Chains, other.Chains) && ArrayEquals(Methods, other.Methods) && + ArrayEquals(Events, other.Events); } public override bool Equals(object obj) @@ -134,7 +135,8 @@ public bool Equals(ProposedNamespace x, ProposedNamespace y) return false; } - return x.Chains.SequenceEqual(y.Chains) && x.Methods.SequenceEqual(y.Methods) && x.Events.SequenceEqual(y.Events); + return x.Chains.SequenceEqual(y.Chains) && x.Methods.SequenceEqual(y.Methods) && + x.Events.SequenceEqual(y.Events); } public int GetHashCode(ProposedNamespace obj) @@ -143,6 +145,7 @@ public int GetHashCode(ProposedNamespace obj) } } - public static IEqualityComparer RequiredNamespaceComparer { get; } = new RequiredNamespaceEqualityComparer(); + public static IEqualityComparer RequiredNamespaceComparer { get; } = + new RequiredNamespaceEqualityComparer(); } }