package meta_test

import (
	"testing"

	"github.com/nspcc-dev/neofs-node/pkg/core/object"
	meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
	addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
	"github.com/stretchr/testify/require"
)

func TestDB_IterateOverGraveyard(t *testing.T) {
	db := newDB(t)

	// generate and put 2 objects
	obj1 := generateObject(t)
	obj2 := generateObject(t)

	var err error

	err = putBig(db, obj1)
	require.NoError(t, err)

	err = putBig(db, obj2)
	require.NoError(t, err)

	inhumePrm := new(meta.InhumePrm)

	// inhume with tombstone
	addrTombstone := generateAddress()

	_, err = db.Inhume(inhumePrm.
		WithAddresses(object.AddressOf(obj1)).
		WithTombstoneAddress(addrTombstone),
	)
	require.NoError(t, err)

	// inhume with GC mark
	_, err = db.Inhume(inhumePrm.
		WithAddresses(object.AddressOf(obj2)).
		WithGCMark(),
	)

	var (
		counterAll         int
		buriedTS, buriedGC []*addressSDK.Address
	)

	err = db.IterateOverGraveyard(func(g *meta.Grave) error {
		if g.WithGCMark() {
			buriedGC = append(buriedGC, g.Address())
		} else {
			buriedTS = append(buriedTS, g.Address())
		}

		counterAll++

		return nil
	})

	require.NoError(t, err)

	require.Equal(t, 2, counterAll)
	require.Equal(t, []*addressSDK.Address{object.AddressOf(obj1)}, buriedTS)
	require.Equal(t, []*addressSDK.Address{object.AddressOf(obj2)}, buriedGC)
}