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