github.com/MetalBlockchain/metalgo@v1.11.9/utils/sorting_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package utils 5 6 import ( 7 "cmp" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 ) 12 13 var _ Sortable[sortable] = sortable(0) 14 15 type sortable int 16 17 func (s sortable) Compare(other sortable) int { 18 return cmp.Compare(s, other) 19 } 20 21 func TestSortSliceSortable(t *testing.T) { 22 require := require.New(t) 23 24 var s []sortable 25 Sort(s) 26 require.True(IsSortedAndUnique(s)) 27 require.Empty(s) 28 29 s = []sortable{1} 30 Sort(s) 31 require.True(IsSortedAndUnique(s)) 32 require.Equal([]sortable{1}, s) 33 34 s = []sortable{1, 1} 35 Sort(s) 36 require.Equal([]sortable{1, 1}, s) 37 38 s = []sortable{1, 2} 39 Sort(s) 40 require.True(IsSortedAndUnique(s)) 41 require.Equal([]sortable{1, 2}, s) 42 43 s = []sortable{2, 1} 44 Sort(s) 45 require.True(IsSortedAndUnique(s)) 46 require.Equal([]sortable{1, 2}, s) 47 48 s = []sortable{1, 2, 1} 49 Sort(s) 50 require.Equal([]sortable{1, 1, 2}, s) 51 52 s = []sortable{2, 1, 2} 53 Sort(s) 54 require.Equal([]sortable{1, 2, 2}, s) 55 56 s = []sortable{3, 1, 2} 57 Sort(s) 58 require.Equal([]sortable{1, 2, 3}, s) 59 } 60 61 func TestIsSortedAndUniqueSortable(t *testing.T) { 62 require := require.New(t) 63 64 var s []sortable 65 require.True(IsSortedAndUnique(s)) 66 67 s = []sortable{} 68 require.True(IsSortedAndUnique(s)) 69 70 s = []sortable{1} 71 require.True(IsSortedAndUnique(s)) 72 73 s = []sortable{1, 2} 74 require.True(IsSortedAndUnique(s)) 75 76 s = []sortable{1, 1} 77 require.False(IsSortedAndUnique(s)) 78 79 s = []sortable{2, 1} 80 require.False(IsSortedAndUnique(s)) 81 82 s = []sortable{1, 2, 1} 83 require.False(IsSortedAndUnique(s)) 84 85 s = []sortable{1, 2, 0} 86 require.False(IsSortedAndUnique(s)) 87 } 88 89 func TestSortByHash(t *testing.T) { 90 require := require.New(t) 91 92 s := [][]byte{} 93 SortByHash(s) 94 require.Empty(s) 95 96 s = [][]byte{{1}} 97 SortByHash(s) 98 require.Len(s, 1) 99 require.Equal([]byte{1}, s[0]) 100 101 s = [][]byte{{1}, {2}} 102 SortByHash(s) 103 require.Len(s, 2) 104 require.Equal([]byte{1}, s[0]) 105 require.Equal([]byte{2}, s[1]) 106 107 for i := byte(0); i < 100; i++ { 108 s = [][]byte{{i}, {i + 1}, {i + 2}} 109 SortByHash(s) 110 require.Len(s, 3) 111 require.True(IsSortedAndUniqueByHash(s)) 112 } 113 }