Use the method descriptor for prototype and return type comparisons.

Change-Id: If2623b53e069d6f51c08849ac2798f792d465234
diff --git a/src/object_test.cc b/src/object_test.cc
index d240d0c..18e8e77 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -19,7 +19,7 @@
   void AssertString(size_t length,
                     const char* utf8_in,
                     const char* utf16_expected_le,
-                    int32_t hash_expected) {
+                    uint32_t hash_expected) {
     uint16_t utf16_expected[length];
     for (size_t i = 0; i < length; i++) {
       uint16_t ch = (((utf16_expected_le[i*2 + 0] & 0xff) << 8) |
@@ -28,15 +28,15 @@
     }
 
     String* string = String::AllocFromModifiedUtf8(length, utf8_in);
-    ASSERT_EQ(length,  static_cast<size_t>(string->count_));
-    ASSERT_TRUE(string->array_ != NULL);
-    ASSERT_TRUE(string->array_->GetChars() != NULL);
+    ASSERT_EQ(length, string->GetLength());
+    ASSERT_TRUE(string->GetCharArray() != NULL);
+    ASSERT_TRUE(string->GetCharArray()->GetChars() != NULL);
     // strlen is necessary because the 1-character string "\0" is interpreted as ""
-    ASSERT_TRUE(String::EqualsUtf8(string, utf8_in) || length != strlen(utf8_in));
+    ASSERT_TRUE(string->Equals(utf8_in) || length != strlen(utf8_in));
     for (size_t i = 0; i < length; i++) {
-      EXPECT_EQ(utf16_expected[i], string->array_->GetChar(i));
+      EXPECT_EQ(utf16_expected[i], string->GetCharArray()->GetChar(i));
     }
-    EXPECT_EQ(hash_expected, string->hash_code_);
+    EXPECT_EQ(hash_expected, string->GetHashCode());
   }
 };
 
@@ -90,40 +90,76 @@
   AssertString(3, "h\xe1\x88\xb4i", "\x00\x68\x12\x34\x00\x69", (31 * ((31 * 0x68) + 0x1234)) + 0x69);
 }
 
