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

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