diff --git a/core/src/main/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizer.java b/core/src/main/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizer.java index 988e000c17..a03f327442 100644 --- a/core/src/main/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizer.java +++ b/core/src/main/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizer.java @@ -17,13 +17,37 @@ public String sanitizeFunctionName(String functionName) { sanitized.append(words[0].toLowerCase()); for (int i = 1; i < words.length; i++) { - sanitized.append(capitalize(words[i].toLowerCase())); + sanitized.append(sanitizeWord(words[i])); } return sanitized.toString(); } private String capitalize(String line) { - return Character.toUpperCase(line.charAt(0)) + line.substring(1); + return line.length() > 0 ? Character.toUpperCase(line.charAt(0)) + line.substring(1) : ""; + } + + private boolean isUpperCaseAcronym(String word) { + if (word == null || word.length() < 2) { + return false; + } + + for (char c : word.toCharArray()) { + if (Character.isLowerCase(c)) { + return false; + } + } + + return true; + } + + private String sanitizeWord(String word) { + if (word == null) { + return ""; + } else if (word.length() == 2 && isUpperCaseAcronym(word)) { + return word; + } else { + return capitalize(isUpperCaseAcronym(word) ? word.toLowerCase() : word); + } } } diff --git a/core/src/test/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizerTest.java b/core/src/test/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizerTest.java index 406a6594f4..39f00177c3 100644 --- a/core/src/test/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizerTest.java +++ b/core/src/test/java/cucumber/runtime/snippets/CamelCaseFunctionNameSanitizerTest.java @@ -14,7 +14,31 @@ public void testSanitizeFunctionName() { String functionName = "I am a function name"; String expected = "iAmAFunctionName"; String actual = generator.sanitizeFunctionName(functionName); + assertEquals(expected, actual); + + functionName = "Function name with multiple spaces"; + expected = "functionNameWithMultipleSpaces"; + actual = generator.sanitizeFunctionName(functionName); + assertEquals(expected, actual); + + functionName = "Function name with pascalCase word"; + expected = "functionNameWithPascalCaseWord"; + actual = generator.sanitizeFunctionName(functionName); + assertEquals(expected, actual); + + functionName = "Function name with CamelCase word"; + expected = "functionNameWithCamelCaseWord"; + actual = generator.sanitizeFunctionName(functionName); + assertEquals(expected, actual); + + functionName = "Function name with multi char acronym HTTP Server"; + expected = "functionNameWithMultiCharAcronymHttpServer"; + actual = generator.sanitizeFunctionName(functionName); + assertEquals(expected, actual); + functionName = "Function name with two char acronym US"; + expected = "functionNameWithTwoCharAcronymUS"; + actual = generator.sanitizeFunctionName(functionName); assertEquals(expected, actual); } }