// Copyright 2010-2011 Michel Kraemer
//
// 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 de.undercouch.bson4jackson.io;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import org.junit.Test;
/**
* Tests {@link DynamicOutputBuffer}
* @author Michel Kraemer
*/
public class DynamicOutputBufferTest {
@Test
public void putByteBig() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
assertEquals(0, db.size());
db.putByte((byte)0xA0);
assertEquals(1, db.size());
db.putByte((byte)0xB0);
assertEquals(2, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0xA0, r[0]);
assertEquals((byte)0xB0, r[1]);
}
@Test
public void putByteLittle() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(ByteOrder.LITTLE_ENDIAN, 2);
assertEquals(0, db.size());
db.putByte((byte)0xA0);
assertEquals(1, db.size());
db.putByte((byte)0xB0);
assertEquals(2, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0xA0, r[0]);
assertEquals((byte)0xB0, r[1]);
}
@Test
public void putInt32Big() throws Exception {
//test the case of a too small initial size
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
assertEquals(0, db.size());
db.putInt(0xAABBCCDD);
assertEquals(4, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0xAA, r[0]);
assertEquals((byte)0xBB, r[1]);
assertEquals((byte)0xCC, r[2]);
assertEquals((byte)0xDD, r[3]);
//test the case of a large initial size
db = new DynamicOutputBuffer(40);
assertEquals(0, db.size());
db.putInt(0xAABBCCDD);
assertEquals(4, db.size());
baos = new ByteArrayOutputStream();
db.writeTo(baos);
r = baos.toByteArray();
assertEquals((byte)0xAA, r[0]);
assertEquals((byte)0xBB, r[1]);
assertEquals((byte)0xCC, r[2]);
assertEquals((byte)0xDD, r[3]);
}
@Test
public void putInt32Little() throws Exception {
//test the case of a too small initial size
DynamicOutputBuffer db = new DynamicOutputBuffer(ByteOrder.LITTLE_ENDIAN, 2);
assertEquals(0, db.size());
db.putInt(0xAABBCCDD);
assertEquals(4, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0xAA, r[3]);
assertEquals((byte)0xBB, r[2]);
assertEquals((byte)0xCC, r[1]);
assertEquals((byte)0xDD, r[0]);
//test the case of a large initial size
db = new DynamicOutputBuffer(ByteOrder.LITTLE_ENDIAN, 40);
assertEquals(0, db.size());
db.putInt(0xAABBCCDD);
assertEquals(4, db.size());
baos = new ByteArrayOutputStream();
db.writeTo(baos);
r = baos.toByteArray();
assertEquals((byte)0xAA, r[3]);
assertEquals((byte)0xBB, r[2]);
assertEquals((byte)0xCC, r[1]);
assertEquals((byte)0xDD, r[0]);
}
@Test
public void putInt64Big() throws Exception {
//test the case of a too small initial size
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
assertEquals(0, db.size());
db.putLong(0x66778899AABBCCDDL);
assertEquals(8, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0x66, r[0]);
assertEquals((byte)0x77, r[1]);
assertEquals((byte)0x88, r[2]);
assertEquals((byte)0x99, r[3]);
assertEquals((byte)0xAA, r[4]);
assertEquals((byte)0xBB, r[5]);
assertEquals((byte)0xCC, r[6]);
assertEquals((byte)0xDD, r[7]);
//test the case of a large initial size
db = new DynamicOutputBuffer(40);
assertEquals(0, db.size());
db.putLong(0x66778899AABBCCDDL);
assertEquals(8, db.size());
baos = new ByteArrayOutputStream();
db.writeTo(baos);
r = baos.toByteArray();
assertEquals((byte)0x66, r[0]);
assertEquals((byte)0x77, r[1]);
assertEquals((byte)0x88, r[2]);
assertEquals((byte)0x99, r[3]);
assertEquals((byte)0xAA, r[4]);
assertEquals((byte)0xBB, r[5]);
assertEquals((byte)0xCC, r[6]);
assertEquals((byte)0xDD, r[7]);
}
@Test
public void putInt64Little() throws Exception {
//test the case of a too small initial size
DynamicOutputBuffer db = new DynamicOutputBuffer(ByteOrder.LITTLE_ENDIAN, 2);
assertEquals(0, db.size());
db.putLong(0x66778899AABBCCDDL);
assertEquals(8, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals((byte)0x66, r[7]);
assertEquals((byte)0x77, r[6]);
assertEquals((byte)0x88, r[5]);
assertEquals((byte)0x99, r[4]);
assertEquals((byte)0xAA, r[3]);
assertEquals((byte)0xBB, r[2]);
assertEquals((byte)0xCC, r[1]);
assertEquals((byte)0xDD, r[0]);
//test the case of a large initial size
db = new DynamicOutputBuffer(ByteOrder.LITTLE_ENDIAN, 40);
assertEquals(0, db.size());
db.putLong(0x66778899AABBCCDDL);
assertEquals(8, db.size());
baos = new ByteArrayOutputStream();
db.writeTo(baos);
r = baos.toByteArray();
assertEquals((byte)0x66, r[7]);
assertEquals((byte)0x77, r[6]);
assertEquals((byte)0x88, r[5]);
assertEquals((byte)0x99, r[4]);
assertEquals((byte)0xAA, r[3]);
assertEquals((byte)0xBB, r[2]);
assertEquals((byte)0xCC, r[1]);
assertEquals((byte)0xDD, r[0]);
}
@Test
public void putUTF8() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
int w = db.putUTF8("Hello");
assertEquals(5, w);
assertEquals(5, db.size());
db = new DynamicOutputBuffer(10);
w = db.putUTF8("Hello");
assertEquals(5, w);
assertEquals(5, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
String s = new String(baos.toByteArray());
assertEquals("Hello", s);
db = new DynamicOutputBuffer(2);
w = db.putUTF8("a\u20AC\u00A2\u00A2bb");
assertEquals(10, w);
assertEquals(10, db.size());
baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals('a', r[0]);
assertEquals((byte)0xE2, r[1]);
assertEquals((byte)0x82, r[2]);
assertEquals((byte)0xAC, r[3]);
assertEquals((byte)0xC2, r[4]);
assertEquals((byte)0xA2, r[5]);
assertEquals((byte)0xC2, r[6]);
assertEquals((byte)0xA2, r[7]);
assertEquals('b', r[8]);
assertEquals('b', r[9]);
}
@Test
public void putRandom() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
db.putByte(5, (byte)0);
db.putByte(1, (byte)1);
db.putByte(4, (byte)2);
db.putByte(3, (byte)3);
db.putByte(2, (byte)4);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
assertEquals(0, r[0]);
assertEquals(0, r[5]);
assertEquals(1, r[1]);
assertEquals(2, r[4]);
assertEquals(3, r[3]);
assertEquals(4, r[2]);
}
@Test
public void putFloatingPoint() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
db.putFloat(1234.1234f);
db.putDouble(5678.5678);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
byte[] r = baos.toByteArray();
ByteBuffer bb = ByteBuffer.wrap(r);
assertEquals(1234.1234f, bb.getFloat(), 0.00001);
assertEquals(5678.5678, bb.getDouble(), 0.00001);
}
@Test
public void flush() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
db.putByte((byte)1);
db.putByte((byte)2);
db.putByte((byte)3);
db.putByte((byte)4);
db.putByte((byte)5);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.flushTo(baos);
byte[] r = baos.toByteArray();
assertEquals(4, r.length);
assertEquals(1, r[0]);
assertEquals(2, r[1]);
assertEquals(3, r[2]);
assertEquals(4, r[3]);
db.putByte((byte)6);
db.flushTo(baos);
r = baos.toByteArray();
assertEquals(6, r.length);
assertEquals(5, r[4]);
assertEquals(6, r[5]);
db.putByte((byte)7);
db.writeTo(baos);
r = baos.toByteArray();
assertEquals(7, r.length);
assertEquals(7, r[6]);
}
@Test(expected = java.lang.IndexOutOfBoundsException.class)
public void putAfterWrite() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
db.putByte((byte)1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
db.putByte((byte)8);
}
@Test
public void putString() throws Exception {
DynamicOutputBuffer db = new DynamicOutputBuffer(2);
db.putString("Hello");
assertEquals(10, db.size());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
db.writeTo(baos);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ReadableByteChannel channel = Channels.newChannel(bais);
ByteBuffer buf = ByteBuffer.allocate(10);
channel.read(buf);
buf.flip();
CharBuffer cbuf = buf.asCharBuffer();
char[] c = new char[5];
cbuf.get(c);
String s = String.valueOf(c);
assertEquals("Hello", s);
}
}