|  | // Copyright 2019 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package strs | 
|  |  | 
|  | import ( | 
|  | "strconv" | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | func TestGoCamelCase(t *testing.T) { | 
|  | tests := []struct { | 
|  | in, want string | 
|  | }{ | 
|  | {"", ""}, | 
|  | {"one", "One"}, | 
|  | {"one_two", "OneTwo"}, | 
|  | {"_my_field_name_2", "XMyFieldName_2"}, | 
|  | {"Something_Capped", "Something_Capped"}, | 
|  | {"my_Name", "My_Name"}, | 
|  | {"OneTwo", "OneTwo"}, | 
|  | {"_", "X"}, | 
|  | {"_a_", "XA_"}, | 
|  | {"one.two", "OneTwo"}, | 
|  | {"one.Two", "One_Two"}, | 
|  | {"one_two.three_four", "OneTwoThreeFour"}, | 
|  | {"one_two.Three_four", "OneTwo_ThreeFour"}, | 
|  | {"_one._two", "XOne_XTwo"}, | 
|  | {"SCREAMING_SNAKE_CASE", "SCREAMING_SNAKE_CASE"}, | 
|  | {"double__underscore", "Double_Underscore"}, | 
|  | {"camelCase", "CamelCase"}, | 
|  | {"go2proto", "Go2Proto"}, | 
|  | {"世界", "世界"}, | 
|  | {"x世界", "X世界"}, | 
|  | {"foo_bar世界", "FooBar世界"}, | 
|  | } | 
|  | for _, tc := range tests { | 
|  | if got := GoCamelCase(tc.in); got != tc.want { | 
|  | t.Errorf("GoCamelCase(%q) = %q, want %q", tc.in, got, tc.want) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestGoSanitized(t *testing.T) { | 
|  | tests := []struct { | 
|  | in, want string | 
|  | }{ | 
|  | {"", "_"}, | 
|  | {"boo", "boo"}, | 
|  | {"Boo", "Boo"}, | 
|  | {"ßoo", "ßoo"}, | 
|  | {"default", "_default"}, | 
|  | {"hello", "hello"}, | 
|  | {"hello-world!!", "hello_world__"}, | 
|  | {"hello-\xde\xad\xbe\xef\x00", "hello_____"}, | 
|  | {"hello 世界", "hello_世界"}, | 
|  | {"世界", "世界"}, | 
|  | } | 
|  | for _, tc := range tests { | 
|  | if got := GoSanitized(tc.in); got != tc.want { | 
|  | t.Errorf("GoSanitized(%q) = %q, want %q", tc.in, got, tc.want) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestName(t *testing.T) { | 
|  | tests := []struct { | 
|  | in                string | 
|  | inEnumPrefix      string | 
|  | wantMapEntry      string | 
|  | wantEnumValue     string | 
|  | wantTrimValue     string | 
|  | wantJSONCamelCase string | 
|  | wantJSONSnakeCase string | 
|  | }{{ | 
|  | in:                "abc", | 
|  | inEnumPrefix:      "", | 
|  | wantMapEntry:      "AbcEntry", | 
|  | wantEnumValue:     "Abc", | 
|  | wantTrimValue:     "abc", | 
|  | wantJSONCamelCase: "abc", | 
|  | wantJSONSnakeCase: "abc", | 
|  | }, { | 
|  | in:                "foo_baR_", | 
|  | inEnumPrefix:      "foo_bar", | 
|  | wantMapEntry:      "FooBaREntry", | 
|  | wantEnumValue:     "FooBar", | 
|  | wantTrimValue:     "foo_baR_", | 
|  | wantJSONCamelCase: "fooBaR", | 
|  | wantJSONSnakeCase: "foo_ba_r_", | 
|  | }, { | 
|  | in:                "snake_caseCamelCase", | 
|  | inEnumPrefix:      "snakecasecamel", | 
|  | wantMapEntry:      "SnakeCaseCamelCaseEntry", | 
|  | wantEnumValue:     "SnakeCasecamelcase", | 
|  | wantTrimValue:     "Case", | 
|  | wantJSONCamelCase: "snakeCaseCamelCase", | 
|  | wantJSONSnakeCase: "snake_case_camel_case", | 
|  | }, { | 
|  | in:                "FiZz_BuZz", | 
|  | inEnumPrefix:      "fizz", | 
|  | wantMapEntry:      "FiZzBuZzEntry", | 
|  | wantEnumValue:     "FizzBuzz", | 
|  | wantTrimValue:     "BuZz", | 
|  | wantJSONCamelCase: "FiZzBuZz", | 
|  | wantJSONSnakeCase: "_fi_zz__bu_zz", | 
|  | }} | 
|  |  | 
|  | for _, tt := range tests { | 
|  | if got := MapEntryName(tt.in); got != tt.wantMapEntry { | 
|  | t.Errorf("MapEntryName(%q) = %q, want %q", tt.in, got, tt.wantMapEntry) | 
|  | } | 
|  | if got := EnumValueName(tt.in); got != tt.wantEnumValue { | 
|  | t.Errorf("EnumValueName(%q) = %q, want %q", tt.in, got, tt.wantEnumValue) | 
|  | } | 
|  | if got := TrimEnumPrefix(tt.in, tt.inEnumPrefix); got != tt.wantTrimValue { | 
|  | t.Errorf("ErimEnumPrefix(%q, %q) = %q, want %q", tt.in, tt.inEnumPrefix, got, tt.wantTrimValue) | 
|  | } | 
|  | if got := JSONCamelCase(tt.in); got != tt.wantJSONCamelCase { | 
|  | t.Errorf("JSONCamelCase(%q) = %q, want %q", tt.in, got, tt.wantJSONCamelCase) | 
|  | } | 
|  | if got := JSONSnakeCase(tt.in); got != tt.wantJSONSnakeCase { | 
|  | t.Errorf("JSONSnakeCase(%q) = %q, want %q", tt.in, got, tt.wantJSONSnakeCase) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | var ( | 
|  | srcString = "1234" | 
|  | srcBytes  = []byte(srcString) | 
|  | dst       uint64 | 
|  | ) | 
|  |  | 
|  | func BenchmarkCast(b *testing.B) { | 
|  | b.Run("Ideal", func(b *testing.B) { | 
|  | b.ReportAllocs() | 
|  | for i := 0; i < b.N; i++ { | 
|  | dst, _ = strconv.ParseUint(srcString, 0, 64) | 
|  | } | 
|  | if dst != 1234 { | 
|  | b.Errorf("got %d, want %s", dst, srcString) | 
|  | } | 
|  | }) | 
|  | b.Run("Copy", func(b *testing.B) { | 
|  | b.ReportAllocs() | 
|  | for i := 0; i < b.N; i++ { | 
|  | dst, _ = strconv.ParseUint(string(srcBytes), 0, 64) | 
|  | } | 
|  | if dst != 1234 { | 
|  | b.Errorf("got %d, want %s", dst, srcString) | 
|  | } | 
|  | }) | 
|  | b.Run("Cast", func(b *testing.B) { | 
|  | b.ReportAllocs() | 
|  | for i := 0; i < b.N; i++ { | 
|  | dst, _ = strconv.ParseUint(UnsafeString(srcBytes), 0, 64) | 
|  | } | 
|  | if dst != 1234 { | 
|  | b.Errorf("got %d, want %s", dst, srcString) | 
|  | } | 
|  | }) | 
|  | } |