blob: caab4414e7a884de85d61b1ebc227d0ac9c92f6b [file] [log] [blame]
Argyrios Kyrtzidisd7711ec2011-12-21 16:56:29 +00001//===- unittests/Basic/SourceManagerTest.cpp ------ SourceManager tests ---===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "clang/Basic/SourceManager.h"
11#include "clang/Basic/FileManager.h"
12#include "clang/Basic/Diagnostic.h"
13#include "clang/Basic/LangOptions.h"
14#include "clang/Basic/TargetOptions.h"
15#include "clang/Basic/TargetInfo.h"
16#include "clang/Lex/ModuleLoader.h"
17#include "clang/Lex/HeaderSearch.h"
18#include "clang/Lex/Preprocessor.h"
19
20#include "gtest/gtest.h"
21
22using namespace llvm;
23using namespace clang;
24
25namespace {
26
27// The test fixture.
28class SourceManagerTest : public ::testing::Test {
29protected:
30 SourceManagerTest()
31 : FileMgr(FileMgrOpts),
32 DiagID(new DiagnosticIDs()),
33 Diags(DiagID, new IgnoringDiagConsumer()),
34 SourceMgr(Diags, FileMgr) {
35 TargetOpts.Triple = "x86_64-apple-darwin11.1.0";
36 Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
37 }
38
39 FileSystemOptions FileMgrOpts;
40 FileManager FileMgr;
41 llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
42 DiagnosticsEngine Diags;
43 SourceManager SourceMgr;
44 LangOptions LangOpts;
45 TargetOptions TargetOpts;
46 llvm::IntrusiveRefCntPtr<TargetInfo> Target;
47};
48
49class VoidModuleLoader : public ModuleLoader {
50 virtual Module *loadModule(SourceLocation ImportLoc, ModuleIdPath Path,
51 Module::NameVisibilityKind Visibility,
52 bool IsInclusionDirective) {
53 return 0;
54 }
55};
56
57TEST_F(SourceManagerTest, isBeforeInTranslationUnit) {
58 const char *source =
59 "#define M(x) [x]\n"
60 "M(foo)";
61 MemoryBuffer *buf = MemoryBuffer::getMemBuffer(source);
62 FileID mainFileID = SourceMgr.createMainFileIDForMemBuffer(buf);
63
64 VoidModuleLoader ModLoader;
65 HeaderSearch HeaderInfo(FileMgr, Diags);
66 Preprocessor PP(Diags, LangOpts,
67 Target.getPtr(),
68 SourceMgr, HeaderInfo, ModLoader,
69 /*IILookup =*/ 0,
70 /*OwnsHeaderSearch =*/false,
71 /*DelayInitialization =*/ false);
72 PP.EnterMainSourceFile();
73
74 std::vector<Token> toks;
75 while (1) {
76 Token tok;
77 PP.Lex(tok);
78 if (tok.is(tok::eof))
79 break;
80 toks.push_back(tok);
81 }
82
83 // Make sure we got the tokens that we expected.
84 ASSERT_EQ(3U, toks.size());
85 ASSERT_EQ(tok::l_square, toks[0].getKind());
86 ASSERT_EQ(tok::identifier, toks[1].getKind());
87 ASSERT_EQ(tok::r_square, toks[2].getKind());
88
89 SourceLocation lsqrLoc = toks[0].getLocation();
90 SourceLocation idLoc = toks[1].getLocation();
91 SourceLocation rsqrLoc = toks[2].getLocation();
92
93 SourceLocation macroExpStartLoc = SourceMgr.translateLineCol(mainFileID, 2, 1);
94 SourceLocation macroExpEndLoc = SourceMgr.translateLineCol(mainFileID, 2, 6);
95 ASSERT_TRUE(macroExpStartLoc.isFileID());
96 ASSERT_TRUE(macroExpEndLoc.isFileID());
97
98 llvm::SmallString<32> str;
99 ASSERT_EQ("M", PP.getSpelling(macroExpStartLoc, str));
100 ASSERT_EQ(")", PP.getSpelling(macroExpEndLoc, str));
101
102 EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(lsqrLoc, idLoc));
103 EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(idLoc, rsqrLoc));
104 EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(macroExpStartLoc, idLoc));
105 EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(idLoc, macroExpEndLoc));
106}
107
108} // anonymous namespace