Skip to content

Commit

Permalink
add: snakecese converter
Browse files Browse the repository at this point in the history
  • Loading branch information
gongna-au committed Oct 5, 2023
1 parent 49a0205 commit 80f9681
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 6 deletions.
10 changes: 4 additions & 6 deletions pkg/metrics/stats/snake_case_converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
53 changes: 53 additions & 0 deletions pkg/metrics/stats/snake_case_converter_test.go
Original file line number Diff line number Diff line change
@@ -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])
}
}

0 comments on commit 80f9681

Please sign in to comment.