TEST(ResolveField, empty) { g_redex = new RedexContext(); create_scope(); // different cases for int A.f1 DexField* fdef = DexField::get_field(DexType::get_type("A"), DexString::get_string("f1"), DexType::get_type("I")); EXPECT_TRUE(fdef != nullptr && fdef->is_def()); DexField* fref = make_field_ref( DexType::get_type("A"), "f1", DexType::get_type("I")); EXPECT_TRUE(fdef->is_def()); EXPECT_TRUE(resolve_field(fref) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == fdef); EXPECT_TRUE(resolve_field(DexType::get_type("A"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Static) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("D"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Static) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("B"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Instance) == fdef); EXPECT_TRUE(resolve_field(DexType::get_type("B"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Static) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("C"), DexString::get_string("f1"), DexType::get_type("I")) == fdef); EXPECT_TRUE(resolve_field(DexType::get_type("C"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Static) == nullptr); fref = make_field_ref( DexType::get_type("B"), "f1", DexType::get_type("I")); EXPECT_FALSE(fref->is_def()); EXPECT_TRUE(resolve_field(fref) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Static) == nullptr); fref = make_field_ref( DexType::get_type("C"), "f1", DexType::get_type("I")); EXPECT_FALSE(fref->is_def()); EXPECT_TRUE(resolve_field(fref) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Static) == nullptr); // different cases for static String B.f2 fdef = DexField::get_field(DexType::get_type("B"), DexString::get_string("f2"), DexType::get_type("Ljava/lang/String;")); EXPECT_TRUE(fdef != nullptr && fdef->is_def()); fref = make_field_ref( DexType::get_type("A"), "f2", DexType::get_type("Ljava/lang/String;")); EXPECT_FALSE(fref->is_def()); EXPECT_TRUE(resolve_field(fref) == nullptr); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == nullptr); EXPECT_TRUE(resolve_field(fref, FieldSearch::Static) == nullptr); fref = make_field_ref( DexType::get_type("B"), "f2", DexType::get_type("Ljava/lang/String;")); EXPECT_TRUE(fref->is_def()); EXPECT_TRUE(resolve_field(fref) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == fdef); fref = make_field_ref( DexType::get_type("C"), "f2", DexType::get_type("Ljava/lang/String;")); EXPECT_FALSE(fref->is_def()); EXPECT_TRUE(resolve_field(fref) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Static) == fdef); EXPECT_TRUE(resolve_field(fref, FieldSearch::Instance) == nullptr); // different cases for D.f fdef = DexField::get_field(DexType::get_type("D"), DexString::get_string("f"), DexType::get_type("A")); EXPECT_TRUE(fdef != nullptr && fdef->is_def()); EXPECT_TRUE(resolve_field(fdef) == fdef); EXPECT_TRUE(resolve_field(fdef, FieldSearch::Instance) == fdef); // random non existent field fdef = DexField::make_field(DexType::get_type("U"), DexString::get_string("f"), DexType::get_type("I")); EXPECT_FALSE(fdef->is_def()); EXPECT_TRUE(resolve_field(fdef) == nullptr); EXPECT_TRUE(resolve_field(fdef, FieldSearch::Instance) == nullptr); EXPECT_TRUE(resolve_field(fdef, FieldSearch::Static) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("E"), DexString::get_string("f1"), DexType::get_type("I"), FieldSearch::Static) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("E"), DexString::get_string("f1"), DexType::get_type("Ljava/lang/String;"), FieldSearch::Instance) == nullptr); EXPECT_TRUE(resolve_field(DexType::get_type("E"), DexString::get_string("f1"), DexType::get_type("I")) == nullptr); delete g_redex; }
// Scoped members. Expr& operator()(Field_decl& d) { return make_field_ref(cxt, obj, d); }