-static bool StringNotEqualsUtf8(const String* a, const char* b) {
-  return !String::EqualsUtf8(a, b);
-}
-
 TEST_F(ObjectTest, StringEqualsUtf8) {
   String* string = String::AllocFromAscii("android");
-  EXPECT_PRED2(String::EqualsUtf8, string, "android");
-  EXPECT_PRED2(StringNotEqualsUtf8, string, "Android");
-  EXPECT_PRED2(StringNotEqualsUtf8, string, "ANDROID");
-  EXPECT_PRED2(StringNotEqualsUtf8, string, "");
-  EXPECT_PRED2(StringNotEqualsUtf8, string, "and");
-  EXPECT_PRED2(StringNotEqualsUtf8, string, "androids");
+  EXPECT_TRUE(string->Equals("android"));
+  EXPECT_FALSE(string->Equals("Android"));
+  EXPECT_FALSE(string->Equals("ANDROID"));
+  EXPECT_FALSE(string->Equals(""));
+  EXPECT_FALSE(string->Equals("and"));
+  EXPECT_FALSE(string->Equals("androids"));
 
   String* empty = String::AllocFromAscii("");
-  EXPECT_PRED2(String::EqualsUtf8, empty, "");
-  EXPECT_PRED2(StringNotEqualsUtf8, empty, "a");
-}
-
-static bool StringNotEquals(const String* a, const String* b) {
-  return !String::Equals(a, b);
+  EXPECT_TRUE(empty->Equals(""));
+  EXPECT_FALSE(empty->Equals("a"));
 }
 
 TEST_F(ObjectTest, StringEquals) {
   String* string = String::AllocFromAscii("android");
-  EXPECT_PRED2(String::Equals, string, String::AllocFromAscii("android"));
-  EXPECT_PRED2(StringNotEquals, string, String::AllocFromAscii("Android"));
-  EXPECT_PRED2(StringNotEquals, string, String::AllocFromAscii("ANDROID"));
-  EXPECT_PRED2(StringNotEquals, string, String::AllocFromAscii(""));
-  EXPECT_PRED2(StringNotEquals, string, String::AllocFromAscii("and"));
-  EXPECT_PRED2(StringNotEquals, string, String::AllocFromAscii("androids"));
+  EXPECT_TRUE(string->Equals(String::AllocFromAscii("android")));
+  EXPECT_FALSE(string->Equals("Android"));
+  EXPECT_FALSE(string->Equals("ANDROID"));
+  EXPECT_FALSE(string->Equals(""));
+  EXPECT_FALSE(string->Equals("and"));
+  EXPECT_FALSE(string->Equals("androids"));
 
   String* empty = String::AllocFromAscii("");
-  EXPECT_PRED2(String::Equals, empty, String::AllocFromAscii(""));
-  EXPECT_PRED2(StringNotEquals, empty, String::AllocFromAscii("a"));
+  EXPECT_TRUE(empty->Equals(""));
+  EXPECT_FALSE(empty->Equals("a"));
+}
+
+TEST_F(ObjectTest, DescriptorCompare) {
+  ClassLinker* linker = class_linker_;
+
+  scoped_ptr<DexFile> proto1_dex_file(OpenDexFileBase64(kProtoCompareDex));
+  PathClassLoader* class_loader_1 = AllocPathClassLoader(proto1_dex_file.get());
+  scoped_ptr<DexFile> proto2_dex_file(OpenDexFileBase64(kProtoCompare2Dex));
+  PathClassLoader* class_loader_2 = AllocPathClassLoader(proto2_dex_file.get());
+
+  Class* klass1 = linker->FindClass("LProtoCompare;", class_loader_1);
+  ASSERT_TRUE(klass1 != NULL);
+  Class* klass2 = linker->FindClass("LProtoCompare2;", class_loader_2);
+  ASSERT_TRUE(klass2 != NULL);
+
+  Method* m1_1 = klass1->GetVirtualMethod(0);
+  EXPECT_TRUE(m1_1->GetName()->Equals("m1"));
+  Method* m2_1 = klass1->GetVirtualMethod(1);
+  EXPECT_TRUE(m2_1->GetName()->Equals("m2"));
+  Method* m3_1 = klass1->GetVirtualMethod(2);
+  EXPECT_TRUE(m3_1->GetName()->Equals("m3"));
+  Method* m4_1 = klass1->GetVirtualMethod(3);
+  EXPECT_TRUE(m4_1->GetName()->Equals("m4"));
+
+  Method* m1_2 = klass2->GetVirtualMethod(0);
+  EXPECT_TRUE(m1_2->GetName()->Equals("m1"));
+  Method* m2_2 = klass2->GetVirtualMethod(1);
+  EXPECT_TRUE(m2_2->GetName()->Equals("m2"));
+  Method* m3_2 = klass2->GetVirtualMethod(2);
+  EXPECT_TRUE(m3_2->GetName()->Equals("m3"));
+  Method* m4_2 = klass2->GetVirtualMethod(3);
+  EXPECT_TRUE(m4_2->GetName()->Equals("m4"));
+
+  EXPECT_TRUE(m1_1->HasSameNameAndDescriptor(m1_2));
+  EXPECT_TRUE(m1_2->HasSameNameAndDescriptor(m1_1));
+
+  EXPECT_TRUE(m2_1->HasSameNameAndDescriptor(m2_2));
+  EXPECT_TRUE(m2_2->HasSameNameAndDescriptor(m2_1));
+
+  EXPECT_TRUE(m3_1->HasSameNameAndDescriptor(m3_2));
+  EXPECT_TRUE(m3_2->HasSameNameAndDescriptor(m3_1));
+
+  EXPECT_TRUE(m4_1->HasSameNameAndDescriptor(m4_2));
+  EXPECT_TRUE(m4_2->HasSameNameAndDescriptor(m4_1));
 }
 
 }  // namespace art