This is an automated email from the ASF dual-hosted git repository.

blankensteiner pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar-dotpulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 276bd9a  Implementing IComparable<MessageId>
276bd9a is described below

commit 276bd9a2cebb5f7fdd34cb468f1c869b55420dc0
Author: Daniel Blankensteiner <[email protected]>
AuthorDate: Tue Dec 22 19:06:33 2020 +0100

    Implementing IComparable<MessageId>
---
 CHANGELOG.md                            |  4 ++
 src/DotPulsar/MessageId.cs              | 34 +++++++++++-
 tests/DotPulsar.Tests/MessageIdTests.cs | 96 +++++++++++++++++++++++++++++----
 3 files changed, 124 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index be9ea7d..a9141a3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/),
 
 ## [Unreleased]
 
+### Added
+
+- MessageId implements IComparable\<MessageId\>
+
 ### Fixed
 
 - Do not throw exceptions when disposing consumers, readers or producers
diff --git a/src/DotPulsar/MessageId.cs b/src/DotPulsar/MessageId.cs
index 27efc62..53bbaa9 100644
--- a/src/DotPulsar/MessageId.cs
+++ b/src/DotPulsar/MessageId.cs
@@ -20,7 +20,7 @@ namespace DotPulsar
     /// <summary>
     /// Unique identifier of a single message.
     /// </summary>
