#include "IndexTester.h" namespace clice { namespace { TEST(Index, Test) { const char* code = R"cpp( void bar(); void $(1)foo(); void $(2)foo() {} )cpp"; IndexTester tester{"main.cpp", code}; tester.run(); auto symbols = tester.locateSymbols("1"); EXPECT_EQ(symbols.size(), 1); EXPECT_EQ(tester.getString(symbols[0]->name), "foo"); tester.GotoDefinition("1", "2"); } TEST(Index, ClassTemplate) { const char* code = R"cpp( template struct $(primary_decl)foo; using type = $(forward_full)foo; template struct $(primary)foo {}; template struct $(partial_spec_decl)foo; template struct $(partial_spec)foo {}; template <> struct $(full_spec_decl)foo; template <> struct $(full_spec)foo {}; template struct $(explicit_primary)foo; template struct $(explicit_partial)foo; $(implicit_primary_1)foo b; $(implicit_primary_2)foo c; $(implicit_partial)foo d; $(implicit_full)foo a; )cpp"; IndexTester tester("main.cpp", code); tester.run(); tester.GotoDefinition("primary_decl", "primary"); tester.GotoDefinition("explicit_primary", "primary"); tester.GotoDefinition("implicit_primary_1", "primary"); tester.GotoDefinition("implicit_primary_2", "primary"); tester.GotoDefinition("partial_spec_decl", "partial_spec"); tester.GotoDefinition("explicit_partial", "partial_spec"); tester.GotoDefinition("implicit_partial", "partial_spec"); tester.GotoDefinition("forward_full", "full_spec"); tester.GotoDefinition("full_spec_decl", "full_spec"); tester.GotoDefinition("implicit_full", "full_spec"); /// TODO: add more tests, FunctionTemplate, VarTemplate, ..., Dependent Name, ..., etc. /// add tests for find references ..., !test symbol count. } TEST(Index, FunctionTemplate) { /// Function template doesn't have partial specialization. const char* code = R"cpp( template void $(primary_decl)foo(); template void $(primary)foo() {} template <> void $(spec_decl)foo(); template <> void $(spec)foo() {} template void $(explicit_primary)foo(); int main() { $(implicit_primary)foo(); $(implicit_spec)foo(); } )cpp"; IndexTester tester("main.cpp", code); tester.run(); tester.GotoDefinition("primary_decl", "primary"); /// FIXME: /// tester.GotoDefinition("explicit_primary", "primary"); tester.GotoDefinition("implicit_primary", "primary"); tester.GotoDefinition("spec_decl", "spec"); tester.GotoDefinition("implicit_spec", "spec"); } TEST(Index, AliasTemplate) { const char* code = R"cpp( template using $(primary)foo = T; $(implicit_primary)foo a; )cpp"; IndexTester tester("main.cpp", code); tester.run(); tester.GotoDefinition("implicit_primary", "primary"); } TEST(Index, VarTemplate) { const char* code = R"cpp( template extern int $(primary_decl)foo; template int $(primary)foo = 1; template extern int $(partial_spec_decl)foo; template int $(partial_spec)foo = 2; template <> float $(full_spec)foo = 1.0f; template int $(explicit_primary)foo; template int $(explicit_partial)foo; int main() { $(implicit_primary_1)foo = 1; $(implicit_primary_2)foo = 2; $(implicit_partial)foo = 3; $(implicit_full)foo = 4; return 0; } )cpp"; IndexTester tester("main.cpp", code); tester.run(); tester.GotoDefinition("primary_decl", "primary"); /// tester.GotoDefinition("explicit_primary", "primary"); tester.GotoDefinition("implicit_primary_1", "primary"); tester.GotoDefinition("implicit_primary_2", "primary"); tester.GotoDefinition("partial_spec_decl", "partial_spec"); /// tester.GotoDefinition("explicit_partial", "partial_spec"); tester.GotoDefinition("implicit_partial", "partial_spec"); tester.GotoDefinition("implicit_full", "full_spec"); } TEST(Index, Concept) { const char* code = R"cpp( template concept $(primary)foo = true; static_assert($(implicit)foo); $(implicit2)foo auto bar = 1; )cpp"; IndexTester tester("main.cpp", code); tester.run(); tester.GotoDefinition("primary", "primary"); tester.GotoDefinition("implicit", "primary"); tester.GotoDefinition("implicit2", "primary"); } } // namespace } // namespace clice