data-generator/data-generator-runtime/src/test/java/it/cavallium/stream/TestOutput.java

253 lines
9.4 KiB
Java

package it.cavallium.stream;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import it.cavallium.buffer.Buf;
import it.cavallium.buffer.BufDataOutput;
import it.cavallium.data.generator.nativedata.Int52;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
public class TestOutput {
@Test
public void testBufOutputStream() throws IOException {
var buf = Buf.createZeroes(Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 4);
var subMiddleBuf = buf.subList(Integer.BYTES, Integer.BYTES * 2);
buf.setInt(0, 0);
buf.setInt(Integer.BYTES, 5);
buf.setInt(Integer.BYTES * 2, 4);
var subBuf = buf.subList(Integer.BYTES, Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 4);
var subBufOut = subBuf.binaryOutputStream();
var subBufOutData = new SafeDataOutputStream(subBufOut);
assertEquals(0, subBufOutData.size());
subBufOutData.writeInt(9);
subBufOut.position(0);
subBufOutData.writeInt(1);
subBufOutData.writeInt(2);
subBufOutData.writeShort(1);
subBufOutData.writeChar(1);
subBufOutData.write(new byte[] {1, 2});
subBufOutData.write(new byte[] {0, 0, 3, 4, 0, 0}, 2, 2);
assertEquals(Integer.BYTES, Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 4, subBufOutData.size());
assertDoesNotThrow(subBufOutData::toString);
assertDoesNotThrow(subBufOut::toString);
assertThrows(Exception.class, () -> subBufOutData.writeByte(1));
assertThrows(Exception.class, () -> subBufOut.ensureWritable(1));
var i0 = buf.getInt(0);
var i1 = buf.getInt(Integer.BYTES);
var i2 = buf.getInt(Integer.BYTES * 2);
var s1 = (buf.getByte(Integer.BYTES * 3) << 8) | buf.getByte(Integer.BYTES * 3 + 1);
var c1 = (buf.getByte(Integer.BYTES * 3 + Short.BYTES) << 8) | buf.getByte(Integer.BYTES * 3 + Short.BYTES + 1);
var b1 = buf.getByte(Integer.BYTES * 3 + Short.BYTES + Character.BYTES);
var b2 = buf.getByte(Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 1);
var b3 = buf.getByte(Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 2);
var b4 = buf.getByte(Integer.BYTES * 3 + Short.BYTES + Character.BYTES + 3);
assertEquals(List.of(0, 1, 2), List.of(i0, i1, i2));
assertEquals(1, s1);
assertEquals(1, c1);
assertEquals(List.of(1, 2, 3, 4), List.of((int) b1, (int) b2, (int) b3, (int) b4));
{
var baos = new ByteArrayOutputStream();
var dos = new DataOutputStream(baos);
dos.writeInt(1);
dos.writeInt(2);
dos.writeShort(1);
dos.writeChar(1);
dos.writeByte(1);
dos.writeByte(2);
dos.writeByte(3);
dos.writeByte(4);
assertArrayEquals(baos.toByteArray(), subBufOut.toByteArray());
}
{
var baos = new ByteArrayOutputStream();
var dos = new DataOutputStream(baos);
dos.writeInt(0);
dos.writeInt(1);
dos.writeInt(2);
dos.writeShort(1);
dos.writeChar(1);
dos.writeByte(1);
dos.writeByte(2);
dos.writeByte(3);
dos.writeByte(4);
assertArrayEquals(baos.toByteArray(), buf.toByteArray());
}
{
var baos = new ByteArrayOutputStream();
var dos = new DataOutputStream(baos);
dos.writeInt(1);
assertArrayEquals(baos.toByteArray(), subMiddleBuf.toByteArray());
}
{
var b = Buf.createZeroes(Long.BYTES * 4);
var os = b.binaryOutputStream();
var ds = new SafeDataOutputStream(os);
ds.writeBoolean(true);
assertTrue(b.getBoolean(0));
os.reset();
ds.writeByte(Byte.MAX_VALUE - 1);
assertEquals(Byte.MAX_VALUE - 1, b.getByte(0));
os.reset();
ds.writeShort(Short.MAX_VALUE - 1);
assertEquals(Short.MAX_VALUE - 1, b.getShort(0));
os.reset();
ds.writeChar(Character.MAX_VALUE - 1);
assertEquals(Character.MAX_VALUE - 1, b.getChar(0));
os.reset();
ds.writeInt(Integer.MAX_VALUE - 1);
assertEquals(Integer.MAX_VALUE - 1, b.getInt(0));
os.reset();
ds.writeLong(Long.MAX_VALUE - 1);
assertEquals(Long.MAX_VALUE - 1, b.getLong(0));
os.reset();
ds.writeInt52(Int52.MAX_VALUE_L - 1);
assertEquals(Int52.MAX_VALUE_L - 1, b.getInt52(0));
os.reset();
ds.writeFloat(Float.MAX_VALUE - 1);
assertEquals(Float.MAX_VALUE - 1, b.getFloat(0));
os.reset();
ds.writeDouble(Double.MAX_VALUE - 1);
assertEquals(Double.MAX_VALUE - 1, b.getDouble(0));
os.reset();
ds.write(10);
ds.write(10);
ds.writeShortText("Ciao", StandardCharsets.UTF_8);
assertEquals("Ciao", b.getShortText(2, StandardCharsets.UTF_8));
assertEquals("Ciao", b.subList(1, b.size()).getShortText(1, StandardCharsets.UTF_8));
assertThrows(Exception.class, () -> ds.writeShortText("1".repeat(Short.MAX_VALUE + 1), StandardCharsets.UTF_8));
os.reset();
ds.write(10);
ds.write(10);
ds.writeMediumText("Ciao", StandardCharsets.UTF_8);
assertEquals("Ciao", b.getMediumText(2, StandardCharsets.UTF_8));
assertEquals("Ciao", b.subList(1, b.size()).getMediumText(1, StandardCharsets.UTF_8));
os.reset();
}
}
@Test
public void testWrappedBufDataOutput() throws IOException {
var sz = Long.BYTES * 4;
BufDataOutput bdo;
Buf buf;
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeBoolean(true);
buf = bdo.asList();
assertTrue(buf.getBoolean(0));
}
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeByte(Byte.MAX_VALUE - 1);
buf = bdo.asList();
assertEquals(Byte.MAX_VALUE - 1, buf.getByte(0));
}
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeShort(Short.MAX_VALUE - 1);
buf = bdo.asList();
assertEquals(Short.MAX_VALUE - 1, buf.getShort(0));
}
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeChar(Character.MAX_VALUE - 1);
buf = bdo.asList();
assertEquals(Character.MAX_VALUE - 1, buf.getChar(0));
}
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeInt(Integer.MAX_VALUE - 1);
buf = bdo.asList();
assertEquals(Integer.MAX_VALUE - 1, buf.getInt(0));
}
{
bdo = BufDataOutput.createLimited(sz);
bdo.writeLong(Long.MAX_VALUE - 1);
buf = bdo.asList();
assertEquals(Long.MAX_VALUE - 1, buf.getLong(0));
}
}
@ParameterizedTest
@MethodSource("provideByteArrayOutputStreams")
public void testByteArrayOutputStream(SafeByteArrayOutputStream baos) {
assertArrayEquals(new byte[0], baos.toByteArray());
baos.write(0);
baos.write(0);
baos.write(0);
var x = new byte[] {1, 2, 3, 4};
baos.write(x);
baos.write(x, 1, 2);
assertArrayEquals(new byte[] {0, 0, 0, 1, 2, 3, 4, 2, 3}, baos.toByteArray());
}
@ParameterizedTest
@MethodSource("provideByteArrayOutputStreams")
public void testTrimAndGrow(SafeByteArrayOutputStream baos) {
baos.trim();
assertEquals(0, baos.array.length);
baos.write(10);
baos.trim();
assertEquals(1, baos.array.length);
assertArrayEquals(new byte[] {10}, baos.array);
baos.ensureWritable(2);
assertEquals(3, baos.array.length);
assertArrayEquals(new byte[] {10, 0, 0}, baos.array);
}
@ParameterizedTest
@MethodSource("provideByteArrayOutputStreams")
public void testReset(SafeByteArrayOutputStream baos) {
baos.trim();
baos.write(10);
baos.write(10);
assertEquals(2, baos.position());
assertEquals(2, baos.length());
assertEquals(2, baos.array.length);
baos.reset();
assertEquals(0, baos.position());
assertEquals(0, baos.length());
assertEquals(2, baos.array.length);
}
public static Stream<SafeByteArrayOutputStream> provideByteArrayOutputStreams() {
return Stream.of(new SafeByteArrayOutputStream(),
new SafeByteArrayOutputStream(10),
new SafeByteArrayOutputStream(8),
new SafeByteArrayOutputStream(20),
new SafeByteArrayOutputStream()
);
}
@Test
public void testNOS() {
try (var nos = SafeDataOutputStream.nullOutputStream()) {
nos.write(0);
nos.flush();
}
}
}