SourceMgrTest.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //===- unittests/Support/SourceMgrTest.cpp - SourceMgr 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. #include "llvm/Support/SourceMgr.h"
  10. #include "llvm/Support/MemoryBuffer.h"
  11. #include "llvm/Support/raw_ostream.h"
  12. #include "gtest/gtest.h"
  13. using namespace llvm;
  14. namespace {
  15. class SourceMgrTest : public testing::Test {
  16. public:
  17. SourceMgr SM;
  18. unsigned MainBufferID;
  19. std::string Output;
  20. void setMainBuffer(StringRef Text, StringRef BufferName) {
  21. std::unique_ptr<MemoryBuffer> MainBuffer =
  22. MemoryBuffer::getMemBuffer(Text, BufferName);
  23. MainBufferID = SM.AddNewSourceBuffer(std::move(MainBuffer), llvm::SMLoc());
  24. }
  25. SMLoc getLoc(unsigned Offset) {
  26. return SMLoc::getFromPointer(
  27. SM.getMemoryBuffer(MainBufferID)->getBufferStart() + Offset);
  28. }
  29. SMRange getRange(unsigned Offset, unsigned Length) {
  30. return SMRange(getLoc(Offset), getLoc(Offset + Length));
  31. }
  32. void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
  33. const Twine &Msg, ArrayRef<SMRange> Ranges,
  34. ArrayRef<SMFixIt> FixIts) {
  35. raw_string_ostream OS(Output);
  36. SM.PrintMessage(OS, Loc, Kind, Msg, Ranges, FixIts);
  37. }
  38. };
  39. } // unnamed namespace
  40. TEST_F(SourceMgrTest, BasicError) {
  41. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  42. printMessage(getLoc(4), SourceMgr::DK_Error, "message", None, None);
  43. EXPECT_EQ("file.in:1:5: error: message\n"
  44. "aaa bbb\n"
  45. " ^\n",
  46. Output);
  47. }
  48. TEST_F(SourceMgrTest, BasicWarning) {
  49. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  50. printMessage(getLoc(4), SourceMgr::DK_Warning, "message", None, None);
  51. EXPECT_EQ("file.in:1:5: warning: message\n"
  52. "aaa bbb\n"
  53. " ^\n",
  54. Output);
  55. }
  56. TEST_F(SourceMgrTest, BasicNote) {
  57. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  58. printMessage(getLoc(4), SourceMgr::DK_Note, "message", None, None);
  59. EXPECT_EQ("file.in:1:5: note: message\n"
  60. "aaa bbb\n"
  61. " ^\n",
  62. Output);
  63. }
  64. TEST_F(SourceMgrTest, LocationAtEndOfLine) {
  65. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  66. printMessage(getLoc(6), SourceMgr::DK_Error, "message", None, None);
  67. EXPECT_EQ("file.in:1:7: error: message\n"
  68. "aaa bbb\n"
  69. " ^\n",
  70. Output);
  71. }
  72. TEST_F(SourceMgrTest, LocationAtNewline) {
  73. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  74. printMessage(getLoc(7), SourceMgr::DK_Error, "message", None, None);
  75. EXPECT_EQ("file.in:1:8: error: message\n"
  76. "aaa bbb\n"
  77. " ^\n",
  78. Output);
  79. }
  80. TEST_F(SourceMgrTest, BasicRange) {
  81. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  82. printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 3), None);
  83. EXPECT_EQ("file.in:1:5: error: message\n"
  84. "aaa bbb\n"
  85. " ^~~\n",
  86. Output);
  87. }
  88. TEST_F(SourceMgrTest, RangeWithTab) {
  89. setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
  90. printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(3, 3), None);
  91. EXPECT_EQ("file.in:1:5: error: message\n"
  92. "aaa bbb\n"
  93. " ~~~~~^~\n",
  94. Output);
  95. }
  96. TEST_F(SourceMgrTest, MultiLineRange) {
  97. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  98. printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 7), None);
  99. EXPECT_EQ("file.in:1:5: error: message\n"
  100. "aaa bbb\n"
  101. " ^~~\n",
  102. Output);
  103. }
  104. TEST_F(SourceMgrTest, MultipleRanges) {
  105. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  106. SMRange Ranges[] = { getRange(0, 3), getRange(4, 3) };
  107. printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
  108. EXPECT_EQ("file.in:1:5: error: message\n"
  109. "aaa bbb\n"
  110. "~~~ ^~~\n",
  111. Output);
  112. }
  113. TEST_F(SourceMgrTest, OverlappingRanges) {
  114. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  115. SMRange Ranges[] = { getRange(0, 3), getRange(2, 4) };
  116. printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
  117. EXPECT_EQ("file.in:1:5: error: message\n"
  118. "aaa bbb\n"
  119. "~~~~^~\n",
  120. Output);
  121. }
  122. TEST_F(SourceMgrTest, BasicFixit) {
  123. setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
  124. printMessage(getLoc(4), SourceMgr::DK_Error, "message", None,
  125. makeArrayRef(SMFixIt(getRange(4, 3), "zzz")));
  126. EXPECT_EQ("file.in:1:5: error: message\n"
  127. "aaa bbb\n"
  128. " ^~~\n"
  129. " zzz\n",
  130. Output);
  131. }
  132. TEST_F(SourceMgrTest, FixitForTab) {
  133. setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
  134. printMessage(getLoc(3), SourceMgr::DK_Error, "message", None,
  135. makeArrayRef(SMFixIt(getRange(3, 1), "zzz")));
  136. EXPECT_EQ("file.in:1:4: error: message\n"
  137. "aaa bbb\n"
  138. " ^^^^^\n"
  139. " zzz\n",
  140. Output);
  141. }