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 }