blob: 02cfd10327b152d59111f843f04f879909e45b1c [file] [log] [blame]
package org.mockito.internal.util.reflection;
import org.junit.Test;
import java.lang.reflect.Field;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.internal.util.reflection.SuperTypesLastSorter.sortSuperTypesLast;
@SuppressWarnings("unused")
public class SuperTypesLastSorterTest {
/**
* A Comparator that behaves like the old one, so the existing tests
* continue to work.
*/
private static Comparator<Field> cmp = new Comparator<Field>() {
public int compare(Field o1, Field o2) {
if (o1.equals(o2)) {
return 0;
}
List<Field> l = sortSuperTypesLast(Arrays.asList(o1, o2));
if (l.get(0) == o1) {
return -1;
} else {
return 1;
}
}
};
private Object objectA;
private Object objectB;
private Number numberA;
private Number numberB;
private Integer integerA;
private Integer integerB;
private Iterable<?> iterableA;
private Number xNumber;
private Iterable<?> yIterable;
private Integer zInteger;
@Test
public void when_same_type_the_order_is_based_on_field_name() throws Exception {
assertThat(cmp.compare(field("objectA"), field("objectB"))).isEqualTo(-1);
assertThat(cmp.compare(field("objectB"), field("objectA"))).isEqualTo(1);
assertThat(cmp.compare(field("objectB"), field("objectB"))).isEqualTo(0);
}
@Test
public void when_type_is_different_the_supertype_comes_last() throws Exception {
assertThat(cmp.compare(field("numberA"), field("objectB"))).isEqualTo(-1);
assertThat(cmp.compare(field("objectB"), field("numberA"))).isEqualTo(1);
}
@Test
public void using_Collections_dot_sort() throws Exception {
List<Field> unsortedFields = Arrays.asList(
field("objectB"),
field("integerB"),
field("numberA"),
field("numberB"),
field("objectA"),
field("integerA")
);
List<Field> sortedFields = sortSuperTypesLast(unsortedFields);
assertThat(sortedFields).containsSequence(
field("integerA"),
field("integerB"),
field("numberA"),
field("numberB"),
field("objectA"),
field("objectB")
);
}
@Test
public void issue_352_order_was_different_between_JDK6_and_JDK7() throws Exception {
List<Field> unsortedFields = Arrays.asList(
field("objectB"),
field("objectA")
);
Collections.sort(unsortedFields, cmp);
assertThat(unsortedFields).containsSequence(
field("objectA"),
field("objectB")
);
}
@Test
public void fields_sort_consistently_when_interfaces_are_included() throws NoSuchFieldException {
assertSortConsistently(field("iterableA"), field("numberA"), field("integerA"));
}
@Test
public void fields_sort_consistently_when_names_and_type_indicate_different_order() throws NoSuchFieldException {
assertSortConsistently(field("xNumber"), field("yIterable"), field("zInteger"));
}
/**
* Assert that these fields sort in the same order no matter which order
* they start in.
*/
private static void assertSortConsistently(Field a, Field b, Field c) {
Field[][] initialOrderings = {
{a, b, c},
{a, c, b},
{b, a, c},
{b, c, a},
{c, a, b},
{c, b, a}
};
Set<List<Field>> results = new HashSet<List<Field>>();
for (Field[] o : initialOrderings) {
results.add(sortSuperTypesLast(Arrays.asList(o)));
}
assertThat(results).hasSize(1);
}
private Field field(String field) throws NoSuchFieldException {
return getClass().getDeclaredField(field);
}
}