Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 687a487

Browse files
authored
fix: handle post-digit caps, add test, and robustify JavaStyle (#288)
1 parent b16cba7 commit 687a487

File tree

4 files changed

+163
-2
lines changed

4 files changed

+163
-2
lines changed

src/main/java/com/google/api/generator/gapic/utils/JavaStyle.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,50 @@
1515
package com.google.api.generator.gapic.utils;
1616

1717
import com.google.common.base.CaseFormat;
18+
import com.google.common.base.Strings;
19+
import java.util.stream.IntStream;
1820

1921
public class JavaStyle {
2022
private static final String UNDERSCORE = "_";
2123

2224
public static String toLowerCamelCase(String s) {
25+
if (Strings.isNullOrEmpty(s)) {
26+
return s;
27+
}
28+
2329
if (s.indexOf(UNDERSCORE) >= 0) {
2430
s = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, s);
2531
}
26-
return String.format("%s%s", s.substring(0, 1).toLowerCase(), s.substring(1));
32+
return capitalizeLettersAfterDigits(
33+
String.format("%s%s", s.substring(0, 1).toLowerCase(), s.substring(1)));
2734
}
2835

2936
public static String toUpperCamelCase(String s) {
37+
if (Strings.isNullOrEmpty(s)) {
38+
return s;
39+
}
40+
3041
if (s.indexOf(UNDERSCORE) >= 0) {
3142
s = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, s);
3243
}
33-
return String.format("%s%s", s.substring(0, 1).toUpperCase(), s.substring(1));
44+
return capitalizeLettersAfterDigits(
45+
String.format("%s%s", s.substring(0, 1).toUpperCase(), s.substring(1)));
3446
}
3547

3648
public static String toUpperSnakeCase(String s) {
3749
return CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, toUpperCamelCase(s));
3850
}
51+
52+
private static String capitalizeLettersAfterDigits(String s) {
53+
return IntStream.range(0, s.length())
54+
.collect(
55+
StringBuilder::new,
56+
(sb, i) ->
57+
sb.append(
58+
i > 0 && Character.isDigit(s.charAt(i - 1))
59+
? Character.toUpperCase(s.charAt(i))
60+
: s.charAt(i)),
61+
StringBuilder::append)
62+
.toString();
63+
}
3964
}

