diff --git a/internal/btree/btree.go b/internal/btree/btree.go index 95068f6..7b3b49c 100644 --- a/internal/btree/btree.go +++ b/internal/btree/btree.go @@ -528,8 +528,10 @@ func (d *DB) Delete(hash *byte) error { // Foreach iterates over all items in the database file. func (d *DB) Foreach(iter func(key [16]byte, value []byte)) { - top := d.get(d.top) - d.iterate(top, iter) + if d.top != 0 { + top := d.get(d.top) + d.iterate(top, iter) + } } func (d *DB) iterate(table *table, iter func(key [16]byte, value []byte)) { diff --git a/internal/btree/btree_test.go b/internal/btree/btree_test.go index a080fbd..dfb2b2e 100644 --- a/internal/btree/btree_test.go +++ b/internal/btree/btree_test.go @@ -27,7 +27,8 @@ func TestBtree(t *testing.T) { f := tempfile(t) defer os.Remove(f) bt, err := Create(f) - assert2.NoError(t, err) + assert := assert2.New(t) + assert.NoError(err) tests := []string{ "hello world", @@ -42,51 +43,55 @@ func TestBtree(t *testing.T) { sha[i] = &hash.Sum(nil)[0] bt.Insert(sha[i], []byte(tt)) } - assert2.NoError(t, bt.Close()) + assert.NoError(bt.Close()) bt, err = Open(f) - assert2.NoError(t, err) + assert.NoError(err) var ss []string bt.Foreach(func(key [16]byte, value []byte) { ss = append(ss, string(value)) }) - assert2.ElementsMatch(t, tests, ss) + assert.ElementsMatch(tests, ss) for i, tt := range tests { - assert2.Equal(t, []byte(tt), bt.Get(sha[i])) + assert.Equal([]byte(tt), bt.Get(sha[i])) } for i := range tests { - assert2.NoError(t, bt.Delete(sha[i])) + assert.NoError(bt.Delete(sha[i])) } for i := range tests { - assert2.Equal(t, []byte(nil), bt.Get(sha[i])) + assert.Equal([]byte(nil), bt.Get(sha[i])) } - - assert2.NoError(t, bt.Close()) + assert.NoError(bt.Close()) } -func TestDB_Foreach(t *testing.T) { - const elemSize = 100 - set := make([]string, elemSize) +func testForeach(t *testing.T, elemSize int) { + expected := make([]string, elemSize) for i := 0; i < elemSize; i++ { - set[i] = utils.RandomString(20) + expected[i] = utils.RandomString(20) } f := tempfile(t) defer os.Remove(f) bt, err := Create(f) defer bt.Close() assert2.NoError(t, err) - for _, v := range set { + for _, v := range expected { hash := sha1.New() hash.Write([]byte(v)) bt.Insert(&hash.Sum(nil)[0], []byte(v)) } - - var ss []string + var got []string bt.Foreach(func(key [16]byte, value []byte) { - ss = append(ss, string(value)) + got = append(got, string(value)) }) - assert2.ElementsMatch(t, set, ss) + assert2.ElementsMatch(t, expected, got) +} + +func TestDB_Foreach(t *testing.T) { + elemSizes := []int{0, 5, 100, 200} + for _, size := range elemSizes { + testForeach(t, size) + } }