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 }