package limiter

import (
	"testing"
	"time"

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

func TestRateLimiter(t *testing.T) {
	r := NewRateLimiter(5, time.Second)
	ticker := time.NewTicker(time.Millisecond * 75)

	// test that we can only get 5 receives from the rate limiter
	counter := 0
outer:
	for {
		select {
		case <-r.C:
			counter++
		case <-ticker.C:
			break outer
		}
	}

	assert.Equal(t, 5, counter)
	r.Stop()
	// verify that the Stop function closes the channel.
	_, ok := <-r.C
	assert.False(t, ok)
}

func TestRateLimiterMultipleIterations(t *testing.T) {
	r := NewRateLimiter(5, time.Millisecond*50)
	ticker := time.NewTicker(time.Millisecond * 250)

	// test that we can get 15 receives from the rate limiter
	counter := 0
outer:
	for {
		select {
		case <-ticker.C:
			break outer
		case <-r.C:
			counter++
		}
	}

	assert.True(t, counter > 10)
	r.Stop()
	// verify that the Stop function closes the channel.
	_, ok := <-r.C
	assert.False(t, ok)
}