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  }