github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/neatdb/memorydb/memorydb_test.go (about) 1 package memorydb 2 3 import ( 4 "bytes" 5 "testing" 6 ) 7 8 func TestMemoryDBIterator(t *testing.T) { 9 tests := []struct { 10 content map[string]string 11 prefix string 12 order []string 13 }{ 14 15 {map[string]string{}, "", nil}, 16 {map[string]string{}, "non-existent-prefix", nil}, 17 18 {map[string]string{"key": "val"}, "", []string{"key"}}, 19 {map[string]string{"key": "val"}, "k", []string{"key"}}, 20 {map[string]string{"key": "val"}, "l", nil}, 21 22 { 23 map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, 24 "", 25 []string{"k1", "k2", "k3", "k4", "k5"}, 26 }, 27 { 28 map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, 29 "k", 30 []string{"k1", "k2", "k3", "k4", "k5"}, 31 }, 32 { 33 map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, 34 "l", 35 nil, 36 }, 37 38 { 39 map[string]string{ 40 "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", 41 "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", 42 }, 43 "ka", 44 []string{"ka1", "ka2", "ka3", "ka4", "ka5"}, 45 }, 46 { 47 map[string]string{ 48 "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", 49 "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", 50 }, 51 "kc", 52 nil, 53 }, 54 } 55 for i, tt := range tests { 56 57 db := New() 58 for key, val := range tt.content { 59 if err := db.Put([]byte(key), []byte(val)); err != nil { 60 t.Fatalf("test %d: failed to insert item %s:%s into database: %v", i, key, val, err) 61 } 62 } 63 64 it, idx := db.NewIteratorWithPrefix([]byte(tt.prefix)), 0 65 for it.Next() { 66 if !bytes.Equal(it.Key(), []byte(tt.order[idx])) { 67 t.Errorf("test %d: item %d: key mismatch: have %s, want %s", i, idx, string(it.Key()), tt.order[idx]) 68 } 69 if !bytes.Equal(it.Value(), []byte(tt.content[tt.order[idx]])) { 70 t.Errorf("test %d: item %d: value mismatch: have %s, want %s", i, idx, string(it.Value()), tt.content[tt.order[idx]]) 71 } 72 idx++ 73 } 74 if err := it.Error(); err != nil { 75 t.Errorf("test %d: iteration failed: %v", i, err) 76 } 77 if idx != len(tt.order) { 78 t.Errorf("test %d: iteration terminated prematurely: have %d, want %d", i, idx, len(tt.order)) 79 } 80 } 81 }