1*b7c941bbSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project 2*b7c941bbSAndroid Build Coastguard Worker// 3*b7c941bbSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*b7c941bbSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*b7c941bbSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*b7c941bbSAndroid Build Coastguard Worker// 7*b7c941bbSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*b7c941bbSAndroid Build Coastguard Worker// 9*b7c941bbSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*b7c941bbSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*b7c941bbSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*b7c941bbSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*b7c941bbSAndroid Build Coastguard Worker// limitations under the License. 14*b7c941bbSAndroid Build Coastguard Worker 15*b7c941bbSAndroid Build Coastguard Workerpackage templatefns 16*b7c941bbSAndroid Build Coastguard Worker 17*b7c941bbSAndroid Build Coastguard Workerimport ( 18*b7c941bbSAndroid Build Coastguard Worker "errors" 19*b7c941bbSAndroid Build Coastguard Worker "testing" 20*b7c941bbSAndroid Build Coastguard Worker 21*b7c941bbSAndroid Build Coastguard Worker pb "cts/test/mediapc/requirements/requirements_go_proto" 22*b7c941bbSAndroid Build Coastguard Worker 23*b7c941bbSAndroid Build Coastguard Worker "google.golang.org/protobuf/proto" 24*b7c941bbSAndroid Build Coastguard Worker) 25*b7c941bbSAndroid Build Coastguard Worker 26*b7c941bbSAndroid Build Coastguard Workervar caseTests = []struct { 27*b7c941bbSAndroid Build Coastguard Worker input, kebabCase, snakeCase, titleCase, upperCamelCase, lowerCamelCase, safeTestConfigID string 28*b7c941bbSAndroid Build Coastguard Worker}{ 29*b7c941bbSAndroid Build Coastguard Worker { 30*b7c941bbSAndroid Build Coastguard Worker input: "", 31*b7c941bbSAndroid Build Coastguard Worker kebabCase: "", snakeCase: "", titleCase: "", upperCamelCase: "", lowerCamelCase: "", safeTestConfigID: ""}, 32*b7c941bbSAndroid Build Coastguard Worker { 33*b7c941bbSAndroid Build Coastguard Worker input: "f", 34*b7c941bbSAndroid Build Coastguard Worker kebabCase: "f", snakeCase: "f", titleCase: "F", upperCamelCase: "F", lowerCamelCase: "f", safeTestConfigID: "__f"}, 35*b7c941bbSAndroid Build Coastguard Worker { 36*b7c941bbSAndroid Build Coastguard Worker input: "foo", 37*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo", snakeCase: "foo", titleCase: "Foo", upperCamelCase: "Foo", lowerCamelCase: "foo", safeTestConfigID: "__foo"}, 38*b7c941bbSAndroid Build Coastguard Worker { 39*b7c941bbSAndroid Build Coastguard Worker input: " foo_bar", 40*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-bar", snakeCase: "foo_bar", titleCase: "Foo Bar", upperCamelCase: "FooBar", lowerCamelCase: "fooBar", safeTestConfigID: "__foo_bar"}, 41*b7c941bbSAndroid Build Coastguard Worker { 42*b7c941bbSAndroid Build Coastguard Worker input: " foo-bar", 43*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-bar", snakeCase: "foo_bar", titleCase: "Foo Bar", upperCamelCase: "FooBar", lowerCamelCase: "fooBar", safeTestConfigID: "__foo_bar"}, 44*b7c941bbSAndroid Build Coastguard Worker { 45*b7c941bbSAndroid Build Coastguard Worker input: " foo bar", 46*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-bar", snakeCase: "foo_bar", titleCase: "Foo Bar", upperCamelCase: "FooBar", lowerCamelCase: "fooBar", safeTestConfigID: "__foo_bar"}, 47*b7c941bbSAndroid Build Coastguard Worker { 48*b7c941bbSAndroid Build Coastguard Worker input: " Foo Bar", 49*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-bar", snakeCase: "foo_bar", titleCase: "Foo Bar", upperCamelCase: "FooBar", lowerCamelCase: "fooBar", safeTestConfigID: "__foo_bar"}, 50*b7c941bbSAndroid Build Coastguard Worker { 51*b7c941bbSAndroid Build Coastguard Worker input: "HTTP_status_code", 52*b7c941bbSAndroid Build Coastguard Worker kebabCase: "http-status-code", snakeCase: "http_status_code", titleCase: "HTTP Status Code", upperCamelCase: "HTTPStatusCode", lowerCamelCase: "httpStatusCode", safeTestConfigID: "__http_status_code"}, 53*b7c941bbSAndroid Build Coastguard Worker { 54*b7c941bbSAndroid Build Coastguard Worker input: "foo many spaces", 55*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-many-spaces", snakeCase: "foo_many_spaces", titleCase: "Foo Many Spaces", upperCamelCase: "FooManySpaces", lowerCamelCase: "fooManySpaces", safeTestConfigID: "__foo_many_spaces"}, 56*b7c941bbSAndroid Build Coastguard Worker { 57*b7c941bbSAndroid Build Coastguard Worker input: "foo---many-dashes", 58*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-many-dashes", snakeCase: "foo_many_dashes", titleCase: "Foo Many Dashes", upperCamelCase: "FooManyDashes", lowerCamelCase: "fooManyDashes", safeTestConfigID: "__foo_many_dashes"}, 59*b7c941bbSAndroid Build Coastguard Worker { 60*b7c941bbSAndroid Build Coastguard Worker input: "foo___many_underline", 61*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-many-underline", snakeCase: "foo_many_underline", titleCase: "Foo Many Underline", upperCamelCase: "FooManyUnderline", lowerCamelCase: "fooManyUnderline", safeTestConfigID: "__foo_many_underline"}, 62*b7c941bbSAndroid Build Coastguard Worker { 63*b7c941bbSAndroid Build Coastguard Worker input: "UpperCamelCase", 64*b7c941bbSAndroid Build Coastguard Worker kebabCase: "upper-camel-case", snakeCase: "upper_camel_case", titleCase: "Upper Camel Case", upperCamelCase: "UpperCamelCase", lowerCamelCase: "upperCamelCase", safeTestConfigID: "__upper_camel_case"}, 65*b7c941bbSAndroid Build Coastguard Worker { 66*b7c941bbSAndroid Build Coastguard Worker input: "ACRONYMInUpperCamelCase", 67*b7c941bbSAndroid Build Coastguard Worker kebabCase: "acronym-in-upper-camel-case", snakeCase: "acronym_in_upper_camel_case", titleCase: "ACRONYM In Upper Camel Case", upperCamelCase: "ACRONYMInUpperCamelCase", lowerCamelCase: "acronymInUpperCamelCase", safeTestConfigID: "__acronym_in_upper_camel_case"}, 68*b7c941bbSAndroid Build Coastguard Worker { 69*b7c941bbSAndroid Build Coastguard Worker input: "FooGRPCHandler", 70*b7c941bbSAndroid Build Coastguard Worker kebabCase: "foo-grpc-handler", snakeCase: "foo_grpc_handler", titleCase: "Foo GRPC Handler", upperCamelCase: "FooGRPCHandler", lowerCamelCase: "fooGRPCHandler", safeTestConfigID: "__foo_grpc_handler"}, 71*b7c941bbSAndroid Build Coastguard Worker { 72*b7c941bbSAndroid Build Coastguard Worker input: "GRPC1234Handler", 73*b7c941bbSAndroid Build Coastguard Worker kebabCase: "grpc1234-handler", snakeCase: "grpc1234_handler", titleCase: "GRPC1234 Handler", upperCamelCase: "GRPC1234Handler", lowerCamelCase: "grpc1234Handler", safeTestConfigID: "__grpc1234_handler"}, 74*b7c941bbSAndroid Build Coastguard Worker { 75*b7c941bbSAndroid Build Coastguard Worker input: "tricky4567number", 76*b7c941bbSAndroid Build Coastguard Worker kebabCase: "tricky4567-number", snakeCase: "tricky4567_number", titleCase: "Tricky4567 Number", upperCamelCase: "Tricky4567Number", lowerCamelCase: "tricky4567Number", safeTestConfigID: "__tricky4567_number"}, 77*b7c941bbSAndroid Build Coastguard Worker { 78*b7c941bbSAndroid Build Coastguard Worker input: "tricky 4567number", 79*b7c941bbSAndroid Build Coastguard Worker kebabCase: "tricky-4567-number", snakeCase: "tricky_4567_number", titleCase: "Tricky 4567 Number", upperCamelCase: "Tricky4567Number", lowerCamelCase: "tricky4567Number", safeTestConfigID: "__tricky_4567_number"}, 80*b7c941bbSAndroid Build Coastguard Worker { 81*b7c941bbSAndroid Build Coastguard Worker input: "tricky 4567Number", 82*b7c941bbSAndroid Build Coastguard Worker kebabCase: "tricky-4567-number", snakeCase: "tricky_4567_number", titleCase: "Tricky 4567 Number", upperCamelCase: "Tricky4567Number", lowerCamelCase: "tricky4567Number", safeTestConfigID: "__tricky_4567_number"}, 83*b7c941bbSAndroid Build Coastguard Worker { 84*b7c941bbSAndroid Build Coastguard Worker input: "tricky 4567 Number", 85*b7c941bbSAndroid Build Coastguard Worker kebabCase: "tricky-4567-number", snakeCase: "tricky_4567_number", titleCase: "Tricky 4567 Number", upperCamelCase: "Tricky4567Number", lowerCamelCase: "tricky4567Number", safeTestConfigID: "__tricky_4567_number"}, 86*b7c941bbSAndroid Build Coastguard Worker { 87*b7c941bbSAndroid Build Coastguard Worker input: "lowerCamelCase", 88*b7c941bbSAndroid Build Coastguard Worker kebabCase: "lower-camel-case", snakeCase: "lower_camel_case", titleCase: "Lower Camel Case", upperCamelCase: "LowerCamelCase", lowerCamelCase: "lowerCamelCase", safeTestConfigID: "__lower_camel_case"}, 89*b7c941bbSAndroid Build Coastguard Worker { 90*b7c941bbSAndroid Build Coastguard Worker input: "endInCapitalT", 91*b7c941bbSAndroid Build Coastguard Worker kebabCase: "end-in-capital-t", snakeCase: "end_in_capital_t", titleCase: "End In Capital T", upperCamelCase: "EndInCapitalT", lowerCamelCase: "endInCapitalT", safeTestConfigID: "__end_in_capital_t"}, 92*b7c941bbSAndroid Build Coastguard Worker { 93*b7c941bbSAndroid Build Coastguard Worker input: "snake_case", 94*b7c941bbSAndroid Build Coastguard Worker kebabCase: "snake-case", snakeCase: "snake_case", titleCase: "Snake Case", upperCamelCase: "SnakeCase", lowerCamelCase: "snakeCase", safeTestConfigID: "__snake_case"}, 95*b7c941bbSAndroid Build Coastguard Worker { 96*b7c941bbSAndroid Build Coastguard Worker input: "kebab-case", 97*b7c941bbSAndroid Build Coastguard Worker kebabCase: "kebab-case", snakeCase: "kebab_case", titleCase: "Kebab Case", upperCamelCase: "KebabCase", lowerCamelCase: "kebabCase", safeTestConfigID: "__kebab_case"}, 98*b7c941bbSAndroid Build Coastguard Worker { 99*b7c941bbSAndroid Build Coastguard Worker input: "üñicödeCäse", 100*b7c941bbSAndroid Build Coastguard Worker kebabCase: "üñicöde-cäse", snakeCase: "üñicöde_cäse", titleCase: "Üñicöde Cäse", upperCamelCase: "ÜñicödeCäse", lowerCamelCase: "üñicödeCäse", safeTestConfigID: "__üñicöde_cäse"}} 101*b7c941bbSAndroid Build Coastguard Worker 102*b7c941bbSAndroid Build Coastguard Workerfunc TestKebabCase(t *testing.T) { 103*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 104*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 105*b7c941bbSAndroid Build Coastguard Worker if got := kebabCase(tt.input); got != tt.kebabCase { 106*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("KebabCase(%q) = %q, want %q", tt.input, got, tt.kebabCase) 107*b7c941bbSAndroid Build Coastguard Worker } 108*b7c941bbSAndroid Build Coastguard Worker }) 109*b7c941bbSAndroid Build Coastguard Worker } 110*b7c941bbSAndroid Build Coastguard Worker} 111*b7c941bbSAndroid Build Coastguard Worker 112*b7c941bbSAndroid Build Coastguard Workerfunc TestSnakeCase(t *testing.T) { 113*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 114*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 115*b7c941bbSAndroid Build Coastguard Worker if got := snakeCase(tt.input); got != tt.snakeCase { 116*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("SnakeCase(%q) = %q, want %q", tt.input, got, tt.snakeCase) 117*b7c941bbSAndroid Build Coastguard Worker } 118*b7c941bbSAndroid Build Coastguard Worker }) 119*b7c941bbSAndroid Build Coastguard Worker } 120*b7c941bbSAndroid Build Coastguard Worker} 121*b7c941bbSAndroid Build Coastguard Worker 122*b7c941bbSAndroid Build Coastguard Workerfunc TestTitleCase(t *testing.T) { 123*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 124*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 125*b7c941bbSAndroid Build Coastguard Worker if got := titleCase(tt.input); got != tt.titleCase { 126*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("TitleCase(%q) = %q, want %q", tt.input, got, tt.titleCase) 127*b7c941bbSAndroid Build Coastguard Worker } 128*b7c941bbSAndroid Build Coastguard Worker }) 129*b7c941bbSAndroid Build Coastguard Worker } 130*b7c941bbSAndroid Build Coastguard Worker} 131*b7c941bbSAndroid Build Coastguard Worker 132*b7c941bbSAndroid Build Coastguard Workerfunc TestUpperCamelCase(t *testing.T) { 133*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 134*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 135*b7c941bbSAndroid Build Coastguard Worker if got := upperCamelCase(tt.input); got != tt.upperCamelCase { 136*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("upperCamelCase(%q) = %q, want %q", tt.input, got, tt.upperCamelCase) 137*b7c941bbSAndroid Build Coastguard Worker } 138*b7c941bbSAndroid Build Coastguard Worker }) 139*b7c941bbSAndroid Build Coastguard Worker } 140*b7c941bbSAndroid Build Coastguard Worker} 141*b7c941bbSAndroid Build Coastguard Worker 142*b7c941bbSAndroid Build Coastguard Workerfunc TestLowerCamelCase(t *testing.T) { 143*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 144*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 145*b7c941bbSAndroid Build Coastguard Worker if got := lowerCamelCase(tt.input); got != tt.lowerCamelCase { 146*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("lowerCamelCase(%q) = %q, want %q", tt.input, got, tt.lowerCamelCase) 147*b7c941bbSAndroid Build Coastguard Worker } 148*b7c941bbSAndroid Build Coastguard Worker }) 149*b7c941bbSAndroid Build Coastguard Worker } 150*b7c941bbSAndroid Build Coastguard Worker} 151*b7c941bbSAndroid Build Coastguard Worker 152*b7c941bbSAndroid Build Coastguard Workerfunc TestSafeTestConfigID(t *testing.T) { 153*b7c941bbSAndroid Build Coastguard Worker for _, tt := range caseTests { 154*b7c941bbSAndroid Build Coastguard Worker t.Run(tt.input, func(t *testing.T) { 155*b7c941bbSAndroid Build Coastguard Worker if got := safeTestConfigID(tt.input); got != tt.safeTestConfigID { 156*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("safeTestConfigID(%q) = %q, want %q", tt.input, got, tt.safeTestConfigID) 157*b7c941bbSAndroid Build Coastguard Worker } 158*b7c941bbSAndroid Build Coastguard Worker }) 159*b7c941bbSAndroid Build Coastguard Worker } 160*b7c941bbSAndroid Build Coastguard Worker} 161*b7c941bbSAndroid Build Coastguard Worker 162*b7c941bbSAndroid Build Coastguard Workerfunc TestDict(t *testing.T) { 163*b7c941bbSAndroid Build Coastguard Worker errorValue := errors.New("error_value") 164*b7c941bbSAndroid Build Coastguard Worker var dictTest = []struct { 165*b7c941bbSAndroid Build Coastguard Worker values []any 166*b7c941bbSAndroid Build Coastguard Worker want map[string]any 167*b7c941bbSAndroid Build Coastguard Worker }{ 168*b7c941bbSAndroid Build Coastguard Worker { 169*b7c941bbSAndroid Build Coastguard Worker values: []any{1, 2, 3}, 170*b7c941bbSAndroid Build Coastguard Worker want: map[string]any{ 171*b7c941bbSAndroid Build Coastguard Worker "1": 2, 172*b7c941bbSAndroid Build Coastguard Worker "3": nil, 173*b7c941bbSAndroid Build Coastguard Worker }, 174*b7c941bbSAndroid Build Coastguard Worker }, 175*b7c941bbSAndroid Build Coastguard Worker { 176*b7c941bbSAndroid Build Coastguard Worker values: []any{"foo", "bar"}, 177*b7c941bbSAndroid Build Coastguard Worker want: map[string]any{"foo": "bar"}, 178*b7c941bbSAndroid Build Coastguard Worker }, 179*b7c941bbSAndroid Build Coastguard Worker { 180*b7c941bbSAndroid Build Coastguard Worker values: []any{errors.New("error_key"), errorValue}, 181*b7c941bbSAndroid Build Coastguard Worker want: map[string]any{"error_key": errorValue}, 182*b7c941bbSAndroid Build Coastguard Worker }, 183*b7c941bbSAndroid Build Coastguard Worker } 184*b7c941bbSAndroid Build Coastguard Worker for _, tt := range dictTest { 185*b7c941bbSAndroid Build Coastguard Worker got := dict(tt.values...) 186*b7c941bbSAndroid Build Coastguard Worker for k, v := range tt.want { 187*b7c941bbSAndroid Build Coastguard Worker if got[k] != v { 188*b7c941bbSAndroid Build Coastguard Worker t.Fatalf("dict(%v)[%q] = %q, want %q", tt.values, k, got[k], v) 189*b7c941bbSAndroid Build Coastguard Worker } 190*b7c941bbSAndroid Build Coastguard Worker } 191*b7c941bbSAndroid Build Coastguard Worker } 192*b7c941bbSAndroid Build Coastguard Worker} 193*b7c941bbSAndroid Build Coastguard Worker 194*b7c941bbSAndroid Build Coastguard Workerfunc TestHasConfigVariant(t *testing.T) { 195*b7c941bbSAndroid Build Coastguard Worker testReq := pb.Requirement_builder{ 196*b7c941bbSAndroid Build Coastguard Worker Specs: map[int64]*pb.RequirementSpec{ 197*b7c941bbSAndroid Build Coastguard Worker 30: pb.RequirementSpec_builder{ 198*b7c941bbSAndroid Build Coastguard Worker TestConfigId: proto.String("720p"), 199*b7c941bbSAndroid Build Coastguard Worker VariantSpecs: map[string]*pb.VariantSpec{ 200*b7c941bbSAndroid Build Coastguard Worker "VP9": pb.VariantSpec_builder{}.Build(), 201*b7c941bbSAndroid Build Coastguard Worker }, 202*b7c941bbSAndroid Build Coastguard Worker }.Build(), 203*b7c941bbSAndroid Build Coastguard Worker 34: pb.RequirementSpec_builder{ 204*b7c941bbSAndroid Build Coastguard Worker TestConfigId: proto.String("4k"), 205*b7c941bbSAndroid Build Coastguard Worker VariantSpecs: make(map[string]*pb.VariantSpec), 206*b7c941bbSAndroid Build Coastguard Worker }.Build(), 207*b7c941bbSAndroid Build Coastguard Worker }, 208*b7c941bbSAndroid Build Coastguard Worker }.Build() 209*b7c941bbSAndroid Build Coastguard Worker 210*b7c941bbSAndroid Build Coastguard Worker tests := []struct { 211*b7c941bbSAndroid Build Coastguard Worker r *pb.Requirement 212*b7c941bbSAndroid Build Coastguard Worker configID string 213*b7c941bbSAndroid Build Coastguard Worker variantID string 214*b7c941bbSAndroid Build Coastguard Worker want bool 215*b7c941bbSAndroid Build Coastguard Worker }{ 216*b7c941bbSAndroid Build Coastguard Worker { 217*b7c941bbSAndroid Build Coastguard Worker r: testReq, 218*b7c941bbSAndroid Build Coastguard Worker configID: "720p", 219*b7c941bbSAndroid Build Coastguard Worker variantID: "VP9", 220*b7c941bbSAndroid Build Coastguard Worker want: true, 221*b7c941bbSAndroid Build Coastguard Worker }, 222*b7c941bbSAndroid Build Coastguard Worker { 223*b7c941bbSAndroid Build Coastguard Worker r: testReq, 224*b7c941bbSAndroid Build Coastguard Worker configID: "4k", 225*b7c941bbSAndroid Build Coastguard Worker variantID: "VP9", 226*b7c941bbSAndroid Build Coastguard Worker want: false, 227*b7c941bbSAndroid Build Coastguard Worker }, 228*b7c941bbSAndroid Build Coastguard Worker } 229*b7c941bbSAndroid Build Coastguard Worker 230*b7c941bbSAndroid Build Coastguard Worker for _, tc := range tests { 231*b7c941bbSAndroid Build Coastguard Worker got := HasConfigVariant(tc.r, tc.configID, tc.variantID) 232*b7c941bbSAndroid Build Coastguard Worker if got != tc.want { 233*b7c941bbSAndroid Build Coastguard Worker t.Errorf("HasConfigVariant(%v, %q, %q) = %v, want: %v", tc.r, tc.configID, tc.variantID, got, tc.want) 234*b7c941bbSAndroid Build Coastguard Worker } 235*b7c941bbSAndroid Build Coastguard Worker } 236*b7c941bbSAndroid Build Coastguard Worker} 237