package bbgo

import (
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/c9s/bbgo/pkg/types"
)

func newTestIndicatorSet() *IndicatorSet {
	symbol := "BTCUSDT"
	store := types.NewMarketDataStore(symbol)
	store.KLineWindows[types.Interval1m] = &types.KLineWindow{
		{Open: number(19000.0), Close: number(19100.0)},
		{Open: number(19100.0), Close: number(19200.0)},
		{Open: number(19200.0), Close: number(19300.0)},
		{Open: number(19300.0), Close: number(19200.0)},
		{Open: number(19200.0), Close: number(19100.0)},
		{Open: number(19100.0), Close: number(19500.0)},
		{Open: number(19500.0), Close: number(19600.0)},
		{Open: number(19600.0), Close: number(19700.0)},
	}

	stream := types.NewStandardStream()
	indicatorSet := NewIndicatorSet(symbol, &stream, store)
	return indicatorSet
}

func TestIndicatorSet_closeCache(t *testing.T) {
	indicatorSet := newTestIndicatorSet()

	close1m := indicatorSet.CLOSE(types.Interval1m)
	assert.NotNil(t, close1m)

	close1m2 := indicatorSet.CLOSE(types.Interval1m)
	assert.Equal(t, close1m, close1m2)
}

func TestIndicatorSet_RSI(t *testing.T) {
	indicatorSet := newTestIndicatorSet()

	rsi1m := indicatorSet.RSI(types.IntervalWindow{Interval: types.Interval1m, Window: 7})
	assert.NotNil(t, rsi1m)

	rsiLast := rsi1m.Last(0)
	assert.InDelta(t, 80, rsiLast, 0.0000001)
}

func TestIndicatorSet_EWMA(t *testing.T) {
	indicatorSet := newTestIndicatorSet()

	ema1m := indicatorSet.EWMA(types.IntervalWindow{Interval: types.Interval1m, Window: 7})
	assert.NotNil(t, ema1m)

	emaLast := ema1m.Last(0)
	assert.InDelta(t, 19424.224853515625, emaLast, 0.0000001)
}
