xref: /llvm-project/llvm/unittests/Support/LineIteratorTest.cpp (revision f2b7d9f7faa2788e362a91761a1624fb6b020851)
1f8c5281cSChandler Carruth //===- LineIterator.cpp - Unit tests --------------------------------------===//
2f8c5281cSChandler Carruth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f8c5281cSChandler Carruth //
7f8c5281cSChandler Carruth //===----------------------------------------------------------------------===//
8f8c5281cSChandler Carruth 
9f8c5281cSChandler Carruth #include "llvm/Support/LineIterator.h"
10f8c5281cSChandler Carruth #include "llvm/Support/MemoryBuffer.h"
11f8c5281cSChandler Carruth #include "gtest/gtest.h"
12f8c5281cSChandler Carruth 
13f8c5281cSChandler Carruth using namespace llvm;
14f8c5281cSChandler Carruth using namespace llvm::sys;
15f8c5281cSChandler Carruth 
16f8c5281cSChandler Carruth namespace {
17f8c5281cSChandler Carruth 
TEST(LineIteratorTest,Basic)18f8c5281cSChandler Carruth TEST(LineIteratorTest, Basic) {
19dfbe3d6bSDavid Blaikie   std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("line 1\n"
20f8c5281cSChandler Carruth                                                                     "line 2\n"
21dfbe3d6bSDavid Blaikie                                                                     "line 3");
22f8c5281cSChandler Carruth 
23f8c5281cSChandler Carruth   line_iterator I = line_iterator(*Buffer), E;
24f8c5281cSChandler Carruth 
25f8c5281cSChandler Carruth   EXPECT_FALSE(I.is_at_eof());
26f8c5281cSChandler Carruth   EXPECT_NE(E, I);
27f8c5281cSChandler Carruth 
28f8c5281cSChandler Carruth   EXPECT_EQ("line 1", *I);
29f8c5281cSChandler Carruth   EXPECT_EQ(1, I.line_number());
30f8c5281cSChandler Carruth   ++I;
31f8c5281cSChandler Carruth   EXPECT_EQ("line 2", *I);
32f8c5281cSChandler Carruth   EXPECT_EQ(2, I.line_number());
33f8c5281cSChandler Carruth   ++I;
34f8c5281cSChandler Carruth   EXPECT_EQ("line 3", *I);
35f8c5281cSChandler Carruth   EXPECT_EQ(3, I.line_number());
36f8c5281cSChandler Carruth   ++I;
37f8c5281cSChandler Carruth 
38f8c5281cSChandler Carruth   EXPECT_TRUE(I.is_at_eof());
39f8c5281cSChandler Carruth   EXPECT_EQ(E, I);
40f8c5281cSChandler Carruth }
41f8c5281cSChandler Carruth 
TEST(LineIteratorTest,Ref)42*f2b7d9f7SDuncan P. N. Exon Smith TEST(LineIteratorTest, Ref) {
43*f2b7d9f7SDuncan P. N. Exon Smith   std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("line 1\n"
44*f2b7d9f7SDuncan P. N. Exon Smith                                                                     "line 2\n"
45*f2b7d9f7SDuncan P. N. Exon Smith                                                                     "line 3");
46*f2b7d9f7SDuncan P. N. Exon Smith 
47*f2b7d9f7SDuncan P. N. Exon Smith   line_iterator I = line_iterator(Buffer->getMemBufferRef()), E;
48*f2b7d9f7SDuncan P. N. Exon Smith 
49*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_FALSE(I.is_at_eof());
50*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_NE(E, I);
51*f2b7d9f7SDuncan P. N. Exon Smith 
52*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ("line 1", *I);
53*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ(1, I.line_number());
54*f2b7d9f7SDuncan P. N. Exon Smith   ++I;
55*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ("line 2", *I);
56*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ(2, I.line_number());
57*f2b7d9f7SDuncan P. N. Exon Smith   ++I;
58*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ("line 3", *I);
59*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ(3, I.line_number());
60*f2b7d9f7SDuncan P. N. Exon Smith   ++I;
61*f2b7d9f7SDuncan P. N. Exon Smith 
62*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_TRUE(I.is_at_eof());
63*f2b7d9f7SDuncan P. N. Exon Smith   EXPECT_EQ(E, I);
64*f2b7d9f7SDuncan P. N. Exon Smith }
65*f2b7d9f7SDuncan P. N. Exon Smith 
TEST(LineIteratorTest,CommentAndBlankSkipping)6669fe4e98SJustin Bogner TEST(LineIteratorTest, CommentAndBlankSkipping) {
6756440fd8SAhmed Charles   std::unique_ptr<MemoryBuffer> Buffer(
6856440fd8SAhmed Charles       MemoryBuffer::getMemBuffer("line 1\n"
69f8c5281cSChandler Carruth                                  "line 2\n"
70f8c5281cSChandler Carruth                                  "# Comment 1\n"
7169fe4e98SJustin Bogner                                  "\n"
7269fe4e98SJustin Bogner                                  "line 5\n"
7369fe4e98SJustin Bogner                                  "\n"
74f8c5281cSChandler Carruth                                  "# Comment 2"));
75f8c5281cSChandler Carruth 
7669fe4e98SJustin Bogner   line_iterator I = line_iterator(*Buffer, true, '#'), E;
77f8c5281cSChandler Carruth 
78f8c5281cSChandler Carruth   EXPECT_FALSE(I.is_at_eof());
79f8c5281cSChandler Carruth   EXPECT_NE(E, I);
80f8c5281cSChandler Carruth 
81f8c5281cSChandler Carruth   EXPECT_EQ("line 1", *I);
82f8c5281cSChandler Carruth   EXPECT_EQ(1, I.line_number());
83f8c5281cSChandler Carruth   ++I;
84f8c5281cSChandler Carruth   EXPECT_EQ("line 2", *I);
85f8c5281cSChandler Carruth   EXPECT_EQ(2, I.line_number());
86f8c5281cSChandler Carruth   ++I;
8769fe4e98SJustin Bogner   EXPECT_EQ("line 5", *I);
8869fe4e98SJustin Bogner   EXPECT_EQ(5, I.line_number());
89f8c5281cSChandler Carruth   ++I;
90f8c5281cSChandler Carruth 
91f8c5281cSChandler Carruth   EXPECT_TRUE(I.is_at_eof());
92f8c5281cSChandler Carruth   EXPECT_EQ(E, I);
93f8c5281cSChandler Carruth }
94f8c5281cSChandler Carruth 
TEST(LineIteratorTest,CommentSkippingKeepBlanks)9569fe4e98SJustin Bogner TEST(LineIteratorTest, CommentSkippingKeepBlanks) {
9669fe4e98SJustin Bogner   std::unique_ptr<MemoryBuffer> Buffer(
9769fe4e98SJustin Bogner       MemoryBuffer::getMemBuffer("line 1\n"
9869fe4e98SJustin Bogner                                  "line 2\n"
9969fe4e98SJustin Bogner                                  "# Comment 1\n"
10069fe4e98SJustin Bogner                                  "# Comment 2\n"
10169fe4e98SJustin Bogner                                  "\n"
10269fe4e98SJustin Bogner                                  "line 6\n"
10369fe4e98SJustin Bogner                                  "\n"
10469fe4e98SJustin Bogner                                  "# Comment 3"));
10569fe4e98SJustin Bogner 
10669fe4e98SJustin Bogner   line_iterator I = line_iterator(*Buffer, false, '#'), E;
10769fe4e98SJustin Bogner 
10869fe4e98SJustin Bogner   EXPECT_FALSE(I.is_at_eof());
10969fe4e98SJustin Bogner   EXPECT_NE(E, I);
11069fe4e98SJustin Bogner 
11169fe4e98SJustin Bogner   EXPECT_EQ("line 1", *I);
11269fe4e98SJustin Bogner   EXPECT_EQ(1, I.line_number());
11369fe4e98SJustin Bogner   ++I;
11469fe4e98SJustin Bogner   EXPECT_EQ("line 2", *I);
11569fe4e98SJustin Bogner   EXPECT_EQ(2, I.line_number());
11669fe4e98SJustin Bogner   ++I;
11769fe4e98SJustin Bogner   EXPECT_EQ("", *I);
11869fe4e98SJustin Bogner   EXPECT_EQ(5, I.line_number());
11969fe4e98SJustin Bogner   ++I;
12069fe4e98SJustin Bogner   EXPECT_EQ("line 6", *I);
12169fe4e98SJustin Bogner   EXPECT_EQ(6, I.line_number());
12269fe4e98SJustin Bogner   ++I;
12369fe4e98SJustin Bogner   EXPECT_EQ("", *I);
12469fe4e98SJustin Bogner   EXPECT_EQ(7, I.line_number());
12569fe4e98SJustin Bogner   ++I;
12669fe4e98SJustin Bogner 
12769fe4e98SJustin Bogner   EXPECT_TRUE(I.is_at_eof());
12869fe4e98SJustin Bogner   EXPECT_EQ(E, I);
12969fe4e98SJustin Bogner }
13069fe4e98SJustin Bogner 
13169fe4e98SJustin Bogner 
TEST(LineIteratorTest,BlankSkipping)132f8c5281cSChandler Carruth TEST(LineIteratorTest, BlankSkipping) {
133dfbe3d6bSDavid Blaikie   std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("\n\n\n"
134f8c5281cSChandler Carruth                                                                     "line 1\n"
135f8c5281cSChandler Carruth                                                                     "\n\n\n"
136f8c5281cSChandler Carruth                                                                     "line 2\n"
137dfbe3d6bSDavid Blaikie                                                                     "\n\n\n");
138f8c5281cSChandler Carruth 
139f8c5281cSChandler Carruth   line_iterator I = line_iterator(*Buffer), E;
140f8c5281cSChandler Carruth 
141f8c5281cSChandler Carruth   EXPECT_FALSE(I.is_at_eof());
142f8c5281cSChandler Carruth   EXPECT_NE(E, I);
143f8c5281cSChandler Carruth 
144f8c5281cSChandler Carruth   EXPECT_EQ("line 1", *I);
145f8c5281cSChandler Carruth   EXPECT_EQ(4, I.line_number());
146f8c5281cSChandler Carruth   ++I;
147f8c5281cSChandler Carruth   EXPECT_EQ("line 2", *I);
148f8c5281cSChandler Carruth   EXPECT_EQ(8, I.line_number());
149f8c5281cSChandler Carruth   ++I;
150f8c5281cSChandler Carruth 
151f8c5281cSChandler Carruth   EXPECT_TRUE(I.is_at_eof());
152f8c5281cSChandler Carruth   EXPECT_EQ(E, I);
153f8c5281cSChandler Carruth }
154f8c5281cSChandler Carruth 
TEST(LineIteratorTest,BlankKeeping)15569fe4e98SJustin Bogner TEST(LineIteratorTest, BlankKeeping) {
15669fe4e98SJustin Bogner   std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("\n\n"
15769fe4e98SJustin Bogner                                                                     "line 3\n"
15869fe4e98SJustin Bogner                                                                     "\n"
15969fe4e98SJustin Bogner                                                                     "line 5\n"
16069fe4e98SJustin Bogner                                                                     "\n\n");
16169fe4e98SJustin Bogner   line_iterator I = line_iterator(*Buffer, false), E;
16269fe4e98SJustin Bogner 
16369fe4e98SJustin Bogner   EXPECT_FALSE(I.is_at_eof());
16469fe4e98SJustin Bogner   EXPECT_NE(E, I);
16569fe4e98SJustin Bogner 
16669fe4e98SJustin Bogner   EXPECT_EQ("", *I);
16769fe4e98SJustin Bogner   EXPECT_EQ(1, I.line_number());
16869fe4e98SJustin Bogner   ++I;
16969fe4e98SJustin Bogner   EXPECT_EQ("", *I);
17069fe4e98SJustin Bogner   EXPECT_EQ(2, I.line_number());
17169fe4e98SJustin Bogner   ++I;
17269fe4e98SJustin Bogner   EXPECT_EQ("line 3", *I);
17369fe4e98SJustin Bogner   EXPECT_EQ(3, I.line_number());
17469fe4e98SJustin Bogner   ++I;
17569fe4e98SJustin Bogner   EXPECT_EQ("", *I);
17669fe4e98SJustin Bogner   EXPECT_EQ(4, I.line_number());
17769fe4e98SJustin Bogner   ++I;
17869fe4e98SJustin Bogner   EXPECT_EQ("line 5", *I);
17969fe4e98SJustin Bogner   EXPECT_EQ(5, I.line_number());
18069fe4e98SJustin Bogner   ++I;
18169fe4e98SJustin Bogner   EXPECT_EQ("", *I);
18269fe4e98SJustin Bogner   EXPECT_EQ(6, I.line_number());
18369fe4e98SJustin Bogner   ++I;
18469fe4e98SJustin Bogner   EXPECT_EQ("", *I);
18569fe4e98SJustin Bogner   EXPECT_EQ(7, I.line_number());
18669fe4e98SJustin Bogner   ++I;
18769fe4e98SJustin Bogner 
18869fe4e98SJustin Bogner   EXPECT_TRUE(I.is_at_eof());
18969fe4e98SJustin Bogner   EXPECT_EQ(E, I);
19069fe4e98SJustin Bogner }
19169fe4e98SJustin Bogner 
TEST(LineIteratorTest,EmptyBuffers)192f8c5281cSChandler Carruth TEST(LineIteratorTest, EmptyBuffers) {
193dfbe3d6bSDavid Blaikie   std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("");
194f8c5281cSChandler Carruth   EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
195f8c5281cSChandler Carruth   EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
19669fe4e98SJustin Bogner   EXPECT_TRUE(line_iterator(*Buffer, false).is_at_eof());
19769fe4e98SJustin Bogner   EXPECT_EQ(line_iterator(), line_iterator(*Buffer, false));
198f8c5281cSChandler Carruth 
1993560ff2cSRafael Espindola   Buffer = MemoryBuffer::getMemBuffer("\n\n\n");
200f8c5281cSChandler Carruth   EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
201f8c5281cSChandler Carruth   EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
202f8c5281cSChandler Carruth 
2033560ff2cSRafael Espindola   Buffer = MemoryBuffer::getMemBuffer("# foo\n"
204f8c5281cSChandler Carruth                                       "\n"
2053560ff2cSRafael Espindola                                       "# bar");
20669fe4e98SJustin Bogner   EXPECT_TRUE(line_iterator(*Buffer, true, '#').is_at_eof());
20769fe4e98SJustin Bogner   EXPECT_EQ(line_iterator(), line_iterator(*Buffer, true, '#'));
208f8c5281cSChandler Carruth 
2093560ff2cSRafael Espindola   Buffer = MemoryBuffer::getMemBuffer("\n"
210f8c5281cSChandler Carruth                                       "# baz\n"
2113560ff2cSRafael Espindola                                       "\n");
21269fe4e98SJustin Bogner   EXPECT_TRUE(line_iterator(*Buffer, true, '#').is_at_eof());
21369fe4e98SJustin Bogner   EXPECT_EQ(line_iterator(), line_iterator(*Buffer, true, '#'));
214f8c5281cSChandler Carruth }
215f8c5281cSChandler Carruth 
216f8c5281cSChandler Carruth } // anonymous namespace
217