blob: ddefff639c511451b6eec2aeefcfd77c4f81c0ee [file] [log] [blame]
package com.fasterxml.jackson.core.io;
import java.io.*;
import org.junit.Assert;
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.core.io.UTF8Writer;
import com.fasterxml.jackson.core.util.BufferRecycler;
public class UTF8WriterTest
extends com.fasterxml.jackson.core.BaseTest
{
public void testSimple() throws Exception
{
BufferRecycler rec = new BufferRecycler();
IOContext ctxt = new IOContext(rec, null, false);
ByteArrayOutputStream out = new ByteArrayOutputStream();
UTF8Writer w = new UTF8Writer(ctxt, out);
String str = "AB\u00A0\u1AE9\uFFFC";
char[] ch = str.toCharArray();
// Let's write 3 times, using different methods
w.write(str);
w.append(ch[0]);
w.write(ch[1]);
w.write(ch, 2, 3);
w.flush();
w.write(str, 0, str.length());
w.close();
// and thus should have 3 times contents
byte[] data = out.toByteArray();
assertEquals(3*10, data.length);
String act = out.toString("UTF-8");
assertEquals(15, act.length());
assertEquals(3 * str.length(), act.length());
assertEquals(str+str+str, act);
}
public void testSimpleAscii() throws Exception
{
BufferRecycler rec = new BufferRecycler();
IOContext ctxt = new IOContext(rec, null, false);
ByteArrayOutputStream out = new ByteArrayOutputStream();
UTF8Writer w = new UTF8Writer(ctxt, out);
String str = "abcdefghijklmnopqrst\u00A0";
char[] ch = str.toCharArray();
w.write(ch, 0, ch.length);
w.flush(); // trigger different code path for close
w.close();
byte[] data = out.toByteArray();
// one 2-byte encoded char
assertEquals(ch.length+1, data.length);
String act = out.toString("UTF-8");
assertEquals(str, act);
}
public void testFlushAfterClose() throws Exception
{
BufferRecycler rec = new BufferRecycler();
IOContext ctxt = new IOContext(rec, null, false);
ByteArrayOutputStream out = new ByteArrayOutputStream();
UTF8Writer w = new UTF8Writer(ctxt, out);
w.write('X');
char[] ch = { 'Y' };
w.write(ch);
w.close();
assertEquals(2, out.size());
// and this ought to be fine...
w.flush();
// as well as some more...
w.close();
w.flush();
}
public void testSurrogatesOk() throws Exception
{
BufferRecycler rec = new BufferRecycler();
IOContext ctxt = new IOContext(rec, null, false);
ByteArrayOutputStream out = new ByteArrayOutputStream();
UTF8Writer w = new UTF8Writer(ctxt, out);
// First, valid case, char by char
w.write(0xD83D);
w.write(0xDE03);
w.close();
assertEquals(4, out.size());
final byte[] EXP_SURROGATES = new byte[] { (byte) 0xF0, (byte) 0x9F,
(byte) 0x98, (byte) 0x83 };
Assert.assertArrayEquals(EXP_SURROGATES, out.toByteArray());
// and then as String
ctxt = new IOContext(rec, null, false);
out = new ByteArrayOutputStream();
w = new UTF8Writer(ctxt, out);
w.write("\uD83D\uDE03");
w.close();
assertEquals(4, out.size());
Assert.assertArrayEquals(EXP_SURROGATES, out.toByteArray());
}
@SuppressWarnings("resource")
public void testSurrogatesFail() throws Exception
{
BufferRecycler rec = new BufferRecycler();
IOContext ctxt;
ByteArrayOutputStream out;
UTF8Writer w;
ctxt = new IOContext(rec, null, false);
out = new ByteArrayOutputStream();
w = new UTF8Writer(ctxt, out);
try {
w.write(0xDE03);
fail("should not pass");
} catch (IOException e) {
verifyException(e, "Unmatched second part");
}
ctxt = new IOContext(rec, null, false);
out = new ByteArrayOutputStream();
w = new UTF8Writer(ctxt, out);
w.write(0xD83D);
try {
w.write('a');
fail("should not pass");
} catch (IOException e) {
verifyException(e, "Broken surrogate pair");
}
ctxt = new IOContext(rec, null, false);
out = new ByteArrayOutputStream();
w = new UTF8Writer(ctxt, out);
try {
w.write("\uDE03");
fail("should not pass");
} catch (IOException e) {
verifyException(e, "Unmatched second part");
}
ctxt = new IOContext(rec, null, false);
out = new ByteArrayOutputStream();
w = new UTF8Writer(ctxt, out);
try {
w.write("\uD83Da");
fail("should not pass");
} catch (IOException e) {
verifyException(e, "Broken surrogate pair");
}
}
}