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


The following commit(s) were added to refs/heads/master by this push:
     new 587bc9a  Another edge case.
587bc9a is described below

commit 587bc9aad3893069c03f4dfe9334b1a3f4fe135b
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat Jul 18 10:21:35 2020 -0400

    Another edge case.
---
 .../org/apache/commons/text/io/StringSubstitutorReader.java  | 12 +++++++++---
 .../commons/text/io/StringSubstitutorFilterReaderTest.java   |  8 ++++++--
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java 
b/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java
index 064cf50..aea901c 100644
--- a/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java
+++ b/src/main/java/org/apache/commons/text/io/StringSubstitutorReader.java
@@ -108,7 +108,7 @@ public class StringSubstitutorReader extends FilterReader {
             // nothing or everything drained.
             toDrain = 0;
         }
-        return eos && drainCount == 0 ? EOS : drainCount;
+        return drainCount;
     }
 
     /**
@@ -207,13 +207,19 @@ public class StringSubstitutorReader extends FilterReader 
{
         int readCount = buffer(readCount(minReadLenPrefix, 0));
         if (buffer.length() < minReadLenPrefix && targetLength < 
minReadLenPrefix) {
             // read less than minReadLenPrefix, no variable possible
-            return drain(target, targetIndex, targetLength);
+            final int drainCount = drain(target, targetIndex, targetLength);
+            targetIndex += drainCount;
+            targetLength -= drainCount;
+            return eos && targetIndex == 0 ? EOS : targetIndex;
         }
         if (eos) {
             // EOS
             stringSubstitutor.replaceIn(buffer);
             toDrain = buffer.size();
-            return drain(target, targetIndex, targetLength);
+            final int drainCount = drain(target, targetIndex, targetLength);
+            targetIndex += drainCount;
+            targetLength -= drainCount;
+            return eos && targetIndex == 0 ? EOS : targetIndex;
         }
         // PREFIX
         // buffer and drain until we find a variable start, escaped or plain.
diff --git 
a/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java
 
b/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java
index 18c82f9..a14ad50 100644
--- 
a/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java
+++ 
b/src/test/java/org/apache/commons/text/io/StringSubstitutorFilterReaderTest.java
@@ -56,7 +56,11 @@ public class StringSubstitutorFilterReaderTest extends 
StringSubstitutorTest {
     private void doTestNoReplaceInSteps(final String replaceTemplate, final 
StringSubstitutor substitutor)
         throws IOException {
         doTestReplaceInCharSteps(substitutor, replaceTemplate, 
replaceTemplate, false);
-        doTestReplaceInCharArraySteps(substitutor, replaceTemplate, 
replaceTemplate, false, 1);
+        final int minStepSize = 1;
+        final int maxStepSize = 3;
+        for (int stepSize = minStepSize; stepSize < maxStepSize; stepSize++) {
+            doTestReplaceInCharArraySteps(substitutor, replaceTemplate, 
replaceTemplate, false, stepSize);
+        }
     }
 
     @Override
@@ -78,7 +82,7 @@ public class StringSubstitutorFilterReaderTest extends 
StringSubstitutorTest {
             int actualCount;
             while ((actualCount = actualReader.read(actualCh)) != -1) {
                 final int expectedCount = 
expectedResultReader.read(expectedCh);
-                assertEquals(actualCount, expectedCount);
+                assertEquals(actualCount, expectedCount, () -> 
String.format("Step size %,d", stepSize));
                 assertArrayEquals(expectedCh, actualCh, () -> 
String.format("[%,d] '%s' != '%s', result so far: \"%s\"",
                     index.get(), String.valueOf(expectedCh), 
String.valueOf(actualCh), actualResultWriter.toString()));
                 if (actualCount != -1) {

Reply via email to