1 //===- unittests/libclang/LibclangTest.cpp --- libclang tests -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "clang-c/Index.h"
11 #include "gtest/gtest.h"
13 TEST(libclang, clang_parseTranslationUnit2_InvalidArgs) {
14 EXPECT_EQ(CXError_InvalidArguments,
15 clang_parseTranslationUnit2(nullptr, nullptr, nullptr, 0, nullptr,
19 TEST(libclang, clang_createTranslationUnit_InvalidArgs) {
20 EXPECT_EQ(nullptr, clang_createTranslationUnit(nullptr, nullptr));
23 TEST(libclang, clang_createTranslationUnit2_InvalidArgs) {
24 EXPECT_EQ(CXError_InvalidArguments,
25 clang_createTranslationUnit2(nullptr, nullptr, nullptr));
27 CXTranslationUnit TU = reinterpret_cast<CXTranslationUnit>(1);
28 EXPECT_EQ(CXError_InvalidArguments,
29 clang_createTranslationUnit2(nullptr, nullptr, &TU));
30 EXPECT_EQ(nullptr, TU);
36 CXVirtualFileOverlay VFO;
38 TestVFO(const char *Contents) : Contents(Contents) {
39 VFO = clang_VirtualFileOverlay_create(0);
42 void map(const char *VPath, const char *RPath) {
43 CXErrorCode Err = clang_VirtualFileOverlay_addFileMapping(VFO, VPath, RPath);
44 EXPECT_EQ(Err, CXError_Success);
47 void mapError(const char *VPath, const char *RPath, CXErrorCode ExpErr) {
48 CXErrorCode Err = clang_VirtualFileOverlay_addFileMapping(VFO, VPath, RPath);
49 EXPECT_EQ(Err, ExpErr);
56 clang_VirtualFileOverlay_writeToBuffer(VFO, 0, &BufPtr, &BufSize);
57 std::string BufStr(BufPtr, BufSize);
58 EXPECT_STREQ(Contents, BufStr.c_str());
61 clang_VirtualFileOverlay_dispose(VFO);
66 TEST(libclang, VirtualFileOverlay_Basic) {
67 const char *contents =
72 " 'type': 'directory',\n"
73 " 'name': \"/path/virtual\",\n"
77 " 'name': \"foo.h\",\n"
78 " 'external-contents': \"/real/foo.h\"\n"
85 T.map("/path/virtual/foo.h", "/real/foo.h");
88 TEST(libclang, VirtualFileOverlay_Unicode) {
89 const char *contents =
94 " 'type': 'directory',\n"
95 " 'name': \"/path/\\u266B\",\n"
99 " 'name': \"\\u2602.h\",\n"
100 " 'external-contents': \"/real/\\u2602.h\"\n"
107 T.map("/path/♫/☂.h", "/real/☂.h");
110 TEST(libclang, VirtualFileOverlay_InvalidArgs) {
112 T.mapError("/path/./virtual/../foo.h", "/real/foo.h",
113 CXError_InvalidArguments);
116 TEST(libclang, VirtualFileOverlay_RemapDirectories) {
117 const char *contents =
122 " 'type': 'directory',\n"
123 " 'name': \"/another/dir\",\n"
127 " 'name': \"foo2.h\",\n"
128 " 'external-contents': \"/real/foo2.h\"\n"
133 " 'type': 'directory',\n"
134 " 'name': \"/path/virtual/dir\",\n"
138 " 'name': \"foo1.h\",\n"
139 " 'external-contents': \"/real/foo1.h\"\n"
143 " 'name': \"foo3.h\",\n"
144 " 'external-contents': \"/real/foo3.h\"\n"
147 " 'type': 'directory',\n"
148 " 'name': \"in/subdir\",\n"
152 " 'name': \"foo4.h\",\n"
153 " 'external-contents': \"/real/foo4.h\"\n"
162 T.map("/path/virtual/dir/foo1.h", "/real/foo1.h");
163 T.map("/another/dir/foo2.h", "/real/foo2.h");
164 T.map("/path/virtual/dir/foo3.h", "/real/foo3.h");
165 T.map("/path/virtual/dir/in/subdir/foo4.h", "/real/foo4.h");
168 TEST(libclang, VirtualFileOverlay_CaseInsensitive) {
169 const char *contents =
172 " 'case-sensitive': 'false',\n"
175 " 'type': 'directory',\n"
176 " 'name': \"/path/virtual\",\n"
180 " 'name': \"foo.h\",\n"
181 " 'external-contents': \"/real/foo.h\"\n"
188 T.map("/path/virtual/foo.h", "/real/foo.h");
189 clang_VirtualFileOverlay_setCaseSensitivity(T.VFO, false);
192 TEST(libclang, VirtualFileOverlay_SharedPrefix) {
193 const char *contents =
198 " 'type': 'directory',\n"
199 " 'name': \"/path/foo\",\n"
203 " 'name': \"bar\",\n"
204 " 'external-contents': \"/real/bar\"\n"
208 " 'name': \"bar.h\",\n"
209 " 'external-contents': \"/real/bar.h\"\n"
214 " 'type': 'directory',\n"
215 " 'name': \"/path/foobar\",\n"
219 " 'name': \"baz.h\",\n"
220 " 'external-contents': \"/real/baz.h\"\n"
225 " 'type': 'directory',\n"
226 " 'name': \"/path\",\n"
230 " 'name': \"foobarbaz.h\",\n"
231 " 'external-contents': \"/real/foobarbaz.h\"\n"
238 T.map("/path/foo/bar.h", "/real/bar.h");
239 T.map("/path/foo/bar", "/real/bar");
240 T.map("/path/foobar/baz.h", "/real/baz.h");
241 T.map("/path/foobarbaz.h", "/real/foobarbaz.h");
244 TEST(libclang, VirtualFileOverlay_AdjacentDirectory) {
245 const char *contents =
250 " 'type': 'directory',\n"
251 " 'name': \"/path/dir1\",\n"
255 " 'name': \"foo.h\",\n"
256 " 'external-contents': \"/real/foo.h\"\n"
259 " 'type': 'directory',\n"
260 " 'name': \"subdir\",\n"
264 " 'name': \"bar.h\",\n"
265 " 'external-contents': \"/real/bar.h\"\n"
272 " 'type': 'directory',\n"
273 " 'name': \"/path/dir2\",\n"
277 " 'name': \"baz.h\",\n"
278 " 'external-contents': \"/real/baz.h\"\n"
285 T.map("/path/dir1/foo.h", "/real/foo.h");
286 T.map("/path/dir1/subdir/bar.h", "/real/bar.h");
287 T.map("/path/dir2/baz.h", "/real/baz.h");
290 TEST(libclang, VirtualFileOverlay_TopLevel) {
291 const char *contents =
296 " 'type': 'directory',\n"
301 " 'name': \"foo.h\",\n"
302 " 'external-contents': \"/real/foo.h\"\n"
309 T.map("/foo.h", "/real/foo.h");
312 TEST(libclang, ModuleMapDescriptor) {
313 const char *Contents =
314 "framework module TestFrame {\n"
315 " umbrella header \"TestFrame.h\"\n"
318 " module * { export * }\n"
321 CXModuleMapDescriptor MMD = clang_ModuleMapDescriptor_create(0);
323 clang_ModuleMapDescriptor_setFrameworkModuleName(MMD, "TestFrame");
324 clang_ModuleMapDescriptor_setUmbrellaHeader(MMD, "TestFrame.h");
328 clang_ModuleMapDescriptor_writeToBuffer(MMD, 0, &BufPtr, &BufSize);
329 std::string BufStr(BufPtr, BufSize);
330 EXPECT_STREQ(Contents, BufStr.c_str());
332 clang_ModuleMapDescriptor_dispose(MMD);