Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
clang-tools-extra/clangd/unittests/ConfigYAMLTests.cpp
Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
--- | --- | ||||
Diagnostics: | Diagnostics: | ||||
ClangTidy: | ClangTidy: | ||||
CheckOptions: | CheckOptions: | ||||
IgnoreMacros: true | IgnoreMacros: true | ||||
example-check.ExampleOption: 0 | example-check.ExampleOption: 0 | ||||
UnusedIncludes: Strict | UnusedIncludes: Strict | ||||
)yaml"; | )yaml"; | ||||
auto Results = Fragment::parseYAML(YAML, "config.yaml", Diags.callback()); | auto Results = Fragment::parseYAML(YAML, "config.yaml", "", Diags.callback()); | ||||
EXPECT_THAT(Diags.Diagnostics, IsEmpty()); | EXPECT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
EXPECT_THAT(Diags.Files, ElementsAre("config.yaml")); | EXPECT_THAT(Diags.Files, ElementsAre("config.yaml")); | ||||
ASSERT_EQ(Results.size(), 4u); | ASSERT_EQ(Results.size(), 4u); | ||||
EXPECT_FALSE(Results[0].If.HasUnrecognizedCondition); | EXPECT_FALSE(Results[0].If.HasUnrecognizedCondition); | ||||
EXPECT_THAT(Results[0].If.PathMatch, ElementsAre(val("abc"))); | EXPECT_THAT(Results[0].If.PathMatch, ElementsAre(val("abc"))); | ||||
EXPECT_THAT(Results[0].CompileFlags.Add, ElementsAre(val("foo"), val("bar"))); | EXPECT_THAT(Results[0].CompileFlags.Add, ElementsAre(val("foo"), val("bar"))); | ||||
EXPECT_THAT(Results[1].CompileFlags.Add, ElementsAre(val("b\naz\n"))); | EXPECT_THAT(Results[1].CompileFlags.Add, ElementsAre(val("b\naz\n"))); | ||||
ASSERT_TRUE(Results[2].Index.Background); | ASSERT_TRUE(Results[2].Index.Background); | ||||
EXPECT_EQ("Skip", **Results[2].Index.Background); | EXPECT_EQ("Skip", **Results[2].Index.Background); | ||||
EXPECT_THAT(Results[3].Diagnostics.ClangTidy.CheckOptions, | EXPECT_THAT(Results[3].Diagnostics.ClangTidy.CheckOptions, | ||||
ElementsAre(PairVal("IgnoreMacros", "true"), | ElementsAre(PairVal("IgnoreMacros", "true"), | ||||
PairVal("example-check.ExampleOption", "0"))); | PairVal("example-check.ExampleOption", "0"))); | ||||
EXPECT_TRUE(Results[3].Diagnostics.UnusedIncludes); | EXPECT_TRUE(Results[3].Diagnostics.UnusedIncludes); | ||||
EXPECT_EQ("Strict", **Results[3].Diagnostics.UnusedIncludes); | EXPECT_EQ("Strict", **Results[3].Diagnostics.UnusedIncludes); | ||||
} | } | ||||
TEST(ParseYAML, IncludesFileRelative) { | |||||
CapturedDiags Diags; | |||||
/* Annotations cannot be used here as it interprets the $ and {} special | |||||
* characters */ | |||||
StringRef RawYAML(R"yaml( | |||||
CompileFlags: | |||||
Add: ["-I${CURRENT_FILE_PATH}test.h"] | |||||
)yaml"); | |||||
auto Results = Fragment::parseYAML(RawYAML, "config.yaml", "/tmp/testpath/", | |||||
Diags.callback()); | |||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | |||||
ASSERT_EQ(Results.size(), 1u); | |||||
EXPECT_THAT(Results[0].CompileFlags.Add, | |||||
ElementsAre(val("-I/tmp/testpath/test.h"))); | |||||
} | |||||
TEST(ParseYAML, Locations) { | TEST(ParseYAML, Locations) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
If: | If: | ||||
PathMatch: [['???bad***regex(((']] | PathMatch: [['???bad***regex(((']] | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
EXPECT_THAT(Diags.Diagnostics, IsEmpty()); | EXPECT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
ASSERT_NE(Results.front().Source.Manager, nullptr); | ASSERT_NE(Results.front().Source.Manager, nullptr); | ||||
EXPECT_EQ(toRange(Results.front().If.PathMatch.front().Range, | EXPECT_EQ(toRange(Results.front().If.PathMatch.front().Range, | ||||
*Results.front().Source.Manager), | *Results.front().Source.Manager), | ||||
YAML.range()); | YAML.range()); | ||||
} | } | ||||
TEST(ParseYAML, ConfigDiagnostics) { | TEST(ParseYAML, ConfigDiagnostics) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
If: | If: | ||||
$unknown[[UnknownCondition]]: "foo" | $unknown[[UnknownCondition]]: "foo" | ||||
CompileFlags: | CompileFlags: | ||||
Add: 'first' | Add: 'first' | ||||
--- | --- | ||||
CompileFlags: {$unexpected^ | CompileFlags: {$unexpected^ | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT( | ASSERT_THAT( | ||||
Diags.Diagnostics, | Diags.Diagnostics, | ||||
ElementsAre(AllOf(diagMessage("Unknown If key 'UnknownCondition'"), | ElementsAre(AllOf(diagMessage("Unknown If key 'UnknownCondition'"), | ||||
diagKind(llvm::SourceMgr::DK_Warning), | diagKind(llvm::SourceMgr::DK_Warning), | ||||
diagPos(YAML.range("unknown").start), | diagPos(YAML.range("unknown").start), | ||||
diagRange(YAML.range("unknown"))), | diagRange(YAML.range("unknown"))), | ||||
AllOf(diagMessage("Unexpected token. Expected Key, Flow " | AllOf(diagMessage("Unexpected token. Expected Key, Flow " | ||||
Show All 11 Lines | TEST(ParseYAML, Invalid) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
const char *YAML = R"yaml( | const char *YAML = R"yaml( | ||||
If: | If: | ||||
horrible | horrible | ||||
--- | --- | ||||
- 1 | - 1 | ||||
)yaml"; | )yaml"; | ||||
auto Results = Fragment::parseYAML(YAML, "config.yaml", Diags.callback()); | auto Results = Fragment::parseYAML(YAML, "config.yaml", "", Diags.callback()); | ||||
EXPECT_THAT(Diags.Diagnostics, | EXPECT_THAT(Diags.Diagnostics, | ||||
ElementsAre(diagMessage("If should be a dictionary"), | ElementsAre(diagMessage("If should be a dictionary"), | ||||
diagMessage("Config should be a dictionary"))); | diagMessage("Config should be a dictionary"))); | ||||
ASSERT_THAT(Results, IsEmpty()); | ASSERT_THAT(Results, IsEmpty()); | ||||
} | } | ||||
TEST(ParseYAML, ExternalBlockNone) { | TEST(ParseYAML, ExternalBlockNone) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Index: | Index: | ||||
External: None | External: None | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
ASSERT_TRUE(Results[0].Index.External); | ASSERT_TRUE(Results[0].Index.External); | ||||
EXPECT_FALSE((*Results[0].Index.External)->File.has_value()); | EXPECT_FALSE((*Results[0].Index.External)->File.has_value()); | ||||
EXPECT_FALSE((*Results[0].Index.External)->MountPoint.has_value()); | EXPECT_FALSE((*Results[0].Index.External)->MountPoint.has_value()); | ||||
EXPECT_FALSE((*Results[0].Index.External)->Server.has_value()); | EXPECT_FALSE((*Results[0].Index.External)->Server.has_value()); | ||||
EXPECT_THAT(*(*Results[0].Index.External)->IsNone, testing::Eq(true)); | EXPECT_THAT(*(*Results[0].Index.External)->IsNone, testing::Eq(true)); | ||||
} | } | ||||
TEST(ParseYAML, ExternalBlock) { | TEST(ParseYAML, ExternalBlock) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Index: | Index: | ||||
External: | External: | ||||
File: "foo" | File: "foo" | ||||
Server: ^"bar" | Server: ^"bar" | ||||
MountPoint: "baz" | MountPoint: "baz" | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
ASSERT_TRUE(Results[0].Index.External); | ASSERT_TRUE(Results[0].Index.External); | ||||
EXPECT_THAT(*(*Results[0].Index.External)->File, val("foo")); | EXPECT_THAT(*(*Results[0].Index.External)->File, val("foo")); | ||||
EXPECT_THAT(*(*Results[0].Index.External)->MountPoint, val("baz")); | EXPECT_THAT(*(*Results[0].Index.External)->MountPoint, val("baz")); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
EXPECT_THAT(*(*Results[0].Index.External)->Server, val("bar")); | EXPECT_THAT(*(*Results[0].Index.External)->Server, val("bar")); | ||||
} | } | ||||
TEST(ParseYAML, AllScopes) { | TEST(ParseYAML, AllScopes) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Completion: | Completion: | ||||
AllScopes: True | AllScopes: True | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].Completion.AllScopes, llvm::ValueIs(val(true))); | EXPECT_THAT(Results[0].Completion.AllScopes, llvm::ValueIs(val(true))); | ||||
} | } | ||||
TEST(ParseYAML, AllScopesWarn) { | TEST(ParseYAML, AllScopesWarn) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Completion: | Completion: | ||||
AllScopes: $diagrange[[Truex]] | AllScopes: $diagrange[[Truex]] | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
EXPECT_THAT(Diags.Diagnostics, | EXPECT_THAT(Diags.Diagnostics, | ||||
ElementsAre(AllOf(diagMessage("AllScopes should be a boolean"), | ElementsAre(AllOf(diagMessage("AllScopes should be a boolean"), | ||||
diagKind(llvm::SourceMgr::DK_Warning), | diagKind(llvm::SourceMgr::DK_Warning), | ||||
diagPos(YAML.range("diagrange").start), | diagPos(YAML.range("diagrange").start), | ||||
diagRange(YAML.range("diagrange"))))); | diagRange(YAML.range("diagrange"))))); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].Completion.AllScopes, testing::Eq(std::nullopt)); | EXPECT_THAT(Results[0].Completion.AllScopes, testing::Eq(std::nullopt)); | ||||
} | } | ||||
TEST(ParseYAML, ShowAKA) { | TEST(ParseYAML, ShowAKA) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Hover: | Hover: | ||||
ShowAKA: True | ShowAKA: True | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].Hover.ShowAKA, llvm::ValueIs(val(true))); | EXPECT_THAT(Results[0].Hover.ShowAKA, llvm::ValueIs(val(true))); | ||||
} | } | ||||
TEST(ParseYAML, InlayHints) { | TEST(ParseYAML, InlayHints) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
InlayHints: | InlayHints: | ||||
Enabled: No | Enabled: No | ||||
ParameterNames: Yes | ParameterNames: Yes | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].InlayHints.Enabled, llvm::ValueIs(val(false))); | EXPECT_THAT(Results[0].InlayHints.Enabled, llvm::ValueIs(val(false))); | ||||
EXPECT_THAT(Results[0].InlayHints.ParameterNames, llvm::ValueIs(val(true))); | EXPECT_THAT(Results[0].InlayHints.ParameterNames, llvm::ValueIs(val(true))); | ||||
EXPECT_EQ(Results[0].InlayHints.DeducedTypes, std::nullopt); | EXPECT_EQ(Results[0].InlayHints.DeducedTypes, std::nullopt); | ||||
} | } | ||||
TEST(ParseYAML, IncludesIgnoreHeader) { | TEST(ParseYAML, IncludesIgnoreHeader) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Diagnostics: | Diagnostics: | ||||
Includes: | Includes: | ||||
IgnoreHeader: [foo, bar] | IgnoreHeader: [foo, bar] | ||||
)yaml"); | )yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].Diagnostics.Includes.IgnoreHeader, | EXPECT_THAT(Results[0].Diagnostics.Includes.IgnoreHeader, | ||||
ElementsAre(val("foo"), val("bar"))); | ElementsAre(val("foo"), val("bar"))); | ||||
} | } | ||||
TEST(ParseYAML, Style) { | TEST(ParseYAML, Style) { | ||||
CapturedDiags Diags; | CapturedDiags Diags; | ||||
Annotations YAML(R"yaml( | Annotations YAML(R"yaml( | ||||
Style: | Style: | ||||
FullyQualifiedNamespaces: [foo, bar])yaml"); | FullyQualifiedNamespaces: [foo, bar])yaml"); | ||||
auto Results = | auto Results = | ||||
Fragment::parseYAML(YAML.code(), "config.yaml", Diags.callback()); | Fragment::parseYAML(YAML.code(), "config.yaml", "", Diags.callback()); | ||||
ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ASSERT_THAT(Diags.Diagnostics, IsEmpty()); | ||||
ASSERT_EQ(Results.size(), 1u); | ASSERT_EQ(Results.size(), 1u); | ||||
EXPECT_THAT(Results[0].Style.FullyQualifiedNamespaces, | EXPECT_THAT(Results[0].Style.FullyQualifiedNamespaces, | ||||
ElementsAre(val("foo"), val("bar"))); | ElementsAre(val("foo"), val("bar"))); | ||||
} | } | ||||
} // namespace | } // namespace | ||||
} // namespace config | } // namespace config | ||||
} // namespace clangd | } // namespace clangd | ||||
} // namespace clang | } // namespace clang |