From 889e345689854a80828c9e8b8bf49300e2849db4 Mon Sep 17 00:00:00 2001 From: Say Cheong Date: Mon, 23 Oct 2023 14:09:50 +0900 Subject: [PATCH 1/4] Fixed Boolean equality spec --- Bencodex.Tests/Types/BooleanTest.cs | 29 +++++++++++++++++++++++++++++ Bencodex/Types/Boolean.cs | 29 +++-------------------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/Bencodex.Tests/Types/BooleanTest.cs b/Bencodex.Tests/Types/BooleanTest.cs index 14e5ebc..db30ffe 100644 --- a/Bencodex.Tests/Types/BooleanTest.cs +++ b/Bencodex.Tests/Types/BooleanTest.cs @@ -9,6 +9,35 @@ public class BooleanTest private readonly Boolean _t = new Boolean(true); private readonly Boolean _f = new Boolean(false); + [Fact] + public void Equality() + { + bool b = true; + Boolean x = new Boolean(true); + object ob = (object)b; + object ox = (object)x; + +#pragma warning disable CS1718 // Comparison made to same variable + Assert.True(x == x); + Assert.True(x.Equals(x)); + Assert.True(x.Equals(ox)); + Assert.True(ox.Equals(x)); + Assert.True(ox.Equals(ox)); +#pragma warning restore CS1718 + + Assert.True(b == x); + Assert.True(x == b); + Assert.True(b.Equals(x)); + Assert.True(x.Equals(x)); + + Assert.False(b.Equals(ox)); + Assert.False(x.Equals(ob)); + Assert.False(ob.Equals(x)); + Assert.False(ox.Equals(b)); + Assert.False(ob.Equals(ox)); + Assert.False(ox.Equals(ob)); + } + [Fact] public void Kind() { diff --git a/Bencodex/Types/Boolean.cs b/Bencodex/Types/Boolean.cs index 26a99e8..ae805db 100644 --- a/Bencodex/Types/Boolean.cs +++ b/Bencodex/Types/Boolean.cs @@ -7,7 +7,6 @@ namespace Bencodex.Types /// or false (i.e., f). public struct Boolean : IValue, - IEquatable, IEquatable, IComparable, IComparable, @@ -55,33 +54,11 @@ int IComparable.CompareTo(Boolean other) return CompareTo(other.Value); } - bool IEquatable.Equals(bool other) - { - return Value == other; - } - - bool IEquatable.Equals(Boolean other) - { - return Value == other.Value; - } + public bool Equals(Boolean other) => Value == other.Value; - bool IEquatable.Equals(IValue other) => - other is Boolean o && ((IEquatable)this).Equals(o); + public bool Equals(IValue other) => other is Boolean b && Equals(b); - public override bool Equals(object obj) - { - switch (obj) - { - case null: - return false; - case Boolean b: - return Value.Equals(b.Value); - case bool b: - return Value.Equals(b); - default: - return false; - } - } + public override bool Equals(object obj) => obj is Boolean b && Equals(b); public override int GetHashCode() { From 26cd82cd2e00d1d8803f5e3702fb1f5ba822e505 Mon Sep 17 00:00:00 2001 From: Say Cheong Date: Mon, 23 Oct 2023 14:14:29 +0900 Subject: [PATCH 2/4] Fixed Boolean comparison spec --- Bencodex.Tests/Types/BooleanTest.cs | 30 +++++++++++++++++++++++++++++ Bencodex/Types/Boolean.cs | 24 ++++++++++++----------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/Bencodex.Tests/Types/BooleanTest.cs b/Bencodex.Tests/Types/BooleanTest.cs index db30ffe..0a85719 100644 --- a/Bencodex.Tests/Types/BooleanTest.cs +++ b/Bencodex.Tests/Types/BooleanTest.cs @@ -38,6 +38,36 @@ public void Equality() Assert.False(ox.Equals(ob)); } + [Fact] + public void Comparison() + { + bool b = true; + Boolean x = new Boolean(true); + Boolean? n = null; + object ob = (object)b; + object ox = (object)x; + object on = null; + + Assert.Equal(0, x.CompareTo(x)); + Assert.Equal(0, x.CompareTo(ox)); + Assert.Equal(1, x.CompareTo(n)); + Assert.Equal(1, x.CompareTo(on)); + + Assert.Equal(0, b.CompareTo(x)); + Assert.Equal(0, x.CompareTo(b)); + + Assert.Throws(() => b.CompareTo(ox)); + Assert.Throws(() => x.CompareTo(ob)); + + Boolean f = new Boolean(false); + Boolean t = new Boolean(true); + + Assert.Equal(0, f.CompareTo(f)); + Assert.Equal(0, t.CompareTo(t)); + Assert.True(f.CompareTo(t) < 0); + Assert.True(t.CompareTo(f) > 0); + } + [Fact] public void Kind() { diff --git a/Bencodex/Types/Boolean.cs b/Bencodex/Types/Boolean.cs index ae805db..205f132 100644 --- a/Bencodex/Types/Boolean.cs +++ b/Bencodex/Types/Boolean.cs @@ -8,7 +8,6 @@ namespace Bencodex.Types public struct Boolean : IValue, IEquatable, - IComparable, IComparable, IComparable { @@ -37,21 +36,24 @@ public static implicit operator Boolean(bool b) return new Boolean(b); } - public int CompareTo(object obj) + public int CompareTo(Boolean other) { - if (obj is bool b) + return Value.CompareTo(other.Value); + } + + public int CompareTo(object? obj) + { + if (obj is null) { - return ((IComparable)this).CompareTo(b); + return 1; } - return Value.CompareTo(obj); - } - - int IComparable.CompareTo(bool other) => Value.CompareTo(other); + if (obj is Boolean b) + { + return CompareTo(b); + } - int IComparable.CompareTo(Boolean other) - { - return CompareTo(other.Value); + throw new ArgumentException($"Object must be of type {nameof(Boolean)}"); } public bool Equals(Boolean other) => Value == other.Value; From 4d7f108ffdaf39838dba42d0e0e497a0b5e186eb Mon Sep 17 00:00:00 2001 From: Say Cheong Date: Mon, 23 Oct 2023 14:18:43 +0900 Subject: [PATCH 3/4] Additional equality operator overloading --- Bencodex/Types/Boolean.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Bencodex/Types/Boolean.cs b/Bencodex/Types/Boolean.cs index 205f132..d0eb54d 100644 --- a/Bencodex/Types/Boolean.cs +++ b/Bencodex/Types/Boolean.cs @@ -36,6 +36,18 @@ public static implicit operator Boolean(bool b) return new Boolean(b); } + public static bool operator ==(Boolean a, Boolean b) => a.Equals(b); + + public static bool operator !=(Boolean a, Boolean b) => !a.Equals(b); + + public static bool operator ==(Boolean a, bool b) => a.Equals(b); + + public static bool operator !=(Boolean a, bool b) => !a.Equals(b); + + public static bool operator ==(bool a, Boolean b) => a.Equals(b.Value); + + public static bool operator !=(bool a, Boolean b) => !a.Equals(b.Value); + public int CompareTo(Boolean other) { return Value.CompareTo(other.Value); From 15966186a419db346cf2a6c10a9f775f1418f137 Mon Sep 17 00:00:00 2001 From: Say Cheong Date: Mon, 23 Oct 2023 14:47:21 +0900 Subject: [PATCH 4/4] Changelog --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 49ff260..f057814 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,9 +8,13 @@ To be released. - Removed `IValue.Inspection` property. [[#117]] - Changed `IValue.Inspect(bool)` to `IValue.Inspect()`. [[#118]] + - Removed `IEquatable` and `IComparable` from `Boolean`. + [[#104], [#119]] + - Added `==` and `!=` operators for `Boolean`. [[#119]] [#117]: https://github.com/planetarium/bencodex.net/pull/117 [#118]: https://github.com/planetarium/bencodex.net/pull/118 +[#119]: https://github.com/planetarium/bencodex.net/pull/119 Version 0.15.0