diff --git a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt index 9fb4c25..8b9f9ec 100644 --- a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt +++ b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt @@ -6,6 +6,7 @@ import com.cesarferreira.pluralize.pluralize import com.cesarferreira.pluralize.singularize import com.google.common.base.Strings import me.carleslc.kotlinextensions.standard.letOrElse +import java.lang.IllegalArgumentException import java.util.* inline infix operator fun String.times(n: Int): String = Strings.repeat(this, n) @@ -49,16 +50,24 @@ inline fun String.replace(ignoreCase: Boolean = false, vararg vars: Pair - d.replaceRange(0, 1, d.first().uppercaseChar().toString()) +fun String.capitalizeFirstChar(saveSpacing: Boolean = true): String { + + if (isEmpty() || isBlank()) throw IllegalArgumentException("Blank or empty String cannot be used.") + + val deliminator = if (saveSpacing) " " else " +" + + return this + .lowercase(Locale.getDefault()) + .split(deliminator.toRegex()) + .joinToString(" ") { + if (it.isEmpty()) it + else it.replaceRange(0, 1, it.first().uppercaseChar().toString()) } +} + /** * Removes non-numerical characters from a string. */ diff --git a/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt b/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt index 172c266..11ea48a 100644 --- a/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt +++ b/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import strings.* +import java.lang.IllegalArgumentException import java.util.* class StringsExtensionsKtTest { @@ -189,17 +190,27 @@ class StringsExtensionsKtTest { @Test fun capitalizeFirstCharTest() { - val expected = "Petro Canada" - - val result1 = "petro canada".capitalizeFirstChar() - val result2 = "PETRO CANADA".capitalizeFirstChar() - val result3 = "PEtRO CAnaDA".capitalizeFirstChar() - val result4 = "pEtRO cAnaDA".capitalizeFirstChar() - - Assertions.assertEquals(expected, result1) - Assertions.assertEquals(expected, result2) - Assertions.assertEquals(expected, result3) - Assertions.assertEquals(expected, result4) + val result1 = "aa bb cc dd".capitalizeFirstChar() + val result2 = "aa bb cc dd".capitalizeFirstChar() + val result3 = " aa bb ".capitalizeFirstChar() + val result4 = " aa bb ".capitalizeFirstChar() + val result5 = "aa bb cc dd".capitalizeFirstChar(false) + val result6 = "aa bb cc dd".capitalizeFirstChar(false) + val result7 = " aa bb ".capitalizeFirstChar(false) + val result8 = " aa bb ".capitalizeFirstChar(false) + + Assertions.assertEquals("Aa Bb Cc Dd", result1) + Assertions.assertEquals("Aa Bb Cc Dd", result2) + Assertions.assertEquals(" Aa Bb ", result3) + Assertions.assertEquals(" Aa Bb ", result4) + Assertions.assertEquals("Aa Bb Cc Dd", result5) + Assertions.assertEquals("Aa Bb Cc Dd", result6) + Assertions.assertEquals(" Aa Bb ", result7) + Assertions.assertEquals(" Aa Bb ", result8) + + Assertions.assertThrows(IllegalArgumentException::class.java) { "".capitalizeFirstChar() } + Assertions.assertThrows(IllegalArgumentException::class.java) { " ".capitalizeFirstChar() } + Assertions.assertThrows(IllegalArgumentException::class.java) { " ".capitalizeFirstChar() } }