This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-text.git
commit a89e57545d6f501ef59a1bc275b70777f0e8b644 Author: Gary Gregory <[email protected]> AuthorDate: Sat Jul 18 11:30:38 2020 -0400 Let drainChars() copy as much as it can within the target's bounds. --- .../org/apache/commons/text/TextStringBuilder.java | 4 ++-- .../apache/commons/text/TextStringBuilderTest.java | 27 +++++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/text/TextStringBuilder.java b/src/main/java/org/apache/commons/text/TextStringBuilder.java index 62e857c..10e6230 100644 --- a/src/main/java/org/apache/commons/text/TextStringBuilder.java +++ b/src/main/java/org/apache/commons/text/TextStringBuilder.java @@ -1781,10 +1781,10 @@ public class TextStringBuilder implements CharSequence, Appendable, Serializable */ public int drainChars(final int startIndex, final int endIndex, final char[] target, final int targetIndex) { final int length = endIndex - startIndex; - if (isEmpty() || length == 0) { + if (isEmpty() || length == 0 || target.length == 0) { return 0; } - final int actualLen = Math.min(size, length); + final int actualLen = Math.min(Math.min(size, length), target.length - targetIndex); getChars(startIndex, actualLen, target, targetIndex); delete(startIndex, actualLen); return actualLen; diff --git a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java index 4cdd599..13373d9 100644 --- a/src/test/java/org/apache/commons/text/TextStringBuilderTest.java +++ b/src/test/java/org/apache/commons/text/TextStringBuilderTest.java @@ -785,14 +785,14 @@ public class TextStringBuilderTest { @Test public void testDrainCharsIntIntCharArrayInt() { - final char[] array = new char[5]; + final String data = "junit"; + final char[] array = new char[data.length()]; final TextStringBuilder sb = new TextStringBuilder(); // empty buffer assertEquals(0, sb.drainChars(0, 5, array, 1)); // empty buffer, 0 length request assertEquals(0, sb.drainChars(5, 5, array, 1)); - final String data = "junit"; sb.append(data); assertEquals(0, sb.drainChars(5, 5, array, 1)); assertEquals(5, sb.drainChars(0, 5, array, 0)); @@ -811,10 +811,31 @@ public class TextStringBuilderTest { sb.set(data); assertEquals(data.length(), sb.drainChars(0, sb.length() + 1, array, 0)); assertArrayEquals(data.toCharArray(), array); - // get and delete it more than there is + + // get and delete more than there is sb.set(data); assertEquals(data.length(), sb.drainChars(0, sb.length() + 10, array, 0)); assertArrayEquals(data.toCharArray(), array); + + // get and delete more than can fit + sb.set(data); + int targetIndex = 1; + Arrays.fill(array, '-'); + assertEquals(data.length() - targetIndex, sb.drainChars(0, sb.length() + 10, array, targetIndex)); + assertArrayEquals("-juni".toCharArray(), array); + + // get and delete more than can fit + sb.set(data); + Arrays.fill(array, '-'); + assertEquals(data.length() - targetIndex, sb.drainChars(0, sb.length() + 1, array, targetIndex)); + assertArrayEquals("-juni".toCharArray(), array); + + // get and delete more than can fit + sb.set(data); + targetIndex = 2; + Arrays.fill(array, '-'); + assertEquals(data.length() - targetIndex, sb.drainChars(0, sb.length() + 1, array, targetIndex)); + assertArrayEquals("--jun".toCharArray(), array); } @Test