-    public sealed class MessageId : IEquatable<MessageId>
+    public sealed class MessageId : IEquatable<MessageId>, 
IComparable<MessageId>
     {
         static MessageId()
         {
@@ -72,6 +72,38 @@ namespace DotPulsar
         /// </summary>
         public int BatchIndex => Data.BatchIndex;
 
+        public int CompareTo(MessageId? other)
+        {
+            if (other is null)
+                return 1;
+
+            var result = LedgerId.CompareTo(other.LedgerId);
+            if (result != 0)
+                return result;
+
+            result = EntryId.CompareTo(other.EntryId);
+            if (result != 0)
+                return result;
+
+            result = Partition.CompareTo(other.Partition);
+            if (result != 0)
+                return result;
+
+            return BatchIndex.CompareTo(other.BatchIndex);
+        }
+
+        public static bool operator >(MessageId x, MessageId y)
+            => x is not null && x.CompareTo(y) >= 1;
+
+        public static bool operator <(MessageId x, MessageId y)
+            => x is not null ? x.CompareTo(y) <= -1 : y is not null;
+
+        public static bool operator >=(MessageId x, MessageId y)
+            => x is not null ? x.CompareTo(y) >= 0 : y is null;
+
+        public static bool operator <=(MessageId x, MessageId y)
+            => x is not null ? x.CompareTo(y) <= 0 : true;
+
         public override bool Equals(object? o)
             => o is MessageId id && Equals(id);
 
diff --git a/tests/DotPulsar.Tests/MessageIdTests.cs 
b/tests/DotPulsar.Tests/MessageIdTests.cs
index b3d1077..1b87744 100644
--- a/tests/DotPulsar.Tests/MessageIdTests.cs
+++ b/tests/DotPulsar.Tests/MessageIdTests.cs
@@ -12,7 +12,6 @@
  * limitations under the License.
  */
 
-// We cannot assume consumers of this library will obey the nullability 
guarantees
 #nullable disable
 
 namespace DotPulsar.Tests
@@ -24,9 +23,82 @@ namespace DotPulsar.Tests
     public class MessageIdTests
     {
         [Fact]
+        public void CompareTo_GivenTheSameValues_ShouldBeEqual()
+        {
+            var m1 = new MessageId(1, 2, 3, 4);
+            var m2 = new MessageId(1, 2, 3, 4);
+
+            m1.CompareTo(m2).Should().Be(0);
+            (m1 < m2).Should().BeFalse();
+            (m1 > m2).Should().BeFalse();
+            (m1 >= m2).Should().BeTrue();
+            (m1 <= m2).Should().BeTrue();
+        }
+
+        [Fact]
+        public void CompareTo_GivenAllNull_ShouldBeEqual()
+        {
+            MessageId m1 = null;
+            MessageId m2 = null;
+
+            (m1 < m2).Should().BeFalse();
+            (m1 > m2).Should().BeFalse();
+            (m1 <= m2).Should().BeTrue();
+            (m1 >= m2).Should().BeTrue();
+        }
+
+        [Fact]
+        public void CompareTo_GivenOneNull_ShouldFollowNull()
+        {
+            var m1 = new MessageId(1, 2, 3, 4);
+            MessageId m2 = null;
+
+            m1.CompareTo(m2).Should().BePositive();
+            (m1 < m2).Should().BeFalse();
+            (m1 > m2).Should().BeTrue();
+            (m1 <= m2).Should().BeFalse();
+            (m1 >= m2).Should().BeTrue();
+
+            (m2 < m1).Should().BeTrue();
+            (m2 > m1).Should().BeFalse();
+            (m2 <= m1).Should().BeTrue();
+            (m2 >= m1).Should().BeFalse();
+        }
+
+        [Theory]
+        [InlineData(2, 2, 3, 4)] // LegderId is greater
+        [InlineData(1, 3, 3, 4)] // EntryId is greater
+        [InlineData(1, 2, 4, 4)] // Partition is greater
+        [InlineData(1, 2, 3, 5)] // BatchIndex is greater
+        public void 
CompareTo_GivenCurrentFollowsArgument_ShouldReturnPositive(ulong ledgerId, 
ulong entryId, int partition, int batchIndex)
+        {
+            var m1 = new MessageId(ledgerId, entryId, partition, batchIndex);
+            var m2 = new MessageId(1, 2, 3, 4);
+
+            m1.CompareTo(m2).Should().BePositive();
+            (m1 > m2).Should().BeTrue();
+            (m1 < m2).Should().BeFalse();
+        }
+
+        [Theory]
+        [InlineData(0, 2, 3, 4)] // LegderId is less
+        [InlineData(1, 1, 3, 4)] // EntryId is less
+        [InlineData(1, 2, 2, 4)] // Partition is less
+        [InlineData(1, 2, 3, 3)] // BatchIndex is less
+        public void 
CompareTo_GivenCurrentPrecedesArgument_ShouldReturnNegative(ulong ledgerId, 
ulong entryId, int partition, int batchIndex)
+        {
+            var m1 = new MessageId(ledgerId, entryId, partition, batchIndex);
+            var m2 = new MessageId(1, 2, 3, 4);
+
+            m1.CompareTo(m2).Should().BeNegative();
+            (m1 < m2).Should().BeTrue();
+            (m1 > m2).Should().BeFalse();
+        }
+
+        [Fact]
         public void Equals_GivenTheSameObject_ShouldBeEqual()
         {
-            var m1 = new MessageId(1234, 5678, 9876, 5432);
+            var m1 = new MessageId(1, 2, 3, 4);
             var m2 = m1;
 
             m1.Equals(m2).Should().BeTrue();
@@ -37,19 +109,23 @@ namespace DotPulsar.Tests
         [Fact]
         public void Equals_GivenTheSameValues_ShouldBeEqual()
         {
-            var m1 = new MessageId(1234, 5678, 9876, 5432);
-            var m2 = new MessageId(1234, 5678, 9876, 5432);
+            var m1 = new MessageId(1, 2, 3, 4);
+            var m2 = new MessageId(1, 2, 3, 4);
 
             m1.Equals(m2).Should().BeTrue();
             (m1 == m2).Should().BeTrue();
             (m1 != m2).Should().BeFalse();
         }
 
-        [Fact]
-        public void Equals_GivenDifferentValues_ShouldNotBeEqual()
+        [Theory]
+        [InlineData(0, 2, 3, 4)] // LegerId not the same
+        [InlineData(1, 0, 3, 4)] // EntryId not the same
+        [InlineData(1, 2, 0, 4)] // Partition not the same
+        [InlineData(1, 2, 3, 0)] // BatchIndex not the same
+        public void Equals_GivenDifferentValues_ShouldNotBeEqual(ulong 
ledgerId, ulong entryId, int partition, int batchIndex)
         {
-            var m1 = new MessageId(1234, 5678, 9876, 5432);
-            var m2 = new MessageId(9876, 6432, 1234, 6678);
+            var m1 = new MessageId(ledgerId, entryId, partition, batchIndex);
+            var m2 = new MessageId(1, 2, 3, 4);
 
             m1.Equals(m2).Should().BeFalse();
             (m1 == m2).Should().BeFalse();
@@ -70,7 +146,7 @@ namespace DotPulsar.Tests
         [Fact]
         public void Equals_GivenOneNull_ShouldNotBeEqual()
         {
-            var m1 = new MessageId(1234, 5678, 9876, 5432);
+            var m1 = new MessageId(1, 2, 3, 4);
             MessageId m2 = null;
 
             (m1 == null).Should().BeFalse();
@@ -80,3 +156,5 @@ namespace DotPulsar.Tests
         }
     }
 }
+
+#nullable enable

Reply via email to