61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package orm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"pgregory.net/rapid"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPrefixRangeProperty(t *testing.T) {
|
|
t.Run("TestPrefixRange", rapid.MakeCheck(func(t *rapid.T) {
|
|
prefix := rapid.SliceOf(rapid.Byte()).Draw(t, "prefix").([]byte)
|
|
|
|
start, end := PrefixRange(prefix)
|
|
|
|
// len(prefix) == 0 => start == nil && end == nil
|
|
if len(prefix) == 0 {
|
|
require.Nil(t, start)
|
|
require.Nil(t, end)
|
|
} else {
|
|
// start == prefix
|
|
require.Equal(t, prefix, start)
|
|
|
|
// Would overflow if all bytes are 255
|
|
wouldOverflow := true
|
|
for _, b := range prefix {
|
|
if b != 255 {
|
|
wouldOverflow = false
|
|
}
|
|
}
|
|
|
|
// Overflow => end == nil
|
|
if wouldOverflow {
|
|
require.Nil(t, end)
|
|
} else {
|
|
require.Equal(t, len(start), len(end))
|
|
|
|
// Scan back and find last value that isn't 255
|
|
overflowIndex := len(start) - 1
|
|
for overflowIndex > 0 && prefix[overflowIndex] == 255 {
|
|
overflowIndex--
|
|
}
|
|
|
|
// bytes should be the same up to overflow
|
|
// index, one greater at overflow and 0 from
|
|
// then on
|
|
for i, b := range start {
|
|
if i < overflowIndex {
|
|
require.Equal(t, b, end[i])
|
|
} else if i == overflowIndex {
|
|
require.Equal(t, b+1, end[i])
|
|
} else {
|
|
require.Equal(t, uint8(0), end[i])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}))
|
|
}
|