github.com/eris-ltd/erisdb@v0.25.0/storage/prefix_test.go (about)

     1  package storage
     2  
     3  import (
     4  	"sort"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"github.com/stretchr/testify/require"
    11  	dbm "github.com/tendermint/tendermint/libs/db"
    12  )
    13  
    14  func TestPrefix_Iterable(t *testing.T) {
    15  	keys := [][]byte{
    16  		{0x10, 0xab},
    17  		{0x11, 0x00},
    18  		{0x11, 0x00, 0x00},
    19  		{0x11, 0x00, 0x00, 1},
    20  		{0x11, 0x00, 0x00, 2},
    21  		{0x11, 0x00, 0x00, 3},
    22  		{0x11, 0x00, 0x00, 4},
    23  		{0x11, 0x00, 0x01, 0x00},
    24  		{0x11, 0x34, 0x00},
    25  		{0x11, 0xff, 0xff},
    26  		{0x11, 0xff, 0xff, 0xff},
    27  		{0x12},
    28  	}
    29  	memDB := dbm.NewMemDB()
    30  	for i, k := range keys {
    31  		memDB.Set(k, []byte{byte(i)})
    32  	}
    33  	requireKeysSorted(t, keys)
    34  	p := Prefix([]byte{0x11, 0x00, 0x00})
    35  	it := p.Iterable(memDB)
    36  	expectedKeys := [][]byte{{}, {1}, {2}, {3}, {4}}
    37  	requireKeysSorted(t, expectedKeys)
    38  	assert.Equal(t, expectedKeys, dumpKeys(it.Iterator(nil, nil)))
    39  
    40  	expectedKeys = [][]byte{{4}, {3}, {2}, {1}, {}}
    41  	requireKeysSorted(t, expectedKeys, true)
    42  	assert.Equal(t, expectedKeys, dumpKeys(it.ReverseIterator(nil, nil)))
    43  }
    44  
    45  func requireKeysSorted(t *testing.T, keys [][]byte, reverse ...bool) {
    46  	comp := -1
    47  	if len(reverse) > 0 && reverse[0] {
    48  		comp = 1
    49  	}
    50  	sortedKeys := make([][]byte, len(keys))
    51  	for i, k := range keys {
    52  		sortedKeys[i] = make([]byte, len(k))
    53  		copy(sortedKeys[i], k)
    54  	}
    55  	sort.Slice(sortedKeys, func(i, j int) bool {
    56  		return strings.Compare(string(sortedKeys[i]), string(sortedKeys[j])) == comp
    57  	})
    58  	require.Equal(t, sortedKeys, keys)
    59  }
    60  
    61  func dumpKeys(it dbm.Iterator) [][]byte {
    62  	var keys [][]byte
    63  	for it.Valid() {
    64  		keys = append(keys, it.Key())
    65  		it.Next()
    66  	}
    67  	return keys
    68  }