13 #include "llvm/Support/SourceMgr.h"
14 #include "gmock/gmock.h"
15 #include "gtest/gtest.h"
23 using ::testing::ElementsAre;
24 using ::testing::IsEmpty;
29 class FakeProvider :
public Provider {
31 mutable std::atomic<unsigned>
Index = {0};
33 std::vector<CompiledFragment>
35 DC(llvm::SMDiagnostic(
"", llvm::SourceMgr::DK_Error, Prefix));
37 [Arg(Prefix + std::to_string(++
Index))](
const Params &P,
Config &C) {
38 C.CompileFlags.Edits.push_back(
39 [Arg](std::vector<std::string> &Argv) { Argv.push_back(Arg); });
46 FakeProvider(llvm::StringRef Prefix) : Prefix(Prefix) {}
49 std::vector<std::string> getAddedArgs(
Config &C) {
50 std::vector<std::string> Argv;
51 for (
auto &Edit : C.CompileFlags.Edits)
58 TEST(ProviderTest, Combine) {
60 FakeProvider Foo(
"foo");
61 FakeProvider Bar(
"bar");
65 ElementsAre(DiagMessage(
"foo"), DiagMessage(
"bar")));
66 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo1",
"bar1"));
71 ElementsAre(DiagMessage(
"foo"), DiagMessage(
"bar")));
72 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo2",
"bar2"));
75 const char *AddFooWithErr = R
"yaml(
81 const char *AddBarBaz = R
"yaml(
89 TEST(ProviderTest, FromYAMLFile) {
91 FS.Files["foo.yaml"] = AddFooWithErr;
97 ElementsAre(DiagMessage(
"Unknown CompileFlags key Unknown")));
98 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo"));
103 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo"));
105 FS.Files[
"foo.yaml"] = AddBarBaz;
108 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"bar",
"baz"));
110 FS.Files.erase(
"foo.yaml");
112 EXPECT_THAT(
Diags.
Diagnostics, IsEmpty()) <<
"Missing file is not an error";
113 EXPECT_THAT(getAddedArgs(Cfg), IsEmpty());
116 TEST(ProviderTest, FromAncestorRelativeYAMLFiles) {
118 FS.Files[
"a/b/c/foo.yaml"] = AddBarBaz;
119 FS.Files[
"a/foo.yaml"] = AddFooWithErr;
121 std::string ABCPath =
122 testPath(
"a/b/c/d/test.cc", llvm::sys::path::Style::posix);
124 ABCParams.Path = ABCPath;
126 testPath(
"a/b/e/f/test.cc", llvm::sys::path::Style::posix);
128 AParams.Path = APath;
135 EXPECT_THAT(getAddedArgs(Cfg), IsEmpty());
139 ElementsAre(DiagMessage(
"Unknown CompileFlags key Unknown")));
140 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo",
"bar",
"baz"));
145 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo"));
147 FS.Files.erase(
"a/foo.yaml");
150 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"bar",
"baz"));
153 TEST(ProviderTest, Staleness) {
156 auto StartTime = std::chrono::steady_clock::now();
158 StaleOK.FreshTime = StartTime;
160 MustBeFresh.FreshTime = StartTime + std::chrono::hours(1);
165 FS.Files[
"foo.yaml"] = AddFooWithErr;
168 ElementsAre(DiagMessage(
"Unknown CompileFlags key Unknown")));
169 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo"));
173 FS.Files[
"foo.yaml"] = AddBarBaz;
176 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"foo"));
181 EXPECT_THAT(getAddedArgs(Cfg), ElementsAre(
"bar",
"baz"));
184 FS.Files.erase(
"foo.yaml");
187 EXPECT_THAT(getAddedArgs(Cfg), IsEmpty());