package fs_test

import (
	"context"
	"fmt"
	"testing"

	"github.com/rclone/rclone/fs"
	"github.com/rclone/rclone/fs/hash"
	"github.com/rclone/rclone/fstest/mockfs"
	"github.com/rclone/rclone/fstest/mockobject"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestFingerprint(t *testing.T) {
	ctx := context.Background()
	fMock, err := mockfs.NewFs(ctx, "test", "root", nil)
	require.NoError(t, err)
	f := fMock.(*mockfs.Fs)
	f.SetHashes(hash.NewHashSet(hash.MD5))

	for i, test := range []struct {
		fast        bool
		slowModTime bool
		slowHash    bool
		want        string
	}{
		{fast: false, slowModTime: false, slowHash: false, want: "4,0001-01-01 00:00:00 +0000 UTC,8d777f385d3dfec8815d20f7496026dc"},
		{fast: false, slowModTime: false, slowHash: true, want: "4,0001-01-01 00:00:00 +0000 UTC,8d777f385d3dfec8815d20f7496026dc"},
		{fast: false, slowModTime: true, slowHash: false, want: "4,0001-01-01 00:00:00 +0000 UTC,8d777f385d3dfec8815d20f7496026dc"},
		{fast: false, slowModTime: true, slowHash: true, want: "4,0001-01-01 00:00:00 +0000 UTC,8d777f385d3dfec8815d20f7496026dc"},
		{fast: true, slowModTime: false, slowHash: false, want: "4,0001-01-01 00:00:00 +0000 UTC,8d777f385d3dfec8815d20f7496026dc"},
		{fast: true, slowModTime: false, slowHash: true, want: "4,0001-01-01 00:00:00 +0000 UTC"},
		{fast: true, slowModTime: true, slowHash: false, want: "4,8d777f385d3dfec8815d20f7496026dc"},
		{fast: true, slowModTime: true, slowHash: true, want: "4"},
	} {
		what := fmt.Sprintf("#%d fast=%v,slowModTime=%v,slowHash=%v", i, test.fast, test.slowModTime, test.slowHash)
		o := mockobject.New("potato").WithContent([]byte("data"), mockobject.SeekModeRegular)
		o.SetFs(f)
		f.Features().SlowModTime = test.slowModTime
		f.Features().SlowHash = test.slowHash
		got := fs.Fingerprint(ctx, o, test.fast)
		assert.Equal(t, test.want, got, what)
	}
}
