xref: /llvm-project/lldb/unittests/Core/SourceLocationSpecTest.cpp (revision 8959968b7225d154dca05cdeee17f9477429c420)
1adfffebeSMed Ismail Bennani //===-- SourceLocationSpecTest.cpp ----------------------------------------===//
2adfffebeSMed Ismail Bennani //
3adfffebeSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4adfffebeSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
5adfffebeSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6adfffebeSMed Ismail Bennani //
7adfffebeSMed Ismail Bennani //===----------------------------------------------------------------------===//
8adfffebeSMed Ismail Bennani 
9adfffebeSMed Ismail Bennani #include "gtest/gtest.h"
10adfffebeSMed Ismail Bennani 
11adfffebeSMed Ismail Bennani #include "lldb/Core/SourceLocationSpec.h"
12adfffebeSMed Ismail Bennani #include "lldb/Utility/LLDBAssert.h"
13adfffebeSMed Ismail Bennani 
14adfffebeSMed Ismail Bennani #include "llvm/Testing/Support/Error.h"
15adfffebeSMed Ismail Bennani 
16adfffebeSMed Ismail Bennani using namespace lldb_private;
17adfffebeSMed Ismail Bennani 
TEST(SourceLocationSpecTest,OperatorBool)18adfffebeSMed Ismail Bennani TEST(SourceLocationSpecTest, OperatorBool) {
19adfffebeSMed Ismail Bennani   SourceLocationSpec invalid(FileSpec(), 0);
20adfffebeSMed Ismail Bennani   EXPECT_FALSE(invalid);
21adfffebeSMed Ismail Bennani 
22adfffebeSMed Ismail Bennani   SourceLocationSpec invalid_filespec(FileSpec(), 4);
23adfffebeSMed Ismail Bennani   EXPECT_FALSE(invalid_filespec);
24adfffebeSMed Ismail Bennani 
25adfffebeSMed Ismail Bennani   SourceLocationSpec invalid_line(FileSpec("/foo/bar"), 0);
26adfffebeSMed Ismail Bennani   EXPECT_FALSE(invalid_line);
27adfffebeSMed Ismail Bennani 
28adfffebeSMed Ismail Bennani   SourceLocationSpec valid_fs_line_no_column(FileSpec("/foo/bar"), 4);
29adfffebeSMed Ismail Bennani   EXPECT_TRUE(valid_fs_line_no_column);
30adfffebeSMed Ismail Bennani 
31adfffebeSMed Ismail Bennani   SourceLocationSpec invalid_fs_column(FileSpec(), 4, 0);
32adfffebeSMed Ismail Bennani   EXPECT_FALSE(invalid_fs_column);
33adfffebeSMed Ismail Bennani 
34adfffebeSMed Ismail Bennani   SourceLocationSpec invalid_line_column(FileSpec("/foo/bar"), 0, 19);
35adfffebeSMed Ismail Bennani   EXPECT_FALSE(invalid_line_column);
36adfffebeSMed Ismail Bennani 
37adfffebeSMed Ismail Bennani   SourceLocationSpec valid_fs_line_zero_column(FileSpec("/foo/bar"), 4, 0);
38adfffebeSMed Ismail Bennani   EXPECT_TRUE(valid_fs_line_zero_column);
39adfffebeSMed Ismail Bennani 
40adfffebeSMed Ismail Bennani   SourceLocationSpec valid_fs_line_column(FileSpec("/foo/bar"), 4, 19);
41adfffebeSMed Ismail Bennani   EXPECT_TRUE(valid_fs_line_column);
42adfffebeSMed Ismail Bennani }
43adfffebeSMed Ismail Bennani 
TEST(SourceLocationSpecTest,FileLineColumnComponents)44adfffebeSMed Ismail Bennani TEST(SourceLocationSpecTest, FileLineColumnComponents) {
45adfffebeSMed Ismail Bennani   FileSpec fs("/foo/bar", FileSpec::Style::posix);
46adfffebeSMed Ismail Bennani   const uint32_t line = 19;
47adfffebeSMed Ismail Bennani   const uint16_t column = 4;
48adfffebeSMed Ismail Bennani 
49adfffebeSMed Ismail Bennani   SourceLocationSpec without_column(fs, line, LLDB_INVALID_COLUMN_NUMBER, false,
50adfffebeSMed Ismail Bennani                                     true);
51adfffebeSMed Ismail Bennani   EXPECT_TRUE(without_column);
52adfffebeSMed Ismail Bennani   EXPECT_EQ(fs, without_column.GetFileSpec());
5330c67587SKazu Hirata   EXPECT_EQ(line, without_column.GetLine().value_or(0));
54d2a6114fSKazu Hirata   EXPECT_EQ(std::nullopt, without_column.GetColumn());
55adfffebeSMed Ismail Bennani   EXPECT_FALSE(without_column.GetCheckInlines());
56adfffebeSMed Ismail Bennani   EXPECT_TRUE(without_column.GetExactMatch());
57adfffebeSMed Ismail Bennani   EXPECT_STREQ("check inlines = false, exact match = true, decl = /foo/bar:19",
58adfffebeSMed Ismail Bennani                without_column.GetString().c_str());
59adfffebeSMed Ismail Bennani 
60adfffebeSMed Ismail Bennani   SourceLocationSpec with_column(fs, line, column, true, false);
61adfffebeSMed Ismail Bennani   EXPECT_TRUE(with_column);
62adfffebeSMed Ismail Bennani   EXPECT_EQ(column, *with_column.GetColumn());
63adfffebeSMed Ismail Bennani   EXPECT_TRUE(with_column.GetCheckInlines());
64adfffebeSMed Ismail Bennani   EXPECT_FALSE(with_column.GetExactMatch());
65adfffebeSMed Ismail Bennani   EXPECT_STREQ(
66adfffebeSMed Ismail Bennani       "check inlines = true, exact match = false, decl = /foo/bar:19:4",
67adfffebeSMed Ismail Bennani       with_column.GetString().c_str());
68adfffebeSMed Ismail Bennani }
69adfffebeSMed Ismail Bennani 
Create(bool check_inlines,bool exact_match,FileSpec fs,uint32_t line,uint16_t column=LLDB_INVALID_COLUMN_NUMBER)70adfffebeSMed Ismail Bennani static SourceLocationSpec Create(bool check_inlines, bool exact_match,
71adfffebeSMed Ismail Bennani                                  FileSpec fs, uint32_t line,
72adfffebeSMed Ismail Bennani                                  uint16_t column = LLDB_INVALID_COLUMN_NUMBER) {
73adfffebeSMed Ismail Bennani   return SourceLocationSpec(fs, line, column, check_inlines, exact_match);
74adfffebeSMed Ismail Bennani }
75adfffebeSMed Ismail Bennani 
TEST(SourceLocationSpecTest,Equal)76adfffebeSMed Ismail Bennani TEST(SourceLocationSpecTest, Equal) {
77adfffebeSMed Ismail Bennani   auto Equal = [](SourceLocationSpec lhs, SourceLocationSpec rhs, bool full) {
78adfffebeSMed Ismail Bennani     return SourceLocationSpec::Equal(lhs, rhs, full);
79adfffebeSMed Ismail Bennani   };
80adfffebeSMed Ismail Bennani 
81adfffebeSMed Ismail Bennani   const FileSpec fs("/foo/bar", FileSpec::Style::posix);
82adfffebeSMed Ismail Bennani   const FileSpec other_fs("/foo/baz", FileSpec::Style::posix);
83adfffebeSMed Ismail Bennani 
84adfffebeSMed Ismail Bennani   // mutating FileSpec + const Inlined, ExactMatch, Line
85adfffebeSMed Ismail Bennani   EXPECT_TRUE(
86adfffebeSMed Ismail Bennani       Equal(Create(false, false, fs, 4), Create(false, false, fs, 4), true));
87adfffebeSMed Ismail Bennani   EXPECT_TRUE(
88adfffebeSMed Ismail Bennani       Equal(Create(true, true, fs, 4), Create(true, true, fs, 4), false));
89adfffebeSMed Ismail Bennani   EXPECT_FALSE(Equal(Create(false, false, fs, 4),
90adfffebeSMed Ismail Bennani                      Create(false, false, other_fs, 4), true));
91adfffebeSMed Ismail Bennani   EXPECT_FALSE(
92adfffebeSMed Ismail Bennani       Equal(Create(true, true, fs, 4), Create(true, true, other_fs, 4), false));
93adfffebeSMed Ismail Bennani 
94adfffebeSMed Ismail Bennani   // Mutating FileSpec + const Inlined, ExactMatch, Line, Column
95adfffebeSMed Ismail Bennani   EXPECT_TRUE(Equal(Create(false, false, fs, 4, 19),
96adfffebeSMed Ismail Bennani                     Create(false, false, fs, 4, 19), true));
97adfffebeSMed Ismail Bennani   EXPECT_TRUE(Equal(Create(true, true, fs, 4, 19),
98adfffebeSMed Ismail Bennani                     Create(true, true, fs, 4, 19), false));
99adfffebeSMed Ismail Bennani   EXPECT_FALSE(Equal(Create(false, false, fs, 4, 19),
100adfffebeSMed Ismail Bennani                      Create(false, false, other_fs, 4, 19), true));
101adfffebeSMed Ismail Bennani   EXPECT_FALSE(Equal(Create(true, true, fs, 4, 19),
102adfffebeSMed Ismail Bennani                      Create(true, true, other_fs, 4, 19), false));
103adfffebeSMed Ismail Bennani 
104adfffebeSMed Ismail Bennani   // Asymetric match
105adfffebeSMed Ismail Bennani   EXPECT_FALSE(
106adfffebeSMed Ismail Bennani       Equal(Create(true, true, fs, 4), Create(true, true, fs, 4, 19), true));
107adfffebeSMed Ismail Bennani   EXPECT_TRUE(Equal(Create(false, false, fs, 4),
108adfffebeSMed Ismail Bennani                     Create(false, false, fs, 4, 19), false));
109adfffebeSMed Ismail Bennani 
110adfffebeSMed Ismail Bennani   // Mutating Inlined, ExactMatch
111adfffebeSMed Ismail Bennani   EXPECT_FALSE(
112adfffebeSMed Ismail Bennani       Equal(Create(true, false, fs, 4), Create(false, true, fs, 4), true));
113adfffebeSMed Ismail Bennani   EXPECT_TRUE(
114adfffebeSMed Ismail Bennani       Equal(Create(false, true, fs, 4), Create(true, false, fs, 4), false));
115adfffebeSMed Ismail Bennani 
116adfffebeSMed Ismail Bennani   // Mutating Column
117adfffebeSMed Ismail Bennani   EXPECT_FALSE(Equal(Create(true, true, fs, 4, 96),
118adfffebeSMed Ismail Bennani                      Create(true, true, fs, 4, 19), true));
119adfffebeSMed Ismail Bennani   EXPECT_TRUE(Equal(Create(false, false, fs, 4, 96),
120adfffebeSMed Ismail Bennani                     Create(false, false, fs, 4, 19), false));
121adfffebeSMed Ismail Bennani }
122adfffebeSMed Ismail Bennani 
TEST(SourceLocationSpecTest,Compare)123adfffebeSMed Ismail Bennani TEST(SourceLocationSpecTest, Compare) {
124adfffebeSMed Ismail Bennani   auto Cmp = [](SourceLocationSpec a, SourceLocationSpec b) {
125*8959968bSBenjamin Kramer     return std::clamp(SourceLocationSpec::Compare(a, b), -1, 1);
126adfffebeSMed Ismail Bennani   };
127adfffebeSMed Ismail Bennani 
128adfffebeSMed Ismail Bennani   FileSpec fs("/foo/bar", FileSpec::Style::posix);
129adfffebeSMed Ismail Bennani   FileSpec other_fs("/foo/baz", FileSpec::Style::posix);
130adfffebeSMed Ismail Bennani 
131adfffebeSMed Ismail Bennani   // Asymetric comparaison
132adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(true, true, fs, 4), Create(true, true, fs, 4, 19)));
133adfffebeSMed Ismail Bennani   EXPECT_EQ(-1,
134adfffebeSMed Ismail Bennani             Cmp(Create(false, false, fs, 4), Create(false, false, fs, 4, 19)));
135adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(true, true, fs, 4, 19), Create(true, true, fs, 4)));
136adfffebeSMed Ismail Bennani 
137adfffebeSMed Ismail Bennani   // Mutating FS, const Line
138adfffebeSMed Ismail Bennani   EXPECT_EQ(
139adfffebeSMed Ismail Bennani       -1, Cmp(Create(false, false, fs, 4), Create(false, false, other_fs, 4)));
140adfffebeSMed Ismail Bennani   EXPECT_EQ(-1,
141adfffebeSMed Ismail Bennani             Cmp(Create(true, true, fs, 4), Create(true, true, other_fs, 4)));
142adfffebeSMed Ismail Bennani   EXPECT_EQ(1,
143adfffebeSMed Ismail Bennani             Cmp(Create(false, true, other_fs, 4), Create(false, true, fs, 4)));
144adfffebeSMed Ismail Bennani   EXPECT_EQ(1,
145adfffebeSMed Ismail Bennani             Cmp(Create(true, false, other_fs, 4), Create(true, false, fs, 4)));
146adfffebeSMed Ismail Bennani 
147adfffebeSMed Ismail Bennani   // Const FS, mutating Line
148adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(false, false, fs, 1), Create(false, false, fs, 4)));
149adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(true, true, fs, 1), Create(true, true, fs, 4)));
150adfffebeSMed Ismail Bennani   EXPECT_EQ(0, Cmp(Create(false, true, fs, 4), Create(false, true, fs, 4)));
151adfffebeSMed Ismail Bennani   EXPECT_EQ(0, Cmp(Create(true, false, fs, 4), Create(true, false, fs, 4)));
152adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(false, false, fs, 4), Create(false, false, fs, 1)));
153adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(true, true, fs, 4), Create(true, true, fs, 1)));
154adfffebeSMed Ismail Bennani 
155adfffebeSMed Ismail Bennani   // Const FS, mutating Line, const Column
156adfffebeSMed Ismail Bennani   EXPECT_EQ(-1,
157adfffebeSMed Ismail Bennani             Cmp(Create(false, true, fs, 1), Create(false, true, fs, 4, 19)));
158adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(true, true, fs, 1), Create(true, true, fs, 4, 19)));
159adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(true, false, fs, 4, 19), Create(true, false, fs, 1)));
160adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(true, false, fs, 4, 19), Create(true, false, fs, 1)));
161adfffebeSMed Ismail Bennani 
162adfffebeSMed Ismail Bennani   // Mutating FS, const Line, const Column
163adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(false, false, fs, 4, 19),
164adfffebeSMed Ismail Bennani                     Create(false, false, other_fs, 4, 19)));
165adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(true, true, fs, 4, 19),
166adfffebeSMed Ismail Bennani                     Create(true, true, other_fs, 4, 19)));
167adfffebeSMed Ismail Bennani   EXPECT_EQ(
168adfffebeSMed Ismail Bennani       0, Cmp(Create(false, false, fs, 4, 19), Create(false, false, fs, 4, 19)));
169adfffebeSMed Ismail Bennani   EXPECT_EQ(0,
170adfffebeSMed Ismail Bennani             Cmp(Create(true, true, fs, 4, 19), Create(true, true, fs, 4, 19)));
171adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(false, true, other_fs, 4, 19),
172adfffebeSMed Ismail Bennani                    Create(false, true, fs, 4, 19)));
173adfffebeSMed Ismail Bennani   EXPECT_EQ(1, Cmp(Create(true, false, other_fs, 4, 19),
174adfffebeSMed Ismail Bennani                    Create(true, false, fs, 4, 19)));
175adfffebeSMed Ismail Bennani 
176adfffebeSMed Ismail Bennani   // Const FS, const Line, mutating Column
177adfffebeSMed Ismail Bennani   EXPECT_EQ(-1, Cmp(Create(false, false, fs, 4, 19),
178adfffebeSMed Ismail Bennani                     Create(false, false, fs, 4, 96)));
179adfffebeSMed Ismail Bennani   EXPECT_EQ(1,
180adfffebeSMed Ismail Bennani             Cmp(Create(true, true, fs, 4, 96), Create(true, true, fs, 4, 19)));
181adfffebeSMed Ismail Bennani   EXPECT_EQ(
182adfffebeSMed Ismail Bennani       1, Cmp(Create(false, true, fs, 4, 96), Create(false, true, fs, 4, 19)));
183adfffebeSMed Ismail Bennani }
184