xref: /llvm-project/lldb/unittests/Core/SourceLocationSpecTest.cpp (revision 8959968b7225d154dca05cdeee17f9477429c420)
1 //===-- SourceLocationSpecTest.cpp ----------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "gtest/gtest.h"
10 
11 #include "lldb/Core/SourceLocationSpec.h"
12 #include "lldb/Utility/LLDBAssert.h"
13 
14 #include "llvm/Testing/Support/Error.h"
15 
16 using namespace lldb_private;
17 
TEST(SourceLocationSpecTest,OperatorBool)18 TEST(SourceLocationSpecTest, OperatorBool) {
19   SourceLocationSpec invalid(FileSpec(), 0);
20   EXPECT_FALSE(invalid);
21 
22   SourceLocationSpec invalid_filespec(FileSpec(), 4);
23   EXPECT_FALSE(invalid_filespec);
24 
25   SourceLocationSpec invalid_line(FileSpec("/foo/bar"), 0);
26   EXPECT_FALSE(invalid_line);
27 
28   SourceLocationSpec valid_fs_line_no_column(FileSpec("/foo/bar"), 4);
29   EXPECT_TRUE(valid_fs_line_no_column);
30 
31   SourceLocationSpec invalid_fs_column(FileSpec(), 4, 0);
32   EXPECT_FALSE(invalid_fs_column);
33 
34   SourceLocationSpec invalid_line_column(FileSpec("/foo/bar"), 0, 19);
35   EXPECT_FALSE(invalid_line_column);
36 
37   SourceLocationSpec valid_fs_line_zero_column(FileSpec("/foo/bar"), 4, 0);
38   EXPECT_TRUE(valid_fs_line_zero_column);
39 
40   SourceLocationSpec valid_fs_line_column(FileSpec("/foo/bar"), 4, 19);
41   EXPECT_TRUE(valid_fs_line_column);
42 }
43 
TEST(SourceLocationSpecTest,FileLineColumnComponents)44 TEST(SourceLocationSpecTest, FileLineColumnComponents) {
45   FileSpec fs("/foo/bar", FileSpec::Style::posix);
46   const uint32_t line = 19;
47   const uint16_t column = 4;
48 
49   SourceLocationSpec without_column(fs, line, LLDB_INVALID_COLUMN_NUMBER, false,
50                                     true);
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());
59 
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());
65   EXPECT_STREQ(
66       "check inlines = true, exact match = false, decl = /foo/bar:19:4",
67       with_column.GetString().c_str());
68 }
69 
Create(bool check_inlines,bool exact_match,FileSpec fs,uint32_t line,uint16_t column=LLDB_INVALID_COLUMN_NUMBER)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);
74 }
75 
TEST(SourceLocationSpecTest,Equal)76 TEST(SourceLocationSpecTest, Equal) {
77   auto Equal = [](SourceLocationSpec lhs, SourceLocationSpec rhs, bool full) {
78     return SourceLocationSpec::Equal(lhs, rhs, full);
79   };
80 
81   const FileSpec fs("/foo/bar", FileSpec::Style::posix);
82   const FileSpec other_fs("/foo/baz", FileSpec::Style::posix);
83 
84   // mutating FileSpec + const Inlined, ExactMatch, Line
85   EXPECT_TRUE(
86       Equal(Create(false, false, fs, 4), Create(false, false, fs, 4), true));
87   EXPECT_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));
91   EXPECT_FALSE(
92       Equal(Create(true, true, fs, 4), Create(true, true, other_fs, 4), false));
93 
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));
103 
104   // Asymetric match
105   EXPECT_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));
109 
110   // Mutating Inlined, ExactMatch
111   EXPECT_FALSE(
112       Equal(Create(true, false, fs, 4), Create(false, true, fs, 4), true));
113   EXPECT_TRUE(
114       Equal(Create(false, true, fs, 4), Create(true, false, fs, 4), false));
115 
116   // Mutating Column
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));
121 }
122 
TEST(SourceLocationSpecTest,Compare)123 TEST(SourceLocationSpecTest, Compare) {
124   auto Cmp = [](SourceLocationSpec a, SourceLocationSpec b) {
125     return std::clamp(SourceLocationSpec::Compare(a, b), -1, 1);
126   };
127 
128   FileSpec fs("/foo/bar", FileSpec::Style::posix);
129   FileSpec other_fs("/foo/baz", FileSpec::Style::posix);
130 
131   // Asymetric comparaison
132   EXPECT_EQ(-1, Cmp(Create(true, true, fs, 4), Create(true, true, fs, 4, 19)));
133   EXPECT_EQ(-1,
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)));
136 
137   // Mutating FS, const Line
138   EXPECT_EQ(
139       -1, Cmp(Create(false, false, fs, 4), Create(false, false, other_fs, 4)));
140   EXPECT_EQ(-1,
141             Cmp(Create(true, true, fs, 4), Create(true, true, other_fs, 4)));
142   EXPECT_EQ(1,
143             Cmp(Create(false, true, other_fs, 4), Create(false, true, fs, 4)));
144   EXPECT_EQ(1,
145             Cmp(Create(true, false, other_fs, 4), Create(true, false, fs, 4)));
146 
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)));
154 
155   // Const FS, mutating Line, const Column
156   EXPECT_EQ(-1,
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)));
161 
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)));
167   EXPECT_EQ(
168       0, Cmp(Create(false, false, fs, 4, 19), Create(false, false, fs, 4, 19)));
169   EXPECT_EQ(0,
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)));
175 
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)));
179   EXPECT_EQ(1,
180             Cmp(Create(true, true, fs, 4, 96), Create(true, true, fs, 4, 19)));
181   EXPECT_EQ(
182       1, Cmp(Create(false, true, fs, 4, 96), Create(false, true, fs, 4, 19)));
183 }
184