package io.termd.core.io;
import io.termd.core.util.Helper;
import org.junit.Test;
import java.nio.CharBuffer;
import java.nio.ByteBuffer;
import java.nio.charset.CharsetDecoder;
import java.util.ArrayList;
import java.util.function.Consumer;
import static org.junit.Assert.*;
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public class TelnetCharsetTest {
@Test
public void testDecodeSingleByte() {
for (int i = 13;i < 256;i++) {
byte[] bytes = {(byte) i};
assertEquals("Invalid encoding at " + i, new String(new char[]{(char) i}), TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
}
}
@Test
public void testDecodeByte() {
for (int i = 0;i < 256;i++) {
byte[] bytes = {(byte) i, 'A'};
assertEquals("Invalid encoding at " + i, new String(new char[]{(char)i, 'A'}), TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
}
}
@Test
public void testDecodeCRLF() {
for (int i = 0;i < 256;i++) {
byte[] bytes = {(byte) i, '\n'};
if (i != '\r') {
assertEquals("Invalid encoding at " + i, new String(new char[]{(char)i, '\n'}), TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
} else {
assertEquals("Invalid encoding at " + i, "\r", TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
}
}
}
@Test
public void testDecodeCRNULL() {
for (int i = 0;i < 256;i++) {
byte[] bytes = {(byte) i, 0};
if (i != '\r') {
assertEquals("Invalid encoding at " + i, new String(new char[]{(char)i, 0}), TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
} else {
assertEquals("Invalid encoding at " + i, "\r", TelnetCharset.INSTANCE.decode(ByteBuffer.wrap(bytes)).toString());
}
}
}
@Test
public void testDecoderOverflow() {
CharsetDecoder decoder = TelnetCharset.INSTANCE.newDecoder();
assertTrue(decoder.decode(ByteBuffer.wrap(new byte[]{'A', 'B'}), CharBuffer.allocate(1), true).isOverflow());
}
@Test
public void testBinaryDecoder() {
byte[] input = { '\n', 0, 'A'};
int[][] expectedOutput = {{'\r'},{'\r'},{'\r','A'}};
for (int i = 0;i < input.length;i++) {
final ArrayList<Integer> codePoints = new ArrayList<>();
BinaryDecoder decoder = new BinaryDecoder(512, TelnetCharset.INSTANCE, event -> {
for (int j : event) {
codePoints.add(j);
}
});
decoder.write(new byte[]{'\r'});
assertEquals(1, codePoints.size());
decoder.write(new byte[]{input[i]});
assertEquals(Helper.list(expectedOutput[i]), codePoints);
}
}
}