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

     1  package below
     2  
     3  import (
     4  	"math"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/go-graphite/carbonapi/expr/interfaces"
     9  	"github.com/go-graphite/carbonapi/expr/metadata"
    10  	"github.com/go-graphite/carbonapi/expr/types"
    11  	"github.com/go-graphite/carbonapi/pkg/parser"
    12  	th "github.com/go-graphite/carbonapi/tests"
    13  )
    14  
    15  var (
    16  	md []interfaces.FunctionMetadata = New("")
    17  )
    18  
    19  func init() {
    20  	for _, m := range md {
    21  		metadata.RegisterFunction(m.Name, m.F)
    22  	}
    23  }
    24  
    25  func TestBelow(t *testing.T) {
    26  	now32 := int64(time.Now().Unix())
    27  
    28  	tests := []th.EvalTestItem{
    29  		{
    30  			"currentAbove(metric1,7)",
    31  			map[parser.MetricRequest][]*types.MetricData{
    32  				{Metric: "metric1", From: 0, Until: 1}: {
    33  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
    34  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    35  					types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32),
    36  					types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 7}, 1, now32),
    37  				},
    38  			},
    39  			[]*types.MetricData{types.MakeMetricData("metricB",
    40  				[]float64{3, 4, 5, 6, 7, 8}, 1, now32)},
    41  		},
    42  		{
    43  			"currentBelow(metric1,0)",
    44  			map[parser.MetricRequest][]*types.MetricData{
    45  				{Metric: "metric1", From: 0, Until: 1}: {
    46  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, math.NaN()}, 1, now32),
    47  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    48  					types.MakeMetricData("metricC", []float64{0, 4, 4, 5, 5, 6}, 1, now32),
    49  				},
    50  			},
    51  			[]*types.MetricData{types.MakeMetricData("metricA",
    52  				[]float64{0, 0, 0, 0, 0, math.NaN()}, 1, now32)},
    53  		},
    54  		{
    55  			"averageAbove(metric1,5)",
    56  			map[parser.MetricRequest][]*types.MetricData{
    57  				{Metric: "metric1", From: 0, Until: 1}: {
    58  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
    59  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32), // avg=5.5
    60  					types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32), // avg=5
    61  				},
    62  			},
    63  			[]*types.MetricData{
    64  				types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    65  			},
    66  		},
    67  		{
    68  			"averageBelow(metric1,0)",
    69  			map[parser.MetricRequest][]*types.MetricData{
    70  				{Metric: "metric1", From: 0, Until: 1}: {
    71  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
    72  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    73  					types.MakeMetricData("metricC", []float64{0, 4, 4, 5, 5, 6}, 1, now32),
    74  				},
    75  			},
    76  			[]*types.MetricData{types.MakeMetricData("metricA",
    77  				[]float64{0, 0, 0, 0, 0, 0}, 1, now32)},
    78  		},
    79  		{
    80  			"maximumAbove(metric1,6)",
    81  			map[parser.MetricRequest][]*types.MetricData{
    82  				{Metric: "metric1", From: 0, Until: 1}: {
    83  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
    84  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    85  					types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32),
    86  				},
    87  			},
    88  			[]*types.MetricData{types.MakeMetricData("metricB",
    89  				[]float64{3, 4, 5, 6, 7, 8}, 1, now32)},
    90  		},
    91  		{
    92  			"maximumBelow(metric1,5)",
    93  			map[parser.MetricRequest][]*types.MetricData{
    94  				{Metric: "metric1", From: 0, Until: 1}: {
    95  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
    96  					types.MakeMetricData("metricB", []float64{3, 4, 5, 6, 7, 8}, 1, now32),
    97  					types.MakeMetricData("metricC", []float64{4, 4, 5, 5, 6, 6}, 1, now32),
    98  				},
    99  			},
   100  			[]*types.MetricData{types.MakeMetricData("metricA",
   101  				[]float64{0, 0, 0, 0, 0, 0}, 1, now32)},
   102  		},
   103  		{
   104  			"minimumAbove(metric1,1)",
   105  			map[parser.MetricRequest][]*types.MetricData{
   106  				{Metric: "metric1", From: 0, Until: 1}: {
   107  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
   108  					types.MakeMetricData("metricB", []float64{1, 4, 5, 6, 7, 8}, 1, now32),
   109  					types.MakeMetricData("metricC", []float64{2, 4, 4, 5, 5, 6}, 1, now32),
   110  				},
   111  			},
   112  			[]*types.MetricData{types.MakeMetricData("metricC",
   113  				[]float64{2, 4, 4, 5, 5, 6}, 1, now32)},
   114  		},
   115  		{
   116  			"minimumBelow(metric1,-2)",
   117  			map[parser.MetricRequest][]*types.MetricData{
   118  				{Metric: "metric1", From: 0, Until: 1}: {
   119  					types.MakeMetricData("metricA", []float64{0, 0, 0, 0, 0, 0}, 1, now32),
   120  					types.MakeMetricData("metricB", []float64{-1, 4, 5, 6, 7, 8}, 1, now32),
   121  					types.MakeMetricData("metricC", []float64{-2, 4, 4, 5, 5, 6}, 1, now32),
   122  				},
   123  			},
   124  			[]*types.MetricData{types.MakeMetricData("metricC",
   125  				[]float64{-2, 4, 4, 5, 5, 6}, 1, now32)},
   126  		},
   127  	}
   128  
   129  	for _, tt := range tests {
   130  		testName := tt.Target
   131  		t.Run(testName, func(t *testing.T) {
   132  			eval := th.EvaluatorFromFunc(md[0].F)
   133  			th.TestEvalExpr(t, eval, &tt)
   134  		})
   135  	}
   136  
   137  }