diff --git a/pkg/metrics/stats/snake_case_converter.go b/pkg/metrics/stats/snake_case_converter.go index 227c0687..f2653db5 100644 --- a/pkg/metrics/stats/snake_case_converter.go +++ b/pkg/metrics/stats/snake_case_converter.go @@ -52,12 +52,10 @@ var snakeConverters = []struct { re *regexp.Regexp repl string }{ - // example: LC -> L_C (e.g. CamelCase -> Camel_Case). - {regexp.MustCompile("([a-z])([A-Z])"), "${1}_${2}"}, - // example: CCa -> C_Ca (e.g. CCamel -> C_Camel). - {regexp.MustCompile("([A-Z])([A-Z][a-z])"), "${1}_${2}"}, - {regexp.MustCompile("\\."), "_"}, - {regexp.MustCompile("-"), "_"}, + {regexp.MustCompile(`([a-z])([A-Z])`), "${1}_${2}"}, + {regexp.MustCompile(`([A-Z])([A-Z][a-z])`), "${1}_${2}"}, + {regexp.MustCompile(`\.`), "_"}, + {regexp.MustCompile(`-`), "_"}, } var snakeMemoizer = memoizerType{ diff --git a/pkg/metrics/stats/snake_case_converter_test.go b/pkg/metrics/stats/snake_case_converter_test.go new file mode 100644 index 00000000..f3d16459 --- /dev/null +++ b/pkg/metrics/stats/snake_case_converter_test.go @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package stats + +import "testing" + +func TestToSnakeCase(t *testing.T) { + var snakeCaseTest = []struct{ input, output string }{ + {"Camel", "camel"}, + {"Camel", "camel"}, + {"CamelCase", "camel_case"}, + {"CamelCaseAgain", "camel_case_again"}, + {"CCamel", "c_camel"}, + {"CCCamel", "cc_camel"}, + {"CAMEL_CASE", "camel_case"}, + {"camel-case", "camel_case"}, + {"0", "0"}, + {"0.0", "0_0"}, + {"JSON", "json"}, + } + + for _, tt := range snakeCaseTest { + if got, want := toSnakeCase(tt.input), tt.output; got != want { + t.Errorf("want '%s', got '%s'", want, got) + } + } +} + +func TestSnakeMemoize(t *testing.T) { + key := "Test" + if snakeMemoizer.memo[key] != "" { + t.Errorf("want '', got '%s'", snakeMemoizer.memo[key]) + } + toSnakeCase(key) + if snakeMemoizer.memo[key] != "test" { + t.Errorf("want 'test', got '%s'", snakeMemoizer.memo[key]) + } +}