package bps

import (
	"testing"
	"time"
)

type Sample struct {
	N      int64
	Expect float64
}

func getSimpleSamples(sampleCount, rate int) []Sample {
	a := make([]Sample, sampleCount)
	for i := 1; i < sampleCount; i++ {
		a[i] = Sample{N: int64(i * rate), Expect: float64(rate)}
	}
	return a
}

type SampleSetTest struct {
	Gauge    Gauge
	Interval time.Duration
	Samples  []Sample
}

func (c *SampleSetTest) Run(t *testing.T) {
	ts := time.Unix(0, 0)
	for i, sample := range c.Samples {
		c.Gauge.Sample(ts, sample.N)
		if actual := c.Gauge.BPS(); actual != sample.Expect {
			t.Errorf("expected: Gauge.BPS() → %0.2f, got %0.2f in test %d", sample.Expect, actual, i+1)
		}
		ts = ts.Add(c.Interval)
	}
}

func TestSMA_SimpleSteadyCase(t *testing.T) {
	test := &SampleSetTest{
		Interval: time.Second,
		Samples:  getSimpleSamples(100000, 3),
	}
	t.Run("SmallSampleSize", func(t *testing.T) {
		test.Gauge = NewSMA(2)
		test.Run(t)
	})
	t.Run("RegularSize", func(t *testing.T) {
		test.Gauge = NewSMA(6)
		test.Run(t)
	})
	t.Run("LargeSampleSize", func(t *testing.T) {
		test.Gauge = NewSMA(1000)
		test.Run(t)
	})
}