summaryrefslogtreecommitdiff
path: root/test/junit/scala/collection/immutable/StringLikeTest.scala
diff options
context:
space:
mode:
authorDenton Cockburn <kanielc@gmail.com>2014-12-15 21:58:46 -0500
committerDenton Cockburn <kanielc@gmail.com>2015-01-09 20:41:37 -0500
commitd1d3225e28ed1847470d976ffeefbce40e90d9ac (patch)
tree4015a0c80561cf1ca7117f1604d4936a3ca1a982 /test/junit/scala/collection/immutable/StringLikeTest.scala
parent7ba38a07916426314cc3bff6999f3992757e0b26 (diff)
downloadscala-d1d3225e28ed1847470d976ffeefbce40e90d9ac.tar.gz
scala-d1d3225e28ed1847470d976ffeefbce40e90d9ac.tar.bz2
scala-d1d3225e28ed1847470d976ffeefbce40e90d9ac.zip
SI-8988 Escaping character in StringLike.split(c) prevents usage of optimized String.split code path
Escaping a char when calling split is slow. We end up compiling a Pattern to simply match a character literal. Instead, we just use an loop with indexOf to construct our resulting Array. Current speed up over old behaviour is about 12-1
Diffstat (limited to 'test/junit/scala/collection/immutable/StringLikeTest.scala')
-rw-r--r--test/junit/scala/collection/immutable/StringLikeTest.scala37
1 files changed, 37 insertions, 0 deletions
diff --git a/test/junit/scala/collection/immutable/StringLikeTest.scala b/test/junit/scala/collection/immutable/StringLikeTest.scala
new file mode 100644
index 0000000000..3722bdfe4d
--- /dev/null
+++ b/test/junit/scala/collection/immutable/StringLikeTest.scala
@@ -0,0 +1,37 @@
+package scala.collection.immutable
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+import scala.tools.testing.AssertUtil
+import scala.util.Random
+
+/* Test for SI-8988 */
+@RunWith(classOf[JUnit4])
+class StringLikeTest {
+ @Test
+ def testStringSplitWithChar: Unit = {
+ val chars = (0 to 255).map(_.toChar)
+ def randString = Random.nextString(30)
+
+ for (c <- chars) {
+ val s = randString
+ val jString = new java.lang.String(s)
+
+ // make sure we can match a literal character done by Java's split
+ val jSplit = jString.split("\\Q" + c.toString + "\\E")
+ val sSplit = s.split(c)
+ AssertUtil.assertSameElements(jSplit, sSplit, s"Not same result as Java split for char $c in string $s")
+ }
+ }
+
+ @Test
+ def testSplitEdgeCases: Unit = {
+ AssertUtil.assertSameElements("abcd".split('d'), Array("abc")) // not Array("abc", "")
+ AssertUtil.assertSameElements("abccc".split('c'), Array("ab")) // not Array("ab", "", "", "")
+ AssertUtil.assertSameElements("xxx".split('x'), Array[String]()) // not Array("", "", "", "")
+ AssertUtil.assertSameElements("".split('x'), Array("")) // not Array()
+ AssertUtil.assertSameElements("--ch--omp--".split("-"), Array("", "", "ch", "", "omp")) // All the cases!
+ }
+}