/*
* Copyright 2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.grails.buffer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Arrays;
import grails.io.IOUtils;
import junit.framework.TestCase;
/**
* Unit tests for StreamCharBuffer.
*
* @author Lari Hotari, Sagire Software Oy
*/
public class StreamCharBufferTests extends TestCase {
private static final int TESTROUNDS = 1;
static char[] testbuffer = new char[Short.MAX_VALUE];
@Override
protected void setUp() throws Exception {
if (testbuffer == null) {
for (int i = 0; i < TESTROUNDS; i++) {
for (int j = 0; j < Short.MAX_VALUE; j++) {
testbuffer[i * Short.MAX_VALUE + j] = (char) j;
}
}
}
}
public void testEquals() throws Exception {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.flush();
assertEquals(charBuffer,"ABCDE");
assertEquals(charBuffer.hashCode(), "ABCDE".hashCode());
assertFalse(charBuffer.equals("odifjdsof"));
StreamCharBuffer charBuffer2 = new StreamCharBuffer();
Writer writer2=charBuffer2.getWriter();
writer2.write("ABCDE");
writer2.flush();
assertEquals(charBuffer,charBuffer2);
assertEquals(charBuffer.hashCode(),charBuffer2.hashCode());
}
public void testSerialization() throws Exception {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.flush();
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(charBuffer);
out.close();
byte[] bytes = bos.toByteArray();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
charBuffer = (StreamCharBuffer) in.readObject();
assertEquals("ABCDE", charBuffer.toString());
assertEquals(5, charBuffer.size());
charBuffer.getWriter().write("12345");
assertEquals("ABCDE12345", charBuffer.toString());
assertEquals(10, charBuffer.size());
}
public void testBufferedConnectedStringWriting() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(10,0,10);
charBuffer.setSubStringChunkMinSize(6);
charBuffer.setWriteDirectlyToConnectedMinSize(6);
doBufferedTesting(charBuffer);
}
public void testBufferedConnectedStringWritingResizeableChunkSize() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(10);
charBuffer.setSubStringChunkMinSize(6);
charBuffer.setWriteDirectlyToConnectedMinSize(6);
doBufferedTesting(charBuffer);
}
private void doBufferedTesting(StreamCharBuffer charBuffer) throws IOException {
StringWriter sw=new StringWriter();
charBuffer.connectTo(sw);
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("A");
assertEquals("ABCDE12345", sw.toString());
writer.write("1234567");
writer.flush();
if (StringCharArrayAccessor.isEnabled()) {
assertEquals("ABCDE12345A1234567", sw.toString());
}
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals("ABCDE12345A1234567ABCDE67890", sw.toString());
assertEquals(0, charBuffer.size());
}
public void testSubStreamCharBuffer() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("!");
StreamCharBuffer charBuffer2 = new StreamCharBuffer(3);
charBuffer2.setPreferSubChunkWhenWritingToOtherBuffer(true);
Writer writer2=charBuffer2.getWriter();
writer2.write(">OOOOO<");
charBuffer2.writeTo(writer);
writer.write("1234567");
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals("ABCDE12345!>OOOOO<1234567ABCDE67890", IOUtils.toString(charBuffer.getReader()));
assertEquals("ABCDE12345!>OOOOO<1234567ABCDE67890", IOUtils.toString(charBuffer.getReader()));
assertEquals(35, charBuffer.size());
writer2.write("-----");
assertEquals(35, charBuffer.size());
writer2.flush();
assertEquals(40, charBuffer.size());
assertEquals("ABCDE12345!>OOOOO<-----1234567ABCDE67890", charBuffer.toString());
assertEquals("ABCDE12345!>OOOOO<-----1234567ABCDE67890", IOUtils.toString(charBuffer.getReader()));
}
public void testReaderWithStringArrays() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(10);
charBuffer.setSubStringChunkMinSize(6);
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("!");
writer.write("1234567");
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals("ABCDE12345!1234567ABCDE67890", IOUtils.toString(charBuffer.getReader()));
assertEquals("ABCDE12345!1234567ABCDE67890", IOUtils.toString(charBuffer.getReader()));
assertEquals(28, charBuffer.size());
}
public void testStringCharArrays() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("ABCDE");
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals(25, charBuffer.size());
assertEquals("ABCDE12345ABCDEABCDE67890", charBuffer.toString());
assertEquals(25, charBuffer.size());
}
public void testWritingStringBuilder() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(10,0,10);
Writer writer=charBuffer.getWriter();
StringBuilder sb=new StringBuilder("ABCDE12345ABCDEABCDE67890");
writer.append(sb);
writer.close();
assertEquals(25, charBuffer.size());
assertEquals("ABCDE12345ABCDEABCDE67890", charBuffer.toString());
assertEquals(25, charBuffer.size());
}
public void testWritingStringBuffer() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(10,0,10);
Writer writer=charBuffer.getWriter();
StringBuffer sb=new StringBuffer("ABCDE12345ABCDEABCDE67890");
writer.append(sb);
writer.close();
assertEquals(25, charBuffer.size());
assertEquals("ABCDE12345ABCDEABCDE67890", charBuffer.toString());
assertEquals(25, charBuffer.size());
}
public void testWritingStringBuilder2() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(100,0,100);
Writer writer=charBuffer.getWriter();
StringBuilder sb=new StringBuilder("ABCDE12345ABCDEABCDE67890");
writer.append(sb);
writer.close();
assertEquals(25, charBuffer.size());
assertEquals("ABCDE12345ABCDEABCDE67890", charBuffer.toString());
assertEquals(25, charBuffer.size());
}
public void testWritingStringBuffer2() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer(100,0,100);
Writer writer=charBuffer.getWriter();
StringBuffer sb=new StringBuffer("ABCDE12345ABCDEABCDE67890");
writer.append(sb);
writer.close();
assertEquals(25, charBuffer.size());
assertEquals("ABCDE12345ABCDEABCDE67890", charBuffer.toString());
assertEquals(25, charBuffer.size());
}
public void testStringCharArraysWriteTo() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
charBuffer.setSubStringChunkMinSize(0);
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("ABCDE");
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals(25, charBuffer.size());
StringWriter sw=new StringWriter();
charBuffer.writeTo(sw);
assertEquals("ABCDE12345ABCDEABCDE67890", sw.toString());
assertEquals(25, charBuffer.size());
}
public void testStringCharArraysWriteTo2() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
charBuffer.setSubStringChunkMinSize(10000);
Writer writer=charBuffer.getWriter();
writer.write("ABCDE");
writer.write("12345".toCharArray());
writer.write("ABCDE");
writer.write("ABCDE");
writer.write("67890".toCharArray());
writer.close();
assertEquals(25, charBuffer.size());
StringWriter sw=new StringWriter();
charBuffer.writeTo(sw);
assertEquals("ABCDE12345ABCDEABCDE67890", sw.toString());
assertEquals(25, charBuffer.size());
}
public void testToString() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer writer=charBuffer.getWriter();
writer.write("Hello world!");
writer.close();
//assertEquals(0, charBuffer.filledChunkCount());
String str=charBuffer.toString();
assertEquals("Hello world!", str);
assertEquals(12, charBuffer.size());
}
public void testToCharArray() throws IOException {
StreamCharBuffer charBuffer = createTestInstance();
char[] result = charBuffer.toCharArray();
assertTrue(Arrays.equals(testbuffer, result));
assertEquals(testbuffer.length, charBuffer.size());
}
public void testToReader() throws IOException {
StreamCharBuffer charBuffer = createTestInstance();
Reader input = charBuffer.getReader();
CharArrayWriter charsOut = new CharArrayWriter(charBuffer
.size());
copy(input, charsOut, 2048);
char[] result = charsOut.toCharArray();
assertTrue(Arrays.equals(testbuffer, result));
assertEquals(testbuffer.length, charBuffer.size());
}
public void testToReaderOneByOne() throws IOException {
StreamCharBuffer charBuffer = createTestInstance();
Reader input = charBuffer.getReader();
CharArrayWriter charsOut = new CharArrayWriter(charBuffer
.size());
copyOneByOne(input, charsOut);
char[] result = charsOut.toCharArray();
assertTrue(Arrays.equals(testbuffer, result));
assertEquals(testbuffer.length, charBuffer.size());
}
public void testWriteTo() throws IOException {
StreamCharBuffer charBuffer = createTestInstance();
CharArrayWriter charsWriter = new CharArrayWriter(charBuffer
.size());
charBuffer.writeTo(charsWriter);
char[] result = charsWriter.toCharArray();
assertTrue(Arrays.equals(testbuffer, result));
assertEquals(testbuffer.length, charBuffer.size());
}
public void testReadWrite() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer();
Writer writer=buf.getWriter();
Reader reader=buf.getReader();
writer.write("12345");
char[] b=new char[5];
reader.read(b);
assertEquals("12345", new String(b));
StringWriter sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("", sw.toString());
writer.write("12345");
writer.write("12345");
sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("1234512345", sw.toString());
}
public void testReadWriteWithChunks() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(5);
Writer writer=buf.getWriter();
Reader reader=buf.getReader();
writer.write("12345");
char[] b=new char[5];
reader.read(b);
assertEquals("12345", new String(b));
StringWriter sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("", sw.toString());
writer.write("12345");
writer.write("12345");
sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("1234512345", sw.toString());
}
public void testReadWriteWithChunks2() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(3);
Writer writer=buf.getWriter();
Reader reader=buf.getReader();
writer.write("12345");
char[] b=new char[5];
reader.read(b);
assertEquals("12345", new String(b));
StringWriter sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("", sw.toString());
writer.write("12345");
writer.write("12345");
sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("1234512345", sw.toString());
}
public void testReadWriteWithChunks3() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(3);
Writer writer=buf.getWriter();
Reader reader=buf.getReader();
writer.write("12345");
char[] b=new char[5];
reader.read(b);
assertEquals("12345", new String(b));
StringWriter sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("", sw.toString());
writer.write("12345");
writer.write("12345");
char[] b2=new char[8];
reader.read(b2);
assertEquals("12345123", new String(b2));
int len=reader.read(b2);
assertEquals("45", new String(b2, 0, len));
// check that buffer isn't emptied by the reader
assertEquals("123451234512345", buf.toString());
}
public void testReadWriteWithChunksRemoveAfterReading() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(3);
doRemoveChunksAfterReadingTesting(buf);
}
public void testIsEmptyAnsIsSizeLarger() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(3);
assertEquals(true, buf.isEmpty());
assertEquals(false, buf.isSizeLarger(0));
assertEquals(false, buf.isSizeLarger(4));
Writer writer=buf.getWriter();
writer.write("12345");
assertEquals(true, buf.isSizeLarger(4));
assertEquals(false, buf.isSizeLarger(5));
assertEquals(false, buf.isSizeLarger(100));
assertEquals(true, buf.isSizeLarger(0));
assertEquals(false, buf.isEmpty());
}
private void doRemoveChunksAfterReadingTesting(StreamCharBuffer buf) throws IOException {
Writer writer=buf.getWriter();
Reader reader=buf.getReader(true);
writer.write("12345");
char[] b=new char[5];
reader.read(b);
assertEquals("12345", new String(b));
StringWriter sw=new StringWriter();
IOUtils.copy(reader, sw);
assertEquals("", sw.toString());
writer.write("12345");
writer.write("12345");
char[] b2=new char[8];
reader.read(b2);
assertEquals("12345123", new String(b2));
int len=reader.read(b2);
assertEquals("45", new String(b2, 0, len));
// check that buffer is emptied by the reader
assertEquals("", buf.toString());
}
public void testReadWriteWithChunksRemoveAfterReading2() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(3, 0);
doRemoveChunksAfterReadingTesting(buf);
}
public void testReadWriteWithChunksRemoveAfterReading3() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(1, 0);
doRemoveChunksAfterReadingTesting(buf);
}
public void testReadWriteWithChunksRemoveAfterReading4() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(1000, 0);
doRemoveChunksAfterReadingTesting(buf);
}
public void testReadWriteWithChunksRemoveAfterReading5() throws IOException {
StreamCharBuffer buf=new StreamCharBuffer(5, 0);
doRemoveChunksAfterReadingTesting(buf);
}
private int copy(Reader input, Writer output, int bufSize) throws IOException {
char[] buffer = new char[bufSize];
int count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
private int copyOneByOne(Reader input, Writer output) throws IOException {
int count = 0;
int b;
while (-1 != (b = input.read())) {
output.write(b);
count++;
}
return count;
}
private StreamCharBuffer createTestInstance() throws IOException {
StreamCharBuffer charBuffer = new StreamCharBuffer();
Writer output = charBuffer.getWriter();
copyAllFromTestBuffer(output, 27);
return charBuffer;
}
private void copyAllFromTestBuffer(Writer output, int partsize) throws IOException {
int position = 0;
int charsLeft = testbuffer.length;
if (charsLeft < partsize) {
partsize = charsLeft;
}
while (charsLeft > 0) {
output.write(testbuffer, position, partsize);
position += partsize;
charsLeft -= partsize;
if (charsLeft < partsize) {
partsize = charsLeft;
}
}
}
}