// 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) } }) }