From 6474c3fc23b631456a8b6dbe13581357b0bc0497 Mon Sep 17 00:00:00 2001
From: speters33w This class tries to handle {@code null} input gracefully.
* An exception will not be thrown for a {@code null} input.
* Each method documents its behavior in more detail.
+ * "Two words" "foo bar" "Piñata Café"
+ * toCamelCase(str) "twoWords" "fooBar" "pinataCafe"
+ * toCamelCase(str, false, " ") "twoWords" "fooBar" "piñataCafé"
+ * toCamelCase(str, true, " ") "TwoWords" "FooBar" "PiñataCafé"
+ * ToCamelSnakeCase "two_Words" "foo_Bar" "pinata_Cafe"
+ * toFlatcase(str) "twowords" "foobar" "pinatacafe"
+ * toKebabCase(str) "two-words" "foo-bar" "pinata-cafe"
+ * toScreamingCase(str) "TWOWORDS" "FOOBAR" "PINATACAFE"
+ * toScreamingKebabCase(str) "TWO-WORDS" "FOO-BAR" "PINATA-CAFE"
+ * toScreamingSnakeCase(str) "TWO_WORDS" "FOO_BAR" "PINATA_CAFE"
+ * toSnakeCase(str) "two_words" "foo_bar" "pinata_cafe"
+ * toTitleCase(str) "Two_Words" "Foo_Bar" "Pinata_Cafe"
+ * toTrainCase(str) "Two-Words" "Foo-Bar" "Pinata-Cafe"
+ * toUpperCamelCase(str) "TwoWords" "FooBar" "PinataCafe"
+ *
*
* @since 1.2
*/
public class CaseUtils {
/**
- * Converts all the delimiter separated words in a String into camelCase,
+ * Converts all the delimiter-separated words in a String into camelCase,
* that is each word is made up of a title case character and then a series of
* lowercase characters.
*
@@ -62,7 +80,7 @@ public class CaseUtils {
*
*
* @param str the String to be converted to camelCase, may be null
- * @param capitalizeFirstLetter boolean that determines if the first character of first word should be title case.
+ * @param capitalizeFirstLetter boolean if true sets the first character of the first word to title case.
* @param delimiters set of characters to determine capitalization, null and/or empty array means whitespace
* @return camelCase of String, {@code null} if null String input
*/
@@ -116,6 +134,237 @@ private static Set
+ * This method has different behavior from {@link #toCamelCase(String, boolean, char[])}
+ * because all accented characters are normalized (accents removed).
+ * For example, {@code toCamelCase("Piñata Café")} will return {@code "pinataCafe"}, where
+ * {@code toCamelCase("Piñata Café", false, " ")} will return {@code "piñataCafé"}.
+ * The first alphanumeric character of the string is converted to lower case.
+ * The first character of all other alphanumeric sequences capitalized.
+ * The rest of the characters in the sequence are converted to lower case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ *
+ * @see #toCamelCase(String, boolean, char[])
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The convertedText.
+ */
+ public static String toCamelCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ String titleCase = toTitleCase(str).replace("_", "");
+ if (titleCase.length() <= 1) return titleCase.toLowerCase();
+ return titleCase.substring(0,1).toLowerCase() + titleCase.substring(1);
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to camel_Snake_Case.
+ * All accented characters are normalized (accents removed).
+ * The first alphanumeric character of the string is converted to lower case.
+ * The first character of all other alphanumeric sequences capitalized.
+ * The rest of the characters in the sequence are converted to lower case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single underscore ('_').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The converted_Text.
+ */
+ public static String toCamelSnakeCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ String titleCase = toTitleCase(str);
+ if (titleCase.length() <= 1) return titleCase.toLowerCase();
+ return titleCase.substring(0,1).toLowerCase() + titleCase.substring(1);
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to flatcase.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to lower case.
+ * All non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The convertedtext.
+ */
+ public static String toFlatCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ return toSnakeCase(str).replace("_", "");
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to kebab-case.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to lower case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single hyphen ('-').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The converted-text.
+ */
+ public static String toKebabCase(String str){
+ if (StringUtils.isEmpty(str)) return str;
+ return toSnakeCase(str).replace("_", "-");
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to SCREAMINGCASE.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to upper case.
+ * All non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The CONVERTEDTEXT.
+ */
+ public static String toScreamingCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ return toScreamingSnakeCase(str).replace("_", "");
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to SCREAMING-KEBAB-CASE.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to upper case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single hyphen ('-').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The CONVERTED-TEXT.
+ */
+ public static String toScreamingKebabCase(String str){
+ if (StringUtils.isEmpty(str)) return str;
+ return toScreamingSnakeCase(str).replace("_", "-");
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to SCREAMING_SNAKE_CASE.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to upper case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single underscore ('_').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The CONVERTED_TEXT.
+ */
+ public static String toScreamingSnakeCase(String str){
+ if (StringUtils.isEmpty(str)) return str;
+ return toTitleCase(str).toUpperCase();
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to snake_case.
+ * All accented characters are normalized (accents removed).
+ * All alphanumeric characters are converted to lower case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single underscore ('_').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The converted_text.
+ */
+ public static String toSnakeCase(String str){
+ if (StringUtils.isEmpty(str)) return str;
+ return toTitleCase(str).toLowerCase();
+ }
+
+ /**
+ * Converts a string to Title_Case.
+ * All accented characters are normalized (accents removed).
+ * The first character of any alphanumeric sequence is capitalized.
+ * The rest of the characters in the sequence are converted to lower case
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single underscore ('_').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The Converted_Text.
+ */
+ public static String toTitleCase(String str) {
+ if (StringUtils.isEmpty(str)) {
+ return str;
+ }
+ String normalized = StringUtils.stripAccents(str).trim();
+ if (Pattern.matches("^[^a-zA-Z0-9]*$", normalized)) {
+ return "";
+ }
+ int startIndex = 0;
+ for (int i = 0; i < normalized.length(); i++){
+ if (Pattern.matches("[0-9A-Za-z]", Character.toString(normalized.charAt(i)))){
+ startIndex = i;
+ break;
+ }
+ }
+ StringBuilder snake = new StringBuilder();
+ for (int i = startIndex; i < normalized.length(); i++) {
+ if (i > 0 && !Pattern.matches("[0-9A-Za-z'\u2019]", Character.toString(normalized.charAt(i)))) {
+ if (snake.charAt(snake.length() - 1) != '_' && i != normalized.length() - 1) {
+ snake.append("_");
+ }
+ } else if (i == startIndex || snake.charAt(snake.length() - 1) == '_') {
+ snake.append(Character.toUpperCase(normalized.charAt(i)));
+ }
+ else if (normalized.charAt(i) != '\'' && normalized.charAt(i) != '\u2019') {
+ snake.append(Character.toLowerCase(normalized.charAt(i)));
+ }
+ }
+ return snake.toString();
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to Train-Case.
+ * All accented characters are normalized (accents removed).
+ * The first character of any alphanumeric sequence is capitalized.
+ * The rest of the characters in the sequence are converted to lower case
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * are converted to a single hyphen ('-').
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The Converted-Text.
+ */
+ public static String toTrainCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ return toTitleCase(str).replace("_", "-");
+ }
+
+ /**
+ * Uses {@code toTitleCase()} to convert a string to UpperCamelCase.
+ * All accented characters are normalized (accents removed).
+ * The first character of any alphanumeric sequence is capitalized.
+ * The rest of the characters in the sequence are converted to lower case
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * All other non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ *
+ * @see #toTitleCase(String)
+ * @param str The text to convert.
+ * @return The ConvertedText.
+ */
+ public static String toUpperCamelCase(String str) {
+ if (StringUtils.isEmpty(str)) return str;
+ return toTitleCase(str).replace("_", "");
+ }
+
/**
* {@code CaseUtils} instances should NOT be constructed in
* standard programming. Instead, the class should be used as
diff --git a/src/test/java/org/apache/commons/text/CaseUtilsTest.java b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
index f7195e708c..c8c6678735 100644
--- a/src/test/java/org/apache/commons/text/CaseUtilsTest.java
+++ b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
@@ -69,8 +69,342 @@ public void testToCamelCase() {
assertThat(CaseUtils.toCamelCase("tocamelcase", true)).isEqualTo("Tocamelcase");
assertThat(CaseUtils.toCamelCase("tocamelcase", false)).isEqualTo("tocamelcase");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true)).isEqualTo("\uD800\uDF00\uD800\uDF02");
+ assertThat(CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true, null)).isEqualTo("\uD800\uDF00\uD800\uDF02");
assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, '\uD800',
'\uDF14')).isEqualTo("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03");
+
+ assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu.", true, '.'))
+ .isEqualTo("TheCafé\u2019sPiñataGaveMeDéjàVu");
+
+ assertThat(CaseUtils.toCamelCase(null)).isNull();
+ assertThat(CaseUtils.toCamelCase("")).isEqualTo("");
+ assertThat(CaseUtils.toCamelCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toCamelCase("a b c @def")).isEqualTo("aBCDef");
+ assertThat(CaseUtils.toCamelCase("a b c @def")).isEqualTo("aBCDef");
+
+ assertThat(CaseUtils.toCamelCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toCamelCase(" to-CAMEL-cASE")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("@@@@ to+CAMEL@cASE ")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("To+CA+ME L@cASE")).isEqualTo("toCaMeLCase");
+
+ assertThat(CaseUtils.toCamelCase("To.Camel.Case")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("To.Camel-Case")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase(" to @ Camel case")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase(" @to @ Camel case_")).isEqualTo("toCamelCase");
+
+ assertThat(CaseUtils.toCamelCase("TO CAMEL CASE")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("tocamelcase")).isEqualTo("tocamelcase");
+
+ assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("theCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("toCamelCase");
+ }
+
+ @Test
+ public void testToCamelSnakeCase() {
+ assertThat(CaseUtils.toCamelSnakeCase(null)).isNull();
+ assertThat(CaseUtils.toCamelSnakeCase("")).isEqualTo("");
+ assertThat(CaseUtils.toCamelSnakeCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toCamelSnakeCase("a b c @def")).isEqualTo("a_B_C_Def");
+ assertThat(CaseUtils.toCamelSnakeCase("a b c @def")).isEqualTo("a_B_C_Def");
+
+ assertThat(CaseUtils.toCamelSnakeCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toCamelSnakeCase(" to-CAMELSNAKE-cASE")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase("@@@@ to+CAMELSNAKE@cASE ")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase("To+CAMEL+SNAK E@cASE")).isEqualTo("to_Camel_Snak_E_Case");
+
+ assertThat(CaseUtils.toCamelSnakeCase("To.CamelSnake.Case")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase("To.CamelSnake-Case")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase(" to @ CamelSnake case")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase(" @to @ CamelSnake case_")).isEqualTo("to_Camelsnake_Case");
+
+ assertThat(CaseUtils.toCamelSnakeCase("TO CAMELSNAKE CASE")).isEqualTo("to_Camelsnake_Case");
+ assertThat(CaseUtils.toCamelSnakeCase("tocamelsnakecase")).isEqualTo("tocamelsnakecase");
+
+ assertThat(CaseUtils.toCamelSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toCamelSnakeCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("the_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toCamelSnakeCase("\u010C\u0227\u1E41\u0113\u0142 \u1E61\u1E47\u1EA3\u1E31\u1EB9"))
+ .isEqualTo("camel_Snake");
+ }
+
+ @Test
+ public void testToFlatCase() {
+ assertThat(CaseUtils.toFlatCase(null)).isNull();
+ assertThat(CaseUtils.toFlatCase("")).isEqualTo("");
+ assertThat(CaseUtils.toFlatCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toFlatCase("a b c @def")).isEqualTo("abcdef");
+ assertThat(CaseUtils.toFlatCase("a b c @def")).isEqualTo("abcdef");
+
+ assertThat(CaseUtils.toFlatCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toFlatCase(" to-FLAT-cASE")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase("@@@@ to+FLAT@cASE ")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase("To+FL+A T@cASE")).isEqualTo("toflatcase");
+
+ assertThat(CaseUtils.toFlatCase("To.Flat.Case")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase("To.Flat-Case")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase(" to @ Flat case")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase(" @to @ Flat case_")).isEqualTo("toflatcase");
+
+ assertThat(CaseUtils.toFlatCase("TO FLAT CASE")).isEqualTo("toflatcase");
+ assertThat(CaseUtils.toFlatCase("toflatcase")).isEqualTo("toflatcase");
+
+ assertThat(CaseUtils.toFlatCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toFlatCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("thecafespinatagavemedejavu");
+ assertThat(CaseUtils.toFlatCase("\u1E70\u01EB \u1E1E\u0142\u1EA3\u1E6F \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("toflatcase");
}
+
+ @Test
+ public void testToKebabCase() {
+ assertThat(CaseUtils.toKebabCase(null)).isNull();
+ assertThat(CaseUtils.toKebabCase("")).isEqualTo("");
+ assertThat(CaseUtils.toKebabCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toKebabCase("a b c @def")).isEqualTo("a-b-c-def");
+ assertThat(CaseUtils.toKebabCase("a b c @def")).isEqualTo("a-b-c-def");
+
+ assertThat(CaseUtils.toKebabCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toKebabCase(" to-KEBAB-cASE")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase("@@@@ to+KEBAB@cASE ")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase("To+KE+BA B@cASE")).isEqualTo("to-ke-ba-b-case");
+
+ assertThat(CaseUtils.toKebabCase("To.Kebab.Case")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase("To.Kebab-Case")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase(" to @ Kebab case")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase(" @to @ Kebab case_")).isEqualTo("to-kebab-case");
+
+ assertThat(CaseUtils.toKebabCase("TO KEBAB CASE")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase("tokebabcase")).isEqualTo("tokebabcase");
+
+ assertThat(CaseUtils.toKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toKebabCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("the-cafes-pinata-gave-me-deja-vu");
+ assertThat(CaseUtils.toKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("to-kebab-case");
+ }
+
+ @Test
+ public void testToScreamingCase() {
+ assertThat(CaseUtils.toScreamingCase(null)).isNull();
+ assertThat(CaseUtils.toScreamingCase("")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingCase("a b c @def")).isEqualTo("ABCDEF");
+ assertThat(CaseUtils.toScreamingCase("a b c @def")).isEqualTo("ABCDEF");
+
+ assertThat(CaseUtils.toScreamingCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingCase(" to-SCREAMING-cASE")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase("@@@@ to+SCREAMING@cASE ")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase("To+SCR+EAM ING@cASE")).isEqualTo("TOSCREAMINGCASE");
+
+ assertThat(CaseUtils.toScreamingCase("To.SCREAMING.Case")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase("To.SCREAMING-Case")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase(" to @ SCREAMING case")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase(" @to @ SCREAMING case_")).isEqualTo("TOSCREAMINGCASE");
+
+ assertThat(CaseUtils.toScreamingCase("TO SCREAMING CASE")).isEqualTo("TOSCREAMINGCASE");
+ assertThat(CaseUtils.toScreamingCase("toscreamingcase")).isEqualTo("TOSCREAMINGCASE");
+
+ assertThat(CaseUtils.toScreamingCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toScreamingCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("THECAFESPINATAGAVEMEDEJAVU");
+
+ assertThat(CaseUtils.toScreamingCase("\u0218\u0107\u1E59\u0113\u1E01\u1E43\u1EC9\u1F09\u0148\u1E21 " +
+ "\u010D\u1E01\u0219\u1E1B")).isEqualTo("SCREAMINGCASE");
+ }
+
+ @Test
+ public void testToScreamingKebabCase() {
+ assertThat(CaseUtils.toScreamingKebabCase(null)).isNull();
+ assertThat(CaseUtils.toScreamingKebabCase("")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingKebabCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingKebabCase("a b c @def")).isEqualTo("A-B-C-DEF");
+ assertThat(CaseUtils.toScreamingKebabCase("a b c @def")).isEqualTo("A-B-C-DEF");
+
+ assertThat(CaseUtils.toScreamingKebabCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingKebabCase(" to-KEBAB-cASE")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase("@@@@ to+KEBAB@cASE ")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase("To+KE+BA B@cASE")).isEqualTo("TO-KE-BA-B-CASE");
+
+ assertThat(CaseUtils.toScreamingKebabCase("To.Kebab.Case")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase("To.Kebab-Case")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase(" to @ Kebab case")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase(" @to @ Kebab case_")).isEqualTo("TO-KEBAB-CASE");
+
+ assertThat(CaseUtils.toScreamingKebabCase("TO KEBAB CASE")).isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toScreamingKebabCase("tokebabcase")).isEqualTo("TOKEBABCASE");
+
+ assertThat(CaseUtils.toScreamingKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toScreamingKebabCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("THE-CAFES-PINATA-GAVE-ME-DEJA-VU");
+
+ assertThat(CaseUtils.toScreamingKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("TO-KEBAB-CASE");
+ }
+
+ @Test
+ public void testToScreamingSnakeCase() {
+ assertThat(CaseUtils.toScreamingSnakeCase(null)).isNull();
+ assertThat(CaseUtils.toScreamingSnakeCase("")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingSnakeCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingSnakeCase("a b c @def")).isEqualTo("A_B_C_DEF");
+ assertThat(CaseUtils.toScreamingSnakeCase("a b c @def")).isEqualTo("A_B_C_DEF");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toScreamingSnakeCase(" to-SNAKE-cASE")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase("@@@@ to+SNAKE@cASE ")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase("To+SN+AK E@cASE")).isEqualTo("TO_SN_AK_E_CASE");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("To.Snake.Case")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase("To.Snake-Case")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase(" to @ Snake case")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase(" @to @ Snake case_")).isEqualTo("TO_SNAKE_CASE");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("TO SNAKE CASE")).isEqualTo("TO_SNAKE_CASE");
+ assertThat(CaseUtils.toScreamingSnakeCase("tosnakecase")).isEqualTo("TOSNAKECASE");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("THE_CAFES_PINATA_GAVE_ME_DEJA_VU");
+
+ assertThat(CaseUtils.toScreamingSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 " +
+ "\u010D\u1E01\u0219\u1E1B")).isEqualTo("TO_SNAKE_CASE");
+ }
+
+ @Test
+ public void testToSnakeCase() {
+ assertThat(CaseUtils.toSnakeCase(null)).isNull();
+ assertThat(CaseUtils.toSnakeCase("")).isEqualTo("");
+ assertThat(CaseUtils.toSnakeCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toSnakeCase("a b c @def")).isEqualTo("a_b_c_def");
+ assertThat(CaseUtils.toSnakeCase("a b c @def")).isEqualTo("a_b_c_def");
+
+ assertThat(CaseUtils.toSnakeCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toSnakeCase(" to-SNAKE-cASE")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("@@@@ to+SNAKE@cASE ")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("To+SN+AK E@cASE")).isEqualTo("to_sn_ak_e_case");
+
+ assertThat(CaseUtils.toSnakeCase("To.Snake.Case")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("To.Snake-Case")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase(" to @ Snake case")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase(" @to @ Snake case_")).isEqualTo("to_snake_case");
+
+ assertThat(CaseUtils.toSnakeCase("TO SNAKE CASE")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("tosnakecase")).isEqualTo("tosnakecase");
+
+ assertThat(CaseUtils.toSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toSnakeCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("the_cafes_pinata_gave_me_deja_vu");
+ assertThat(CaseUtils.toSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("to_snake_case");
+ }
+
+ @Test
+ public void testToTitleCase() {
+ assertThat(CaseUtils.toTitleCase(null)).isNull();
+ assertThat(CaseUtils.toTitleCase("")).isEqualTo("");
+ assertThat(CaseUtils.toTitleCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toTitleCase("a b c @def")).isEqualTo("A_B_C_Def");
+ assertThat(CaseUtils.toTitleCase("a b c @def")).isEqualTo("A_B_C_Def");
+
+ assertThat(CaseUtils.toTitleCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toTitleCase(" to-TITLE-cASE")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase("@@@@ to+TITLE@cASE ")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase("To+TI+TL E@cASE")).isEqualTo("To_Ti_Tl_E_Case");
+
+ assertThat(CaseUtils.toTitleCase("To.Title.Case")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase("To.Title-Case")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase(" to @ Title case")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase(" @to @ Title case_")).isEqualTo("To_Title_Case");
+
+ assertThat(CaseUtils.toTitleCase("TO TITLE CASE")).isEqualTo("To_Title_Case");
+ assertThat(CaseUtils.toTitleCase("totitlecase")).isEqualTo("Totitlecase");
+
+ assertThat(CaseUtils.toTitleCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toTitleCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("The_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toTitleCase("\u1E70\u01EB \u1E6A\u1ECB\u1E71\u0142\u1EB9 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("To_Title_Case");
+ }
+
+ @Test
+ public void testToTrainCase() {
+ assertThat(CaseUtils.toTrainCase(null)).isNull();
+ assertThat(CaseUtils.toTrainCase("")).isEqualTo("");
+ assertThat(CaseUtils.toTrainCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toTrainCase("a b c @def")).isEqualTo("A-B-C-Def");
+ assertThat(CaseUtils.toTrainCase("a b c @def")).isEqualTo("A-B-C-Def");
+
+ assertThat(CaseUtils.toTrainCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toTrainCase(" to-TRAIN-cASE")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase("@@@@ to+TRAIN@cASE ")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase("To+TR+AI N@cASE")).isEqualTo("To-Tr-Ai-N-Case");
+
+ assertThat(CaseUtils.toTrainCase("To.Train.Case")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase("To.Train-Case")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase(" to @ Train case")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase(" @to @ Train case_")).isEqualTo("To-Train-Case");
+
+ assertThat(CaseUtils.toTrainCase("TO TRAIN CASE")).isEqualTo("To-Train-Case");
+ assertThat(CaseUtils.toTrainCase("totraincase")).isEqualTo("Totraincase");
+
+ assertThat(CaseUtils.toTrainCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toTrainCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("The-Cafes-Pinata-Gave-Me-Deja-Vu");
+ assertThat(CaseUtils.toTrainCase("\u1E70\u01EB \u1E6A\u0211\u0101\u012F\u1E49 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("To-Train-Case");
+ }
+
+ @Test
+ public void testToUpperCamelCase() {
+ assertThat(CaseUtils.toUpperCamelCase(null)).isNull();
+ assertThat(CaseUtils.toUpperCamelCase("")).isEqualTo("");
+ assertThat(CaseUtils.toUpperCamelCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toUpperCamelCase("a b c @def")).isEqualTo("ABCDef");
+ assertThat(CaseUtils.toUpperCamelCase("a b c @def")).isEqualTo("ABCDef");
+
+ assertThat(CaseUtils.toUpperCamelCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toUpperCamelCase(" to-CAMEL-cASE")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase("@@@@ to+CAMEL@cASE ")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase("To+CA+ME L@cASE")).isEqualTo("ToCaMeLCase");
+
+ assertThat(CaseUtils.toUpperCamelCase("To.Camel.Case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase("To.Camel-Case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase(" to @ Camel case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase(" @to @ Camel case_")).isEqualTo("ToCamelCase");
+
+ assertThat(CaseUtils.toUpperCamelCase("TO CAMEL CASE")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toUpperCamelCase("tocamelcase")).isEqualTo("Tocamelcase");
+
+ assertThat(CaseUtils.toUpperCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
+
+ assertThat(CaseUtils.toUpperCamelCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("TheCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toUpperCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("ToCamelCase");
+ }
+
}
From 5a614c6f743e5ed9a08d179cca92593110118302 Mon Sep 17 00:00:00 2001
From: speters33w
- * "Two words" "foo bar" "Piñata Café" - * toCamelCase(str) "twoWords" "fooBar" "pinataCafe" - * toCamelCase(str, false, " ") "twoWords" "fooBar" "piñataCafé" - * toCamelCase(str, true, " ") "TwoWords" "FooBar" "PiñataCafé" - * ToCamelSnakeCase "two_Words" "foo_Bar" "pinata_Cafe" - * toFlatcase(str) "twowords" "foobar" "pinatacafe" - * toKebabCase(str) "two-words" "foo-bar" "pinata-cafe" - * toScreamingCase(str) "TWOWORDS" "FOOBAR" "PINATACAFE" - * toScreamingKebabCase(str) "TWO-WORDS" "FOO-BAR" "PINATA-CAFE" - * toScreamingSnakeCase(str) "TWO_WORDS" "FOO_BAR" "PINATA_CAFE" - * toSnakeCase(str) "two_words" "foo_bar" "pinata_cafe" - * toTitleCase(str) "Two_Words" "Foo_Bar" "Pinata_Cafe" - * toTrainCase(str) "Two-Words" "Foo-Bar" "Pinata-Cafe" - * toUpperCamelCase(str) "TwoWords" "FooBar" "PinataCafe" + * "Two words" "foo bar" "Piñata Café" + * camelCase toCamelCase(str) "twoWords" "fooBar" "pinataCafe" + * camelCase toCamelCase(str, false, " ") "twoWords" "fooBar" "piñataCafé" + * camel_Snake toDelimitedCase(str, false, '_') "two_Words" "foo_Bar" "pinata_Cafe" + * flatcase toPascalCase(str).toLowerCase() "twowords" "foobar" "pinatacafe" + * kebab-case toKebabCase(str) "two-words" "foo-bar" "pinata-cafe" + * PascalCase toPascalCase(str) "TwoWords" "FooBar" "PinataCafe" + * PascalCase toCamelCase(str, true, " ") "TwoWords" "FooBar" "PiñataCafé" + * SCREAMINGCASE toPascalCase(str).toUpperCase() "TWOWORDS" "FOOBAR" "PINATACAFE" + * SCREAMING-KEBAB toDelimitedCase(str, '-').toUpperCase() "TWO-WORDS" "FOO-BAR" "PINATA-CAFE" + * SCREAMING_SNAKE toDelimitedCase(str, '_').toUpperCase() "TWO_WORDS" "FOO_BAR" "PINATA_CAFE" + * snake_case toSnakeCase(str) "two_words" "foo_bar" "pinata_cafe" + * Title_Case toDelimitedCase(str, '_') "Two_Words" "Foo_Bar" "Pinata_Cafe" + * Train-Case toDelimitedCase(str, '-') "Two-Words" "Foo-Bar" "Pinata-Cafe" ** * @since 1.2 @@ -64,7 +65,7 @@ public class CaseUtils { *
A {@code null} input String returns {@code null}.
* *A input string with only delimiter characters returns {@code ""}.
- * + *
* Capitalization uses the Unicode title case, normally equivalent to
* upper case and cannot perform locale-sensitive mappings.
*
@@ -79,9 +80,9 @@ public class CaseUtils {
* CaseUtils.toCamelCase(" @", false, new char[]{'@'}) = ""
*
*
- * @param str the String to be converted to camelCase, may be null
+ * @param str the String to be converted to camelCase, may be null
* @param capitalizeFirstLetter boolean. If true, set the first character of the first word to title case.
- * @param delimiters set of characters to determine capitalization, null and/or empty array means whitespace
+ * @param delimiters set of characters to determine capitalization, null and/or empty array means whitespace
* @return camelCase of String, {@code null} if null String input
*/
public static String toCamelCase(String str, final boolean capitalizeFirstLetter, final char... delimiters) {
@@ -94,7 +95,7 @@ public static String toCamelCase(String str, final boolean capitalizeFirstLetter
int outOffset = 0;
final Set
+ * Uses {@code toDelimitedCase()} to convert a string to camelCase.
* This method has different behavior from {@link #toCamelCase(String, boolean, char[])}
* because all accented characters are normalized (accents removed).
* For example, {@code toCamelCase("Piñata Café")} will return {@code "pinataCafe"}, where
* {@code toCamelCase("Piñata Café", false, " ")} will return {@code "piñataCafé"}.
- * The first alphanumeric character of the string is converted to lower case.
- * The first character of all other alphanumeric sequences capitalized.
- * The rest of the characters in the sequence are converted to lower case.
+ * Converts the first alphanumeric character of the string to lower case.
+ * Capitalizes first character of all other alphanumeric sequences.
+ * Converts all other characters in the sequence to lower case.
* Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
* from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ * Deletes all other non-alphanumeric characters or sequences of non-alphanumeric characters.
*
- * @see #toCamelCase(String, boolean, char[])
- * @see #toTitleCase(String)
* @param str The text to convert.
* @return The convertedText.
+ * @see #toCamelCase(String, boolean, char[])
+ * @see #toDelimitedCase(String, Boolean, Character)
*/
public static String toCamelCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- String titleCase = toTitleCase(str).replace("_", "");
- if (titleCase.length() <= 1) return titleCase.toLowerCase();
- return titleCase.substring(0,1).toLowerCase() + titleCase.substring(1);
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to camel_Snake_Case.
- * All accented characters are normalized (accents removed).
- * The first alphanumeric character of the string is converted to lower case.
- * The first character of all other alphanumeric sequences capitalized.
- * The rest of the characters in the sequence are converted to lower case.
- * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
- * from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single underscore ('_').
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The converted_Text.
- */
- public static String toCamelSnakeCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- String titleCase = toTitleCase(str);
- if (titleCase.length() <= 1) return titleCase.toLowerCase();
- return titleCase.substring(0,1).toLowerCase() + titleCase.substring(1);
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to flatcase.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to lower case.
- * All non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The convertedtext.
- */
- public static String toFlatCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- return toSnakeCase(str).replace("_", "");
+ return StringUtils.deleteWhitespace(toDelimitedCase(str, false, ' '));
}
/**
- * Uses {@code toTitleCase()} to convert a string to kebab-case.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to lower case.
+ * Converts a string to Delimited Case.
+ * This is identical to using {@code toDelimitedCase(str, true, separator);}
+ * Normalizes accented characters (removes accents).
+ * Capitalizes the first character of any alphanumeric sequence.
+ * Converts the rest of the characters in the sequence to lower case
* Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
* from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single hyphen ('-').
+ * Converts all other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * to the separator delimiter.
*
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The converted-text.
- */
- public static String toKebabCase(String str){
- if (StringUtils.isEmpty(str)) return str;
- return toSnakeCase(str).replace("_", "-");
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to SCREAMINGCASE.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to upper case.
- * All non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The CONVERTEDTEXT.
- */
- public static String toScreamingCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- return toScreamingSnakeCase(str).replace("_", "");
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to SCREAMING-KEBAB-CASE.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to upper case.
- * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
- * from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single hyphen ('-').
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The CONVERTED-TEXT.
- */
- public static String toScreamingKebabCase(String str){
- if (StringUtils.isEmpty(str)) return str;
- return toScreamingSnakeCase(str).replace("_", "-");
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to SCREAMING_SNAKE_CASE.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to upper case.
- * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
- * from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single underscore ('_').
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The CONVERTED_TEXT.
- */
- public static String toScreamingSnakeCase(String str){
- if (StringUtils.isEmpty(str)) return str;
- return toTitleCase(str).toUpperCase();
- }
-
- /**
- * Uses {@code toTitleCase()} to convert a string to snake_case.
- * All accented characters are normalized (accents removed).
- * All alphanumeric characters are converted to lower case.
- * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
- * from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single underscore ('_').
- *
- * @see #toTitleCase(String)
- * @param str The text to convert.
- * @return The converted_text.
+ * @param str String: the text to convert.
+ * @param separator char: The separator to use as a delimiter.
+ * @return The Converted_Text.
*/
- public static String toSnakeCase(String str){
- if (StringUtils.isEmpty(str)) return str;
- return toTitleCase(str).toLowerCase();
+ public static String toDelimitedCase(String str, Character separator) {
+ return toDelimitedCase(str, true, separator);
}
+ // todo reduce cyclomatic complexity (17) to < 10 if possible. Create a private method for sanitization?
/**
- * Converts a string to Title_Case.
- * All accented characters are normalized (accents removed).
- * The first character of any alphanumeric sequence is capitalized.
- * The rest of the characters in the sequence are converted to lower case
+ * Converts a string to Delimited Case.
+ * Normalizes accented characters (removes accents).
+ * If {@code capitalizeFirstLetter} is {@code true}, capitalizes the first character of the string.
+ * Otherwise, converts the first character of the string to lower case.
+ * Capitalizes the first character of any other alphanumeric sequence.
+ * Converts the rest of the characters in the sequence to lower case
* Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
* from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single underscore ('_').
+ * Converts all other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * to the separator delimiter.
*
- * @see #toTitleCase(String)
- * @param str The text to convert.
+ * @param str String: the text to convert.
+ * @param capitalizeFirstLetter boolean: If false, converts the first character of the string to lower case.
+ * @param separator char: The separator to use as a delimiter.
* @return The Converted_Text.
*/
- public static String toTitleCase(String str) {
+ public static String toDelimitedCase(String str, final Boolean capitalizeFirstLetter, Character separator) {
if (StringUtils.isEmpty(str)) {
return str;
}
- String normalized = StringUtils.stripAccents(str).trim();
- if (Pattern.matches("^[^a-zA-Z0-9]*$", normalized)) {
+ boolean capitalizeFirst = BooleanUtils.isNotFalse(capitalizeFirstLetter);
+ if (separator == null) {
+ return toPascalCase(str);
+ }
+ // todo precompile regex patterns to handle these and other regex patterns.
+ String normalized = StringUtils.stripAccents(str)
+ .replace("O'", "O ")
+ .replace("O\u2019", "O ").trim();
+ if (Pattern.matches("^[^0-9A-Za-z]*$", normalized)) {
return "";
}
int startIndex = 0;
- for (int i = 0; i < normalized.length(); i++){
- if (Pattern.matches("[0-9A-Za-z]", Character.toString(normalized.charAt(i)))){
+ for (int i = 0; i < normalized.length(); i++) {
+ if (Pattern.matches("[0-9A-Za-z]", Character.toString(normalized.charAt(i)))) {
startIndex = i;
break;
}
}
- StringBuilder snake = new StringBuilder();
+ // todo see if TextStringBuilder is better than StringBuilder for this application.
+ StringBuilder delimited = new StringBuilder();
for (int i = startIndex; i < normalized.length(); i++) {
- if (i > 0 && !Pattern.matches("[0-9A-Za-z'\u2019]", Character.toString(normalized.charAt(i)))) {
- if (snake.charAt(snake.length() - 1) != '_' && i != normalized.length() - 1) {
- snake.append("_");
+ if (i > startIndex && !Pattern.matches("[0-9A-Za-z'\u2019]",
+ Character.toString(normalized.charAt(i)))) {
+ if (delimited.charAt(delimited.length() - 1) != separator) {
+ delimited.append(separator);
+ }
+ } else if (normalized.charAt(i) != '\'' && normalized.charAt(i) != '\u2019') {
+ if (i == startIndex && capitalizeFirst) {
+ delimited.append(Character.toUpperCase(normalized.charAt(i)));
+ } else if (i != startIndex && delimited.charAt(delimited.length() - 1) == separator) {
+ delimited.append(Character.toUpperCase(normalized.charAt(i)));
+ } else {
+ delimited.append(Character.toLowerCase(normalized.charAt(i)));
}
- } else if (i == startIndex || snake.charAt(snake.length() - 1) == '_') {
- snake.append(Character.toUpperCase(normalized.charAt(i)));
- }
- else if (normalized.charAt(i) != '\'' && normalized.charAt(i) != '\u2019') {
- snake.append(Character.toLowerCase(normalized.charAt(i)));
}
}
- return snake.toString();
+ if (delimited.charAt(delimited.length() - 1) == separator) {
+ delimited.deleteCharAt(delimited.length() - 1);
+ }
+
+ return delimited.toString();
}
/**
- * Uses {@code toTitleCase()} to convert a string to Train-Case.
- * All accented characters are normalized (accents removed).
- * The first character of any alphanumeric sequence is capitalized.
- * The rest of the characters in the sequence are converted to lower case
+ * Uses {@code toDelimitedCase()} to convert a string to kebab-case.
+ * Normalizes accented characters (removes accents).
+ * Converts all alphanumeric characters to lower case.
* Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
* from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters
- * are converted to a single hyphen ('-').
+ * Converts all other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * to a single hyphen ('-').
*
- * @see #toTitleCase(String)
* @param str The text to convert.
- * @return The Converted-Text.
+ * @return The converted-text.
+ * @see #toDelimitedCase(String, Character)
+ * @see StringUtils#lowerCase(String)
*/
- public static String toTrainCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- return toTitleCase(str).replace("_", "-");
+ public static String toKebabCase(String str) {
+ return StringUtils.lowerCase(toDelimitedCase(str, '-'));
}
/**
- * Uses {@code toTitleCase()} to convert a string to UpperCamelCase.
- * All accented characters are normalized (accents removed).
- * The first character of any alphanumeric sequence is capitalized.
- * The rest of the characters in the sequence are converted to lower case
+ * Uses {@code toDelimitedCase()} to convert a string to UpperCamelCase.
+ * Normalizes accented characters (removes accents).
+ * Capitalizes The first character of any alphanumeric sequence.
+ * Converts the rest of the characters in the sequence to lower case
* Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
* from the beginning and end of the string.
- * All other non-alphanumeric characters or sequences of non-alphanumeric characters are deleted.
+ * Deletes all other non-alphanumeric characters or sequences of non-alphanumeric characters.
*
- * @see #toTitleCase(String)
* @param str The text to convert.
* @return The ConvertedText.
+ * @see #toDelimitedCase(String, Character)
+ * @see StringUtils#deleteWhitespace(String)
+ */
+ public static String toPascalCase(String str) {
+ return StringUtils.deleteWhitespace(toDelimitedCase(str, ' '));
+ }
+
+ /**
+ * Uses {@code toDelimitedCase()} to convert a string to snake_case.
+ * Normalizes accented characters (removes accents).
+ * Converts all alphanumeric characters to lower case.
+ * Strips all non-alphanumeric characters or sequences of non-alphanumeric characters
+ * from the beginning and end of the string.
+ * Converts all other non-alphanumeric characters or sequences of non-alphanumeric characters
+ * to a single underscore ('_').
+ *
+ * @param str The text to convert.
+ * @return The converted_text.
+ * @see #toDelimitedCase(String, Character)
+ * @see StringUtils#lowerCase(String)
*/
- public static String toUpperCamelCase(String str) {
- if (StringUtils.isEmpty(str)) return str;
- return toTitleCase(str).replace("_", "");
+ public static String toSnakeCase(String str) {
+ return StringUtils.lowerCase(toDelimitedCase(str, '_'));
}
/**
diff --git a/src/test/java/org/apache/commons/text/CaseUtilsTest.java b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
index b287cc995e..46f2d31d36 100644
--- a/src/test/java/org/apache/commons/text/CaseUtilsTest.java
+++ b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
@@ -70,11 +70,9 @@ public void testToCamelCase() {
assertThat(CaseUtils.toCamelCase("tocamelcase", false)).isEqualTo("tocamelcase");
assertThat(CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true)).isEqualTo("\uD800\uDF00\uD800\uDF02");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, '\uD800',
- '\uDF14')).isEqualTo("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03");
+ assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, '\uD800', '\uDF14')).isEqualTo("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03");
- assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu.", true, '.'))
- .isEqualTo("TheCafé\u2019sPiñataGaveMeDéjàVu");
+ /* **** NEW TESTS **** */
assertThat(CaseUtils.toCamelCase(null)).isNull();
assertThat(CaseUtils.toCamelCase("")).isEqualTo("");
@@ -95,73 +93,59 @@ public void testToCamelCase() {
assertThat(CaseUtils.toCamelCase("TO CAMEL CASE")).isEqualTo("toCamelCase");
assertThat(CaseUtils.toCamelCase("tocamelcase")).isEqualTo("tocamelcase");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
+ assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
- assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("theCafesPinataGaveMeDejaVu");
- assertThat(CaseUtils.toCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("theCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B")).isEqualTo("toCamelCase");
}
@Test
- public void testToCamelSnakeCase() {
- assertThat(CaseUtils.toCamelSnakeCase(null)).isNull();
- assertThat(CaseUtils.toCamelSnakeCase("")).isEqualTo("");
- assertThat(CaseUtils.toCamelSnakeCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toCamelSnakeCase("a b c @def")).isEqualTo("a_B_C_Def");
- assertThat(CaseUtils.toCamelSnakeCase("a b c @def")).isEqualTo("a_B_C_Def");
-
- assertThat(CaseUtils.toCamelSnakeCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toCamelSnakeCase(" to-CAMELSNAKE-cASE")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase("@@@@ to+CAMELSNAKE@cASE ")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase("To+CAMEL+SNAK E@cASE")).isEqualTo("to_Camel_Snak_E_Case");
-
- assertThat(CaseUtils.toCamelSnakeCase("To.CamelSnake.Case")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase("To.CamelSnake-Case")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase(" to @ CamelSnake case")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase(" @to @ CamelSnake case_")).isEqualTo("to_Camelsnake_Case");
-
- assertThat(CaseUtils.toCamelSnakeCase("TO CAMELSNAKE CASE")).isEqualTo("to_Camelsnake_Case");
- assertThat(CaseUtils.toCamelSnakeCase("tocamelsnakecase")).isEqualTo("tocamelsnakecase");
-
- assertThat(CaseUtils.toCamelSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toCamelSnakeCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("the_Cafes_Pinata_Gave_Me_Deja_Vu");
- assertThat(CaseUtils.toCamelSnakeCase("\u010C\u0227\u1E41\u0113\u0142 \u1E61\u1E47\u1EA3\u1E31\u1EB9"))
- .isEqualTo("camel_Snake");
- }
-
- @Test
- public void testToFlatCase() {
- assertThat(CaseUtils.toFlatCase(null)).isNull();
- assertThat(CaseUtils.toFlatCase("")).isEqualTo("");
- assertThat(CaseUtils.toFlatCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toFlatCase("a b c @def")).isEqualTo("abcdef");
- assertThat(CaseUtils.toFlatCase("a b c @def")).isEqualTo("abcdef");
-
- assertThat(CaseUtils.toFlatCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toFlatCase(" to-FLAT-cASE")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase("@@@@ to+FLAT@cASE ")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase("To+FL+A T@cASE")).isEqualTo("toflatcase");
-
- assertThat(CaseUtils.toFlatCase("To.Flat.Case")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase("To.Flat-Case")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase(" to @ Flat case")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase(" @to @ Flat case_")).isEqualTo("toflatcase");
-
- assertThat(CaseUtils.toFlatCase("TO FLAT CASE")).isEqualTo("toflatcase");
- assertThat(CaseUtils.toFlatCase("toflatcase")).isEqualTo("toflatcase");
-
- assertThat(CaseUtils.toFlatCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toFlatCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("thecafespinatagavemedejavu");
- assertThat(CaseUtils.toFlatCase("\u1E70\u01EB \u1E1E\u0142\u1EA3\u1E6F \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("toflatcase");
+ public void testToDelimitedCase() {
+ assertThat(CaseUtils.toDelimitedCase(null, null)).isNull();
+ assertThat(CaseUtils.toDelimitedCase(null, null, null)).isNull();
+ assertThat(CaseUtils.toDelimitedCase("", ' ')).isEqualTo("");
+ assertThat(CaseUtils.toDelimitedCase(" ", ' ')).isEqualTo("");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", '_')).isEqualTo("A_B_C_Def");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", '-')).isEqualTo("A-B-C-Def");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", true, null)).isEqualTo("ABCDef");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", null, null)).isEqualTo("ABCDef");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", null, '_')).isEqualTo("A_B_C_Def");
+
+ assertThat(CaseUtils.toDelimitedCase("-+@ ", '@')).isEqualTo("");
+
+ assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", '_')).isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", '_')).isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", '+')).isEqualTo("To+Delim+It+Ed+Case");
+
+ assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", false, '_')).isEqualTo("to_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", false, '_')).isEqualTo("to_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", false, '+')).isEqualTo("to+Delim+It+Ed+Case");
+
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", '.')).isEqualTo("To.Delimited.Case");
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", '\u2250')).isEqualTo("To\u2250Delimited\u2250Case");
+ assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", ' ')).isEqualTo("To Delimited Case");
+ assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", '@')).isEqualTo("To@Delimited@Case");
+
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", false, '.')).isEqualTo("to.Delimited.Case");
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", false, '\u2250')).isEqualTo("to\u2250Delimited\u2250Case");
+ assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", false, ' ')).isEqualTo("to Delimited Case");
+ assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", false, '@')).isEqualTo("to@Delimited@Case");
+
+ assertThat(CaseUtils.toDelimitedCase("TO DELIMITED CASE", '_')).isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("todelimitedcase", '_')).isEqualTo("Todelimitedcase");
+
+ assertThat(CaseUtils.toDelimitedCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", '\uD800')).isEqualTo("");
+
+ assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.", '_')).isEqualTo("The_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.", false, '_')).isEqualTo("the_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toDelimitedCase("\u1E70\u01EB \u1E12\u0205\u0142\u012B\u1E43\u01D0\u1E6B\u0119\u1E0B " +
+ "\u010D\u1E01\u0219\u1E1B", '_')).isEqualTo("To_Delimited_Case");
+
+ assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026", '\u272F')).isEqualTo("With\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
+ assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026", false, '\u272F')).isEqualTo("with\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
+
+ assertThat(CaseUtils.toDelimitedCase("\"Officer O'Malley and Peart O'Niel " +
+ "walk into the Protestant's Bar.\"", '_')).isEqualTo("Officer_O_Malley_And_Peart_O_Niel_Walk_Into_The_Protestants_Bar");
}
@Test
@@ -185,106 +169,37 @@ public void testToKebabCase() {
assertThat(CaseUtils.toKebabCase("TO KEBAB CASE")).isEqualTo("to-kebab-case");
assertThat(CaseUtils.toKebabCase("tokebabcase")).isEqualTo("tokebabcase");
- assertThat(CaseUtils.toKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toKebabCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("the-cafes-pinata-gave-me-deja-vu");
- assertThat(CaseUtils.toKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("to-kebab-case");
- }
-
- @Test
- public void testToScreamingCase() {
- assertThat(CaseUtils.toScreamingCase(null)).isNull();
- assertThat(CaseUtils.toScreamingCase("")).isEqualTo("");
- assertThat(CaseUtils.toScreamingCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingCase("a b c @def")).isEqualTo("ABCDEF");
- assertThat(CaseUtils.toScreamingCase("a b c @def")).isEqualTo("ABCDEF");
-
- assertThat(CaseUtils.toScreamingCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingCase(" to-SCREAMING-cASE")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase("@@@@ to+SCREAMING@cASE ")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase("To+SCR+EAM ING@cASE")).isEqualTo("TOSCREAMINGCASE");
-
- assertThat(CaseUtils.toScreamingCase("To.SCREAMING.Case")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase("To.SCREAMING-Case")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase(" to @ SCREAMING case")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase(" @to @ SCREAMING case_")).isEqualTo("TOSCREAMINGCASE");
-
- assertThat(CaseUtils.toScreamingCase("TO SCREAMING CASE")).isEqualTo("TOSCREAMINGCASE");
- assertThat(CaseUtils.toScreamingCase("toscreamingcase")).isEqualTo("TOSCREAMINGCASE");
-
- assertThat(CaseUtils.toScreamingCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toScreamingCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("THECAFESPINATAGAVEMEDEJAVU");
-
- assertThat(CaseUtils.toScreamingCase("\u0218\u0107\u1E59\u0113\u1E01\u1E43\u1EC9\u1F09\u0148\u1E21 " +
- "\u010D\u1E01\u0219\u1E1B")).isEqualTo("SCREAMINGCASE");
- }
+ assertThat(CaseUtils.toKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
- @Test
- public void testToScreamingKebabCase() {
- assertThat(CaseUtils.toScreamingKebabCase(null)).isNull();
- assertThat(CaseUtils.toScreamingKebabCase("")).isEqualTo("");
- assertThat(CaseUtils.toScreamingKebabCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingKebabCase("a b c @def")).isEqualTo("A-B-C-DEF");
- assertThat(CaseUtils.toScreamingKebabCase("a b c @def")).isEqualTo("A-B-C-DEF");
-
- assertThat(CaseUtils.toScreamingKebabCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingKebabCase(" to-KEBAB-cASE")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase("@@@@ to+KEBAB@cASE ")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase("To+KE+BA B@cASE")).isEqualTo("TO-KE-BA-B-CASE");
-
- assertThat(CaseUtils.toScreamingKebabCase("To.Kebab.Case")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase("To.Kebab-Case")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase(" to @ Kebab case")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase(" @to @ Kebab case_")).isEqualTo("TO-KEBAB-CASE");
-
- assertThat(CaseUtils.toScreamingKebabCase("TO KEBAB CASE")).isEqualTo("TO-KEBAB-CASE");
- assertThat(CaseUtils.toScreamingKebabCase("tokebabcase")).isEqualTo("TOKEBABCASE");
-
- assertThat(CaseUtils.toScreamingKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toScreamingKebabCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("THE-CAFES-PINATA-GAVE-ME-DEJA-VU");
-
- assertThat(CaseUtils.toScreamingKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("TO-KEBAB-CASE");
+ assertThat(CaseUtils.toKebabCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("the-cafes-pinata-gave-me-deja-vu");
+ assertThat(CaseUtils.toKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B")).isEqualTo("to-kebab-case");
}
@Test
- public void testToScreamingSnakeCase() {
- assertThat(CaseUtils.toScreamingSnakeCase(null)).isNull();
- assertThat(CaseUtils.toScreamingSnakeCase("")).isEqualTo("");
- assertThat(CaseUtils.toScreamingSnakeCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingSnakeCase("a b c @def")).isEqualTo("A_B_C_DEF");
- assertThat(CaseUtils.toScreamingSnakeCase("a b c @def")).isEqualTo("A_B_C_DEF");
-
- assertThat(CaseUtils.toScreamingSnakeCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toScreamingSnakeCase(" to-SNAKE-cASE")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase("@@@@ to+SNAKE@cASE ")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase("To+SN+AK E@cASE")).isEqualTo("TO_SN_AK_E_CASE");
-
- assertThat(CaseUtils.toScreamingSnakeCase("To.Snake.Case")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase("To.Snake-Case")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase(" to @ Snake case")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase(" @to @ Snake case_")).isEqualTo("TO_SNAKE_CASE");
-
- assertThat(CaseUtils.toScreamingSnakeCase("TO SNAKE CASE")).isEqualTo("TO_SNAKE_CASE");
- assertThat(CaseUtils.toScreamingSnakeCase("tosnakecase")).isEqualTo("TOSNAKECASE");
-
- assertThat(CaseUtils.toScreamingSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toScreamingSnakeCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("THE_CAFES_PINATA_GAVE_ME_DEJA_VU");
-
- assertThat(CaseUtils.toScreamingSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 " +
- "\u010D\u1E01\u0219\u1E1B")).isEqualTo("TO_SNAKE_CASE");
+ public void testToPascalCase() {
+ assertThat(CaseUtils.toPascalCase(null)).isNull();
+ assertThat(CaseUtils.toPascalCase("")).isEqualTo("");
+ assertThat(CaseUtils.toPascalCase(" ")).isEqualTo("");
+ assertThat(CaseUtils.toPascalCase("a b c @def")).isEqualTo("ABCDef");
+ assertThat(CaseUtils.toPascalCase("a b c @def")).isEqualTo("ABCDef");
+
+ assertThat(CaseUtils.toPascalCase("-+@ ")).isEqualTo("");
+ assertThat(CaseUtils.toPascalCase(" to-CAMEL-cASE")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase("@@@@ to+CAMEL@cASE ")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase("To+CA+ME L@cASE")).isEqualTo("ToCaMeLCase");
+
+ assertThat(CaseUtils.toPascalCase("To.Camel.Case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase("To.Camel-Case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase(" to @ Camel case")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase(" @to @ Camel case_")).isEqualTo("ToCamelCase");
+
+ assertThat(CaseUtils.toPascalCase("TO CAMEL CASE")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase("tocamelcase")).isEqualTo("Tocamelcase");
+
+ assertThat(CaseUtils.toPascalCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
+
+ assertThat(CaseUtils.toPascalCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("TheCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toPascalCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B")).isEqualTo("ToCamelCase");
}
@Test
@@ -308,103 +223,28 @@ public void testToSnakeCase() {
assertThat(CaseUtils.toSnakeCase("TO SNAKE CASE")).isEqualTo("to_snake_case");
assertThat(CaseUtils.toSnakeCase("tosnakecase")).isEqualTo("tosnakecase");
- assertThat(CaseUtils.toSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
+ assertThat(CaseUtils.toSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
- assertThat(CaseUtils.toSnakeCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("the_cafes_pinata_gave_me_deja_vu");
- assertThat(CaseUtils.toSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("the_cafes_pinata_gave_me_deja_vu");
+ assertThat(CaseUtils.toSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 \u010D\u1E01\u0219\u1E1B")).isEqualTo("to_snake_case");
}
@Test
- public void testToTitleCase() {
- assertThat(CaseUtils.toTitleCase(null)).isNull();
- assertThat(CaseUtils.toTitleCase("")).isEqualTo("");
- assertThat(CaseUtils.toTitleCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toTitleCase("a b c @def")).isEqualTo("A_B_C_Def");
- assertThat(CaseUtils.toTitleCase("a b c @def")).isEqualTo("A_B_C_Def");
-
- assertThat(CaseUtils.toTitleCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toTitleCase(" to-TITLE-cASE")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase("@@@@ to+TITLE@cASE ")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase("To+TI+TL E@cASE")).isEqualTo("To_Ti_Tl_E_Case");
-
- assertThat(CaseUtils.toTitleCase("To.Title.Case")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase("To.Title-Case")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase(" to @ Title case")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase(" @to @ Title case_")).isEqualTo("To_Title_Case");
-
- assertThat(CaseUtils.toTitleCase("TO TITLE CASE")).isEqualTo("To_Title_Case");
- assertThat(CaseUtils.toTitleCase("totitlecase")).isEqualTo("Totitlecase");
-
- assertThat(CaseUtils.toTitleCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toTitleCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("The_Cafes_Pinata_Gave_Me_Deja_Vu");
- assertThat(CaseUtils.toTitleCase("\u1E70\u01EB \u1E6A\u1ECB\u1E71\u0142\u1EB9 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("To_Title_Case");
- }
+ public void testSeparatedWordFormats() {
+ assertThat(CaseUtils.toCamelCase("Çàmè\u0142 çásé")).isEqualTo("camelCase");
+ assertThat(CaseUtils.toCamelCase("Çàmè\u0142 çásé", false, ' ')).isEqualTo("çàmè\u0142Çásé");
+ assertThat(CaseUtils.toDelimitedCase("Camel snake", false, '_')).isEqualTo("camel_Snake");
+ assertThat(CaseUtils.toPascalCase("FLAT CASE").toLowerCase()).isEqualTo("flatcase");
+ assertThat(CaseUtils.toKebabCase("Kebab Case")).isEqualTo("kebab-case");
+ assertThat(CaseUtils.toPascalCase("pâsçã\u0142 çäsê")).isEqualTo("PascalCase");
+ assertThat(CaseUtils.toCamelCase("pâsçã\u0142 çäsê", true, ' ')).isEqualTo("Pâsçã\u0142Çäsê");
+ assertThat(CaseUtils.toPascalCase("screaming case").toUpperCase()).isEqualTo("SCREAMINGCASE");
+ assertThat(CaseUtils.toDelimitedCase("screaming KEBAB-CASE", '-').toUpperCase()).isEqualTo("SCREAMING-KEBAB-CASE");
+ assertThat(CaseUtils.toDelimitedCase("SCREAMING snake_case", '_').toUpperCase()).isEqualTo("SCREAMING_SNAKE_CASE");
+ assertThat(CaseUtils.toDelimitedCase("Snake Case", '_').toLowerCase()).isEqualTo("snake_case");
+ assertThat(CaseUtils.toDelimitedCase("title case", true, '_')).isEqualTo("Title_Case");
+ assertThat(CaseUtils.toDelimitedCase("train case", true, '-')).isEqualTo("Train-Case");
- @Test
- public void testToTrainCase() {
- assertThat(CaseUtils.toTrainCase(null)).isNull();
- assertThat(CaseUtils.toTrainCase("")).isEqualTo("");
- assertThat(CaseUtils.toTrainCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toTrainCase("a b c @def")).isEqualTo("A-B-C-Def");
- assertThat(CaseUtils.toTrainCase("a b c @def")).isEqualTo("A-B-C-Def");
-
- assertThat(CaseUtils.toTrainCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toTrainCase(" to-TRAIN-cASE")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase("@@@@ to+TRAIN@cASE ")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase("To+TR+AI N@cASE")).isEqualTo("To-Tr-Ai-N-Case");
-
- assertThat(CaseUtils.toTrainCase("To.Train.Case")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase("To.Train-Case")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase(" to @ Train case")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase(" @to @ Train case_")).isEqualTo("To-Train-Case");
-
- assertThat(CaseUtils.toTrainCase("TO TRAIN CASE")).isEqualTo("To-Train-Case");
- assertThat(CaseUtils.toTrainCase("totraincase")).isEqualTo("Totraincase");
-
- assertThat(CaseUtils.toTrainCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toTrainCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("The-Cafes-Pinata-Gave-Me-Deja-Vu");
- assertThat(CaseUtils.toTrainCase("\u1E70\u01EB \u1E6A\u0211\u0101\u012F\u1E49 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("To-Train-Case");
- }
-
- @Test
- public void testToUpperCamelCase() {
- assertThat(CaseUtils.toUpperCamelCase(null)).isNull();
- assertThat(CaseUtils.toUpperCamelCase("")).isEqualTo("");
- assertThat(CaseUtils.toUpperCamelCase(" ")).isEqualTo("");
- assertThat(CaseUtils.toUpperCamelCase("a b c @def")).isEqualTo("ABCDef");
- assertThat(CaseUtils.toUpperCamelCase("a b c @def")).isEqualTo("ABCDef");
-
- assertThat(CaseUtils.toUpperCamelCase("-+@ ")).isEqualTo("");
- assertThat(CaseUtils.toUpperCamelCase(" to-CAMEL-cASE")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase("@@@@ to+CAMEL@cASE ")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase("To+CA+ME L@cASE")).isEqualTo("ToCaMeLCase");
-
- assertThat(CaseUtils.toUpperCamelCase("To.Camel.Case")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase("To.Camel-Case")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase(" to @ Camel case")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase(" @to @ Camel case_")).isEqualTo("ToCamelCase");
-
- assertThat(CaseUtils.toUpperCamelCase("TO CAMEL CASE")).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toUpperCamelCase("tocamelcase")).isEqualTo("Tocamelcase");
-
- assertThat(CaseUtils.toUpperCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
- .isEqualTo("");
-
- assertThat(CaseUtils.toUpperCamelCase("The café\u2019s piñata gave me déjà vu."))
- .isEqualTo("TheCafesPinataGaveMeDejaVu");
- assertThat(CaseUtils.toUpperCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
- .isEqualTo("ToCamelCase");
}
}
From 7b30a8d547d9de1ca7405d8f85f4309dd1f83415 Mon Sep 17 00:00:00 2001
From: speters33w
- * This method has different behavior from {@link #toCamelCase(String, boolean, char[])}
+ * This method has different behavior from {@link #toCamelCase(String, Boolean, char[])}
* because all accented characters are normalized (accents removed).
* For example, {@code toCamelCase("Piñata Café")} will return {@code "pinataCafe"}, where
* {@code toCamelCase("Piñata Café", false, " ")} will return {@code "piñataCafé"}.
@@ -150,7 +149,7 @@ private static Set
* Normalizes accented characters (removes accents).
@@ -195,32 +193,48 @@ public static String toDelimitedCase(String str, Character separator) {
* @return The Converted_Text.
*/
public static String toDelimitedCase(String str, final Boolean capitalizeFirstLetter, Character separator) {
+ // This method sanitizes the input to run through toDelimitedEngine().
if (StringUtils.isEmpty(str)) {
return str;
}
boolean capitalizeFirst = BooleanUtils.isNotFalse(capitalizeFirstLetter);
if (separator == null) {
- return toPascalCase(str);
+ if (capitalizeFirst) {
+ return toPascalCase(str);
+ } else {
+ return toCamelCase(str);
+ }
}
- // todo precompile regex patterns to handle these and other regex patterns.
- String normalized = StringUtils.stripAccents(str)
- .replace("O'", "O ")
- .replace("O\u2019", "O ").trim();
- if (Pattern.matches("^[^0-9A-Za-z]*$", normalized)) {
+ // return STRIP_ACCENTS_PATTERN.matcher(decomposed).replaceAll(EMPTY);
+ String normalized = O_IRISH.matcher(StringUtils.stripAccents(str).trim()).replaceAll("O ");
+ if (NON_ALPHANUMERIC.matcher(normalized).matches()) {
return "";
}
int startIndex = 0;
for (int i = 0; i < normalized.length(); i++) {
- if (Pattern.matches("[0-9A-Za-z]", Character.toString(normalized.charAt(i)))) {
+ if (ALPHANUMERIC.matcher(Character.toString(normalized.charAt(i))).matches()) {
startIndex = i;
break;
}
}
- // todo see if TextStringBuilder is better than StringBuilder for this application.
+
+ return toDelimitedEngine(normalized, capitalizeFirst, separator, startIndex);
+ }
+
+ /**
+ * This is the engine that generates the return value of {@link #toDelimitedCase(String, Boolean, Character)}
+ *
+ * @param normalized String: the sanitized and normalized text to convert.
+ * @param capitalizeFirst boolean: If false, converts the first character of the string to lower case.
+ * @param separator char: The separator to use as a delimiter.
+ * @param startIndex int: The index of the first alphanumeric character.
+ * @return The Converted_Text.
+ */
+ private static String toDelimitedEngine(String normalized, boolean capitalizeFirst, char separator, int startIndex) {
StringBuilder delimited = new StringBuilder();
for (int i = startIndex; i < normalized.length(); i++) {
- if (i > startIndex && !Pattern.matches("[0-9A-Za-z'\u2019]",
- Character.toString(normalized.charAt(i)))) {
+ if (i > startIndex &&
+ !ALPHANUMERIC_WITH_APOSTROPHE.matcher(Character.toString(normalized.charAt(i))).matches()) {
if (delimited.charAt(delimited.length() - 1) != separator) {
delimited.append(separator);
}
@@ -306,4 +320,3 @@ public static String toSnakeCase(String str) {
public CaseUtils() {
}
}
-
diff --git a/src/test/java/org/apache/commons/text/CaseUtilsTest.java b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
index 46f2d31d36..ec8890b03f 100644
--- a/src/test/java/org/apache/commons/text/CaseUtilsTest.java
+++ b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
@@ -43,37 +43,59 @@ public void testToCamelCase() {
assertThat(CaseUtils.toCamelCase(null, false, null)).isNull();
assertThat(CaseUtils.toCamelCase("", true, null)).isEqualTo("");
assertThat(CaseUtils.toCamelCase(" ", false, null)).isEqualTo("");
- assertThat(CaseUtils.toCamelCase("a b c @def", false, null)).isEqualTo("aBC@def");
+ assertThat(CaseUtils.toCamelCase("a b c @def", false, null))
+ .isEqualTo("aBC@def");
assertThat(CaseUtils.toCamelCase("a b c @def", true)).isEqualTo("ABC@def");
- assertThat(CaseUtils.toCamelCase("a b c @def", true, '-')).isEqualTo("ABC@def");
- assertThat(CaseUtils.toCamelCase("a b c @def", true, '-')).isEqualTo("ABC@def");
+ assertThat(CaseUtils.toCamelCase("a b c @def", true, '-'))
+ .isEqualTo("ABC@def");
+ assertThat(CaseUtils.toCamelCase("a b c @def", true, '-'))
+ .isEqualTo("ABC@def");
final char[] chars = {'-', '+', ' ', '@'};
assertThat(CaseUtils.toCamelCase("-+@ ", true, chars)).isEqualTo("");
- assertThat(CaseUtils.toCamelCase(" to-CAMEL-cASE", false, chars)).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase("@@@@ to+CAMEL@cASE ", true, chars)).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toCamelCase("To+CA+ME L@cASE", true, chars)).isEqualTo("ToCaMeLCase");
-
- assertThat(CaseUtils.toCamelCase("To.Camel.Case", false, '.')).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase("To.Camel-Case", false, '-', '.')).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase(" to @ Camel case", false, '-', '@')).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase(" @to @ Camel case", true, '-', '@')).isEqualTo("ToCamelCase");
-
- assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", true, null)).isEqualTo("ToCamelCase");
- assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", false, null)).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", false, null)).isEqualTo("toCamelCase");
- assertThat(CaseUtils.toCamelCase("tocamelcase", false, null)).isEqualTo("tocamelcase");
- assertThat(CaseUtils.toCamelCase("tocamelcase", true, null)).isEqualTo("Tocamelcase");
- assertThat(CaseUtils.toCamelCase("Tocamelcase", false, null)).isEqualTo("tocamelcase");
+ assertThat(CaseUtils.toCamelCase(" to-CAMEL-cASE", false, chars))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("@@@@ to+CAMEL@cASE ", true, chars))
+ .isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toCamelCase("To+CA+ME L@cASE", true, chars))
+ .isEqualTo("ToCaMeLCase");
+
+ assertThat(CaseUtils.toCamelCase("To.Camel.Case", false, '.'))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("To.Camel-Case", false, '-', '.'))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase(" to @ Camel case", false, '-', '@'))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase(" @to @ Camel case", true, '-', '@'))
+ .isEqualTo("ToCamelCase");
+
+ assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", true, null))
+ .isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", false, null))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("TO CAMEL CASE", false, null))
+ .isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("tocamelcase", false, null))
+ .isEqualTo("tocamelcase");
+ assertThat(CaseUtils.toCamelCase("tocamelcase", true, null))
+ .isEqualTo("Tocamelcase");
+ assertThat(CaseUtils.toCamelCase("Tocamelcase", false, null))
+ .isEqualTo("tocamelcase");
assertThat(CaseUtils.toCamelCase("tocamelcase", true)).isEqualTo("Tocamelcase");
assertThat(CaseUtils.toCamelCase("tocamelcase", false)).isEqualTo("tocamelcase");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true)).isEqualTo("\uD800\uDF00\uD800\uDF02");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, '\uD800', '\uDF14')).isEqualTo("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03");
+// // These tests fail the new toCamelCase(String, Boolean, char[]) method because
+// // surrogate pairs \uD800 to \uDFFF have been removed from the Unicode Character Set.
+// assertThat(CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true)).isEqualTo("\uD800\uDF00\uD800\uDF02");
+// assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, '\uD800',
+// '\uDF14')).isEqualTo("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03");
/* **** NEW TESTS **** */
+ assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu.",
+ false, ' ', '.')).isEqualTo("theCafé\u2019sPiñataGaveMeDéjàVu");
+
assertThat(CaseUtils.toCamelCase(null)).isNull();
assertThat(CaseUtils.toCamelCase("")).isEqualTo("");
assertThat(CaseUtils.toCamelCase(" ")).isEqualTo("");
@@ -93,10 +115,13 @@ public void testToCamelCase() {
assertThat(CaseUtils.toCamelCase("TO CAMEL CASE")).isEqualTo("toCamelCase");
assertThat(CaseUtils.toCamelCase("tocamelcase")).isEqualTo("tocamelcase");
- assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
+ assertThat(CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
- assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("theCafesPinataGaveMeDejaVu");
- assertThat(CaseUtils.toCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B")).isEqualTo("toCamelCase");
+ assertThat(CaseUtils.toCamelCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("theCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toCamelCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("toCamelCase");
}
@Test
@@ -107,45 +132,77 @@ public void testToDelimitedCase() {
assertThat(CaseUtils.toDelimitedCase(" ", ' ')).isEqualTo("");
assertThat(CaseUtils.toDelimitedCase("a b c @def", '_')).isEqualTo("A_B_C_Def");
assertThat(CaseUtils.toDelimitedCase("a b c @def", '-')).isEqualTo("A-B-C-Def");
- assertThat(CaseUtils.toDelimitedCase("a b c @def", true, null)).isEqualTo("ABCDef");
- assertThat(CaseUtils.toDelimitedCase("a b c @def", null, null)).isEqualTo("ABCDef");
- assertThat(CaseUtils.toDelimitedCase("a b c @def", null, '_')).isEqualTo("A_B_C_Def");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", true, null))
+ .isEqualTo("ABCDef");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", false, null))
+ .isEqualTo("aBCDef");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", null, null))
+ .isEqualTo("ABCDef");
+ assertThat(CaseUtils.toDelimitedCase("a b c @def", null, '_'))
+ .isEqualTo("A_B_C_Def");
assertThat(CaseUtils.toDelimitedCase("-+@ ", '@')).isEqualTo("");
- assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", '_')).isEqualTo("To_Delimited_Case");
- assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", '_')).isEqualTo("To_Delimited_Case");
- assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", '+')).isEqualTo("To+Delim+It+Ed+Case");
-
- assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", false, '_')).isEqualTo("to_Delimited_Case");
- assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", false, '_')).isEqualTo("to_Delimited_Case");
- assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", false, '+')).isEqualTo("to+Delim+It+Ed+Case");
-
- assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", '.')).isEqualTo("To.Delimited.Case");
- assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", '\u2250')).isEqualTo("To\u2250Delimited\u2250Case");
- assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", ' ')).isEqualTo("To Delimited Case");
- assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", '@')).isEqualTo("To@Delimited@Case");
-
- assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", false, '.')).isEqualTo("to.Delimited.Case");
- assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", false, '\u2250')).isEqualTo("to\u2250Delimited\u2250Case");
- assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", false, ' ')).isEqualTo("to Delimited Case");
- assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", false, '@')).isEqualTo("to@Delimited@Case");
-
- assertThat(CaseUtils.toDelimitedCase("TO DELIMITED CASE", '_')).isEqualTo("To_Delimited_Case");
- assertThat(CaseUtils.toDelimitedCase("todelimitedcase", '_')).isEqualTo("Todelimitedcase");
-
- assertThat(CaseUtils.toDelimitedCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", '\uD800')).isEqualTo("");
-
- assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.", '_')).isEqualTo("The_Cafes_Pinata_Gave_Me_Deja_Vu");
- assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.", false, '_')).isEqualTo("the_Cafes_Pinata_Gave_Me_Deja_Vu");
- assertThat(CaseUtils.toDelimitedCase("\u1E70\u01EB \u1E12\u0205\u0142\u012B\u1E43\u01D0\u1E6B\u0119\u1E0B " +
- "\u010D\u1E01\u0219\u1E1B", '_')).isEqualTo("To_Delimited_Case");
-
- assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026", '\u272F')).isEqualTo("With\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
- assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026", false, '\u272F')).isEqualTo("with\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
+ assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", '_'))
+ .isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", '_'))
+ .isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", '+'))
+ .isEqualTo("To+Delim+It+Ed+Case");
+
+ assertThat(CaseUtils.toDelimitedCase(" to-Delimited-cASE", false, '_'))
+ .isEqualTo("to_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("@@@@ to+DELIMITED@cASE ", false, '_'))
+ .isEqualTo("to_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("To+DELIM+IT ED@cASE", false, '+'))
+ .isEqualTo("to+Delim+It+Ed+Case");
+
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", '.'))
+ .isEqualTo("To.Delimited.Case");
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", '\u2250'))
+ .isEqualTo("To\u2250Delimited\u2250Case");
+ assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", ' '))
+ .isEqualTo("To Delimited Case");
+ assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", '@'))
+ .isEqualTo("To@Delimited@Case");
+
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited.Case", false, '.'))
+ .isEqualTo("to.Delimited.Case");
+ assertThat(CaseUtils.toDelimitedCase("To.Delimited-Case", false, '\u2250'))
+ .isEqualTo("to\u2250Delimited\u2250Case");
+ assertThat(CaseUtils.toDelimitedCase(" to @ Delimited case", false, ' '))
+ .isEqualTo("to Delimited Case");
+ assertThat(CaseUtils.toDelimitedCase(" @to @ Delimited case_", false, '@'))
+ .isEqualTo("to@Delimited@Case");
+
+ assertThat(CaseUtils.toDelimitedCase("TO DELIMITED CASE", '_'))
+ .isEqualTo("To_Delimited_Case");
+ assertThat(CaseUtils.toDelimitedCase("todelimitedcase", '_'))
+ .isEqualTo("Todelimitedcase");
+
+ assertThat(CaseUtils.toDelimitedCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03",
+ '\uD800')).isEqualTo("");
+
+ assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.", '_'))
+ .isEqualTo("The_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toDelimitedCase("The café\u2019s piñata gave me déjà vu.",
+ false, '_')).isEqualTo("the_Cafes_Pinata_Gave_Me_Deja_Vu");
+ assertThat(CaseUtils.toDelimitedCase("\u1E12\u0205\u0142\u012B\u1E43\u01D0\u1E6B\u0119\u1E0B " +
+ "\u010D\u1E01\u0219\u1E1B", '_'))
+ .isEqualTo("Delimited_Case");
+
+ assertThat(CaseUtils.toDelimitedCase("Will 'O The Wisp", '-')).isEqualTo("Will-O-The-Wisp");
+
+ assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026",
+ '\u272F'))
+ .isEqualTo("With\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
+ assertThat(CaseUtils.toDelimitedCase("\u2026with boughs of holly\u2026\n\u2019Tis the season\u2026",
+ false,'\u272F'))
+ .isEqualTo("with\u272FBoughs\u272FOf\u272FHolly\u272FTis\u272FThe\u272FSeason");
assertThat(CaseUtils.toDelimitedCase("\"Officer O'Malley and Peart O'Niel " +
- "walk into the Protestant's Bar.\"", '_')).isEqualTo("Officer_O_Malley_And_Peart_O_Niel_Walk_Into_The_Protestants_Bar");
+ "walk into the Protestant's Bar.\"", '_'))
+ .isEqualTo("Officer_O_Malley_And_Peart_O_Niel_Walk_Into_The_Protestants_Bar");
}
@Test
@@ -169,10 +226,13 @@ public void testToKebabCase() {
assertThat(CaseUtils.toKebabCase("TO KEBAB CASE")).isEqualTo("to-kebab-case");
assertThat(CaseUtils.toKebabCase("tokebabcase")).isEqualTo("tokebabcase");
- assertThat(CaseUtils.toKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
+ assertThat(CaseUtils.toKebabCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
- assertThat(CaseUtils.toKebabCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("the-cafes-pinata-gave-me-deja-vu");
- assertThat(CaseUtils.toKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B")).isEqualTo("to-kebab-case");
+ assertThat(CaseUtils.toKebabCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("the-cafes-pinata-gave-me-deja-vu");
+ assertThat(CaseUtils.toKebabCase("\u1E70\u01EB \u1E31\u0115\u1E07\u0227\u1E05 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("to-kebab-case");
}
@Test
@@ -196,10 +256,13 @@ public void testToPascalCase() {
assertThat(CaseUtils.toPascalCase("TO CAMEL CASE")).isEqualTo("ToCamelCase");
assertThat(CaseUtils.toPascalCase("tocamelcase")).isEqualTo("Tocamelcase");
- assertThat(CaseUtils.toPascalCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
+ assertThat(CaseUtils.toPascalCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
- assertThat(CaseUtils.toPascalCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("TheCafesPinataGaveMeDejaVu");
- assertThat(CaseUtils.toPascalCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B")).isEqualTo("ToCamelCase");
+ assertThat(CaseUtils.toPascalCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("TheCafesPinataGaveMeDejaVu");
+ assertThat(CaseUtils.toPascalCase("\u1E70\u01EB \u010C\u0227\u1E41\u0113\u0142 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("ToCamelCase");
}
@Test
@@ -223,28 +286,38 @@ public void testToSnakeCase() {
assertThat(CaseUtils.toSnakeCase("TO SNAKE CASE")).isEqualTo("to_snake_case");
assertThat(CaseUtils.toSnakeCase("tosnakecase")).isEqualTo("tosnakecase");
- assertThat(CaseUtils.toSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03")).isEqualTo("");
+ assertThat(CaseUtils.toSnakeCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03"))
+ .isEqualTo("");
- assertThat(CaseUtils.toSnakeCase("The café\u2019s piñata gave me déjà vu.")).isEqualTo("the_cafes_pinata_gave_me_deja_vu");
- assertThat(CaseUtils.toSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 \u010D\u1E01\u0219\u1E1B")).isEqualTo("to_snake_case");
+ assertThat(CaseUtils.toSnakeCase("The café\u2019s piñata gave me déjà vu."))
+ .isEqualTo("the_cafes_pinata_gave_me_deja_vu");
+ assertThat(CaseUtils.toSnakeCase("\u1E70\u01EB \u1E61\u1E47\u1EA3\u1E31\u1EB9 \u010D\u1E01\u0219\u1E1B"))
+ .isEqualTo("to_snake_case");
}
@Test
public void testSeparatedWordFormats() {
assertThat(CaseUtils.toCamelCase("Çàmè\u0142 çásé")).isEqualTo("camelCase");
- assertThat(CaseUtils.toCamelCase("Çàmè\u0142 çásé", false, ' ')).isEqualTo("çàmè\u0142Çásé");
- assertThat(CaseUtils.toDelimitedCase("Camel snake", false, '_')).isEqualTo("camel_Snake");
+ assertThat(CaseUtils.toCamelCase("Çàmè\u0142 çásé", false, ' '))
+ .isEqualTo("çàmè\u0142Çásé");
+ assertThat(CaseUtils.toDelimitedCase("Camel snake", false, '_'))
+ .isEqualTo("camel_Snake");
assertThat(CaseUtils.toPascalCase("FLAT CASE").toLowerCase()).isEqualTo("flatcase");
assertThat(CaseUtils.toKebabCase("Kebab Case")).isEqualTo("kebab-case");
assertThat(CaseUtils.toPascalCase("pâsçã\u0142 çäsê")).isEqualTo("PascalCase");
- assertThat(CaseUtils.toCamelCase("pâsçã\u0142 çäsê", true, ' ')).isEqualTo("Pâsçã\u0142Çäsê");
+ assertThat(CaseUtils.toCamelCase("pâsçã\u0142 çäsê", true, ' '))
+ .isEqualTo("Pâsçã\u0142Çäsê");
assertThat(CaseUtils.toPascalCase("screaming case").toUpperCase()).isEqualTo("SCREAMINGCASE");
- assertThat(CaseUtils.toDelimitedCase("screaming KEBAB-CASE", '-').toUpperCase()).isEqualTo("SCREAMING-KEBAB-CASE");
- assertThat(CaseUtils.toDelimitedCase("SCREAMING snake_case", '_').toUpperCase()).isEqualTo("SCREAMING_SNAKE_CASE");
- assertThat(CaseUtils.toDelimitedCase("Snake Case", '_').toLowerCase()).isEqualTo("snake_case");
- assertThat(CaseUtils.toDelimitedCase("title case", true, '_')).isEqualTo("Title_Case");
- assertThat(CaseUtils.toDelimitedCase("train case", true, '-')).isEqualTo("Train-Case");
-
+ assertThat(CaseUtils.toDelimitedCase("screaming KEBAB-CASE", '-').toUpperCase())
+ .isEqualTo("SCREAMING-KEBAB-CASE");
+ assertThat(CaseUtils.toDelimitedCase("SCREAMING snake_case", '_').toUpperCase())
+ .isEqualTo("SCREAMING_SNAKE_CASE");
+ assertThat(CaseUtils.toDelimitedCase("Snake Case", '_').toLowerCase())
+ .isEqualTo("snake_case");
+ assertThat(CaseUtils.toDelimitedCase("title case", true, '_'))
+ .isEqualTo("Title_Case");
+ assertThat(CaseUtils.toDelimitedCase("train case", true, '-'))
+ .isEqualTo("Train-Case");
}
}