xref: /llvm-project/clang-tools-extra/unittests/clang-doc/ClangDocTest.cpp (revision 21fb70c6ab3b25fe8f5f8384714a9a359b4b5a54)
168049b1aSJulie Hockett //===-- clang-doc/ClangDocTest.cpp ----------------------------------------===//
268049b1aSJulie Hockett //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
668049b1aSJulie Hockett //
768049b1aSJulie Hockett //===----------------------------------------------------------------------===//
868049b1aSJulie Hockett 
9ba3d595fSDiego Astiazaran #include "ClangDocTest.h"
1068049b1aSJulie Hockett #include "Representation.h"
1168049b1aSJulie Hockett #include "clang/AST/RecursiveASTVisitor.h"
1268049b1aSJulie Hockett #include "gtest/gtest.h"
1368049b1aSJulie Hockett 
1468049b1aSJulie Hockett namespace clang {
1568049b1aSJulie Hockett namespace doc {
1668049b1aSJulie Hockett 
InfoAsNamespace(Info * I)1768049b1aSJulie Hockett NamespaceInfo *InfoAsNamespace(Info *I) {
1868049b1aSJulie Hockett   assert(I->IT == InfoType::IT_namespace);
1968049b1aSJulie Hockett   return static_cast<NamespaceInfo *>(I);
2068049b1aSJulie Hockett }
2168049b1aSJulie Hockett 
InfoAsRecord(Info * I)2268049b1aSJulie Hockett RecordInfo *InfoAsRecord(Info *I) {
2368049b1aSJulie Hockett   assert(I->IT == InfoType::IT_record);
2468049b1aSJulie Hockett   return static_cast<RecordInfo *>(I);
2568049b1aSJulie Hockett }
2668049b1aSJulie Hockett 
InfoAsFunction(Info * I)2768049b1aSJulie Hockett FunctionInfo *InfoAsFunction(Info *I) {
2868049b1aSJulie Hockett   assert(I->IT == InfoType::IT_function);
2968049b1aSJulie Hockett   return static_cast<FunctionInfo *>(I);
3068049b1aSJulie Hockett }
3168049b1aSJulie Hockett 
InfoAsEnum(Info * I)3268049b1aSJulie Hockett EnumInfo *InfoAsEnum(Info *I) {
3368049b1aSJulie Hockett   assert(I->IT == InfoType::IT_enum);
3468049b1aSJulie Hockett   return static_cast<EnumInfo *>(I);
3568049b1aSJulie Hockett }
3668049b1aSJulie Hockett 
InfoAsTypedef(Info * I)37*21fb70c6SBrett Wilson TypedefInfo *InfoAsTypedef(Info *I) {
38*21fb70c6SBrett Wilson   assert(I->IT == InfoType::IT_typedef);
39*21fb70c6SBrett Wilson   return static_cast<TypedefInfo *>(I);
40*21fb70c6SBrett Wilson }
41*21fb70c6SBrett Wilson 
4299baa10fSBrett Wilson void CheckCommentInfo(const std::vector<CommentInfo> &Expected,
4399baa10fSBrett Wilson                       const std::vector<CommentInfo> &Actual);
4499baa10fSBrett Wilson void CheckCommentInfo(const std::vector<std::unique_ptr<CommentInfo>> &Expected,
4599baa10fSBrett Wilson                       const std::vector<std::unique_ptr<CommentInfo>> &Actual);
4699baa10fSBrett Wilson 
CheckCommentInfo(const CommentInfo & Expected,const CommentInfo & Actual)4799baa10fSBrett Wilson void CheckCommentInfo(const CommentInfo &Expected, const CommentInfo &Actual) {
4868049b1aSJulie Hockett   EXPECT_EQ(Expected.Kind, Actual.Kind);
4968049b1aSJulie Hockett   EXPECT_EQ(Expected.Text, Actual.Text);
5068049b1aSJulie Hockett   EXPECT_EQ(Expected.Name, Actual.Name);
5168049b1aSJulie Hockett   EXPECT_EQ(Expected.Direction, Actual.Direction);
5268049b1aSJulie Hockett   EXPECT_EQ(Expected.ParamName, Actual.ParamName);
5368049b1aSJulie Hockett   EXPECT_EQ(Expected.CloseName, Actual.CloseName);
5468049b1aSJulie Hockett   EXPECT_EQ(Expected.SelfClosing, Actual.SelfClosing);
5568049b1aSJulie Hockett   EXPECT_EQ(Expected.Explicit, Actual.Explicit);
5668049b1aSJulie Hockett 
5768049b1aSJulie Hockett   ASSERT_EQ(Expected.AttrKeys.size(), Actual.AttrKeys.size());
5868049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual.AttrKeys.size(); ++Idx)
5968049b1aSJulie Hockett     EXPECT_EQ(Expected.AttrKeys[Idx], Actual.AttrKeys[Idx]);
6068049b1aSJulie Hockett 
6168049b1aSJulie Hockett   ASSERT_EQ(Expected.AttrValues.size(), Actual.AttrValues.size());
6268049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual.AttrValues.size(); ++Idx)
6368049b1aSJulie Hockett     EXPECT_EQ(Expected.AttrValues[Idx], Actual.AttrValues[Idx]);
6468049b1aSJulie Hockett 
6568049b1aSJulie Hockett   ASSERT_EQ(Expected.Args.size(), Actual.Args.size());
6668049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual.Args.size(); ++Idx)
6768049b1aSJulie Hockett     EXPECT_EQ(Expected.Args[Idx], Actual.Args[Idx]);
6868049b1aSJulie Hockett 
6999baa10fSBrett Wilson   CheckCommentInfo(Expected.Children, Actual.Children);
7099baa10fSBrett Wilson }
7199baa10fSBrett Wilson 
CheckCommentInfo(const std::vector<CommentInfo> & Expected,const std::vector<CommentInfo> & Actual)7299baa10fSBrett Wilson void CheckCommentInfo(const std::vector<CommentInfo> &Expected,
7399baa10fSBrett Wilson                       const std::vector<CommentInfo> &Actual) {
7499baa10fSBrett Wilson   ASSERT_EQ(Expected.size(), Actual.size());
7599baa10fSBrett Wilson   for (size_t Idx = 0; Idx < Actual.size(); ++Idx)
7699baa10fSBrett Wilson     CheckCommentInfo(Expected[Idx], Actual[Idx]);
7799baa10fSBrett Wilson }
7899baa10fSBrett Wilson 
CheckCommentInfo(const std::vector<std::unique_ptr<CommentInfo>> & Expected,const std::vector<std::unique_ptr<CommentInfo>> & Actual)7999baa10fSBrett Wilson void CheckCommentInfo(const std::vector<std::unique_ptr<CommentInfo>> &Expected,
8099baa10fSBrett Wilson                       const std::vector<std::unique_ptr<CommentInfo>> &Actual) {
8199baa10fSBrett Wilson   ASSERT_EQ(Expected.size(), Actual.size());
8299baa10fSBrett Wilson   for (size_t Idx = 0; Idx < Actual.size(); ++Idx)
8399baa10fSBrett Wilson     CheckCommentInfo(*Expected[Idx], *Actual[Idx]);
8468049b1aSJulie Hockett }
8568049b1aSJulie Hockett 
CheckReference(Reference & Expected,Reference & Actual)8668049b1aSJulie Hockett void CheckReference(Reference &Expected, Reference &Actual) {
8768049b1aSJulie Hockett   EXPECT_EQ(Expected.Name, Actual.Name);
8868049b1aSJulie Hockett   EXPECT_EQ(Expected.RefType, Actual.RefType);
897dfe0bc3SDiego Astiazaran   EXPECT_EQ(Expected.Path, Actual.Path);
9068049b1aSJulie Hockett }
9168049b1aSJulie Hockett 
CheckTypeInfo(TypeInfo * Expected,TypeInfo * Actual)9268049b1aSJulie Hockett void CheckTypeInfo(TypeInfo *Expected, TypeInfo *Actual) {
9368049b1aSJulie Hockett   CheckReference(Expected->Type, Actual->Type);
9468049b1aSJulie Hockett }
9568049b1aSJulie Hockett 
CheckFieldTypeInfo(FieldTypeInfo * Expected,FieldTypeInfo * Actual)9668049b1aSJulie Hockett void CheckFieldTypeInfo(FieldTypeInfo *Expected, FieldTypeInfo *Actual) {
9768049b1aSJulie Hockett   CheckTypeInfo(Expected, Actual);
9868049b1aSJulie Hockett   EXPECT_EQ(Expected->Name, Actual->Name);
9968049b1aSJulie Hockett }
10068049b1aSJulie Hockett 
CheckMemberTypeInfo(MemberTypeInfo * Expected,MemberTypeInfo * Actual)10168049b1aSJulie Hockett void CheckMemberTypeInfo(MemberTypeInfo *Expected, MemberTypeInfo *Actual) {
10268049b1aSJulie Hockett   CheckFieldTypeInfo(Expected, Actual);
10368049b1aSJulie Hockett   EXPECT_EQ(Expected->Access, Actual->Access);
10499baa10fSBrett Wilson   CheckCommentInfo(Expected->Description, Actual->Description);
10568049b1aSJulie Hockett }
10668049b1aSJulie Hockett 
CheckBaseInfo(Info * Expected,Info * Actual)10768049b1aSJulie Hockett void CheckBaseInfo(Info *Expected, Info *Actual) {
10868049b1aSJulie Hockett   EXPECT_EQ(size_t(20), Actual->USR.size());
10968049b1aSJulie Hockett   EXPECT_EQ(Expected->Name, Actual->Name);
1106169a730SDiego Astiazaran   EXPECT_EQ(Expected->Path, Actual->Path);
11168049b1aSJulie Hockett   ASSERT_EQ(Expected->Namespace.size(), Actual->Namespace.size());
11268049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Namespace.size(); ++Idx)
11368049b1aSJulie Hockett     CheckReference(Expected->Namespace[Idx], Actual->Namespace[Idx]);
11499baa10fSBrett Wilson   CheckCommentInfo(Expected->Description, Actual->Description);
11568049b1aSJulie Hockett }
11668049b1aSJulie Hockett 
CheckSymbolInfo(SymbolInfo * Expected,SymbolInfo * Actual)11768049b1aSJulie Hockett void CheckSymbolInfo(SymbolInfo *Expected, SymbolInfo *Actual) {
11868049b1aSJulie Hockett   CheckBaseInfo(Expected, Actual);
11953daa177SKazu Hirata   EXPECT_EQ(Expected->DefLoc.has_value(), Actual->DefLoc.has_value());
12053daa177SKazu Hirata   if (Expected->DefLoc && Actual->DefLoc.has_value()) {
12168049b1aSJulie Hockett     EXPECT_EQ(Expected->DefLoc->LineNumber, Actual->DefLoc->LineNumber);
12268049b1aSJulie Hockett     EXPECT_EQ(Expected->DefLoc->Filename, Actual->DefLoc->Filename);
12368049b1aSJulie Hockett   }
12468049b1aSJulie Hockett   ASSERT_EQ(Expected->Loc.size(), Actual->Loc.size());
12568049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Loc.size(); ++Idx)
12668049b1aSJulie Hockett     EXPECT_EQ(Expected->Loc[Idx], Actual->Loc[Idx]);
12768049b1aSJulie Hockett }
12868049b1aSJulie Hockett 
CheckFunctionInfo(FunctionInfo * Expected,FunctionInfo * Actual)12968049b1aSJulie Hockett void CheckFunctionInfo(FunctionInfo *Expected, FunctionInfo *Actual) {
13068049b1aSJulie Hockett   CheckSymbolInfo(Expected, Actual);
13168049b1aSJulie Hockett 
13268049b1aSJulie Hockett   EXPECT_EQ(Expected->IsMethod, Actual->IsMethod);
13368049b1aSJulie Hockett   CheckReference(Expected->Parent, Actual->Parent);
13468049b1aSJulie Hockett   CheckTypeInfo(&Expected->ReturnType, &Actual->ReturnType);
13568049b1aSJulie Hockett 
13668049b1aSJulie Hockett   ASSERT_EQ(Expected->Params.size(), Actual->Params.size());
13768049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Params.size(); ++Idx)
13868049b1aSJulie Hockett     EXPECT_EQ(Expected->Params[Idx], Actual->Params[Idx]);
13968049b1aSJulie Hockett 
14068049b1aSJulie Hockett   EXPECT_EQ(Expected->Access, Actual->Access);
14168049b1aSJulie Hockett }
14268049b1aSJulie Hockett 
CheckEnumInfo(EnumInfo * Expected,EnumInfo * Actual)14368049b1aSJulie Hockett void CheckEnumInfo(EnumInfo *Expected, EnumInfo *Actual) {
14468049b1aSJulie Hockett   CheckSymbolInfo(Expected, Actual);
14568049b1aSJulie Hockett 
14668049b1aSJulie Hockett   EXPECT_EQ(Expected->Scoped, Actual->Scoped);
14768049b1aSJulie Hockett   ASSERT_EQ(Expected->Members.size(), Actual->Members.size());
14868049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Members.size(); ++Idx)
14968049b1aSJulie Hockett     EXPECT_EQ(Expected->Members[Idx], Actual->Members[Idx]);
15068049b1aSJulie Hockett }
15168049b1aSJulie Hockett 
CheckTypedefInfo(TypedefInfo * Expected,TypedefInfo * Actual)152*21fb70c6SBrett Wilson void CheckTypedefInfo(TypedefInfo *Expected, TypedefInfo *Actual) {
153*21fb70c6SBrett Wilson   CheckSymbolInfo(Expected, Actual);
154*21fb70c6SBrett Wilson   EXPECT_EQ(Expected->IsUsing, Actual->IsUsing);
155*21fb70c6SBrett Wilson   CheckTypeInfo(&Expected->Underlying, &Actual->Underlying);
156*21fb70c6SBrett Wilson }
157*21fb70c6SBrett Wilson 
CheckNamespaceInfo(NamespaceInfo * Expected,NamespaceInfo * Actual)15868049b1aSJulie Hockett void CheckNamespaceInfo(NamespaceInfo *Expected, NamespaceInfo *Actual) {
15968049b1aSJulie Hockett   CheckBaseInfo(Expected, Actual);
16068049b1aSJulie Hockett 
161*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Namespaces.size(),
162*21fb70c6SBrett Wilson             Actual->Children.Namespaces.size());
163*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Namespaces.size(); ++Idx)
164*21fb70c6SBrett Wilson     CheckReference(Expected->Children.Namespaces[Idx],
165*21fb70c6SBrett Wilson                    Actual->Children.Namespaces[Idx]);
16668049b1aSJulie Hockett 
167*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Records.size(), Actual->Children.Records.size());
168*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Records.size(); ++Idx)
169*21fb70c6SBrett Wilson     CheckReference(Expected->Children.Records[Idx],
170*21fb70c6SBrett Wilson                    Actual->Children.Records[Idx]);
17168049b1aSJulie Hockett 
172*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Functions.size(),
173*21fb70c6SBrett Wilson             Actual->Children.Functions.size());
174*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Functions.size(); ++Idx)
175*21fb70c6SBrett Wilson     CheckFunctionInfo(&Expected->Children.Functions[Idx],
176*21fb70c6SBrett Wilson                       &Actual->Children.Functions[Idx]);
17768049b1aSJulie Hockett 
178*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Enums.size(), Actual->Children.Enums.size());
179*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Enums.size(); ++Idx)
180*21fb70c6SBrett Wilson     CheckEnumInfo(&Expected->Children.Enums[Idx], &Actual->Children.Enums[Idx]);
18168049b1aSJulie Hockett }
18268049b1aSJulie Hockett 
CheckRecordInfo(RecordInfo * Expected,RecordInfo * Actual)18368049b1aSJulie Hockett void CheckRecordInfo(RecordInfo *Expected, RecordInfo *Actual) {
18468049b1aSJulie Hockett   CheckSymbolInfo(Expected, Actual);
18568049b1aSJulie Hockett 
18668049b1aSJulie Hockett   EXPECT_EQ(Expected->TagType, Actual->TagType);
18768049b1aSJulie Hockett 
188b1f01e27SJulie Hockett   EXPECT_EQ(Expected->IsTypeDef, Actual->IsTypeDef);
189b1f01e27SJulie Hockett 
19068049b1aSJulie Hockett   ASSERT_EQ(Expected->Members.size(), Actual->Members.size());
19168049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Members.size(); ++Idx)
19268049b1aSJulie Hockett     EXPECT_EQ(Expected->Members[Idx], Actual->Members[Idx]);
19368049b1aSJulie Hockett 
19468049b1aSJulie Hockett   ASSERT_EQ(Expected->Parents.size(), Actual->Parents.size());
19568049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->Parents.size(); ++Idx)
19668049b1aSJulie Hockett     CheckReference(Expected->Parents[Idx], Actual->Parents[Idx]);
19768049b1aSJulie Hockett 
19868049b1aSJulie Hockett   ASSERT_EQ(Expected->VirtualParents.size(), Actual->VirtualParents.size());
19968049b1aSJulie Hockett   for (size_t Idx = 0; Idx < Actual->VirtualParents.size(); ++Idx)
20068049b1aSJulie Hockett     CheckReference(Expected->VirtualParents[Idx], Actual->VirtualParents[Idx]);
20168049b1aSJulie Hockett 
202ba3d595fSDiego Astiazaran   ASSERT_EQ(Expected->Bases.size(), Actual->Bases.size());
203ba3d595fSDiego Astiazaran   for (size_t Idx = 0; Idx < Actual->Bases.size(); ++Idx)
204ba3d595fSDiego Astiazaran     CheckBaseRecordInfo(&Expected->Bases[Idx], &Actual->Bases[Idx]);
205ba3d595fSDiego Astiazaran 
206*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Records.size(), Actual->Children.Records.size());
207*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Records.size(); ++Idx)
208*21fb70c6SBrett Wilson     CheckReference(Expected->Children.Records[Idx],
209*21fb70c6SBrett Wilson                    Actual->Children.Records[Idx]);
21068049b1aSJulie Hockett 
211*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Functions.size(),
212*21fb70c6SBrett Wilson             Actual->Children.Functions.size());
213*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Functions.size(); ++Idx)
214*21fb70c6SBrett Wilson     CheckFunctionInfo(&Expected->Children.Functions[Idx],
215*21fb70c6SBrett Wilson                       &Actual->Children.Functions[Idx]);
21668049b1aSJulie Hockett 
217*21fb70c6SBrett Wilson   ASSERT_EQ(Expected->Children.Enums.size(), Actual->Children.Enums.size());
218*21fb70c6SBrett Wilson   for (size_t Idx = 0; Idx < Actual->Children.Enums.size(); ++Idx)
219*21fb70c6SBrett Wilson     CheckEnumInfo(&Expected->Children.Enums[Idx], &Actual->Children.Enums[Idx]);
22068049b1aSJulie Hockett }
22168049b1aSJulie Hockett 
CheckBaseRecordInfo(BaseRecordInfo * Expected,BaseRecordInfo * Actual)222ba3d595fSDiego Astiazaran void CheckBaseRecordInfo(BaseRecordInfo *Expected, BaseRecordInfo *Actual) {
223ba3d595fSDiego Astiazaran   CheckRecordInfo(Expected, Actual);
224ba3d595fSDiego Astiazaran 
225ba3d595fSDiego Astiazaran   EXPECT_EQ(Expected->IsVirtual, Actual->IsVirtual);
226ba3d595fSDiego Astiazaran   EXPECT_EQ(Expected->Access, Actual->Access);
227ba3d595fSDiego Astiazaran   EXPECT_EQ(Expected->IsParent, Actual->IsParent);
228ba3d595fSDiego Astiazaran }
229ba3d595fSDiego Astiazaran 
CheckIndex(Index & Expected,Index & Actual)2307dfe0bc3SDiego Astiazaran void CheckIndex(Index &Expected, Index &Actual) {
2317dfe0bc3SDiego Astiazaran   CheckReference(Expected, Actual);
2327dfe0bc3SDiego Astiazaran   ASSERT_EQ(Expected.Children.size(), Actual.Children.size());
2337dfe0bc3SDiego Astiazaran   for (size_t Idx = 0; Idx < Actual.Children.size(); ++Idx)
2347dfe0bc3SDiego Astiazaran     CheckIndex(Expected.Children[Idx], Actual.Children[Idx]);
2357dfe0bc3SDiego Astiazaran }
2367dfe0bc3SDiego Astiazaran 
23768049b1aSJulie Hockett } // namespace doc
23868049b1aSJulie Hockett } // namespace clang
239