18f944628SDmitri Gribenko //===- unittests/Support/SourceMgrTest.cpp - SourceMgr tests --------------===//
28f944628SDmitri Gribenko //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68f944628SDmitri Gribenko //
78f944628SDmitri Gribenko //===----------------------------------------------------------------------===//
88f944628SDmitri Gribenko 
98f944628SDmitri Gribenko #include "llvm/Support/SourceMgr.h"
108f944628SDmitri Gribenko #include "llvm/Support/MemoryBuffer.h"
118f944628SDmitri Gribenko #include "llvm/Support/raw_ostream.h"
128f944628SDmitri Gribenko #include "gtest/gtest.h"
138f944628SDmitri Gribenko 
148f944628SDmitri Gribenko using namespace llvm;
158f944628SDmitri Gribenko 
168f944628SDmitri Gribenko namespace {
178f944628SDmitri Gribenko 
188f944628SDmitri Gribenko class SourceMgrTest : public testing::Test {
198f944628SDmitri Gribenko public:
208f944628SDmitri Gribenko   SourceMgr SM;
218f944628SDmitri Gribenko   unsigned MainBufferID;
228f944628SDmitri Gribenko   std::string Output;
238f944628SDmitri Gribenko 
setMainBuffer(StringRef Text,StringRef BufferName)248f944628SDmitri Gribenko   void setMainBuffer(StringRef Text, StringRef BufferName) {
253560ff2cSRafael Espindola     std::unique_ptr<MemoryBuffer> MainBuffer =
263560ff2cSRafael Espindola         MemoryBuffer::getMemBuffer(Text, BufferName);
271961f14cSDavid Blaikie     MainBufferID = SM.AddNewSourceBuffer(std::move(MainBuffer), llvm::SMLoc());
288f944628SDmitri Gribenko   }
298f944628SDmitri Gribenko 
getLoc(unsigned Offset)308f944628SDmitri Gribenko   SMLoc getLoc(unsigned Offset) {
318f944628SDmitri Gribenko     return SMLoc::getFromPointer(
328f944628SDmitri Gribenko         SM.getMemoryBuffer(MainBufferID)->getBufferStart() + Offset);
338f944628SDmitri Gribenko   }
348f944628SDmitri Gribenko 
getRange(unsigned Offset,unsigned Length)358f944628SDmitri Gribenko   SMRange getRange(unsigned Offset, unsigned Length) {
368f944628SDmitri Gribenko     return SMRange(getLoc(Offset), getLoc(Offset + Length));
378f944628SDmitri Gribenko   }
388f944628SDmitri Gribenko 
printMessage(SMLoc Loc,SourceMgr::DiagKind Kind,const Twine & Msg,ArrayRef<SMRange> Ranges,ArrayRef<SMFixIt> FixIts)398f944628SDmitri Gribenko   void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
408f944628SDmitri Gribenko                     const Twine &Msg, ArrayRef<SMRange> Ranges,
418f944628SDmitri Gribenko                     ArrayRef<SMFixIt> FixIts) {
428f944628SDmitri Gribenko     raw_string_ostream OS(Output);
438f944628SDmitri Gribenko     SM.PrintMessage(OS, Loc, Kind, Msg, Ranges, FixIts);
448f944628SDmitri Gribenko   }
458f944628SDmitri Gribenko };
468f944628SDmitri Gribenko 
478f944628SDmitri Gribenko } // unnamed namespace
488f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,BasicError)498f944628SDmitri Gribenko TEST_F(SourceMgrTest, BasicError) {
508f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
518f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", None, None);
528f944628SDmitri Gribenko 
538f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
548f944628SDmitri Gribenko             "aaa bbb\n"
558f944628SDmitri Gribenko             "    ^\n",
568f944628SDmitri Gribenko             Output);
578f944628SDmitri Gribenko }
588f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,BasicWarning)598f944628SDmitri Gribenko TEST_F(SourceMgrTest, BasicWarning) {
608f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
618f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Warning, "message", None, None);
628f944628SDmitri Gribenko 
638f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: warning: message\n"
648f944628SDmitri Gribenko             "aaa bbb\n"
658f944628SDmitri Gribenko             "    ^\n",
668f944628SDmitri Gribenko             Output);
678f944628SDmitri Gribenko }
688f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,BasicRemark)6901104aeeSAdam Nemet TEST_F(SourceMgrTest, BasicRemark) {
7001104aeeSAdam Nemet   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
7101104aeeSAdam Nemet   printMessage(getLoc(4), SourceMgr::DK_Remark, "message", None, None);
7201104aeeSAdam Nemet 
7301104aeeSAdam Nemet   EXPECT_EQ("file.in:1:5: remark: message\n"
7401104aeeSAdam Nemet             "aaa bbb\n"
7501104aeeSAdam Nemet             "    ^\n",
7601104aeeSAdam Nemet             Output);
7701104aeeSAdam Nemet }
7801104aeeSAdam Nemet 
TEST_F(SourceMgrTest,BasicNote)798f944628SDmitri Gribenko TEST_F(SourceMgrTest, BasicNote) {
808f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
818f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Note, "message", None, None);
828f944628SDmitri Gribenko 
838f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: note: message\n"
848f944628SDmitri Gribenko             "aaa bbb\n"
858f944628SDmitri Gribenko             "    ^\n",
868f944628SDmitri Gribenko             Output);
878f944628SDmitri Gribenko }
888f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,LocationAtEndOfLine)898f944628SDmitri Gribenko TEST_F(SourceMgrTest, LocationAtEndOfLine) {
908f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
918f944628SDmitri Gribenko   printMessage(getLoc(6), SourceMgr::DK_Error, "message", None, None);
928f944628SDmitri Gribenko 
938f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:7: error: message\n"
948f944628SDmitri Gribenko             "aaa bbb\n"
958f944628SDmitri Gribenko             "      ^\n",
968f944628SDmitri Gribenko             Output);
978f944628SDmitri Gribenko }
988f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,LocationAtNewline)998f944628SDmitri Gribenko TEST_F(SourceMgrTest, LocationAtNewline) {
1008f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
1018f944628SDmitri Gribenko   printMessage(getLoc(7), SourceMgr::DK_Error, "message", None, None);
1028f944628SDmitri Gribenko 
1038f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:8: error: message\n"
1048f944628SDmitri Gribenko             "aaa bbb\n"
1058f944628SDmitri Gribenko             "       ^\n",
1068f944628SDmitri Gribenko             Output);
1078f944628SDmitri Gribenko }
1088f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,LocationAtEmptyBuffer)10954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEmptyBuffer) {
11054fe208aSGraydon Hoare   setMainBuffer("", "file.in");
11154fe208aSGraydon Hoare   printMessage(getLoc(0), SourceMgr::DK_Error, "message", None, None);
11254fe208aSGraydon Hoare 
11354fe208aSGraydon Hoare   EXPECT_EQ("file.in:1:1: error: message\n"
11454fe208aSGraydon Hoare             "\n"
11554fe208aSGraydon Hoare             "^\n",
11654fe208aSGraydon Hoare             Output);
11754fe208aSGraydon Hoare }
11854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationJustOnSoleNewline)11954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationJustOnSoleNewline) {
12054fe208aSGraydon Hoare   setMainBuffer("\n", "file.in");
12154fe208aSGraydon Hoare   printMessage(getLoc(0), SourceMgr::DK_Error, "message", None, None);
12254fe208aSGraydon Hoare 
12354fe208aSGraydon Hoare   EXPECT_EQ("file.in:1:1: error: message\n"
12454fe208aSGraydon Hoare             "\n"
12554fe208aSGraydon Hoare             "^\n",
12654fe208aSGraydon Hoare             Output);
12754fe208aSGraydon Hoare }
12854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationJustAfterSoleNewline)12954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationJustAfterSoleNewline) {
13054fe208aSGraydon Hoare   setMainBuffer("\n", "file.in");
13154fe208aSGraydon Hoare   printMessage(getLoc(1), SourceMgr::DK_Error, "message", None, None);
13254fe208aSGraydon Hoare 
13354fe208aSGraydon Hoare   EXPECT_EQ("file.in:2:1: error: message\n"
13454fe208aSGraydon Hoare             "\n"
13554fe208aSGraydon Hoare             "^\n",
13654fe208aSGraydon Hoare             Output);
13754fe208aSGraydon Hoare }
13854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationJustAfterNonNewline)13954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationJustAfterNonNewline) {
14054fe208aSGraydon Hoare   setMainBuffer("123", "file.in");
14154fe208aSGraydon Hoare   printMessage(getLoc(3), SourceMgr::DK_Error, "message", None, None);
14254fe208aSGraydon Hoare 
14354fe208aSGraydon Hoare   EXPECT_EQ("file.in:1:4: error: message\n"
14454fe208aSGraydon Hoare             "123\n"
14554fe208aSGraydon Hoare             "   ^\n",
14654fe208aSGraydon Hoare             Output);
14754fe208aSGraydon Hoare }
14854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationOnFirstLineOfMultiline)14954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationOnFirstLineOfMultiline) {
15054fe208aSGraydon Hoare   setMainBuffer("1234\n6789\n", "file.in");
15154fe208aSGraydon Hoare   printMessage(getLoc(3), SourceMgr::DK_Error, "message", None, None);
15254fe208aSGraydon Hoare 
15354fe208aSGraydon Hoare   EXPECT_EQ("file.in:1:4: error: message\n"
15454fe208aSGraydon Hoare             "1234\n"
15554fe208aSGraydon Hoare             "   ^\n",
15654fe208aSGraydon Hoare             Output);
15754fe208aSGraydon Hoare }
15854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationOnEOLOfFirstLineOfMultiline)15954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationOnEOLOfFirstLineOfMultiline) {
16054fe208aSGraydon Hoare   setMainBuffer("1234\n6789\n", "file.in");
16154fe208aSGraydon Hoare   printMessage(getLoc(4), SourceMgr::DK_Error, "message", None, None);
16254fe208aSGraydon Hoare 
16354fe208aSGraydon Hoare   EXPECT_EQ("file.in:1:5: error: message\n"
16454fe208aSGraydon Hoare             "1234\n"
16554fe208aSGraydon Hoare             "    ^\n",
16654fe208aSGraydon Hoare             Output);
16754fe208aSGraydon Hoare }
16854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationOnSecondLineOfMultiline)16954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationOnSecondLineOfMultiline) {
17054fe208aSGraydon Hoare   setMainBuffer("1234\n6789\n", "file.in");
17154fe208aSGraydon Hoare   printMessage(getLoc(5), SourceMgr::DK_Error, "message", None, None);
17254fe208aSGraydon Hoare 
17354fe208aSGraydon Hoare   EXPECT_EQ("file.in:2:1: error: message\n"
17454fe208aSGraydon Hoare             "6789\n"
17554fe208aSGraydon Hoare             "^\n",
17654fe208aSGraydon Hoare             Output);
17754fe208aSGraydon Hoare }
17854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationOnSecondLineOfMultilineNoSecondEOL)17954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationOnSecondLineOfMultilineNoSecondEOL) {
18054fe208aSGraydon Hoare   setMainBuffer("1234\n6789", "file.in");
18154fe208aSGraydon Hoare   printMessage(getLoc(5), SourceMgr::DK_Error, "message", None, None);
18254fe208aSGraydon Hoare 
18354fe208aSGraydon Hoare   EXPECT_EQ("file.in:2:1: error: message\n"
18454fe208aSGraydon Hoare             "6789\n"
18554fe208aSGraydon Hoare             "^\n",
18654fe208aSGraydon Hoare             Output);
18754fe208aSGraydon Hoare }
18854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationOnEOLOfSecondSecondLineOfMultiline)18954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationOnEOLOfSecondSecondLineOfMultiline) {
19054fe208aSGraydon Hoare   setMainBuffer("1234\n6789\n", "file.in");
19154fe208aSGraydon Hoare   printMessage(getLoc(9), SourceMgr::DK_Error, "message", None, None);
19254fe208aSGraydon Hoare 
19354fe208aSGraydon Hoare   EXPECT_EQ("file.in:2:5: error: message\n"
19454fe208aSGraydon Hoare             "6789\n"
19554fe208aSGraydon Hoare             "    ^\n",
19654fe208aSGraydon Hoare             Output);
19754fe208aSGraydon Hoare }
19854fe208aSGraydon Hoare 
19954fe208aSGraydon Hoare #define STRING_LITERAL_253_BYTES \
20054fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20154fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20254fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20354fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20454fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20554fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20654fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20754fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20854fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
20954fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
21054fe208aSGraydon Hoare   "1234567890\n1234567890\n" \
21154fe208aSGraydon Hoare   "1234567890\n"
21254fe208aSGraydon Hoare 
21354fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
21454fe208aSGraydon Hoare // 255-byte buffer tests
21554fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
21654fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf255ByteBuffer)21754fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf255ByteBuffer) {
21854fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
21954fe208aSGraydon Hoare                 "12"                       // + 2 = 255 bytes
22054fe208aSGraydon Hoare                 , "file.in");
22154fe208aSGraydon Hoare   printMessage(getLoc(253), SourceMgr::DK_Error, "message", None, None);
22254fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:1: error: message\n"
22354fe208aSGraydon Hoare             "12\n"
22454fe208aSGraydon Hoare             "^\n",
22554fe208aSGraydon Hoare             Output);
22654fe208aSGraydon Hoare }
22754fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf255ByteBuffer)22854fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf255ByteBuffer) {
22954fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
23054fe208aSGraydon Hoare                 "12"                       // + 2 = 255 bytes
23154fe208aSGraydon Hoare                 , "file.in");
23254fe208aSGraydon Hoare   printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
23354fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:2: error: message\n"
23454fe208aSGraydon Hoare             "12\n"
23554fe208aSGraydon Hoare             " ^\n",
23654fe208aSGraydon Hoare             Output);
23754fe208aSGraydon Hoare }
23854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf255ByteBuffer)23954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf255ByteBuffer) {
24054fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
24154fe208aSGraydon Hoare                 "12"                       // + 2 = 255 bytes
24254fe208aSGraydon Hoare                 , "file.in");
24354fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
24454fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:3: error: message\n"
24554fe208aSGraydon Hoare             "12\n"
24654fe208aSGraydon Hoare             "  ^\n",
24754fe208aSGraydon Hoare             Output);
24854fe208aSGraydon Hoare }
24954fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf255ByteBufferEndingInNewline)25054fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf255ByteBufferEndingInNewline) {
25154fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
25254fe208aSGraydon Hoare                 "1\n"                      // + 2 = 255 bytes
25354fe208aSGraydon Hoare                 , "file.in");
25454fe208aSGraydon Hoare   printMessage(getLoc(253), SourceMgr::DK_Error, "message", None, None);
25554fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:1: error: message\n"
25654fe208aSGraydon Hoare             "1\n"
25754fe208aSGraydon Hoare             "^\n",
25854fe208aSGraydon Hoare             Output);
25954fe208aSGraydon Hoare }
26054fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf255ByteBufferEndingInNewline)26154fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf255ByteBufferEndingInNewline) {
26254fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
26354fe208aSGraydon Hoare                 "1\n"                      // + 2 = 255 bytes
26454fe208aSGraydon Hoare                 , "file.in");
26554fe208aSGraydon Hoare   printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
26654fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:2: error: message\n"
26754fe208aSGraydon Hoare             "1\n"
26854fe208aSGraydon Hoare             " ^\n",
26954fe208aSGraydon Hoare             Output);
27054fe208aSGraydon Hoare }
27154fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf255ByteBufferEndingInNewline)27254fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf255ByteBufferEndingInNewline) {
27354fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
27454fe208aSGraydon Hoare                 "1\n"                      // + 2 = 255 bytes
27554fe208aSGraydon Hoare                 , "file.in");
27654fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
27754fe208aSGraydon Hoare   EXPECT_EQ("file.in:25:1: error: message\n"
27854fe208aSGraydon Hoare             "\n"
27954fe208aSGraydon Hoare             "^\n",
28054fe208aSGraydon Hoare             Output);
28154fe208aSGraydon Hoare }
28254fe208aSGraydon Hoare 
28354fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
28454fe208aSGraydon Hoare // 256-byte buffer tests
28554fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
28654fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf256ByteBuffer)28754fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf256ByteBuffer) {
28854fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
28954fe208aSGraydon Hoare                 "123"                      // + 3 = 256 bytes
29054fe208aSGraydon Hoare                 , "file.in");
29154fe208aSGraydon Hoare   printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
29254fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:2: error: message\n"
29354fe208aSGraydon Hoare             "123\n"
29454fe208aSGraydon Hoare             " ^\n",
29554fe208aSGraydon Hoare             Output);
29654fe208aSGraydon Hoare }
29754fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf256ByteBuffer)29854fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf256ByteBuffer) {
29954fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
30054fe208aSGraydon Hoare                 "123"                      // + 3 = 256 bytes
30154fe208aSGraydon Hoare                 , "file.in");
30254fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
30354fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:3: error: message\n"
30454fe208aSGraydon Hoare             "123\n"
30554fe208aSGraydon Hoare             "  ^\n",
30654fe208aSGraydon Hoare             Output);
30754fe208aSGraydon Hoare }
30854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf256ByteBuffer)30954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf256ByteBuffer) {
31054fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
31154fe208aSGraydon Hoare                 "123"                      // + 3 = 256 bytes
31254fe208aSGraydon Hoare                 , "file.in");
31354fe208aSGraydon Hoare   printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
31454fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:4: error: message\n"
31554fe208aSGraydon Hoare             "123\n"
31654fe208aSGraydon Hoare             "   ^\n",
31754fe208aSGraydon Hoare             Output);
31854fe208aSGraydon Hoare }
31954fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf256ByteBufferEndingInNewline)32054fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf256ByteBufferEndingInNewline) {
32154fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
32254fe208aSGraydon Hoare                 "12\n"                     // + 3 = 256 bytes
32354fe208aSGraydon Hoare                 , "file.in");
32454fe208aSGraydon Hoare   printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
32554fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:2: error: message\n"
32654fe208aSGraydon Hoare             "12\n"
32754fe208aSGraydon Hoare             " ^\n",
32854fe208aSGraydon Hoare             Output);
32954fe208aSGraydon Hoare }
33054fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf256ByteBufferEndingInNewline)33154fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf256ByteBufferEndingInNewline) {
33254fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
33354fe208aSGraydon Hoare                 "12\n"                     // + 3 = 256 bytes
33454fe208aSGraydon Hoare                 , "file.in");
33554fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
33654fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:3: error: message\n"
33754fe208aSGraydon Hoare             "12\n"
33854fe208aSGraydon Hoare             "  ^\n",
33954fe208aSGraydon Hoare             Output);
34054fe208aSGraydon Hoare }
34154fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf256ByteBufferEndingInNewline)34254fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf256ByteBufferEndingInNewline) {
34354fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
34454fe208aSGraydon Hoare                 "12\n"                     // + 3 = 256 bytes
34554fe208aSGraydon Hoare                 , "file.in");
34654fe208aSGraydon Hoare   printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
34754fe208aSGraydon Hoare   EXPECT_EQ("file.in:25:1: error: message\n"
34854fe208aSGraydon Hoare             "\n"
34954fe208aSGraydon Hoare             "^\n",
35054fe208aSGraydon Hoare             Output);
35154fe208aSGraydon Hoare }
35254fe208aSGraydon Hoare 
35354fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
35454fe208aSGraydon Hoare // 257-byte buffer tests
35554fe208aSGraydon Hoare //===----------------------------------------------------------------------===//
35654fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf257ByteBuffer)35754fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf257ByteBuffer) {
35854fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
35954fe208aSGraydon Hoare                 "1234"                     // + 4 = 257 bytes
36054fe208aSGraydon Hoare                 , "file.in");
36154fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
36254fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:3: error: message\n"
36354fe208aSGraydon Hoare             "1234\n"
36454fe208aSGraydon Hoare             "  ^\n",
36554fe208aSGraydon Hoare             Output);
36654fe208aSGraydon Hoare }
36754fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf257ByteBuffer)36854fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf257ByteBuffer) {
36954fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
37054fe208aSGraydon Hoare                 "1234"                     // + 4 = 257 bytes
37154fe208aSGraydon Hoare                 , "file.in");
37254fe208aSGraydon Hoare   printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
37354fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:4: error: message\n"
37454fe208aSGraydon Hoare             "1234\n"
37554fe208aSGraydon Hoare             "   ^\n",
37654fe208aSGraydon Hoare             Output);
37754fe208aSGraydon Hoare }
37854fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf257ByteBuffer)37954fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf257ByteBuffer) {
38054fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
38154fe208aSGraydon Hoare                 "1234"                     // + 4 = 257 bytes
38254fe208aSGraydon Hoare                 , "file.in");
38354fe208aSGraydon Hoare   printMessage(getLoc(257), SourceMgr::DK_Error, "message", None, None);
38454fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:5: error: message\n"
38554fe208aSGraydon Hoare             "1234\n"
38654fe208aSGraydon Hoare             "    ^\n",
38754fe208aSGraydon Hoare             Output);
38854fe208aSGraydon Hoare }
38954fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationBeforeEndOf257ByteBufferEndingInNewline)39054fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationBeforeEndOf257ByteBufferEndingInNewline) {
39154fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
39254fe208aSGraydon Hoare                 "123\n"                    // + 4 = 257 bytes
39354fe208aSGraydon Hoare                 , "file.in");
39454fe208aSGraydon Hoare   printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
39554fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:3: error: message\n"
39654fe208aSGraydon Hoare             "123\n"
39754fe208aSGraydon Hoare             "  ^\n",
39854fe208aSGraydon Hoare             Output);
39954fe208aSGraydon Hoare }
40054fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationAtEndOf257ByteBufferEndingInNewline)40154fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationAtEndOf257ByteBufferEndingInNewline) {
40254fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
40354fe208aSGraydon Hoare                 "123\n"                    // + 4 = 257 bytes
40454fe208aSGraydon Hoare                 , "file.in");
40554fe208aSGraydon Hoare   printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
40654fe208aSGraydon Hoare   EXPECT_EQ("file.in:24:4: error: message\n"
40754fe208aSGraydon Hoare             "123\n"
40854fe208aSGraydon Hoare             "   ^\n",
40954fe208aSGraydon Hoare             Output);
41054fe208aSGraydon Hoare }
41154fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,LocationPastEndOf257ByteBufferEndingInNewline)41254fe208aSGraydon Hoare TEST_F(SourceMgrTest, LocationPastEndOf257ByteBufferEndingInNewline) {
41354fe208aSGraydon Hoare   setMainBuffer(STRING_LITERAL_253_BYTES   // first 253 bytes
41454fe208aSGraydon Hoare                 "123\n"                    // + 4 = 257 bytes
41554fe208aSGraydon Hoare                 , "file.in");
41654fe208aSGraydon Hoare   printMessage(getLoc(257), SourceMgr::DK_Error, "message", None, None);
41754fe208aSGraydon Hoare   EXPECT_EQ("file.in:25:1: error: message\n"
41854fe208aSGraydon Hoare             "\n"
41954fe208aSGraydon Hoare             "^\n",
42054fe208aSGraydon Hoare             Output);
42154fe208aSGraydon Hoare }
42254fe208aSGraydon Hoare 
TEST_F(SourceMgrTest,BasicRange)4238f944628SDmitri Gribenko TEST_F(SourceMgrTest, BasicRange) {
4248f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
4258f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 3), None);
4268f944628SDmitri Gribenko 
4278f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4288f944628SDmitri Gribenko             "aaa bbb\n"
4298f944628SDmitri Gribenko             "    ^~~\n",
4308f944628SDmitri Gribenko             Output);
4318f944628SDmitri Gribenko }
4328f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,RangeWithTab)4338f944628SDmitri Gribenko TEST_F(SourceMgrTest, RangeWithTab) {
4348f944628SDmitri Gribenko   setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
4358f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(3, 3), None);
4368f944628SDmitri Gribenko 
4378f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4388f944628SDmitri Gribenko             "aaa     bbb\n"
4398f944628SDmitri Gribenko             "   ~~~~~^~\n",
4408f944628SDmitri Gribenko             Output);
4418f944628SDmitri Gribenko }
4428f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,MultiLineRange)4438f944628SDmitri Gribenko TEST_F(SourceMgrTest, MultiLineRange) {
4448f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
4458f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 7), None);
4468f944628SDmitri Gribenko 
4478f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4488f944628SDmitri Gribenko             "aaa bbb\n"
4498f944628SDmitri Gribenko             "    ^~~\n",
4508f944628SDmitri Gribenko             Output);
4518f944628SDmitri Gribenko }
4528f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,MultipleRanges)4538f944628SDmitri Gribenko TEST_F(SourceMgrTest, MultipleRanges) {
4548f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
4558f944628SDmitri Gribenko   SMRange Ranges[] = { getRange(0, 3), getRange(4, 3) };
4568f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
4578f944628SDmitri Gribenko 
4588f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4598f944628SDmitri Gribenko             "aaa bbb\n"
4608f944628SDmitri Gribenko             "~~~ ^~~\n",
4618f944628SDmitri Gribenko             Output);
4628f944628SDmitri Gribenko }
4638f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,OverlappingRanges)4648f944628SDmitri Gribenko TEST_F(SourceMgrTest, OverlappingRanges) {
4658f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
4668f944628SDmitri Gribenko   SMRange Ranges[] = { getRange(0, 3), getRange(2, 4) };
4678f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
4688f944628SDmitri Gribenko 
4698f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4708f944628SDmitri Gribenko             "aaa bbb\n"
4718f944628SDmitri Gribenko             "~~~~^~\n",
4728f944628SDmitri Gribenko             Output);
4738f944628SDmitri Gribenko }
4748f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,BasicFixit)4758f944628SDmitri Gribenko TEST_F(SourceMgrTest, BasicFixit) {
4768f944628SDmitri Gribenko   setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
4778f944628SDmitri Gribenko   printMessage(getLoc(4), SourceMgr::DK_Error, "message", None,
4788f944628SDmitri Gribenko                makeArrayRef(SMFixIt(getRange(4, 3), "zzz")));
4798f944628SDmitri Gribenko 
4808f944628SDmitri Gribenko   EXPECT_EQ("file.in:1:5: error: message\n"
4818f944628SDmitri Gribenko             "aaa bbb\n"
4828f944628SDmitri Gribenko             "    ^~~\n"
4838f944628SDmitri Gribenko             "    zzz\n",
4848f944628SDmitri Gribenko             Output);
4858f944628SDmitri Gribenko }
4868f944628SDmitri Gribenko 
TEST_F(SourceMgrTest,FixitForTab)48778fe2ba3SDmitri Gribenko TEST_F(SourceMgrTest, FixitForTab) {
48878fe2ba3SDmitri Gribenko   setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
48978fe2ba3SDmitri Gribenko   printMessage(getLoc(3), SourceMgr::DK_Error, "message", None,
49078fe2ba3SDmitri Gribenko                makeArrayRef(SMFixIt(getRange(3, 1), "zzz")));
49178fe2ba3SDmitri Gribenko 
49278fe2ba3SDmitri Gribenko   EXPECT_EQ("file.in:1:4: error: message\n"
49378fe2ba3SDmitri Gribenko             "aaa     bbb\n"
49478fe2ba3SDmitri Gribenko             "   ^^^^^\n"
49578fe2ba3SDmitri Gribenko             "   zzz\n",
49678fe2ba3SDmitri Gribenko             Output);
49778fe2ba3SDmitri Gribenko }
49878fe2ba3SDmitri Gribenko 
499