package com.jcwhatever.nucleus.utils.file;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import com.jcwhatever.nucleus.utils.ArrayUtils;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
/**
* Tests {@link BasicByteReader}.
*/
public class BasicByteReaderTest {
private enum TestEnum {
CONSTANT,
DEFAULT
}
/**
* Make sure {@link BasicByteReader#getBytesRead} returns the correct value.
*/
@Test
public void testGetBytesRead() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 0, 0});
reader.getByte();
reader.getByte();
reader.getByte();
assertEquals(3, reader.getBytesRead());
reader.close();
}
/**
* Make sure {@link BasicByteReader#read} returns the correct value.
*/
@Test
public void testRead() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 1, 2});
assertEquals(0, reader.getByte());
assertEquals(1, reader.getByte());
assertEquals(2, reader.getByte());
reader.close();
}
/**
* Make sure {@link BasicByteReader#skip} works correctly.
*/
@Test
public void testSkip() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 1, 2});
assertEquals(0, reader.getByte());
reader.skip(1);
assertEquals(2, reader.getByte());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getBoolean} returns the correct value.
*/
@Test
public void testGetBoolean() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0xF, 0, 0xF });
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(0, reader.getByte());
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(true, reader.getBoolean());
assertEquals(false, reader.getBoolean());
assertEquals(false, reader.getBoolean());
assertEquals(false, reader.getBoolean());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getByte} returns the correct value.
*/
@Test
public void testGetByte() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 1, 2 });
assertEquals(0, reader.getByte());
assertEquals(1, reader.getByte());
assertEquals(2, reader.getByte());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getBytes} returns the correct value.
*/
@Test
public void testGetBytes() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 0, 0, 1, 5 });
assertArrayEquals(new byte[]{5}, reader.getBytes());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getShort} returns the correct value.
*/
@Test
public void testGetShort() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 5 });
assertEquals(5, reader.getShort());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getInteger} returns the correct value.
*/
@Test
public void testGetInteger() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 0, 0, 5 });
assertEquals(5, reader.getInteger());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getLong} returns the correct value.
*/
@Test
public void testGetLong() throws Exception {
BasicByteReader reader = getReader(new byte[] { 0, 0, 0, 0, 0, 0, 0, 5 });
assertEquals(5, reader.getLong());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getString} returns the correct value.
*/
@Test
public void testGetString() throws Exception {
String test = "test";
byte[] stringBytes = test.getBytes(StandardCharsets.UTF_16);
byte[] bytes = new byte[stringBytes.length + 2];
ArrayUtils.copyFromEnd(stringBytes, bytes);
bytes[1] = (byte)stringBytes.length; // string length
BasicByteReader reader = getReader(bytes);
assertEquals("test", reader.getString());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getSmallString} returns the correct value.
*/
@Test
public void testGetSmallString() throws Exception {
byte[] bytes = getSmallStringBytes("test");
BasicByteReader reader = getReader(bytes);
assertEquals("test", reader.getSmallString());
reader.close();
}
/**
* Make sure {@link BasicByteReader#getFloat} returns the correct value.
*/
@Test
public void testGetFloat() throws Exception {
byte[] bytes = getSmallStringBytes("0.1");
BasicByteReader reader = getReader(bytes);
assertEquals(0.1F, reader.getFloat(), 0.0F);
reader.close();
}
/**
* Make sure {@link BasicByteReader#getDouble} returns the correct value.
*/
@Test
public void testGetDouble() throws Exception {
byte[] bytes = getSmallStringBytes("0.1");
BasicByteReader reader = getReader(bytes);
assertEquals(0.1D, reader.getDouble(), 0.0D);
reader.close();
}
/**
* Make sure {@link BasicByteReader#getEnum} returns the correct value.
*/
@Test
public void testGetEnum() throws Exception {
byte[] bytes = getSmallStringBytes(TestEnum.CONSTANT.name());
BasicByteReader reader = getReader(bytes);
assertEquals(TestEnum.CONSTANT, reader.getEnum(TestEnum.class));
reader.close();
}
/**
* Make sure {@link BasicByteReader#getUUID} returns the correct value.
*/
@Test
public void testGetUUID() throws Exception {
UUID uuid = UUID.randomUUID();
byte[] most = getLongBytes(uuid.getMostSignificantBits());
byte[] least = getLongBytes(uuid.getLeastSignificantBits());
byte[] temp = new byte[16];
ArrayUtils.copyFromStart(most, temp);
ArrayUtils.copyFromEnd(least, temp);
byte[] bytes = new byte[17];
bytes[0] = 1;
System.arraycopy(temp, 0, bytes, 1, bytes.length - 1);
BasicByteReader reader = getReader(bytes);
assertEquals(uuid, reader.getUUID());
reader.close();
}
private BasicByteReader getReader(byte[] array) {
InputStream stream = new ByteArrayInputStream(array);
return new BasicByteReader(stream);
}
private byte[] getSmallStringBytes(String test) {
byte[] stringBytes = test.getBytes(StandardCharsets.UTF_8);
byte[] bytes = new byte[stringBytes.length + 1];
ArrayUtils.copyFromEnd(stringBytes, bytes);
bytes[0] = (byte)stringBytes.length; // string length
return bytes;
}
public byte[] getLongBytes(long longValue) throws IOException {
return new byte[]{
(byte) (longValue >> 56 & 0xFF),
(byte) (longValue >> 48 & 0xFF),
(byte) (longValue >> 40 & 0xFF),
(byte) (longValue >> 32 & 0xFF),
(byte) (longValue >> 24 & 0xFF),
(byte) (longValue >> 16 & 0xFF),
(byte) (longValue >> 8 & 0xFF),
(byte) (longValue & 0xFF)
};
}
}