From 876dbf8b4e0f2498fb41f626f98e5fae46600b7b Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 27 Apr 2019 13:23:06 +0200 Subject: [PATCH] ReplaceInputStream ready + tests --- src/be/nikiroo/utils/ReplaceInputStream.java | 49 ++++++++++--- .../test_code/ReplaceInputStreamTest.java | 70 +++++++++++-------- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/src/be/nikiroo/utils/ReplaceInputStream.java b/src/be/nikiroo/utils/ReplaceInputStream.java index 5ce9ef3..ff2ec88 100644 --- a/src/be/nikiroo/utils/ReplaceInputStream.java +++ b/src/be/nikiroo/utils/ReplaceInputStream.java @@ -4,6 +4,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; +/** + * This {@link InputStream} will replace some of its content by replacing it + * with something else. + * + * @author niki + */ public class ReplaceInputStream extends BufferedInputStream { private byte[] from; private byte[] to; @@ -12,10 +18,32 @@ public class ReplaceInputStream extends BufferedInputStream { private int spos; private int slen; + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the {@link String} to replace + * @param to + * the {@link String} to replace with + */ public ReplaceInputStream(InputStream in, String from, String to) { this(in, bytes(from), bytes(to)); } + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the value to replace + * @param to + * the value to replace with + */ public ReplaceInputStream(InputStream in, byte[] from, byte[] to) { super(in); this.from = from; @@ -28,9 +56,9 @@ public class ReplaceInputStream extends BufferedInputStream { @Override protected int read(InputStream in, byte[] buffer) throws IOException { - if (buffer.length < to.length) { + if (buffer.length < to.length || source.length < to.length * 2) { throw new IOException( - "Underlaying buffer is too small to contain the replace String"); + "An underlaying buffer is too small for this replace value"); } if (spos >= slen) { @@ -40,22 +68,27 @@ public class ReplaceInputStream extends BufferedInputStream { // Note: very simple, not efficient implementation, sorry. int count = 0; - int i = spos; - while (i < slen && count < buffer.length - to.length) { + while (spos < slen && count < buffer.length - to.length) { if (from.length > 0 && startsWith(from, source, spos)) { System.arraycopy(to, 0, buffer, spos, to.length); count += to.length; - i += to.length; - spos += to.length; + spos += from.length; } else { - buffer[count++] = source[i++]; - spos++; + buffer[count++] = source[spos++]; } } return count; } + /** + * Return the bytes array representation of the given {@link String} in + * UTF-8. + * + * @param str + * the string to transform into bytes + * @return the content in bytes + */ static private byte[] bytes(String str) { try { return str.getBytes("UTF-8"); diff --git a/src/be/nikiroo/utils/test_code/ReplaceInputStreamTest.java b/src/be/nikiroo/utils/test_code/ReplaceInputStreamTest.java index d6a741f..c0ca923 100644 --- a/src/be/nikiroo/utils/test_code/ReplaceInputStreamTest.java +++ b/src/be/nikiroo/utils/test_code/ReplaceInputStreamTest.java @@ -8,80 +8,88 @@ import be.nikiroo.utils.ReplaceInputStream; import be.nikiroo.utils.test.TestCase; import be.nikiroo.utils.test.TestLauncher; -public class ReplaceInputStreamTest extends TestLauncher { +class ReplaceInputStreamTest extends TestLauncher { public ReplaceInputStreamTest(String[] args) { super("ReplaceInputStream test", args); - addTest(new TestCase("Simple InputStream, empty replace") { + addTest(new TestCase("Empty replace") { @Override public void test() throws Exception { - byte[] expected = new byte[] { 42, 12, 0, 127 }; + byte[] data = new byte[] { 42, 12, 0, 127 }; ReplaceInputStream in = new ReplaceInputStream( - new ByteArrayInputStream(expected), new byte[0], + new ByteArrayInputStream(data), new byte[0], new byte[0]); - checkArrays(this, "FIRST", in, expected); + + checkArrays(this, "FIRST", in, data); } }); - addTest(new TestCase("Simple InputStream, simple replace") { + addTest(new TestCase("Simple replace") { @Override public void test() throws Exception { - byte[] expected = new byte[] { 42, 12, 0, 127 }; + byte[] data = new byte[] { 42, 12, 0, 127 }; ReplaceInputStream in = new ReplaceInputStream( - new ByteArrayInputStream(expected), new byte[] { 0 }, + new ByteArrayInputStream(data), new byte[] { 0 }, new byte[] { 10 }); checkArrays(this, "FIRST", in, new byte[] { 42, 12, 10, 127 }); } }); - addTest(new TestCase("Simple byte array reading, 3/4 replace") { + addTest(new TestCase("3/4 replace") { @Override public void test() throws Exception { - byte[] expected = new byte[] { 42, 12, 0, 127 }; + byte[] data = new byte[] { 42, 12, 0, 127 }; ReplaceInputStream in = new ReplaceInputStream( - new ByteArrayInputStream(expected), new byte[] { 12, 0, - 127 }, new byte[] { 10, 10, 10 }); + new ByteArrayInputStream(data), + new byte[] { 12, 0, 127 }, new byte[] { 10, 10, 10 }); checkArrays(this, "FIRST", in, new byte[] { 42, 10, 10, 10 }); } }); - addTest(new TestCase("Simple byte array reading, longer replace") { + addTest(new TestCase("Lnger replace") { @Override public void test() throws Exception { - byte[] expected = new byte[] { 42, 12, 0, 127 }; + byte[] data = new byte[] { 42, 12, 0, 127 }; ReplaceInputStream in = new ReplaceInputStream( - new ByteArrayInputStream(expected), new byte[] { 0 }, + new ByteArrayInputStream(data), new byte[] { 0 }, new byte[] { 10, 10, 10 }); - // TODO NOT OK!! - System.out.println(); - for (int i = 0; i < expected.length; i++) { - System.out.println("expected[" + i + "] = " + expected[i]); - } - byte[] actual = IOUtils.readSmallStream(in).getBytes("UTF-8"); - for (int i = 0; i < actual.length; i++) { - System.out.println("actual[" + i + "] = " + actual[i]); - } - System.exit(1); - // - checkArrays(this, "FIRST", in, new byte[] { 42, 12, 10, 10, 10, 127 }); } }); - addTest(new TestCase("Simple byte array reading, shorter replace") { + addTest(new TestCase("Shorter replace") { @Override public void test() throws Exception { - byte[] expected = new byte[] { 42, 12, 0, 127 }; + byte[] data = new byte[] { 42, 12, 0, 127 }; ReplaceInputStream in = new ReplaceInputStream( - new ByteArrayInputStream(expected), new byte[] { 42, - 12, 0 }, new byte[] { 10 }); + new ByteArrayInputStream(data), + new byte[] { 42, 12, 0 }, new byte[] { 10 }); + checkArrays(this, "FIRST", in, new byte[] { 10, 127 }); } }); + + addTest(new TestCase("String replace") { + @Override + public void test() throws Exception { + byte[] data = "I like red".getBytes("UTF-8"); + ReplaceInputStream in = new ReplaceInputStream( + new ByteArrayInputStream(data), + "red".getBytes("UTF-8"), "blue".getBytes("UTF-8")); + + checkArrays(this, "FIRST", in, "I like blue".getBytes("UTF-8")); + + data = "I like blue".getBytes("UTF-8"); + in = new ReplaceInputStream(new ByteArrayInputStream(data), + "blue".getBytes("UTF-8"), "red".getBytes("UTF-8")); + + checkArrays(this, "FIRST", in, "I like red".getBytes("UTF-8")); + } + }); } static void checkArrays(TestCase test, String prefix, InputStream in, -- 2.27.0