package leveldb

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestMemDbIterator(t *testing.T) {
	db := NewMemDB()
	keys := make([][]byte, 100)
	for i := 0; i < 100; i++ {
		keys[i] = []byte{byte(i)}
	}

	value := []byte{5}
	for _, k := range keys {
		db.Set(k, value)
	}

	iter := db.Iterator()
	i := 0
	for iter.Next() {
		assert.Equal(t, db.Get(iter.Key()), iter.Value(), "values dont match for key")
		i++
	}
	assert.Equal(t, i, len(db.db), "iterator didnt cover whole db")
}

func TestMemDBClose(t *testing.T) {
	db := NewMemDB()
	copyDB := func(orig map[string][]byte) map[string][]byte {
		copy := make(map[string][]byte)
		for k, v := range orig {
			copy[k] = v
		}
		return copy
	}
	k, v := []byte("foo"), []byte("bar")
	db.Set(k, v)
	require.Equal(t, db.Get(k), v, "expecting a successful get")
	copyBefore := copyDB(db.db)
	db.Close()
	require.Equal(t, db.Get(k), v, "Close is a noop, expecting a successful get")
	copyAfter := copyDB(db.db)
	require.Equal(t, copyBefore, copyAfter, "Close is a noop and shouldn't modify any internal data")
}
