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