[Stdlib] Fix K/N StringBuilder insertRange capacity issue
This commit is contained in:
@@ -611,6 +611,7 @@ actual class StringBuilder private constructor (
|
|||||||
checkBoundsIndexes(startIndex, endIndex, value.size)
|
checkBoundsIndexes(startIndex, endIndex, value.size)
|
||||||
|
|
||||||
val extraLength = endIndex - startIndex
|
val extraLength = endIndex - startIndex
|
||||||
|
ensureExtraCapacity(extraLength)
|
||||||
array.copyInto(array, startIndex = index, endIndex = _length, destinationOffset = index + extraLength)
|
array.copyInto(array, startIndex = index, endIndex = _length, destinationOffset = index + extraLength)
|
||||||
value.copyInto(array, startIndex = startIndex, endIndex = endIndex, destinationOffset = index)
|
value.copyInto(array, startIndex = startIndex, endIndex = endIndex, destinationOffset = index)
|
||||||
|
|
||||||
|
|||||||
@@ -341,6 +341,14 @@ class StringBuilderTest {
|
|||||||
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 0, 4) }
|
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 0, 4) }
|
||||||
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, 1) }
|
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, 1) }
|
||||||
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, -1) }
|
assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, -1) }
|
||||||
|
|
||||||
|
// Test insertion of large arrays that are likely to trigger increase of underlying array capacity
|
||||||
|
sb.insert(0, CharArray(1000) { ',' })
|
||||||
|
assertTrue(sb.toString().take(1000).all { it == ',' })
|
||||||
|
assertEquals("_my insertT CharArray test_", sb.toString().drop(1000))
|
||||||
|
|
||||||
|
sb.insertRange(0, CharArray(10000) { '@' }, 1000, 9000)
|
||||||
|
assertTrue(sb.toString().take(8000).all { it == '@' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user