//===-- CompileCommandsTests.cpp ------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "CompileCommands.h" #include "TestFS.h" #include "llvm/ADT/StringExtras.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { namespace clangd { namespace { using ::testing::Contains; using ::testing::ElementsAre; using ::testing::HasSubstr; using ::testing::Not; // Sadly, CommandMangler::detect(), which contains much of the logic, is // a bunch of untested integration glue. We test the string manipulation here // assuming its results are correct. // Make use of all features and assert the exact command we get out. // Other tests just verify presence/absence of certain args. TEST(CommandMangler, Everything) { auto Mangler = CommandMangler::forTests(); Mangler.ClangPath = testPath("fake/clang"); Mangler.ResourceDir = testPath("fake/resources"); Mangler.Sysroot = testPath("fake/sysroot"); std::vector Cmd = {"clang++", "-Xclang", "-load", "-Xclang", "plugin", "-MF", "dep", "foo.cc"}; Mangler.adjust(Cmd); EXPECT_THAT(Cmd, ElementsAre(testPath("fake/clang++"), "foo.cc", "-fsyntax-only", "-resource-dir=" + testPath("fake/resources"), "-isysroot", testPath("fake/sysroot"))); } TEST(CommandMangler, ResourceDir) { auto Mangler = CommandMangler::forTests(); Mangler.ResourceDir = testPath("fake/resources"); std::vector Cmd = {"clang++", "foo.cc"}; Mangler.adjust(Cmd); EXPECT_THAT(Cmd, Contains("-resource-dir=" + testPath("fake/resources"))); } TEST(CommandMangler, Sysroot) { auto Mangler = CommandMangler::forTests(); Mangler.Sysroot = testPath("fake/sysroot"); std::vector Cmd = {"clang++", "foo.cc"}; Mangler.adjust(Cmd); EXPECT_THAT(llvm::join(Cmd, " "), HasSubstr("-isysroot " + testPath("fake/sysroot"))); } TEST(CommandMangler, StripPlugins) { auto Mangler = CommandMangler::forTests(); std::vector Cmd = {"clang++", "-Xclang", "-load", "-Xclang", "plugin", "foo.cc"}; Mangler.adjust(Cmd); for (const char* Stripped : {"-Xclang", "-load", "plugin"}) EXPECT_THAT(Cmd, Not(Contains(Stripped))); } TEST(CommandMangler, StripOutput) { auto Mangler = CommandMangler::forTests(); std::vector Cmd = {"clang++", "-MF", "dependency", "-c", "foo.cc"}; Mangler.adjust(Cmd); for (const char* Stripped : {"-MF", "dependency"}) EXPECT_THAT(Cmd, Not(Contains(Stripped))); } TEST(CommandMangler, ClangPath) { auto Mangler = CommandMangler::forTests(); Mangler.ClangPath = testPath("fake/clang"); std::vector Cmd = {"clang++", "foo.cc"}; Mangler.adjust(Cmd); EXPECT_EQ(testPath("fake/clang++"), Cmd.front()); Cmd = {"unknown-binary", "foo.cc"}; Mangler.adjust(Cmd); EXPECT_EQ("unknown-binary", Cmd.front()); Cmd = {testPath("path/clang++"), "foo.cc"}; Mangler.adjust(Cmd); EXPECT_EQ(testPath("path/clang++"), Cmd.front()); } } // namespace } // namespace clangd } // namespace clang