13#include "llvm/ADT/StringRef.h"
14#include "llvm/Support/SMLoc.h"
15#include "llvm/Support/SourceMgr.h"
16#include "llvm/Testing/Support/SupportHelpers.h"
17#include "gmock/gmock.h"
18#include "gtest/gtest.h"
27 *OS << ::testing::PrintToString(*V);
31using ::testing::AllOf;
32using ::testing::ElementsAre;
33using ::testing::IsEmpty;
38 *result_listener <<
"value is " << *arg;
43 if (*arg.first == Value1 && *arg.second == Value2)
45 *result_listener <<
"values are [" << *arg.first <<
", " << *arg.second
50TEST(ParseYAML, SyntacticForms) {
52 const char *
YAML = R
"yaml(
56CompileFlags: { Add: [foo, bar] }
69 example-check.ExampleOption: 0
70 UnusedIncludes: Strict
73 EXPECT_THAT(Diags.Diagnostics, IsEmpty());
74 EXPECT_THAT(Diags.Files, ElementsAre(
"config.yaml"));
75 ASSERT_EQ(Results.size(), 4u);
76 EXPECT_FALSE(Results[0].If.HasUnrecognizedCondition);
77 EXPECT_THAT(Results[0].If.PathMatch, ElementsAre(val(
"abc")));
78 EXPECT_THAT(Results[0].CompileFlags.Add, ElementsAre(val(
"foo"), val(
"bar")));
80 EXPECT_THAT(Results[1].CompileFlags.Add, ElementsAre(val(
"b\naz\n")));
82 ASSERT_TRUE(Results[2].Index.Background);
83 EXPECT_EQ(
"Skip", **Results[2].Index.Background);
84 EXPECT_THAT(Results[3].Diagnostics.ClangTidy.CheckOptions,
85 ElementsAre(PairVal(
"example-check.ExampleOption",
"0")));
86 EXPECT_TRUE(Results[3].Diagnostics.UnusedIncludes);
87 EXPECT_EQ(
"Strict", **Results[3].Diagnostics.UnusedIncludes);
90TEST(ParseYAML, Locations) {
92 Annotations
YAML(R
"yaml(
94 PathMatch: [['???bad***regex(((']]
98 EXPECT_THAT(Diags.Diagnostics, IsEmpty());
99 ASSERT_EQ(Results.size(), 1u);
100 ASSERT_NE(Results.front().Source.Manager,
nullptr);
101 EXPECT_EQ(
toRange(Results.front().If.PathMatch.front().Range,
102 *Results.front().Source.Manager),
106TEST(ParseYAML, ConfigDiagnostics) {
108 Annotations
YAML(R
"yaml(
110 $unknown[[UnknownCondition]]: "foo"
114CompileFlags: {$unexpected^
121 ElementsAre(AllOf(diagMessage(
"Unknown If key 'UnknownCondition'"),
122 diagKind(llvm::SourceMgr::DK_Warning),
123 diagPos(
YAML.range(
"unknown").start),
124 diagRange(
YAML.range(
"unknown"))),
125 AllOf(diagMessage(
"Unexpected token. Expected Key, Flow "
126 "Entry, or Flow Mapping End."),
127 diagKind(llvm::SourceMgr::DK_Error),
128 diagPos(
YAML.point(
"unexpected")),
129 diagRange(std::nullopt))));
131 ASSERT_EQ(Results.size(), 1u);
132 EXPECT_THAT(Results.front().CompileFlags.Add, ElementsAre(val(
"first")));
133 EXPECT_TRUE(Results.front().If.HasUnrecognizedCondition);
136TEST(ParseYAML, Invalid) {
138 const char *
YAML = R
"yaml(
146 EXPECT_THAT(Diags.Diagnostics,
147 ElementsAre(diagMessage(
"If should be a dictionary"),
148 diagMessage(
"Config should be a dictionary")));
149 ASSERT_THAT(Results, IsEmpty());
152TEST(ParseYAML, ExternalBlockNone) {
154 Annotations
YAML(R
"yaml(
160 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
161 ASSERT_EQ(Results.size(), 1u);
162 ASSERT_TRUE(Results[0].Index.External);
163 EXPECT_FALSE((*Results[0].Index.External)->File.has_value());
164 EXPECT_FALSE((*Results[0].Index.External)->MountPoint.has_value());
165 EXPECT_FALSE((*Results[0].Index.External)->Server.has_value());
166 EXPECT_THAT(*(*Results[0].Index.External)->IsNone, testing::Eq(
true));
169TEST(ParseYAML, ExternalBlock) {
171 Annotations
YAML(R
"yaml(
180 ASSERT_EQ(Results.size(), 1u);
181 ASSERT_TRUE(Results[0].Index.External);
182 EXPECT_THAT(*(*Results[0].Index.External)->File, val(
"foo"));
183 EXPECT_THAT(*(*Results[0].Index.External)->MountPoint, val(
"baz"));
184 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
185 EXPECT_THAT(*(*Results[0].Index.External)->Server, val(
"bar"));
188TEST(ParseYAML, AllScopes) {
190 Annotations
YAML(R
"yaml(
196 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
197 ASSERT_EQ(Results.size(), 1u);
198 EXPECT_THAT(Results[0].Completion.AllScopes, llvm::ValueIs(val(
true)));
201TEST(ParseYAML, AllScopesWarn) {
203 Annotations
YAML(R
"yaml(
205 AllScopes: $diagrange[[Truex]]
209 EXPECT_THAT(Diags.Diagnostics,
210 ElementsAre(AllOf(diagMessage(
"AllScopes should be a boolean"),
211 diagKind(llvm::SourceMgr::DK_Warning),
212 diagPos(
YAML.range(
"diagrange").start),
213 diagRange(
YAML.range(
"diagrange")))));
214 ASSERT_EQ(Results.size(), 1u);
215 EXPECT_THAT(Results[0].Completion.AllScopes, testing::Eq(std::nullopt));
218TEST(ParseYAML, CodePatterns) {
220 Annotations
YAML(R
"yaml(
226 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
227 ASSERT_EQ(Results.size(), 1u);
228 EXPECT_THAT(Results[0].Completion.CodePatterns, llvm::ValueIs(val(
"None")));
231TEST(ParseYAML, Hover) {
233 Annotations
YAML(R
"yaml(
236 MacroContentsLimit: 4096
240 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
241 ASSERT_EQ(Results.size(), 1u);
242 EXPECT_THAT(Results[0].Hover.ShowAKA, llvm::ValueIs(val(
true)));
243 EXPECT_THAT(Results[0].Hover.MacroContentsLimit, llvm::ValueIs(val(4096U)));
246TEST(ParseYAML, InlayHints) {
248 Annotations
YAML(R
"yaml(
255 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
256 ASSERT_EQ(Results.size(), 1u);
257 EXPECT_THAT(Results[0].InlayHints.Enabled, llvm::ValueIs(val(
false)));
258 EXPECT_THAT(Results[0].InlayHints.ParameterNames, llvm::ValueIs(val(
true)));
259 EXPECT_EQ(Results[0].InlayHints.DeducedTypes, std::nullopt);
262TEST(ParseYAML, SemanticTokens) {
264 Annotations
YAML(R
"yaml(
266 DisabledKinds: [ Operator, InactiveCode]
267 DisabledModifiers: Readonly
271 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
272 ASSERT_EQ(Results.size(), 1u);
273 EXPECT_THAT(Results[0].SemanticTokens.DisabledKinds,
274 ElementsAre(val(
"Operator"), val(
"InactiveCode")));
275 EXPECT_THAT(Results[0].SemanticTokens.DisabledModifiers,
276 ElementsAre(val(
"Readonly")));
279TEST(ParseYAML, IncludesIgnoreHeader) {
281 Annotations
YAML(R
"yaml(
284 IgnoreHeader: [foo, bar]
288 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
289 ASSERT_EQ(Results.size(), 1u);
290 EXPECT_THAT(Results[0].Diagnostics.Includes.IgnoreHeader,
291 ElementsAre(val(
"foo"), val(
"bar")));
294TEST(ParseYAML, IncludesAnalyzeAngledIncludes) {
296 Annotations
YAML(R
"yaml(
299 AnalyzeAngledIncludes: true
303 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
304 ASSERT_EQ(Results.size(), 1u);
305 EXPECT_THAT(Results[0].Diagnostics.Includes.AnalyzeAngledIncludes,
306 llvm::ValueIs(val(
true)));
309TEST(ParseYAML, Style) {
311 Annotations
YAML(R
"yaml(
313 FullyQualifiedNamespaces: [foo, bar]
314 AngledHeaders: ["foo", "bar"]
315 QuotedHeaders: ["baz", "baar"])yaml");
318 ASSERT_THAT(Diags.Diagnostics, IsEmpty());
319 ASSERT_EQ(Results.size(), 1u);
320 EXPECT_THAT(Results[0].Style.FullyQualifiedNamespaces,
321 ElementsAre(val(
"foo"), val(
"bar")));
322 EXPECT_THAT(Results[0].Style.AngledHeaders,
323 ElementsAre(val(
"foo"), val(
"bar")));
324 EXPECT_THAT(Results[0].Style.QuotedHeaders,
325 ElementsAre(val(
"baz"), val(
"baar")));
MATCHER_P(diagMessage, M, "")
Range toRange(llvm::SMRange R, const llvm::SourceMgr &SM)
void PrintTo(const Located< T > &V, std::ostream *OS)
FIXME: Skip testing on windows temporarily due to the different escaping code mode.
MATCHER_P2(hasFlag, Flag, Path, "")
TEST(BackgroundQueueTest, Priority)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static std::vector< Fragment > parseYAML(llvm::StringRef YAML, llvm::StringRef BufferName, DiagnosticCallback)
Parses fragments from a YAML file (one from each — delimited document).
An entity written in config along, with its optional location in the file.