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 }