/* * Copyright (C) 2004 Joe Walnes. * Copyright (C) 2006, 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 14. July 2004 by Joe Walnes */ package com.thoughtworks.xstream.converters.reflection; import junit.framework.TestCase; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Iterator; public class FieldDictionaryTest extends TestCase { private FieldDictionary fieldDictionary; protected void setUp() throws Exception { super.setUp(); fieldDictionary = new FieldDictionary(); } static class SomeClass { private String a; private String c; private transient String b; private static String d; private String e; } public void testListsFieldsInClassInDefinitionOrder() { Iterator fields = fieldDictionary.fieldsFor(SomeClass.class); assertEquals("a", getNonStaticFieldName(fields)); assertEquals("c", getNonStaticFieldName(fields)); assertEquals("b", getNonStaticFieldName(fields)); assertEquals("e", getNonStaticFieldName(fields)); assertFalse("No more fields should be present", fields.hasNext()); } static class SpecialClass extends SomeClass { private String brilliant; } public void testIncludesFieldsInSuperClasses() { Iterator fields = fieldDictionary.fieldsFor(SpecialClass.class); assertEquals("a", getNonStaticFieldName(fields)); assertEquals("c", getNonStaticFieldName(fields)); assertEquals("b", getNonStaticFieldName(fields)); assertEquals("e", getNonStaticFieldName(fields)); assertEquals("brilliant", getNonStaticFieldName(fields)); assertFalse("No more fields should be present", fields.hasNext()); } class InnerClass { // note: no static makes this an inner class, not nested class. private String someThing; } public void testIncludesOuterClassReferenceForInnerClass() { Iterator fields = fieldDictionary.fieldsFor(InnerClass.class); assertEquals("someThing", getNonStaticFieldName(fields)); Field innerField = ((Field)fields.next()); assertEquals("this$0", innerField.getName()); assertEquals(FieldDictionaryTest.class, innerField.getType()); assertFalse("No more fields should be present", fields.hasNext()); } private static String getNonStaticFieldName(Iterator fields) { final Field field = (Field)fields.next(); // JRockit declares static fields first, XStream will ignore them anyway if ((field.getModifiers() & Modifier.STATIC) > 0) { return getNonStaticFieldName(fields); } return field.getName(); } }