blob: 643e9011314e1cd7fe5435dd96bbb02926127be1 [file] [log] [blame]
package com.fasterxml.jackson.databind.ser.jdk;
import java.io.*;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.*;
import java.util.regex.Pattern;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
/**
* Unit tests for JDK types not covered by other tests (i.e. things
* that are not Enums, Collections, Maps, or standard Date/Time types)
*/
public class JDKTypeSerializationTest
extends com.fasterxml.jackson.databind.BaseMapTest
{
private final ObjectMapper MAPPER = objectMapper();
static class InetAddressBean {
public InetAddress value;
public InetAddressBean(InetAddress i) { value = i; }
}
public void testBigDecimal() throws Exception
{
Map<String, Object> map = new HashMap<String, Object>();
String PI_STR = "3.14159265";
map.put("pi", new BigDecimal(PI_STR));
String str = MAPPER.writeValueAsString(map);
assertEquals("{\"pi\":3.14159265}", str);
}
public void testBigDecimalAsPlainString() throws Exception
{
final ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
Map<String, Object> map = new HashMap<String, Object>();
String PI_STR = "3.00000000";
map.put("pi", new BigDecimal(PI_STR));
String str = mapper.writeValueAsString(map);
assertEquals("{\"pi\":3.00000000}", str);
}
public void testFile() throws IOException
{
// this may get translated to different representation on Windows, maybe Mac:
File f = new File(new File("/tmp"), "foo.text");
String str = MAPPER.writeValueAsString(f);
// escape backslashes (for portability with windows)
String escapedAbsPath = f.getAbsolutePath().replaceAll("\\\\", "\\\\\\\\");
assertEquals(quote(escapedAbsPath), str);
}
public void testRegexps() throws IOException
{
final String PATTERN_STR = "\\s+([a-b]+)\\w?";
Pattern p = Pattern.compile(PATTERN_STR);
Map<String,Object> input = new HashMap<String,Object>();
input.put("p", p);
Map<String,Object> result = writeAndMap(MAPPER, input);
assertEquals(p.pattern(), result.get("p"));
}
public void testCurrency() throws IOException
{
Currency usd = Currency.getInstance("USD");
assertEquals(quote("USD"), MAPPER.writeValueAsString(usd));
}
public void testLocale() throws IOException
{
assertEquals(quote("en"), MAPPER.writeValueAsString(new Locale("en")));
assertEquals(quote("es_ES"), MAPPER.writeValueAsString(new Locale("es", "ES")));
assertEquals(quote("fi_FI_savo"), MAPPER.writeValueAsString(new Locale("FI", "fi", "savo")));
assertEquals(quote("en_US"), MAPPER.writeValueAsString(Locale.US));
// [databind#1123]
assertEquals(quote(""), MAPPER.writeValueAsString(Locale.ROOT));
}
public void testInetAddress() throws IOException
{
assertEquals(quote("127.0.0.1"), MAPPER.writeValueAsString(InetAddress.getByName("127.0.0.1")));
InetAddress input = InetAddress.getByName("google.com");
assertEquals(quote("google.com"), MAPPER.writeValueAsString(input));
ObjectMapper mapper = new ObjectMapper();
mapper.configOverride(InetAddress.class)
.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.NUMBER));
String json = mapper.writeValueAsString(input);
assertEquals(quote(input.getHostAddress()), json);
assertEquals(String.format("{\"value\":\"%s\"}", input.getHostAddress()),
mapper.writeValueAsString(new InetAddressBean(input)));
}
public void testInetSocketAddress() throws IOException
{
assertEquals(quote("127.0.0.1:8080"),
MAPPER.writeValueAsString(new InetSocketAddress("127.0.0.1", 8080)));
assertEquals(quote("google.com:6667"),
MAPPER.writeValueAsString(new InetSocketAddress("google.com", 6667)));
assertEquals(quote("[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443"),
MAPPER.writeValueAsString(new InetSocketAddress("2001:db8:85a3:8d3:1319:8a2e:370:7348", 443)));
}
// [JACKSON-597]
public void testClass() throws IOException
{
assertEquals(quote("java.lang.String"), MAPPER.writeValueAsString(String.class));
assertEquals(quote("int"), MAPPER.writeValueAsString(Integer.TYPE));
assertEquals(quote("boolean"), MAPPER.writeValueAsString(Boolean.TYPE));
assertEquals(quote("void"), MAPPER.writeValueAsString(Void.TYPE));
}
public void testCharset() throws IOException
{
assertEquals(quote("UTF-8"), MAPPER.writeValueAsString(Charset.forName("UTF-8")));
}
// [databind#239]: Support serialization of ByteBuffer
public void testByteBuffer() throws IOException
{
final byte[] INPUT_BYTES = new byte[] { 1, 2, 3, 4, 5 };
String exp = MAPPER.writeValueAsString(INPUT_BYTES);
ByteBuffer bbuf = ByteBuffer.wrap(INPUT_BYTES);
assertEquals(exp, MAPPER.writeValueAsString(bbuf));
// so far so good, but must ensure Native buffers also work:
ByteBuffer bbuf2 = ByteBuffer.allocateDirect(5);
bbuf2.put(INPUT_BYTES);
assertEquals(exp, MAPPER.writeValueAsString(bbuf2));
}
// [databind#1662]: Sliced ByteBuffers
public void testSlicedByteBuffer() throws IOException
{
final byte[] INPUT_BYTES = new byte[] { 1, 2, 3, 4, 5 };
String exp = MAPPER.writeValueAsString(new byte[] { 3, 4, 5 });
ByteBuffer bbuf = ByteBuffer.wrap(INPUT_BYTES);
bbuf.position(2);
ByteBuffer slicedBuf = bbuf.slice();
assertEquals(exp, MAPPER.writeValueAsString(slicedBuf));
}
// Verify that efficient UUID codec won't mess things up:
public void testUUIDs() throws IOException
{
// first, couple of generated UUIDs:
for (String value : new String[] {
"76e6d183-5f68-4afa-b94a-922c1fdb83f8",
"540a88d1-e2d8-4fb1-9396-9212280d0a7f",
"2c9e441d-1cd0-472d-9bab-69838f877574",
"591b2869-146e-41d7-8048-e8131f1fdec5",
"82994ac2-7b23-49f2-8cc5-e24cf6ed77be",
"00000007-0000-0000-0000-000000000000"
}) {
UUID uuid = UUID.fromString(value);
String json = MAPPER.writeValueAsString(uuid);
assertEquals(quote(uuid.toString()), json);
// Also, wrt [#362], should convert cleanly
String str = MAPPER.convertValue(uuid, String.class);
assertEquals(value, str);
}
// then use templating; note that these are not exactly valid UUIDs
// wrt spec (type bits etc), but JDK UUID should deal ok
final String TEMPL = "00000000-0000-0000-0000-000000000000";
final String chars = "123456789abcdef";
for (int i = 0; i < chars.length(); ++i) {
String value = TEMPL.replace('0', chars.charAt(i));
UUID uuid = UUID.fromString(value);
String json = MAPPER.writeValueAsString(uuid);
assertEquals(quote(uuid.toString()), json);
}
}
}