github.com/cosmos/cosmos-sdk@v0.50.10/x/group/internal/orm/index_property_test.go (about)

     1  package orm
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  	"pgregory.net/rapid"
     8  )
     9  
    10  func TestPrefixRangeProperty(t *testing.T) {
    11  	t.Run("TestPrefixRange", rapid.MakeCheck(func(t *rapid.T) {
    12  		prefix := rapid.SliceOf(rapid.Byte()).Draw(t, "prefix")
    13  
    14  		start, end := PrefixRange(prefix)
    15  
    16  		// len(prefix) == 0 => start == nil && end == nil
    17  		if len(prefix) == 0 {
    18  			require.Nil(t, start)
    19  			require.Nil(t, end)
    20  		} else {
    21  			// start == prefix
    22  			require.Equal(t, prefix, start)
    23  
    24  			// Would overflow if all bytes are 255
    25  			wouldOverflow := true
    26  			for _, b := range prefix {
    27  				if b != 255 {
    28  					wouldOverflow = false
    29  				}
    30  			}
    31  
    32  			// Overflow => end == nil
    33  			if wouldOverflow {
    34  				require.Nil(t, end)
    35  			} else {
    36  				require.Equal(t, len(start), len(end))
    37  
    38  				// Scan back and find last value that isn't 255
    39  				overflowIndex := len(start) - 1
    40  				for overflowIndex > 0 && prefix[overflowIndex] == 255 {
    41  					overflowIndex--
    42  				}
    43  
    44  				// bytes should be the same up to overflow
    45  				// index, one greater at overflow and 0 from
    46  				// then on
    47  				for i, b := range start {
    48  					if i < overflowIndex {
    49  						require.Equal(t, b, end[i])
    50  					} else if i == overflowIndex {
    51  						require.Equal(t, b+1, end[i])
    52  					} else {
    53  						require.Equal(t, uint8(0), end[i])
    54  					}
    55  				}
    56  			}
    57  		}
    58  	}))
    59  }