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  }