package sync

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"golang.org/x/sync/errgroup"
)

func TestKeyLocker(t *testing.T) {
	taken := false
	eg, _ := errgroup.WithContext(context.Background())
	keyLocker := NewKeyLocker[int]()
	for i := 0; i < 100; i++ {
		eg.Go(func() error {
			keyLocker.Lock(0)
			defer keyLocker.Unlock(0)

			require.False(t, taken)
			taken = true
			require.True(t, taken)
			time.Sleep(10 * time.Millisecond)
			taken = false
			require.False(t, taken)

			return nil
		})
	}
	require.NoError(t, eg.Wait())
}