Skip to content

Commit 204597c

Browse files
authored
Merge pull request #825 from rootulp/rp/messages-is-sorted
Add IsSorted method to messages
2 parents 5a4c4fd + bcf9d9e commit 204597c

File tree

2 files changed

+78
-3
lines changed

2 files changed

+78
-3
lines changed

types/block.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,26 @@ type Messages struct {
11611161
MessagesList []Message `json:"msgs"`
11621162
}
11631163

1164+
// ByNamespace implements sort.Interface for Message
1165+
type ByNamespace []Message
1166+
1167+
func (s ByNamespace) Len() int {
1168+
return len(s)
1169+
}
1170+
1171+
func (s ByNamespace) Swap(i, j int) {
1172+
s[i], s[j] = s[j], s[i]
1173+
}
1174+
1175+
func (s ByNamespace) Less(i, j int) bool {
1176+
// The following comparison is `<` and not `<=` because bytes.Compare returns 0 for if a == b.
1177+
// We want this comparison to return `false` if a == b because:
1178+
// If both Less(i, j) and Less(j, i) are false,
1179+
// then the elements at index i and j are considered equal.
1180+
// See https://pkg.go.dev/sort#Interface
1181+
return bytes.Compare(s[i].NamespaceID, s[j].NamespaceID) < 0
1182+
}
1183+
11641184
func (msgs Messages) SplitIntoShares() NamespacedShares {
11651185
shares := make([]NamespacedShare, 0)
11661186
msgs.SortMessages()
@@ -1174,10 +1194,14 @@ func (msgs Messages) SplitIntoShares() NamespacedShares {
11741194
return shares
11751195
}
11761196

1197+
// SortMessages sorts messages by ascending namespace id
11771198
func (msgs *Messages) SortMessages() {
1178-
sort.Slice(msgs.MessagesList, func(i, j int) bool {
1179-
return bytes.Compare(msgs.MessagesList[i].NamespaceID, msgs.MessagesList[j].NamespaceID) < 0
1180-
})
1199+
sort.Sort(ByNamespace(msgs.MessagesList))
1200+
}
1201+
1202+
// IsSorted returns whether the messages are sorted by namespace id
1203+
func (msgs *Messages) IsSorted() bool {
1204+
return sort.IsSorted(ByNamespace(msgs.MessagesList))
11811205
}
11821206

11831207
type Message struct {

types/block_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,3 +860,54 @@ func TestBlockIDEquals(t *testing.T) {
860860
assert.True(t, blockIDEmpty.Equals(blockIDEmpty))
861861
assert.False(t, blockIDEmpty.Equals(blockIDDifferent))
862862
}
863+
864+
func TestMessagesIsSorted(t *testing.T) {
865+
sortedMessages := Messages{MessagesList: []Message{
866+
{
867+
NamespaceID: []byte{1, 2, 3, 4, 5, 6, 7, 8},
868+
Data: stdbytes.Repeat([]byte{1}, 100),
869+
},
870+
{
871+
NamespaceID: []byte{8, 7, 6, 5, 4, 3, 2, 1},
872+
Data: stdbytes.Repeat([]byte{2}, 100),
873+
},
874+
}}
875+
sameNamespaceMessages := Messages{MessagesList: []Message{
876+
{
877+
NamespaceID: []byte{1, 2, 3, 4, 5, 6, 7, 8},
878+
Data: stdbytes.Repeat([]byte{1}, 100),
879+
},
880+
{
881+
NamespaceID: []byte{1, 2, 3, 4, 5, 6, 7, 8},
882+
Data: stdbytes.Repeat([]byte{2}, 100),
883+
},
884+
}}
885+
unsortedMessages := Messages{MessagesList: []Message{
886+
{
887+
NamespaceID: []byte{8, 7, 6, 5, 4, 3, 2, 1},
888+
Data: stdbytes.Repeat([]byte{1}, 100),
889+
},
890+
{
891+
NamespaceID: []byte{1, 2, 3, 4, 5, 6, 7, 8},
892+
Data: stdbytes.Repeat([]byte{2}, 100),
893+
},
894+
}}
895+
896+
type testCase struct {
897+
descripton string
898+
messages Messages
899+
want bool
900+
}
901+
902+
tests := []testCase{
903+
{"sorted messages", sortedMessages, true},
904+
{"same namespace messages", sameNamespaceMessages, true},
905+
{"unsorted messages", unsortedMessages, false},
906+
}
907+
908+
for _, tc := range tests {
909+
t.Run(tc.descripton, func(t *testing.T) {
910+
assert.Equal(t, tc.want, tc.messages.IsSorted())
911+
})
912+
}
913+
}

0 commit comments

Comments
 (0)