More field order validation.

This is to set me up to remove the redundant fields like declaring
class and name from field and method.

Change-Id: Ie834c615b33caed89c443fa23c25b7757d4b7ef3
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 7c33930..cdcf8fb 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -398,18 +398,44 @@
   AssertDexFile(libcore_dex_file.get());
 }
 
-// C++ fields must exactly match the fields in the Java class. If this fails,
+// C++ fields must exactly match the fields in the Java classes. If this fails,
 // reorder the fields in the C++ class. Managed class fields are ordered by
 // ClassLinker::LinkInstanceFields.
-TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaLangString) {
-  scoped_ptr<DexFile> libcore_dex_file(GetLibCoreDex());
-  EXPECT_TRUE(libcore_dex_file.get() != NULL); // Passes on host only until we have DexFile::OpenJar
-  class_linker_->RegisterDexFile(libcore_dex_file.get());
-  Class* string = class_linker_->FindClass( "Ljava/lang/String;", NULL, libcore_dex_file.get());
+TEST_F(ClassLinkerTest, ValidateFieldOrderOfJavaCppUnionClasses) {
+  UseLibCoreDex();
+  Class* string = class_linker_->FindClass( "Ljava/lang/String;", NULL, java_lang_dex_file_.get());
+  ASSERT_EQ(4U, string->NumInstanceFields());
   EXPECT_EQ("value",    string->GetInstanceField(0)->GetName());
   EXPECT_EQ("hashCode", string->GetInstanceField(1)->GetName());
   EXPECT_EQ("offset",   string->GetInstanceField(2)->GetName());
   EXPECT_EQ("count",    string->GetInstanceField(3)->GetName());
+
+  Class* accessible_object = class_linker_->FindClass("Ljava/lang/reflect/AccessibleObject;", NULL, java_lang_dex_file_.get());
+  ASSERT_EQ(1U, accessible_object->NumInstanceFields());
+  EXPECT_EQ("flag", accessible_object->GetInstanceField(0)->GetName());
+
+  Class* field = class_linker_->FindClass("Ljava/lang/reflect/Field;", NULL, java_lang_dex_file_.get());
+  ASSERT_EQ(6U, field->NumInstanceFields());
+  EXPECT_EQ("declaringClass",             field->GetInstanceField(0)->GetName());
+  EXPECT_EQ("genericType",                field->GetInstanceField(1)->GetName());
+  EXPECT_EQ("type",                       field->GetInstanceField(2)->GetName());
+  EXPECT_EQ("name",                       field->GetInstanceField(3)->GetName());
+  EXPECT_EQ("slot",                       field->GetInstanceField(4)->GetName());
+  EXPECT_EQ("genericTypesAreInitialized", field->GetInstanceField(5)->GetName());
+
+  Class* method = class_linker_->FindClass("Ljava/lang/reflect/Method;", NULL, java_lang_dex_file_.get());
+  ASSERT_EQ(11U, method->NumInstanceFields());
+  EXPECT_EQ("declaringClass",             method->GetInstanceField( 0)->GetName());
+  EXPECT_EQ("exceptionTypes",             method->GetInstanceField( 1)->GetName());
+  EXPECT_EQ("formalTypeParameters",       method->GetInstanceField( 2)->GetName());
+  EXPECT_EQ("genericExceptionTypes",      method->GetInstanceField( 3)->GetName());
+  EXPECT_EQ("genericParameterTypes",      method->GetInstanceField( 4)->GetName());
+  EXPECT_EQ("genericReturnType",          method->GetInstanceField( 5)->GetName());
+  EXPECT_EQ("returnType",                 method->GetInstanceField( 6)->GetName());
+  EXPECT_EQ("name",                       method->GetInstanceField( 7)->GetName());
+  EXPECT_EQ("parameterTypes",             method->GetInstanceField( 8)->GetName());
+  EXPECT_EQ("genericTypesAreInitialized", method->GetInstanceField( 9)->GetName());
+  EXPECT_EQ("slot",                       method->GetInstanceField(10)->GetName());
 }
 
 }  // namespace art