From 296bda2e3a421c51b0fc4bde8647d48b7ec59b30 Mon Sep 17 00:00:00 2001 From: Mohammad Shamsi Date: Thu, 18 Apr 2013 00:06:00 +0800 Subject: [PATCH] Fixed #KT-3379 jet.String.trimLeading and trimTrailing default whitespace trim --- libraries/stdlib/src/kotlin/StringsJVM.kt | 20 ++++++++++ libraries/stdlib/test/StringJVMTest.kt | 48 +++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/libraries/stdlib/src/kotlin/StringsJVM.kt b/libraries/stdlib/src/kotlin/StringsJVM.kt index 82ea1ff2d4f..c0d9dc8d1b3 100644 --- a/libraries/stdlib/src/kotlin/StringsJVM.kt +++ b/libraries/stdlib/src/kotlin/StringsJVM.kt @@ -509,3 +509,23 @@ public inline fun String.toCollection(): Collection = toCollection(ArrayLi /** Copies all characters into a [[Set]] */ public inline fun String.toSet(): Set = toCollection(HashSet()) + +/** Returns a new String containing the everything but the leading whitespace characters */ +public inline fun String.trimLeading(): String { + var count = 0 + + while ((count < this.length) && (this[count] <= ' ')) { + count++ + } + return if (count > 0) substring(count) else this +} + +/** Returns a new String containing the everything but the trailing whitespace characters */ +public inline fun String.trimTrailing(): String { + var count = this.length + + while (count > 0 && this[count - 1] <= ' ') { + count-- + } + return if (count < this.length) substring(0, count) else this +} diff --git a/libraries/stdlib/test/StringJVMTest.kt b/libraries/stdlib/test/StringJVMTest.kt index cd55e7d6e12..8e884e66fd3 100644 --- a/libraries/stdlib/test/StringJVMTest.kt +++ b/libraries/stdlib/test/StringJVMTest.kt @@ -240,4 +240,52 @@ class StringJVMTest { test fun formatter() { assertEquals("12", "%d%d".format(1, 2)) } + + test fun trimLeading() { + assertEquals("", "".trimLeading()) + assertEquals("a", "a".trimLeading()) + assertEquals("a", " a".trimLeading()) + assertEquals("a", " a".trimLeading()) + assertEquals("a ", " a ".trimLeading()) + assertEquals("a b", " a b".trimLeading()) + assertEquals("a b ", " a b ".trimLeading()) + + assertEquals("a", "\ta".trimLeading()) + assertEquals("a", "\t\ta".trimLeading()) + assertEquals("a", "\ra".trimLeading()) + assertEquals("a", "\na".trimLeading()) + } + + test fun trimTrailing() { + assertEquals("", "".trimTrailing()) + assertEquals("a", "a".trimTrailing()) + assertEquals("a", "a ".trimTrailing()) + assertEquals("a", "a ".trimTrailing()) + assertEquals(" a", " a ".trimTrailing()) + assertEquals("a b", "a b ".trimTrailing()) + assertEquals(" a b", " a b ".trimTrailing()) + + assertEquals("a", "a\t".trimTrailing()) + assertEquals("a", "a\t\t".trimTrailing()) + assertEquals("a", "a\r".trimTrailing()) + assertEquals("a", "a\n".trimTrailing()) + } + + test fun trimTrailingAndLeading() { + val examples = array( + "a", + " a ", + " a ", + " a b ", + "\ta\tb\t", + "\t\ta\t\t", + "\ra\r", + "\na\n" + ) + + for (example in examples) { + assertEquals(example.trim(), example.trimTrailing().trimLeading()) + assertEquals(example.trim(), example.trimLeading().trimTrailing()) + } + } }