xref: /llvm-project/clang/unittests/Basic/LineOffsetMappingTest.cpp (revision dd7095f52bda36e0f3cd37574a1cb97c7a46cffe)
1dbbc4f4eSDuncan P. N. Exon Smith //===- unittests/Basic/LineOffsetMappingTest.cpp - Test LineOffsetMapping -===//
2dbbc4f4eSDuncan P. N. Exon Smith //
3dbbc4f4eSDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dbbc4f4eSDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information.
5dbbc4f4eSDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dbbc4f4eSDuncan P. N. Exon Smith //
7dbbc4f4eSDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
8dbbc4f4eSDuncan P. N. Exon Smith 
9dbbc4f4eSDuncan P. N. Exon Smith #include "clang/Basic/SourceManager.h"
10dbbc4f4eSDuncan P. N. Exon Smith #include "gtest/gtest.h"
11dbbc4f4eSDuncan P. N. Exon Smith 
12dbbc4f4eSDuncan P. N. Exon Smith using namespace clang;
13dbbc4f4eSDuncan P. N. Exon Smith using namespace clang::SrcMgr;
14dbbc4f4eSDuncan P. N. Exon Smith using namespace llvm;
15dbbc4f4eSDuncan P. N. Exon Smith 
16dbbc4f4eSDuncan P. N. Exon Smith namespace {
17dbbc4f4eSDuncan P. N. Exon Smith 
TEST(LineOffsetMappingTest,empty)18dbbc4f4eSDuncan P. N. Exon Smith TEST(LineOffsetMappingTest, empty) {
19dbbc4f4eSDuncan P. N. Exon Smith   LineOffsetMapping Mapping;
20dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_FALSE(Mapping);
21dbbc4f4eSDuncan P. N. Exon Smith 
22dbbc4f4eSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST
23*dd7095f5SBenjamin Kramer   EXPECT_DEATH((void)Mapping.getLines(), "Storage");
24dbbc4f4eSDuncan P. N. Exon Smith #endif
25dbbc4f4eSDuncan P. N. Exon Smith }
26dbbc4f4eSDuncan P. N. Exon Smith 
TEST(LineOffsetMappingTest,construct)27dbbc4f4eSDuncan P. N. Exon Smith TEST(LineOffsetMappingTest, construct) {
28dbbc4f4eSDuncan P. N. Exon Smith   BumpPtrAllocator Alloc;
29dbbc4f4eSDuncan P. N. Exon Smith   unsigned Offsets[] = {0, 10, 20};
30dbbc4f4eSDuncan P. N. Exon Smith   LineOffsetMapping Mapping(Offsets, Alloc);
31dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(3u, Mapping.size());
32dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(0u, Mapping[0]);
33dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(10u, Mapping[1]);
34dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(20u, Mapping[2]);
35dbbc4f4eSDuncan P. N. Exon Smith 
36dbbc4f4eSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST
37*dd7095f5SBenjamin Kramer   EXPECT_DEATH((void)Mapping[3], "Invalid index");
38dbbc4f4eSDuncan P. N. Exon Smith #endif
39dbbc4f4eSDuncan P. N. Exon Smith }
40dbbc4f4eSDuncan P. N. Exon Smith 
TEST(LineOffsetMappingTest,constructTwo)41dbbc4f4eSDuncan P. N. Exon Smith TEST(LineOffsetMappingTest, constructTwo) {
42dbbc4f4eSDuncan P. N. Exon Smith   // Confirm allocation size is big enough, convering an off-by-one bug.
43dbbc4f4eSDuncan P. N. Exon Smith   BumpPtrAllocator Alloc;
44dbbc4f4eSDuncan P. N. Exon Smith   unsigned Offsets1[] = {0, 10};
45dbbc4f4eSDuncan P. N. Exon Smith   unsigned Offsets2[] = {0, 20};
46dbbc4f4eSDuncan P. N. Exon Smith   LineOffsetMapping Mapping1(Offsets1, Alloc);
47dbbc4f4eSDuncan P. N. Exon Smith   LineOffsetMapping Mapping2(Offsets2, Alloc);
48dbbc4f4eSDuncan P. N. Exon Smith 
49dbbc4f4eSDuncan P. N. Exon Smith   // Need to check Mapping1 *after* building Mapping2.
50dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(2u, Mapping1.size());
51dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(0u, Mapping1[0]);
52dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(10u, Mapping1[1]);
53dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(2u, Mapping2.size());
54dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(0u, Mapping2[0]);
55dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(20u, Mapping2[1]);
56dbbc4f4eSDuncan P. N. Exon Smith }
57dbbc4f4eSDuncan P. N. Exon Smith 
TEST(LineOffsetMappingTest,get)58dbbc4f4eSDuncan P. N. Exon Smith TEST(LineOffsetMappingTest, get) {
59dbbc4f4eSDuncan P. N. Exon Smith   BumpPtrAllocator Alloc;
60dbbc4f4eSDuncan P. N. Exon Smith   StringRef Source = "first line\n"
61dbbc4f4eSDuncan P. N. Exon Smith                      "second line\n";
62dbbc4f4eSDuncan P. N. Exon Smith   auto Mapping = LineOffsetMapping::get(MemoryBufferRef(Source, ""), Alloc);
63dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(3u, Mapping.size());
64dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(0u, Mapping[0]);
65dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(11u, Mapping[1]);
66dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(23u, Mapping[2]);
67dbbc4f4eSDuncan P. N. Exon Smith }
68dbbc4f4eSDuncan P. N. Exon Smith 
TEST(LineOffsetMappingTest,getMissingFinalNewline)69dbbc4f4eSDuncan P. N. Exon Smith TEST(LineOffsetMappingTest, getMissingFinalNewline) {
70dbbc4f4eSDuncan P. N. Exon Smith   BumpPtrAllocator Alloc;
71dbbc4f4eSDuncan P. N. Exon Smith   StringRef Source = "first line\n"
72dbbc4f4eSDuncan P. N. Exon Smith                      "second line";
73dbbc4f4eSDuncan P. N. Exon Smith   auto Mapping = LineOffsetMapping::get(MemoryBufferRef(Source, ""), Alloc);
74dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(2u, Mapping.size());
75dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(0u, Mapping[0]);
76dbbc4f4eSDuncan P. N. Exon Smith   EXPECT_EQ(11u, Mapping[1]);
77dbbc4f4eSDuncan P. N. Exon Smith }
78dbbc4f4eSDuncan P. N. Exon Smith 
79dbbc4f4eSDuncan P. N. Exon Smith } // end namespace
80