12f395b70SUtkarsh Saxena //===-- ASTSignalsTests.cpp -------------------------------------*- C++ -*-===//
22f395b70SUtkarsh Saxena //
32f395b70SUtkarsh Saxena // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42f395b70SUtkarsh Saxena // See https://llvm.org/LICENSE.txt for license information.
52f395b70SUtkarsh Saxena // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62f395b70SUtkarsh Saxena //
72f395b70SUtkarsh Saxena //===----------------------------------------------------------------------===//
82f395b70SUtkarsh Saxena
94d006520SSam McCall #include "ASTSignals.h"
102f395b70SUtkarsh Saxena #include "TestIndex.h"
112f395b70SUtkarsh Saxena #include "TestTU.h"
122f395b70SUtkarsh Saxena #include "llvm/ADT/StringRef.h"
132f395b70SUtkarsh Saxena #include "gmock/gmock.h"
142f395b70SUtkarsh Saxena #include "gtest/gtest.h"
152f395b70SUtkarsh Saxena
162f395b70SUtkarsh Saxena namespace clang {
172f395b70SUtkarsh Saxena namespace clangd {
182f395b70SUtkarsh Saxena namespace {
192f395b70SUtkarsh Saxena
202f395b70SUtkarsh Saxena using ::testing::_;
212f395b70SUtkarsh Saxena using ::testing::Pair;
222f395b70SUtkarsh Saxena using ::testing::UnorderedElementsAre;
232f395b70SUtkarsh Saxena
TEST(ASTSignals,Derive)242f395b70SUtkarsh Saxena TEST(ASTSignals, Derive) {
252f395b70SUtkarsh Saxena TestTU TU = TestTU::withCode(R"cpp(
262f395b70SUtkarsh Saxena namespace ns1 {
272f395b70SUtkarsh Saxena namespace ns2 {
282f395b70SUtkarsh Saxena namespace {
292f395b70SUtkarsh Saxena int func() {
302f395b70SUtkarsh Saxena tar::X a;
312f395b70SUtkarsh Saxena a.Y = 1;
322f395b70SUtkarsh Saxena return ADD(tar::kConst, a.Y, tar::foo()) + fooInNS2() + tar::foo();
332f395b70SUtkarsh Saxena }
342f395b70SUtkarsh Saxena } // namespace
352f395b70SUtkarsh Saxena } // namespace ns2
362f395b70SUtkarsh Saxena } // namespace ns1
372f395b70SUtkarsh Saxena )cpp");
382f395b70SUtkarsh Saxena
392f395b70SUtkarsh Saxena TU.HeaderCode = R"cpp(
402f395b70SUtkarsh Saxena #define ADD(x, y, z) (x + y + z)
412f395b70SUtkarsh Saxena namespace tar { // A related namespace.
422f395b70SUtkarsh Saxena int kConst = 5;
432f395b70SUtkarsh Saxena int foo();
442f395b70SUtkarsh Saxena void bar(); // Unused symbols are not recorded.
452f395b70SUtkarsh Saxena class X {
462f395b70SUtkarsh Saxena public: int Y;
472f395b70SUtkarsh Saxena };
482f395b70SUtkarsh Saxena } // namespace tar
492f395b70SUtkarsh Saxena namespace ns1::ns2 { int fooInNS2(); }}
502f395b70SUtkarsh Saxena )cpp";
512f395b70SUtkarsh Saxena ASTSignals Signals = ASTSignals::derive(TU.build());
522f395b70SUtkarsh Saxena std::vector<std::pair<StringRef, int>> NS;
532f395b70SUtkarsh Saxena for (const auto &P : Signals.RelatedNamespaces)
542f395b70SUtkarsh Saxena NS.emplace_back(P.getKey(), P.getValue());
552f395b70SUtkarsh Saxena EXPECT_THAT(NS, UnorderedElementsAre(Pair("ns1::", 1), Pair("ns1::ns2::", 1),
562f395b70SUtkarsh Saxena Pair("tar::", /*foo, kConst, X*/ 3)));
572f395b70SUtkarsh Saxena
582f395b70SUtkarsh Saxena std::vector<std::pair<SymbolID, int>> Sym;
592f395b70SUtkarsh Saxena for (const auto &P : Signals.ReferencedSymbols)
602f395b70SUtkarsh Saxena Sym.emplace_back(P.getFirst(), P.getSecond());
612f395b70SUtkarsh Saxena EXPECT_THAT(
622f395b70SUtkarsh Saxena Sym,
632f395b70SUtkarsh Saxena UnorderedElementsAre(
642f395b70SUtkarsh Saxena Pair(ns("tar").ID, 4), Pair(ns("ns1").ID, 1),
652f395b70SUtkarsh Saxena Pair(ns("ns1::ns2").ID, 1), Pair(_ /*int func();*/, 1),
662f395b70SUtkarsh Saxena Pair(cls("tar::X").ID, 1), Pair(var("tar::kConst").ID, 1),
672f395b70SUtkarsh Saxena Pair(func("tar::foo").ID, 2), Pair(func("ns1::ns2::fooInNS2").ID, 1),
682f395b70SUtkarsh Saxena Pair(sym("Y", index::SymbolKind::Variable, "@N@tar@S@X@FI@\\0").ID,
692f395b70SUtkarsh Saxena 2),
702f395b70SUtkarsh Saxena Pair(_ /*a*/, 3)));
71*042dd994SDavid Goldman EXPECT_EQ(Signals.InsertionDirective, Symbol::IncludeDirective::Include);
722f395b70SUtkarsh Saxena }
732f395b70SUtkarsh Saxena } // namespace
742f395b70SUtkarsh Saxena } // namespace clangd
752f395b70SUtkarsh Saxena } // namespace clang
76