Skip to content

Commit 3160a20

Browse files
committed
Add more tests for ScopeReflection
1 parent 0bd100e commit 3160a20

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

unittests/CppInterOp/ScopeReflectionTest.cpp

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,21 @@ TEST(ScopeReflectionTest, GetNumBases) {
963963
// FIXME: Perhaps we should have a special number or error out as this
964964
// operation is not well defined if a class has no definition.
965965
EXPECT_EQ(Cpp::GetNumBases(Decls[5]), 0);
966+
967+
// C API
968+
auto I = clang_createInterpreterFromPtr(Cpp::GetInterpreter());
969+
auto C_API_SHIM = [&](auto Decl) {
970+
return clang_scope_getNumBases(CXScope{CXScope_Unexposed, Decl, I});
971+
};
972+
EXPECT_EQ(C_API_SHIM(Decls[0]), 0);
973+
EXPECT_EQ(C_API_SHIM(Decls[1]), 1);
974+
EXPECT_EQ(C_API_SHIM(Decls[2]), 1);
975+
EXPECT_EQ(C_API_SHIM(Decls[3]), 2);
976+
EXPECT_EQ(C_API_SHIM(Decls[4]), 1);
977+
EXPECT_EQ(C_API_SHIM(Decls[5]), 0);
978+
// Clean up resources
979+
clang_interpreter_takeInterpreterAsPtr(I);
980+
clang_interpreter_dispose(I);
966981
}
967982

