/// #include "Test/IndexTester.h" /// /// namespace clice::testing { /// /// namespace { /// /// 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"); /// /// FIXME: Figure forward template declaration. /// /// 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::testing