1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage strs 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "strconv" 9*1c12ee1eSDan Willemsen "testing" 10*1c12ee1eSDan Willemsen) 11*1c12ee1eSDan Willemsen 12*1c12ee1eSDan Willemsenfunc TestGoCamelCase(t *testing.T) { 13*1c12ee1eSDan Willemsen tests := []struct { 14*1c12ee1eSDan Willemsen in, want string 15*1c12ee1eSDan Willemsen }{ 16*1c12ee1eSDan Willemsen {"", ""}, 17*1c12ee1eSDan Willemsen {"one", "One"}, 18*1c12ee1eSDan Willemsen {"one_two", "OneTwo"}, 19*1c12ee1eSDan Willemsen {"_my_field_name_2", "XMyFieldName_2"}, 20*1c12ee1eSDan Willemsen {"Something_Capped", "Something_Capped"}, 21*1c12ee1eSDan Willemsen {"my_Name", "My_Name"}, 22*1c12ee1eSDan Willemsen {"OneTwo", "OneTwo"}, 23*1c12ee1eSDan Willemsen {"_", "X"}, 24*1c12ee1eSDan Willemsen {"_a_", "XA_"}, 25*1c12ee1eSDan Willemsen {"one.two", "OneTwo"}, 26*1c12ee1eSDan Willemsen {"one.Two", "One_Two"}, 27*1c12ee1eSDan Willemsen {"one_two.three_four", "OneTwoThreeFour"}, 28*1c12ee1eSDan Willemsen {"one_two.Three_four", "OneTwo_ThreeFour"}, 29*1c12ee1eSDan Willemsen {"_one._two", "XOne_XTwo"}, 30*1c12ee1eSDan Willemsen {"SCREAMING_SNAKE_CASE", "SCREAMING_SNAKE_CASE"}, 31*1c12ee1eSDan Willemsen {"double__underscore", "Double_Underscore"}, 32*1c12ee1eSDan Willemsen {"camelCase", "CamelCase"}, 33*1c12ee1eSDan Willemsen {"go2proto", "Go2Proto"}, 34*1c12ee1eSDan Willemsen {"世界", "世界"}, 35*1c12ee1eSDan Willemsen {"x世界", "X世界"}, 36*1c12ee1eSDan Willemsen {"foo_bar世界", "FooBar世界"}, 37*1c12ee1eSDan Willemsen } 38*1c12ee1eSDan Willemsen for _, tc := range tests { 39*1c12ee1eSDan Willemsen if got := GoCamelCase(tc.in); got != tc.want { 40*1c12ee1eSDan Willemsen t.Errorf("GoCamelCase(%q) = %q, want %q", tc.in, got, tc.want) 41*1c12ee1eSDan Willemsen } 42*1c12ee1eSDan Willemsen } 43*1c12ee1eSDan Willemsen} 44*1c12ee1eSDan Willemsen 45*1c12ee1eSDan Willemsenfunc TestGoSanitized(t *testing.T) { 46*1c12ee1eSDan Willemsen tests := []struct { 47*1c12ee1eSDan Willemsen in, want string 48*1c12ee1eSDan Willemsen }{ 49*1c12ee1eSDan Willemsen {"", "_"}, 50*1c12ee1eSDan Willemsen {"boo", "boo"}, 51*1c12ee1eSDan Willemsen {"Boo", "Boo"}, 52*1c12ee1eSDan Willemsen {"ßoo", "ßoo"}, 53*1c12ee1eSDan Willemsen {"default", "_default"}, 54*1c12ee1eSDan Willemsen {"hello", "hello"}, 55*1c12ee1eSDan Willemsen {"hello-world!!", "hello_world__"}, 56*1c12ee1eSDan Willemsen {"hello-\xde\xad\xbe\xef\x00", "hello_____"}, 57*1c12ee1eSDan Willemsen {"hello 世界", "hello_世界"}, 58*1c12ee1eSDan Willemsen {"世界", "世界"}, 59*1c12ee1eSDan Willemsen } 60*1c12ee1eSDan Willemsen for _, tc := range tests { 61*1c12ee1eSDan Willemsen if got := GoSanitized(tc.in); got != tc.want { 62*1c12ee1eSDan Willemsen t.Errorf("GoSanitized(%q) = %q, want %q", tc.in, got, tc.want) 63*1c12ee1eSDan Willemsen } 64*1c12ee1eSDan Willemsen } 65*1c12ee1eSDan Willemsen} 66*1c12ee1eSDan Willemsen 67*1c12ee1eSDan Willemsenfunc TestName(t *testing.T) { 68*1c12ee1eSDan Willemsen tests := []struct { 69*1c12ee1eSDan Willemsen in string 70*1c12ee1eSDan Willemsen inEnumPrefix string 71*1c12ee1eSDan Willemsen wantMapEntry string 72*1c12ee1eSDan Willemsen wantEnumValue string 73*1c12ee1eSDan Willemsen wantTrimValue string 74*1c12ee1eSDan Willemsen wantJSONCamelCase string 75*1c12ee1eSDan Willemsen wantJSONSnakeCase string 76*1c12ee1eSDan Willemsen }{{ 77*1c12ee1eSDan Willemsen in: "abc", 78*1c12ee1eSDan Willemsen inEnumPrefix: "", 79*1c12ee1eSDan Willemsen wantMapEntry: "AbcEntry", 80*1c12ee1eSDan Willemsen wantEnumValue: "Abc", 81*1c12ee1eSDan Willemsen wantTrimValue: "abc", 82*1c12ee1eSDan Willemsen wantJSONCamelCase: "abc", 83*1c12ee1eSDan Willemsen wantJSONSnakeCase: "abc", 84*1c12ee1eSDan Willemsen }, { 85*1c12ee1eSDan Willemsen in: "foo_baR_", 86*1c12ee1eSDan Willemsen inEnumPrefix: "foo_bar", 87*1c12ee1eSDan Willemsen wantMapEntry: "FooBaREntry", 88*1c12ee1eSDan Willemsen wantEnumValue: "FooBar", 89*1c12ee1eSDan Willemsen wantTrimValue: "foo_baR_", 90*1c12ee1eSDan Willemsen wantJSONCamelCase: "fooBaR", 91*1c12ee1eSDan Willemsen wantJSONSnakeCase: "foo_ba_r_", 92*1c12ee1eSDan Willemsen }, { 93*1c12ee1eSDan Willemsen in: "snake_caseCamelCase", 94*1c12ee1eSDan Willemsen inEnumPrefix: "snakecasecamel", 95*1c12ee1eSDan Willemsen wantMapEntry: "SnakeCaseCamelCaseEntry", 96*1c12ee1eSDan Willemsen wantEnumValue: "SnakeCasecamelcase", 97*1c12ee1eSDan Willemsen wantTrimValue: "Case", 98*1c12ee1eSDan Willemsen wantJSONCamelCase: "snakeCaseCamelCase", 99*1c12ee1eSDan Willemsen wantJSONSnakeCase: "snake_case_camel_case", 100*1c12ee1eSDan Willemsen }, { 101*1c12ee1eSDan Willemsen in: "FiZz_BuZz", 102*1c12ee1eSDan Willemsen inEnumPrefix: "fizz", 103*1c12ee1eSDan Willemsen wantMapEntry: "FiZzBuZzEntry", 104*1c12ee1eSDan Willemsen wantEnumValue: "FizzBuzz", 105*1c12ee1eSDan Willemsen wantTrimValue: "BuZz", 106*1c12ee1eSDan Willemsen wantJSONCamelCase: "FiZzBuZz", 107*1c12ee1eSDan Willemsen wantJSONSnakeCase: "_fi_zz__bu_zz", 108*1c12ee1eSDan Willemsen }} 109*1c12ee1eSDan Willemsen 110*1c12ee1eSDan Willemsen for _, tt := range tests { 111*1c12ee1eSDan Willemsen if got := MapEntryName(tt.in); got != tt.wantMapEntry { 112*1c12ee1eSDan Willemsen t.Errorf("MapEntryName(%q) = %q, want %q", tt.in, got, tt.wantMapEntry) 113*1c12ee1eSDan Willemsen } 114*1c12ee1eSDan Willemsen if got := EnumValueName(tt.in); got != tt.wantEnumValue { 115*1c12ee1eSDan Willemsen t.Errorf("EnumValueName(%q) = %q, want %q", tt.in, got, tt.wantEnumValue) 116*1c12ee1eSDan Willemsen } 117*1c12ee1eSDan Willemsen if got := TrimEnumPrefix(tt.in, tt.inEnumPrefix); got != tt.wantTrimValue { 118*1c12ee1eSDan Willemsen t.Errorf("ErimEnumPrefix(%q, %q) = %q, want %q", tt.in, tt.inEnumPrefix, got, tt.wantTrimValue) 119*1c12ee1eSDan Willemsen } 120*1c12ee1eSDan Willemsen if got := JSONCamelCase(tt.in); got != tt.wantJSONCamelCase { 121*1c12ee1eSDan Willemsen t.Errorf("JSONCamelCase(%q) = %q, want %q", tt.in, got, tt.wantJSONCamelCase) 122*1c12ee1eSDan Willemsen } 123*1c12ee1eSDan Willemsen if got := JSONSnakeCase(tt.in); got != tt.wantJSONSnakeCase { 124*1c12ee1eSDan Willemsen t.Errorf("JSONSnakeCase(%q) = %q, want %q", tt.in, got, tt.wantJSONSnakeCase) 125*1c12ee1eSDan Willemsen } 126*1c12ee1eSDan Willemsen } 127*1c12ee1eSDan Willemsen} 128*1c12ee1eSDan Willemsen 129*1c12ee1eSDan Willemsenvar ( 130*1c12ee1eSDan Willemsen srcString = "1234" 131*1c12ee1eSDan Willemsen srcBytes = []byte(srcString) 132*1c12ee1eSDan Willemsen dst uint64 133*1c12ee1eSDan Willemsen) 134*1c12ee1eSDan Willemsen 135*1c12ee1eSDan Willemsenfunc BenchmarkCast(b *testing.B) { 136*1c12ee1eSDan Willemsen b.Run("Ideal", func(b *testing.B) { 137*1c12ee1eSDan Willemsen b.ReportAllocs() 138*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 139*1c12ee1eSDan Willemsen dst, _ = strconv.ParseUint(srcString, 0, 64) 140*1c12ee1eSDan Willemsen } 141*1c12ee1eSDan Willemsen if dst != 1234 { 142*1c12ee1eSDan Willemsen b.Errorf("got %d, want %s", dst, srcString) 143*1c12ee1eSDan Willemsen } 144*1c12ee1eSDan Willemsen }) 145*1c12ee1eSDan Willemsen b.Run("Copy", func(b *testing.B) { 146*1c12ee1eSDan Willemsen b.ReportAllocs() 147*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 148*1c12ee1eSDan Willemsen dst, _ = strconv.ParseUint(string(srcBytes), 0, 64) 149*1c12ee1eSDan Willemsen } 150*1c12ee1eSDan Willemsen if dst != 1234 { 151*1c12ee1eSDan Willemsen b.Errorf("got %d, want %s", dst, srcString) 152*1c12ee1eSDan Willemsen } 153*1c12ee1eSDan Willemsen }) 154*1c12ee1eSDan Willemsen b.Run("Cast", func(b *testing.B) { 155*1c12ee1eSDan Willemsen b.ReportAllocs() 156*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 157*1c12ee1eSDan Willemsen dst, _ = strconv.ParseUint(UnsafeString(srcBytes), 0, 64) 158*1c12ee1eSDan Willemsen } 159*1c12ee1eSDan Willemsen if dst != 1234 { 160*1c12ee1eSDan Willemsen b.Errorf("got %d, want %s", dst, srcString) 161*1c12ee1eSDan Willemsen } 162*1c12ee1eSDan Willemsen }) 163*1c12ee1eSDan Willemsen} 164