src/test/java/com/google/api/generator/gapic/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ filegroup(
77
"//src/test/java/com/google/api/generator/gapic/dummy:dummy_files",
88
"//src/test/java/com/google/api/generator/gapic/model:model_files",
99
"//src/test/java/com/google/api/generator/gapic/protoparser:protoparser_files",
10+
"//src/test/java/com/google/api/generator/gapic/utils:utils_files",
1011
],
1112
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package(default_visibility = ["//visibility:public"])
2+
3+
TESTS = [
4+
"JavaStyleTest",
5+
]
6+
7+
filegroup(
8+
name = "utils_files",
9+
srcs = ["{0}.java".format(f) for f in TESTS],
10+
)
11+
12+
[java_test(
13+
name = test_name,
14+
srcs = ["{0}.java".format(test_name)],
15+
test_class = "com.google.api.generator.gapic.utils.{0}".format(test_name),
16+
deps = [
17+
"//src/main/java/com/google/api/generator/gapic/utils",
18+
"@com_google_truth_truth//jar",
19+
"@junit_junit//jar",
20+
],
21+
) for test_name in TESTS]
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// Copyright 2020 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.api.generator.gapic.utils;
16+
17+
import static com.google.common.truth.Truth.assertThat;
18+
import static junit.framework.Assert.assertEquals;
19+
20+
import org.junit.Test;
21+
22+
public class JavaStyleTest {
23+
@Test
24+
public void emptyOrNull() {
25+
String value = "";
26+
assertEquals("", JavaStyle.toLowerCamelCase(value));
27+
assertEquals("", JavaStyle.toUpperCamelCase(value));
28+
29+
value = null;
30+
assertThat(JavaStyle.toLowerCamelCase(value)).isNull();
31+
assertThat(JavaStyle.toUpperCamelCase(value)).isNull();
32+
}
33+
34+
@Test
35+
public void singleWord() {
36+
String value = "dog";
37+
assertEquals("dog", JavaStyle.toLowerCamelCase(value));
38+
assertEquals("Dog", JavaStyle.toUpperCamelCase(value));
39+
}
40+
41+
@Test
42+
public void fromLowerSnake() {
43+
String value = "factory_decorator_delegate_impl";
44+
assertEquals("factoryDecoratorDelegateImpl", JavaStyle.toLowerCamelCase(value));
45+
assertEquals("FactoryDecoratorDelegateImpl", JavaStyle.toUpperCamelCase(value));
46+
}
47+
48+
@Test
49+
public void fromUpperSnake() {
50+
String value = "FACTORY_DECORATOR_DELEGATE_IMPL";
51+
assertEquals("factoryDecoratorDelegateImpl", JavaStyle.toLowerCamelCase(value));
52+
assertEquals("FactoryDecoratorDelegateImpl", JavaStyle.toUpperCamelCase(value));
53+
}
54+
55+
@Test
56+
public void fromLowerCamelCase() {
57+
String value = "factoryDecoratorDelegateImpl";
58+
assertEquals("factoryDecoratorDelegateImpl", JavaStyle.toLowerCamelCase(value));
59+
assertEquals("FactoryDecoratorDelegateImpl", JavaStyle.toUpperCamelCase(value));
60+
}
61+
62+
@Test
63+
public void fromUpperCamelCase() {
64+
String value = "FactoryDecoratorDelegateImpl";
65+
assertEquals("factoryDecoratorDelegateImpl", JavaStyle.toLowerCamelCase(value));
66+
assertEquals("FactoryDecoratorDelegateImpl", JavaStyle.toUpperCamelCase(value));
67+
}
68+
69+
@Test
70+
public void wordAndNumber() {
71+
String value = "dog2";
72+
assertEquals("dog2", JavaStyle.toLowerCamelCase(value));
73+
assertEquals("Dog2", JavaStyle.toUpperCamelCase(value));
74+
value = "dog_2";
75+
assertEquals("dog2", JavaStyle.toLowerCamelCase(value));
76+
assertEquals("Dog2", JavaStyle.toUpperCamelCase(value));
77+
}
78+
79+
@Test
80+
public void upperWordAndNumber() {
81+
String value = "Dog_v2";
82+
assertEquals("dogV2", JavaStyle.toLowerCamelCase(value));
83+
assertEquals("DogV2", JavaStyle.toUpperCamelCase(value));
84+
}
85+
86+
@Test
87+
public void upperWordAndCharsAfterDigit() {
88+
String value = "dogV2cc";
89+
assertEquals("dogV2Cc", JavaStyle.toLowerCamelCase(value));
90+
assertEquals("DogV2Cc", JavaStyle.toUpperCamelCase(value));
91+
92+
value = "dogv2_cc";
93+
assertEquals("dogv2Cc", JavaStyle.toLowerCamelCase(value));
94+
assertEquals("Dogv2Cc", JavaStyle.toUpperCamelCase(value));
95+
96+
value = "dog_v2_cc";
97+
assertEquals("dogV2Cc", JavaStyle.toLowerCamelCase(value));
98+
assertEquals("DogV2Cc", JavaStyle.toUpperCamelCase(value));
99+
100+
value = "foo1bar2car3";
101+
assertEquals("foo1Bar2Car3", JavaStyle.toLowerCamelCase(value));
102+
assertEquals("Foo1Bar2Car3", JavaStyle.toUpperCamelCase(value));
103+
}
104+
105+
@Test
106+
public void acronyms() {
107+
String value = "iam_http_xml_dog";
108+
assertEquals("iamHttpXmlDog", JavaStyle.toLowerCamelCase(value));
109+
assertEquals("IamHttpXmlDog", JavaStyle.toUpperCamelCase(value));
110+
value = "IAM_HTTP_XML_DOG";
111+
assertEquals("iamHttpXmlDog", JavaStyle.toLowerCamelCase(value));
112+
assertEquals("IamHttpXmlDog", JavaStyle.toUpperCamelCase(value));
113+
}
114+
}

0 commit comments

Comments
 (0)