/*
* ModeShape (http://www.modeshape.org)
*
* 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.modeshape.schematic.internal.io;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class BsonDataOutputTest {
private BsonDataOutput output;
private ByteArrayOutputStream bigEndianBytes;
private DataOutputStream bigEndian;
private ByteArrayOutputStream littleEndianBytes;
@Before
public void beforeMethod() {
this.output = new BsonDataOutput();
this.bigEndianBytes = new ByteArrayOutputStream();
this.bigEndian = new DataOutputStream(this.bigEndianBytes);
this.littleEndianBytes = new ByteArrayOutputStream();
}
@After
public void afterMethod() {
}
@Test
public void shouldWriteAndReadInteger() throws Exception {
output.writeInt(102);
bigEndian.writeInt(toLittleEndian(102));
output.writeTo(littleEndianBytes);
assertSame(littleEndianBytes.toByteArray(), bigEndianBytes.toByteArray(), "littleEndian", "bigEndian");
}
@Test
public void shouldWriteAndReadLong() throws Exception {
output.writeLong(102L);
bigEndian.writeLong(toLittleEndian(102L));
output.writeTo(littleEndianBytes);
assertSame(littleEndianBytes.toByteArray(), bigEndianBytes.toByteArray(), "littleEndian", "bigEndian");
}
@Test
public void shouldWriteAndReadShort() throws Exception {
output.writeShort(102);
bigEndian.writeShort(toLittleEndian((short)102));
output.writeTo(littleEndianBytes);
assertSame(littleEndianBytes.toByteArray(), bigEndianBytes.toByteArray(), "littleEndian", "bigEndian");
}
@Test
public void shouldWriteAndReadChar() throws Exception {
output.writeChar('c');
bigEndian.writeChar(toLittleEndian('c'));
output.writeTo(littleEndianBytes);
assertSame(littleEndianBytes.toByteArray(), bigEndianBytes.toByteArray(), "littleEndian", "bigEndian");
}
protected char toLittleEndian( char value ) {
byte b1 = (byte)value;
byte b2 = (byte)(value >> 8);
int result = b1 << 8 | (b2 & 0xFF);
return (char)result;
}
protected short toLittleEndian( short value ) {
byte b1 = (byte)value;
byte b2 = (byte)(value >> 8);
int result = b1 << 8 | (b2 & 0xFF);
return (short)result;
}
protected int toLittleEndian( int value ) {
byte b1 = (byte)value;
byte b2 = (byte)(value >> 8);
byte b3 = (byte)(value >> 16);
byte b4 = (byte)(value >> 24);
int result = b1 << 24 | (b2 & 0xFF) << 16 | (b3 & 0xFF) << 8 | (b4 & 0xFF);
return result;
}
protected long toLittleEndian( long value ) {
byte b1 = (byte)value;
byte b2 = (byte)(value >> 8);
byte b3 = (byte)(value >> 16);
byte b4 = (byte)(value >> 24);
byte b5 = (byte)(value >> 32);
byte b6 = (byte)(value >> 40);
byte b7 = (byte)(value >> 48);
byte b8 = (byte)(value >> 56);
long result = (b1 & 0xFFL) << 56 | (b2 & 0xFFL) << 48 | (b3 & 0xFFL) << 40 | (b4 & 0xFFL) << 32 | (b5 & 0xFFL) << 24
| (b6 & 0xFFL) << 16 | (b7 & 0xFFL) << 8 | (b8 & 0xFFL);
return result;
}
@SuppressWarnings( "cast" )
protected void assertSame( byte[] b1,
byte[] b2,
String name1,
String name2 ) {
if (b1.equals(b2)) return;
int s1 = b1.length;
int s2 = b2.length;
StringBuilder sb1 = new StringBuilder();
for (byte b : b1) {
sb1.append((int)b).append(' ');
}
StringBuilder sb2 = new StringBuilder();
for (byte b : b2) {
sb2.append((int)b).append(' ');
}
if (!sb1.toString().equals(sb2.toString())) {
System.out.println(name1 + " size: " + s1 + " content: " + sb1);
System.out.println(name2 + " size: " + s2 + " content: " + sb2);
fail();
}
}
}