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

Reply via email to