/*
* Copyright (C) 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 10. April 2007 by Guilherme Silveira
*/
package com.thoughtworks.xstream.converters.reflection;
import java.lang.reflect.Field;
import java.util.Map;
import com.thoughtworks.xstream.core.util.OrderRetainingMap;
import com.thoughtworks.xstream.io.StreamException;
import junit.framework.TestCase;
public class SortableFieldKeySorterTest extends TestCase {
public void testDoesNotAffectUnregisteredTypes() {
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
sorter.registerFieldOrder(Mother.class, new String[]{"field2", "field1"});
sorter.registerFieldOrder(Child.class, new String[]{"field2", "field1"});
Map originalMap = buildMap(Base.class);
Map map = sorter.sort(Base.class, originalMap);
assertEquals(originalMap, map);
}
public void testIgnoresUnknownFields() {
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
String[] fieldOrder = new String[]{"whatever", "field2", "field1", "field3"};
sorter.registerFieldOrder(Child.class, fieldOrder);
Map originalMap = buildMap(Child.class);
Map map = sorter.sort(Child.class, originalMap);
Field[] fields = (Field[])map.values().toArray(new Field[map.size()]);
assertEquals(fieldOrder.length - 1, fields.length);
for (int i = 1; i < fieldOrder.length; i++) {
assertEquals(fieldOrder[i], fields[i - 1].getName());
}
}
public void testComplainsIfSomeFieldIsNotSpecified() {
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
sorter.registerFieldOrder(Base.class, new String[]{"field3"});
try {
sorter.sort(Base.class, buildMap(Base.class));
fail();
} catch (StreamException ex) {
// ok
}
}
public void testSortsMapAccordingToDefinedFieldOrder() {
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
String[] fieldOrder = new String[]{"field2", "field1", "field3"};
sorter.registerFieldOrder(Child.class, fieldOrder);
Map originalMap = buildMap(Child.class);
Map map = sorter.sort(Child.class, originalMap);
Field[] fields = (Field[])map.values().toArray(new Field[map.size()]);
assertEquals(fieldOrder.length, fields.length);
for (int i = 0; i < fieldOrder.length; i++) {
assertEquals(fieldOrder[i], fields[i].getName());
}
}
private Map buildMap(Class type) {
Map map = new OrderRetainingMap();
Class cls = type;
while (!cls.equals(Object.class)) {
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
map.put(new FieldKey(field.getName(), cls, i), field);
}
cls = cls.getSuperclass();
}
return map;
}
static class Base extends Mother {
String field3;
}
static class Child extends Base {
}
static class Mother {
String field1, field2;
}
}