968983
TEST(ScopeReflectionTest, GetBaseClass) {
@@ -1012,6 +1027,40 @@ TEST(ScopeReflectionTest, GetBaseClass) {
10121027
auto* TC3_A_Decl = Cpp::GetScopeFromType(VT1);
10131028
auto* A_class = Cpp::GetBaseClass(TC3_A_Decl, 0);
10141029
EXPECT_EQ(Cpp::GetCompleteName(A_class), "A");
1030+
1031+
// C API
1032+
auto I = clang_createInterpreterFromPtr(Cpp::GetInterpreter());
1033+
auto C_API_SHIM = [&](auto Decl, int i) {
1034+
auto Scope =
1035+
clang_scope_getBaseClass(CXScope{CXScope_Unexposed, Decl, I}, i);
1036+
auto Str = clang_scope_getQualifiedName(Scope);
1037+
auto Res = std::string(clang_getCString(Str));
1038+
clang_disposeString(Str);
1039+
return Res;
1040+
};
1041+
EXPECT_EQ(C_API_SHIM(Decls[1], 0), "A");
1042+
EXPECT_EQ(C_API_SHIM(Decls[2], 0), "A");
1043+
EXPECT_EQ(C_API_SHIM(Decls[3], 0), "B");
1044+
EXPECT_EQ(C_API_SHIM(Decls[3], 1), "C");
1045+
EXPECT_EQ(C_API_SHIM(Decls[4], 0), "D");
1046+
EXPECT_EQ(C_API_SHIM(Decls[10], 0), "<unnamed>");
1047+
1048+
auto C_API_SHIM2 = [&](const char* name) {
1049+
auto GS = clang_scope_getGlobalScope(I);
1050+
auto VD = clang_scope_getNamed(name, GS);
1051+
auto VT = clang_scope_getVariableType(VD);
1052+
auto TC2_A_Decl = clang_scope_getScopeFromType(VT);
1053+
auto TC1_A_Decl = clang_scope_getBaseClass(TC2_A_Decl, 0);
1054+
auto Str = clang_scope_getCompleteName(TC1_A_Decl);
1055+
auto Res = std::string(clang_getCString(Str));
1056+
clang_disposeString(Str);
1057+
return Res;
1058+
};
1059+
EXPECT_EQ(C_API_SHIM2("var"), "TC1<A>");
1060+
EXPECT_EQ(C_API_SHIM2("var1"), "A");
1061+
// Clean up resources
1062+
clang_interpreter_takeInterpreterAsPtr(I);
1063+
clang_interpreter_dispose(I);
10151064
}
10161065

10171066
TEST(ScopeReflectionTest, IsSubclass) {
@@ -1054,6 +1103,38 @@ TEST(ScopeReflectionTest, IsSubclass) {
10541103
EXPECT_TRUE(Cpp::IsSubclass(Decls[4], Decls[4]));
10551104
EXPECT_FALSE(Cpp::IsSubclass(Decls[4], Decls[5]));
10561105
EXPECT_FALSE(Cpp::IsSubclass(Decls[4], nullptr));
1106+
1107+
// C API
1108+
auto I = clang_createInterpreterFromPtr(Cpp::GetInterpreter());
1109+
auto C_API_SHIM = [&](auto D, auto B) {
1110+
return clang_scope_isSubclass(CXScope{CXScope_Unexposed, D, I},
1111+
CXScope{CXScope_Unexposed, B, I});
1112+
};
1113+
EXPECT_FALSE(C_API_SHIM(Decls[0], Decls[1]));
1114+
EXPECT_TRUE(C_API_SHIM(Decls[1], Decls[1]));
1115+
EXPECT_FALSE(C_API_SHIM(Decls[2], Decls[1]));
1116+
EXPECT_TRUE(C_API_SHIM(Decls[3], Decls[1]));
1117+
EXPECT_TRUE(C_API_SHIM(Decls[4], Decls[1]));
1118+
EXPECT_FALSE(C_API_SHIM(Decls[0], Decls[2]));
1119+
EXPECT_FALSE(C_API_SHIM(Decls[1], Decls[2]));
1120+
EXPECT_TRUE(C_API_SHIM(Decls[2], Decls[2]));
1121+
EXPECT_TRUE(C_API_SHIM(Decls[3], Decls[2]));
1122+
EXPECT_TRUE(C_API_SHIM(Decls[4], Decls[2]));
1123+
EXPECT_FALSE(C_API_SHIM(Decls[0], Decls[3]));
1124+
EXPECT_FALSE(C_API_SHIM(Decls[1], Decls[3]));
1125+
EXPECT_FALSE(C_API_SHIM(Decls[2], Decls[3]));
1126+
EXPECT_TRUE(C_API_SHIM(Decls[3], Decls[3]));
1127+
EXPECT_TRUE(C_API_SHIM(Decls[4], Decls[3]));
1128+
EXPECT_FALSE(C_API_SHIM(Decls[0], Decls[4]));
1129+
EXPECT_FALSE(C_API_SHIM(Decls[1], Decls[4]));
1130+
EXPECT_FALSE(C_API_SHIM(Decls[2], Decls[4]));
1131+
EXPECT_FALSE(C_API_SHIM(Decls[3], Decls[4]));
1132+
EXPECT_TRUE(C_API_SHIM(Decls[4], Decls[4]));
1133+
EXPECT_FALSE(C_API_SHIM(Decls[4], Decls[5]));
1134+
EXPECT_FALSE(C_API_SHIM(Decls[4], nullptr));
1135+
// Clean up resources
1136+
clang_interpreter_takeInterpreterAsPtr(I);
1137+
clang_interpreter_dispose(I);
10571138
}
10581139

10591140
TEST(ScopeReflectionTest, GetBaseClassOffset) {
@@ -1113,6 +1194,24 @@ TEST(ScopeReflectionTest, GetBaseClassOffset) {
11131194
auto* g = new G();
11141195
EXPECT_EQ(Cpp::GetBaseClassOffset(Decls[6], Decls[0]),
11151196
(char*)(A*)g - (char*)g);
1197+
1198+
// C API
1199+
auto I = clang_createInterpreterFromPtr(Cpp::GetInterpreter());
1200+
auto C_API_SHIM = [&](auto D, auto B) {
1201+
return clang_scope_getBaseClassOffset(CXScope{CXScope_Unexposed, D, I},
1202+
CXScope{CXScope_Unexposed, B, I});
1203+
};
1204+
EXPECT_EQ(C_API_SHIM(Decls[2], Decls[0]), (char*)(A*)c - (char*)c);
1205+
EXPECT_EQ(C_API_SHIM(Decls[2], Decls[1]), (char*)(B*)c - (char*)c);
1206+
EXPECT_EQ(C_API_SHIM(Decls[3], Decls[0]), (char*)(A*)d - (char*)d);
1207+
EXPECT_EQ(C_API_SHIM(Decls[3], Decls[1]), (char*)(B*)d - (char*)d);
1208+
EXPECT_EQ(C_API_SHIM(Decls[3], Decls[2]), (char*)(C*)d - (char*)d);
1209+
EXPECT_EQ(C_API_SHIM(Decls[4], Decls[0]), (char*)(A*)e - (char*)e);
1210+
EXPECT_EQ(C_API_SHIM(Decls[4], Decls[1]), (char*)(B*)e - (char*)e);
1211+
EXPECT_EQ(C_API_SHIM(Decls[6], Decls[0]), (char*)(A*)g - (char*)g);
1212+
// Clean up resources
1213+
clang_interpreter_takeInterpreterAsPtr(I);
1214+
clang_interpreter_dispose(I);
11161215
}
11171216

11181217
TEST(ScopeReflectionTest, GetAllCppNames) {
@@ -1173,6 +1272,19 @@ TEST(ScopeReflectionTest, InstantiateNNTPClassTemplate) {
11731272
std::vector<Cpp::TemplateArgInfo> args1 = {{IntTy, "5"}};
11741273
EXPECT_TRUE(Cpp::InstantiateTemplate(Decls[0], args1.data(),
11751274
/*type_size*/ args1.size()));
1275+
1276+
// C API
1277+
auto I = clang_createInterpreterFromPtr(Cpp::GetInterpreter());
1278+
CXTemplateArgInfo Args1[] = {{IntTy, "5"}};
1279+
auto C_API_SHIM = [&](auto Decl) {
1280+
return clang_scope_instantiateTemplate(CXScope{CXScope_Function, Decl, I},
1281+
Args1, 1)
1282+
.data;
1283+
};
1284+
EXPECT_NE(C_API_SHIM(Decls[0]), nullptr);
1285+
// Clean up resources
1286+
clang_interpreter_takeInterpreterAsPtr(I);
1287+
clang_interpreter_dispose(I);
11761288
}
11771289

11781290
TEST(ScopeReflectionTest, InstantiateVarTemplate) {

0 commit comments

Comments
 (0)