From 873de57aedeaca8dc7fbcc2730e0e1ae1a2c41cd Mon Sep 17 00:00:00 2001 From: Adam Grzybkowski Date: Wed, 29 Jan 2025 09:57:44 +0100 Subject: [PATCH] Implement extension function to remove orphan words (#566) * Implement QEText that will remove orphan words * Add tests for String.removeOrphans --- ...ESectionMessageTest.qeTextTestNoOrphan.png | Bin 0 -> 14241 bytes .../quickeditor/ui/StringExtensions.kt | 8 ++++ .../ui/components/QESectionMessage.kt | 5 +- .../quickeditor/ui/StringExtensionsTest.kt | 43 ++++++++++++++++++ .../ui/components/QESectionMessageTest.kt | 20 ++++++++ 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 gravatar-quickeditor/screenshotTests/roborazzi/com.gravatar.quickeditor.ui.components.QESectionMessageTest.qeTextTestNoOrphan.png create mode 100644 gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/StringExtensions.kt create mode 100644 gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/StringExtensionsTest.kt create mode 100644 gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/components/QESectionMessageTest.kt diff --git a/gravatar-quickeditor/screenshotTests/roborazzi/com.gravatar.quickeditor.ui.components.QESectionMessageTest.qeTextTestNoOrphan.png b/gravatar-quickeditor/screenshotTests/roborazzi/com.gravatar.quickeditor.ui.components.QESectionMessageTest.qeTextTestNoOrphan.png new file mode 100644 index 0000000000000000000000000000000000000000..7314c8548768d735c0c88347194e3f6efb607431 GIT binary patch literal 14241 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 literal 0 HcmV?d00001 diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/StringExtensions.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/StringExtensions.kt new file mode 100644 index 000000000..bdeafc59d --- /dev/null +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/StringExtensions.kt @@ -0,0 +1,8 @@ +package com.gravatar.quickeditor.ui + +internal val String.removeOrphans: String + get() { + val space = " " + val index = lastIndexOf(space, ignoreCase = true) + return if (index < 0) this else this.replaceRange(index, index + space.length, "\u00A0") + } diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/QESectionMessage.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/QESectionMessage.kt index 949df7143..b4ff7ef8b 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/QESectionMessage.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/components/QESectionMessage.kt @@ -8,12 +8,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp import com.gravatar.quickeditor.R +import com.gravatar.quickeditor.ui.removeOrphans import com.gravatar.ui.GravatarTheme @Composable internal fun QESectionMessage(message: String, modifier: Modifier = Modifier) { Text( - text = message, + text = message.removeOrphans, fontSize = 15.sp, color = MaterialTheme.colorScheme.tertiary, modifier = modifier, @@ -21,7 +22,7 @@ internal fun QESectionMessage(message: String, modifier: Modifier = Modifier) { } @Composable -@Preview(showBackground = true) +@Preview(showBackground = true, widthDp = 300) private fun QESectionMessagePreview() { GravatarTheme { QESectionMessage(message = stringResource(id = R.string.gravatar_qe_avatar_picker_description)) diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/StringExtensionsTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/StringExtensionsTest.kt new file mode 100644 index 000000000..117531295 --- /dev/null +++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/StringExtensionsTest.kt @@ -0,0 +1,43 @@ +package com.gravatar.quickeditor.ui + +import org.junit.Assert.assertEquals +import org.junit.Test + +internal class StringExtensionsTest { + @Test + fun `give a string with spaces when orphans removed then last space replaced with non-breaking`() { + // Given + val input = "This is a test string with spaces" + val expected = "This is a test string with\u00A0spaces" + + // When + val actual = input.removeOrphans + + // Then + assertEquals(expected, actual) + } + + @Test + fun `give a string without spaces when orphans removed then string remains unchanged`() { + // Given + val input = "ThisIsATestStringWithoutSpaces" + + // When + val actual = input.removeOrphans + + // Then + assertEquals(input, actual) + } + + @Test + fun `given an empty string when orphans removed then string remains unchanged`() { + // Given + val input = "" + + // When + val actual = input.removeOrphans + + // Then + assertEquals(input, actual) + } +} diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/components/QESectionMessageTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/components/QESectionMessageTest.kt new file mode 100644 index 000000000..a1532c1ee --- /dev/null +++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/components/QESectionMessageTest.kt @@ -0,0 +1,20 @@ +package com.gravatar.quickeditor.ui.components + +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.gravatar.quickeditor.ui.gravatarScreenshotTest +import com.gravatar.uitestutils.RoborazziTest +import org.junit.Test + +class QESectionMessageTest : RoborazziTest() { + @Test + fun qeTextTestNoOrphan() = gravatarScreenshotTest { + Surface( + modifier = Modifier.width(220.dp), + ) { + QESectionMessage(message = "This is a long text that should not break just before the last word.") + } + } +}