github.com/go-graphite/carbonapi@v0.17.0/expr/functions/holtWintersForecast/function_test.go (about)

     1  package holtWintersForecast
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-graphite/carbonapi/expr/interfaces"
     7  	"github.com/go-graphite/carbonapi/expr/metadata"
     8  	"github.com/go-graphite/carbonapi/expr/types"
     9  	"github.com/go-graphite/carbonapi/pkg/parser"
    10  	th "github.com/go-graphite/carbonapi/tests"
    11  )
    12  
    13  var (
    14  	md []interfaces.FunctionMetadata = New("")
    15  )
    16  
    17  func init() {
    18  	for _, m := range md {
    19  		metadata.RegisterFunction(m.Name, m.F)
    20  	}
    21  }
    22  
    23  func TestHoltWintersForecast(t *testing.T) {
    24  	var startTime int64 = 2678400
    25  	var step int64 = 600
    26  	var points int64 = 10
    27  	var seconds int64 = 86400
    28  
    29  	tests := []th.EvalTestItemWithRange{
    30  		{
    31  			Target: "holtWintersForecast(metric1)",
    32  			M: map[parser.MetricRequest][]*types.MetricData{
    33  				{Metric: "metric1", From: startTime - 7*seconds, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((7*seconds/step)+points)*step, step), step, startTime-7*seconds)},
    34  			},
    35  			Want: []*types.MetricData{
    36  				types.MakeMetricData("holtWintersForecast(metric1)", []float64{4.354532587468384, 5.233762480879125, 5.470443699760628, 5.400062907182546, 4.654782553991797, 4.85560658189784, 3.639077513586465, 4.192121821282148, 4.072238207117917, 4.754208902522321}, step, startTime).SetTag("holtWintersForecast", "1"),
    37  			},
    38  			From:  startTime,
    39  			Until: startTime + step*points,
    40  		},
    41  		{
    42  			Target: "holtWintersForecast(metric1,'6d')",
    43  			M: map[parser.MetricRequest][]*types.MetricData{
    44  				{Metric: "metric1", From: startTime - 6*seconds, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((6*seconds/step)+points)*step, step), step, startTime-6*seconds)},
    45  			},
    46  			Want: []*types.MetricData{
    47  				types.MakeMetricData("holtWintersForecast(metric1)", []float64{3.756495938587323, 4.246729557688366, 4.0724537420914375, 4.707653738003789, 4.526243518254055, 5.324901822037504, 5.491471359733914, 5.360475158485411, 4.56317918291436, 4.719755423132087}, step, startTime).SetTag("holtWintersForecast", "1"),
    48  			},
    49  			From:  startTime,
    50  			Until: startTime + step*points,
    51  		},
    52  		{
    53  			Target: "holtWintersForecast(metric1,'1d','2d')",
    54  			M: map[parser.MetricRequest][]*types.MetricData{
    55  				{Metric: "metric1", From: startTime - seconds, Until: startTime + step*points}: {types.MakeMetricData("metric1", generateHwRange(0, ((seconds/step)+points)*step, step), step, startTime-seconds)},
    56  			},
    57  			Want: []*types.MetricData{
    58  				types.MakeMetricData("holtWintersForecast(metric1)", []float64{4.177645280818122, 4.168426771668243, 4.260421164063269, 4.443824969811369, 4.709783056245225, 5.0502969099660096, 5.458141774396228, 4.923291802762386, 4.540553676160961, 4.2952001684330225}, step, startTime).SetTag("holtWintersForecast", "1"),
    59  			},
    60  			From:  startTime,
    61  			Until: startTime + step*points,
    62  		},
    63  	}
    64  
    65  	for _, tt := range tests {
    66  		testName := tt.Target
    67  		t.Run(testName, func(t *testing.T) {
    68  			eval := th.EvaluatorFromFunc(md[0].F)
    69  			th.TestEvalExprWithRange(t, eval, &tt)
    70  		})
    71  	}
    72  }
    73  
    74  func generateHwRange(x, y, jump int64) []float64 {
    75  	var valuesList []float64
    76  	for x < y {
    77  		val := float64((x / jump) % 10)
    78  		valuesList = append(valuesList, val)
    79  		x += jump
    80  	}
    81  	return valuesList
    82  }