package retrofit.converter; import org.junit.Test; import org.simpleframework.xml.Default; import org.simpleframework.xml.DefaultType; import org.simpleframework.xml.Element; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.stream.Format; import org.simpleframework.xml.stream.HyphenStyle; import org.simpleframework.xml.stream.Verbosity; import retrofit.mime.TypedByteArray; import retrofit.mime.TypedInput; import retrofit.mime.TypedOutput; import java.io.ByteArrayOutputStream; import static org.fest.assertions.api.Assertions.assertThat; public class SimpleXMLConverterTest { private static final String MIME_TYPE = "application/xml; charset=UTF-8"; private final MyObject obj = new MyObject("hello world", 10); private final String objAsXML = String.format( "<my-object><message>%s</message><count>%d</count></my-object>", obj.getMessage(), obj.getCount()); private final Converter converter = initConverter(); private static Converter initConverter() { Format format = new Format(0, null, new HyphenStyle(), Verbosity.HIGH); Persister persister = new Persister(format); return new SimpleXMLConverter(persister); } @Test public void serialize() throws Exception { final TypedOutput typedOutput = converter.toBody(obj); assertThat(typedOutput.mimeType()).isEqualTo(MIME_TYPE); assertThat(asString(typedOutput)).isEqualTo(objAsXML); } @Test public void deserialize() throws Exception { final TypedInput input = new TypedByteArray(MIME_TYPE, objAsXML.getBytes()); final MyObject result = (MyObject) converter.fromBody(input, MyObject.class); assertThat(result).isEqualTo(obj); } @Test(expected = ConversionException.class) public void deserializeWrongValue() throws Exception { final TypedInput input = new TypedByteArray(MIME_TYPE, "<myObject><foo/><bar/></myObject>".getBytes()); converter.fromBody(input, MyObject.class); } @Test public void deserializeWrongClass() throws Exception { final TypedInput input = new TypedByteArray(MIME_TYPE, objAsXML.getBytes()); Object result = converter.fromBody(input, String.class); assertThat(result).isNull(); } private String asString(TypedOutput typedOutput) throws Exception { final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); typedOutput.writeTo(bytes); return new String(bytes.toByteArray()); } @Default(value = DefaultType.FIELD) static class MyObject { @Element private String message; @Element private int count; public MyObject() { } public MyObject(String message, int count) { this.message = message; this.count = count; } public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } public void setCount(int count) { this.count = count; } public int getCount() { return count; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + count; result = prime * result + ((message == null) ? 0 : message.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } MyObject other = (MyObject) obj; if (count != other.count) { return false; } if (message == null) { if (other.message != null) { return false; } } else if (!message.equals(other.message)) { return false; } return true; } } }