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.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; /** * Tests {@link BasicByteWriter}. */ public class BasicByteWriterTest { /** * Make sure {@link #getBytesWritter} returns the correct value. */ @Test public void testGetBytesWritten() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write((byte)1); assertEquals(1, writer.getBytesWritten()); writer.write((short)1); assertEquals(3, writer.getBytesWritten()); writer.write(1); assertEquals(7, writer.getBytesWritten()); writer.write(1L); assertEquals(15, writer.getBytesWritten()); writer.write(new byte[] { 1, 2, 3, 4, 5}); assertEquals(24, writer.getBytesWritten()); writer.close(); } /** * Make sure {@link #writeBoolean} works correctly. */ @Test public void testWriteBoolean() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(true); writer.write(false); writer.write(true); writer.write(true); writer.write(true); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{29}, bytes); writer.close(); } /** * Make sure {@link #writeByte} works correctly. */ @Test public void testWriteByte() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write((byte)5); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{5}, bytes); writer.close(); } /** * Make sure {@link #writeBytes} works correctly. */ @Test public void testWriteBytes() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(new byte[] { 1, 2, 3, 4, 5}); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{0, 0, 0, 5, 1, 2, 3, 4, 5}, bytes); writer.close(); } /** * Make sure {@link #writeShort} works correctly. */ @Test public void testWriteShort() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write((short)5); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{0, 5}, bytes); writer.close(); } /** * Make sure {@link writeInteger} works correctly. */ @Test public void testWriteInteger() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(5); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{0, 0, 0, 5}, bytes); writer.close(); } /** * Make sure {@link #writeLong} works correctly. */ @Test public void testWriteLong() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(5L); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(new byte[]{0, 0, 0, 0, 0, 0, 0, 5}, bytes); writer.close(); } /** * Make sure {@link #writeFloat} works correctly. */ @Test public void testWriteFloat() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(1.0F); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(getSmallStringBytes("1.0"), bytes); writer.close(); } /** * Make sure {@link #writeDouble} works correctly. */ @Test public void testWriteDouble() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write(1.0D); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(getSmallStringBytes("1.0"), bytes); writer.close(); } /** * Make sure {@link #writeString} works correctly. */ @Test public void testWriteString() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.write("test"); writer.flush(); byte[] bytes = stream.toByteArray(); byte[] stringBytes = "test".getBytes(StandardCharsets.UTF_16); byte[] expected = new byte[stringBytes.length + 2]; ArrayUtils.copyFromEnd(stringBytes, expected); expected[1] = (byte)stringBytes.length; // string length assertArrayEquals(expected, bytes); writer.close(); } /** * Make sure {@link #writeSmallString} works correctly. */ @Test public void testWriteSmallString() throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); BasicByteWriter writer = new BasicByteWriter(stream); writer.writeSmallString("test"); writer.flush(); byte[] bytes = stream.toByteArray(); assertArrayEquals(getSmallStringBytes("test"), bytes); writer.close(); } 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; } }