1 //===-- SourceLocationSpecTest.cpp ----------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "gtest/gtest.h"
11 #include "lldb/Core/SourceLocationSpec.h"
12 #include "lldb/Utility/LLDBAssert.h"
14 #include "llvm/Testing/Support/Error.h"
16 using namespace lldb_private
;
18 TEST(SourceLocationSpecTest
, OperatorBool
) {
19 SourceLocationSpec
invalid(FileSpec(), 0);
20 EXPECT_FALSE(invalid
);
22 SourceLocationSpec
invalid_filespec(FileSpec(), 4);
23 EXPECT_FALSE(invalid_filespec
);
25 SourceLocationSpec
invalid_line(FileSpec("/foo/bar"), 0);
26 EXPECT_FALSE(invalid_line
);
28 SourceLocationSpec
valid_fs_line_no_column(FileSpec("/foo/bar"), 4);
29 EXPECT_TRUE(valid_fs_line_no_column
);
31 SourceLocationSpec
invalid_fs_column(FileSpec(), 4, 0);
32 EXPECT_FALSE(invalid_fs_column
);
34 SourceLocationSpec
invalid_line_column(FileSpec("/foo/bar"), 0, 19);
35 EXPECT_FALSE(invalid_line_column
);
37 SourceLocationSpec
valid_fs_line_zero_column(FileSpec("/foo/bar"), 4, 0);
38 EXPECT_TRUE(valid_fs_line_zero_column
);
40 SourceLocationSpec
valid_fs_line_column(FileSpec("/foo/bar"), 4, 19);
41 EXPECT_TRUE(valid_fs_line_column
);
44 TEST(SourceLocationSpecTest
, FileLineColumnComponents
) {
45 FileSpec
fs("/foo/bar", FileSpec::Style::posix
);
46 const uint32_t line
= 19;
47 const uint16_t column
= 4;
49 SourceLocationSpec
without_column(fs
, line
, LLDB_INVALID_COLUMN_NUMBER
, false,
51 EXPECT_TRUE(without_column
);
52 EXPECT_EQ(fs
, without_column
.GetFileSpec());
53 EXPECT_EQ(line
, without_column
.GetLine().value_or(0));
54 EXPECT_EQ(std::nullopt
, without_column
.GetColumn());
55 EXPECT_FALSE(without_column
.GetCheckInlines());
56 EXPECT_TRUE(without_column
.GetExactMatch());
57 EXPECT_STREQ("check inlines = false, exact match = true, decl = /foo/bar:19",
58 without_column
.GetString().c_str());
60 SourceLocationSpec
with_column(fs
, line
, column
, true, false);
61 EXPECT_TRUE(with_column
);
62 EXPECT_EQ(column
, *with_column
.GetColumn());
63 EXPECT_TRUE(with_column
.GetCheckInlines());
64 EXPECT_FALSE(with_column
.GetExactMatch());
66 "check inlines = true, exact match = false, decl = /foo/bar:19:4",
67 with_column
.GetString().c_str());
70 static SourceLocationSpec
Create(bool check_inlines
, bool exact_match
,
71 FileSpec fs
, uint32_t line
,
72 uint16_t column
= LLDB_INVALID_COLUMN_NUMBER
) {
73 return SourceLocationSpec(fs
, line
, column
, check_inlines
, exact_match
);
76 TEST(SourceLocationSpecTest
, Equal
) {
77 auto Equal
= [](SourceLocationSpec lhs
, SourceLocationSpec rhs
, bool full
) {
78 return SourceLocationSpec::Equal(lhs
, rhs
, full
);
81 const FileSpec
fs("/foo/bar", FileSpec::Style::posix
);
82 const FileSpec
other_fs("/foo/baz", FileSpec::Style::posix
);
84 // mutating FileSpec + const Inlined, ExactMatch, Line
86 Equal(Create(false, false, fs
, 4), Create(false, false, fs
, 4), true));
88 Equal(Create(true, true, fs
, 4), Create(true, true, fs
, 4), false));
89 EXPECT_FALSE(Equal(Create(false, false, fs
, 4),
90 Create(false, false, other_fs
, 4), true));
92 Equal(Create(true, true, fs
, 4), Create(true, true, other_fs
, 4), false));
94 // Mutating FileSpec + const Inlined, ExactMatch, Line, Column
95 EXPECT_TRUE(Equal(Create(false, false, fs
, 4, 19),
96 Create(false, false, fs
, 4, 19), true));
97 EXPECT_TRUE(Equal(Create(true, true, fs
, 4, 19),
98 Create(true, true, fs
, 4, 19), false));
99 EXPECT_FALSE(Equal(Create(false, false, fs
, 4, 19),
100 Create(false, false, other_fs
, 4, 19), true));
101 EXPECT_FALSE(Equal(Create(true, true, fs
, 4, 19),
102 Create(true, true, other_fs
, 4, 19), false));
106 Equal(Create(true, true, fs
, 4), Create(true, true, fs
, 4, 19), true));
107 EXPECT_TRUE(Equal(Create(false, false, fs
, 4),
108 Create(false, false, fs
, 4, 19), false));
110 // Mutating Inlined, ExactMatch
112 Equal(Create(true, false, fs
, 4), Create(false, true, fs
, 4), true));
114 Equal(Create(false, true, fs
, 4), Create(true, false, fs
, 4), false));
117 EXPECT_FALSE(Equal(Create(true, true, fs
, 4, 96),
118 Create(true, true, fs
, 4, 19), true));
119 EXPECT_TRUE(Equal(Create(false, false, fs
, 4, 96),
120 Create(false, false, fs
, 4, 19), false));
123 TEST(SourceLocationSpecTest
, Compare
) {
124 auto Cmp
= [](SourceLocationSpec a
, SourceLocationSpec b
) {
125 return std::clamp(SourceLocationSpec::Compare(a
, b
), -1, 1);
128 FileSpec
fs("/foo/bar", FileSpec::Style::posix
);
129 FileSpec
other_fs("/foo/baz", FileSpec::Style::posix
);
131 // Asymetric comparaison
132 EXPECT_EQ(-1, Cmp(Create(true, true, fs
, 4), Create(true, true, fs
, 4, 19)));
134 Cmp(Create(false, false, fs
, 4), Create(false, false, fs
, 4, 19)));
135 EXPECT_EQ(1, Cmp(Create(true, true, fs
, 4, 19), Create(true, true, fs
, 4)));
137 // Mutating FS, const Line
139 -1, Cmp(Create(false, false, fs
, 4), Create(false, false, other_fs
, 4)));
141 Cmp(Create(true, true, fs
, 4), Create(true, true, other_fs
, 4)));
143 Cmp(Create(false, true, other_fs
, 4), Create(false, true, fs
, 4)));
145 Cmp(Create(true, false, other_fs
, 4), Create(true, false, fs
, 4)));
147 // Const FS, mutating Line
148 EXPECT_EQ(-1, Cmp(Create(false, false, fs
, 1), Create(false, false, fs
, 4)));
149 EXPECT_EQ(-1, Cmp(Create(true, true, fs
, 1), Create(true, true, fs
, 4)));
150 EXPECT_EQ(0, Cmp(Create(false, true, fs
, 4), Create(false, true, fs
, 4)));
151 EXPECT_EQ(0, Cmp(Create(true, false, fs
, 4), Create(true, false, fs
, 4)));
152 EXPECT_EQ(1, Cmp(Create(false, false, fs
, 4), Create(false, false, fs
, 1)));
153 EXPECT_EQ(1, Cmp(Create(true, true, fs
, 4), Create(true, true, fs
, 1)));
155 // Const FS, mutating Line, const Column
157 Cmp(Create(false, true, fs
, 1), Create(false, true, fs
, 4, 19)));
158 EXPECT_EQ(-1, Cmp(Create(true, true, fs
, 1), Create(true, true, fs
, 4, 19)));
159 EXPECT_EQ(1, Cmp(Create(true, false, fs
, 4, 19), Create(true, false, fs
, 1)));
160 EXPECT_EQ(1, Cmp(Create(true, false, fs
, 4, 19), Create(true, false, fs
, 1)));
162 // Mutating FS, const Line, const Column
163 EXPECT_EQ(-1, Cmp(Create(false, false, fs
, 4, 19),
164 Create(false, false, other_fs
, 4, 19)));
165 EXPECT_EQ(-1, Cmp(Create(true, true, fs
, 4, 19),
166 Create(true, true, other_fs
, 4, 19)));
168 0, Cmp(Create(false, false, fs
, 4, 19), Create(false, false, fs
, 4, 19)));
170 Cmp(Create(true, true, fs
, 4, 19), Create(true, true, fs
, 4, 19)));
171 EXPECT_EQ(1, Cmp(Create(false, true, other_fs
, 4, 19),
172 Create(false, true, fs
, 4, 19)));
173 EXPECT_EQ(1, Cmp(Create(true, false, other_fs
, 4, 19),
174 Create(true, false, fs
, 4, 19)));
176 // Const FS, const Line, mutating Column
177 EXPECT_EQ(-1, Cmp(Create(false, false, fs
, 4, 19),
178 Create(false, false, fs
, 4, 96)));
180 Cmp(Create(true, true, fs
, 4, 96), Create(true, true, fs
, 4, 19)));
182 1, Cmp(Create(false, true, fs
, 4, 96), Create(false, true, fs
, 4, 19)));