273 lines · cpp
1//===-- clang-doc/MergeTest.cpp -------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "ClangDocTest.h"10#include "Representation.h"11#include "gtest/gtest.h"12 13namespace clang {14namespace doc {15 16TEST(MergeTest, mergeNamespaceInfos) {17 NamespaceInfo One;18 One.Name = "Namespace";19 One.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);20 21 One.Children.Namespaces.emplace_back(NonEmptySID, "ChildNamespace",22 InfoType::IT_namespace);23 One.Children.Records.emplace_back(NonEmptySID, "ChildStruct",24 InfoType::IT_record);25 One.Children.Functions.emplace_back();26 One.Children.Functions.back().Name = "OneFunction";27 One.Children.Functions.back().USR = NonEmptySID;28 One.Children.Enums.emplace_back();29 One.Children.Enums.back().Name = "OneEnum";30 One.Children.Enums.back().USR = NonEmptySID;31 32 NamespaceInfo Two;33 Two.Name = "Namespace";34 Two.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);35 36 Two.Children.Namespaces.emplace_back(EmptySID, "OtherChildNamespace",37 InfoType::IT_namespace);38 Two.Children.Records.emplace_back(EmptySID, "OtherChildStruct",39 InfoType::IT_record);40 Two.Children.Functions.emplace_back();41 Two.Children.Functions.back().Name = "TwoFunction";42 Two.Children.Enums.emplace_back();43 Two.Children.Enums.back().Name = "TwoEnum";44 45 std::vector<std::unique_ptr<Info>> Infos;46 Infos.emplace_back(std::make_unique<NamespaceInfo>(std::move(One)));47 Infos.emplace_back(std::make_unique<NamespaceInfo>(std::move(Two)));48 49 auto Expected = std::make_unique<NamespaceInfo>();50 Expected->Name = "Namespace";51 Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);52 53 Expected->Children.Namespaces.emplace_back(NonEmptySID, "ChildNamespace",54 InfoType::IT_namespace);55 Expected->Children.Records.emplace_back(NonEmptySID, "ChildStruct",56 InfoType::IT_record);57 Expected->Children.Namespaces.emplace_back(EmptySID, "OtherChildNamespace",58 InfoType::IT_namespace);59 Expected->Children.Records.emplace_back(EmptySID, "OtherChildStruct",60 InfoType::IT_record);61 Expected->Children.Functions.emplace_back();62 Expected->Children.Functions.back().Name = "OneFunction";63 Expected->Children.Functions.back().USR = NonEmptySID;64 Expected->Children.Functions.emplace_back();65 Expected->Children.Functions.back().Name = "TwoFunction";66 Expected->Children.Enums.emplace_back();67 Expected->Children.Enums.back().Name = "OneEnum";68 Expected->Children.Enums.back().USR = NonEmptySID;69 Expected->Children.Enums.emplace_back();70 Expected->Children.Enums.back().Name = "TwoEnum";71 72 auto Actual = mergeInfos(Infos);73 assert(Actual);74 CheckNamespaceInfo(InfoAsNamespace(Expected.get()),75 InfoAsNamespace(Actual.get().get()));76}77 78TEST(MergeTest, mergeRecordInfos) {79 RecordInfo One;80 One.Name = "r";81 One.IsTypeDef = true;82 One.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);83 84 One.DefLoc = Location(10, 10, "test.cpp");85 86 One.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);87 One.TagType = TagTypeKind::Class;88 One.Parents.emplace_back(EmptySID, "F", InfoType::IT_record);89 One.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record);90 91 One.Bases.emplace_back(EmptySID, "F", "path/to/F", true,92 AccessSpecifier::AS_protected, true);93 One.Children.Records.emplace_back(NonEmptySID, "SharedChildStruct",94 InfoType::IT_record);95 One.Children.Functions.emplace_back();96 One.Children.Functions.back().Name = "OneFunction";97 One.Children.Functions.back().USR = NonEmptySID;98 One.Children.Enums.emplace_back();99 One.Children.Enums.back().Name = "OneEnum";100 One.Children.Enums.back().USR = NonEmptySID;101 102 RecordInfo Two;103 Two.Name = "r";104 Two.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);105 106 Two.Loc.emplace_back(12, 12, "test.cpp");107 108 Two.TagType = TagTypeKind::Class;109 110 Two.Children.Records.emplace_back(NonEmptySID, "SharedChildStruct",111 InfoType::IT_record, "path");112 Two.Children.Functions.emplace_back();113 Two.Children.Functions.back().Name = "TwoFunction";114 Two.Children.Enums.emplace_back();115 Two.Children.Enums.back().Name = "TwoEnum";116 117 std::vector<std::unique_ptr<Info>> Infos;118 Infos.emplace_back(std::make_unique<RecordInfo>(std::move(One)));119 Infos.emplace_back(std::make_unique<RecordInfo>(std::move(Two)));120 121 auto Expected = std::make_unique<RecordInfo>();122 Expected->Name = "r";123 Expected->IsTypeDef = true;124 Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);125 126 Expected->DefLoc = Location(10, 10, "test.cpp");127 Expected->Loc.emplace_back(12, 12, "test.cpp");128 129 Expected->Members.emplace_back(TypeInfo("int"), "X",130 AccessSpecifier::AS_private);131 Expected->TagType = TagTypeKind::Class;132 Expected->Parents.emplace_back(EmptySID, "F", InfoType::IT_record);133 Expected->VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record);134 Expected->Bases.emplace_back(EmptySID, "F", "path/to/F", true,135 AccessSpecifier::AS_protected, true);136 137 Expected->Children.Records.emplace_back(NonEmptySID, "SharedChildStruct",138 InfoType::IT_record, "path");139 Expected->Children.Functions.emplace_back();140 Expected->Children.Functions.back().Name = "OneFunction";141 Expected->Children.Functions.back().USR = NonEmptySID;142 Expected->Children.Functions.emplace_back();143 Expected->Children.Functions.back().Name = "TwoFunction";144 Expected->Children.Enums.emplace_back();145 Expected->Children.Enums.back().Name = "OneEnum";146 Expected->Children.Enums.back().USR = NonEmptySID;147 Expected->Children.Enums.emplace_back();148 Expected->Children.Enums.back().Name = "TwoEnum";149 150 auto Actual = mergeInfos(Infos);151 assert(Actual);152 CheckRecordInfo(InfoAsRecord(Expected.get()),153 InfoAsRecord(Actual.get().get()));154}155 156TEST(MergeTest, mergeFunctionInfos) {157 FunctionInfo One;158 One.Name = "f";159 One.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);160 161 One.DefLoc = Location(10, 10, "test.cpp");162 One.Loc.emplace_back(12, 12, "test.cpp");163 164 One.IsMethod = true;165 One.Parent = Reference(EmptySID, "Parent", InfoType::IT_namespace);166 167 One.Description.emplace_back();168 auto *OneFullComment = &One.Description.back();169 OneFullComment->Kind = CommentKind::CK_FullComment;170 auto OneParagraphComment = std::make_unique<CommentInfo>();171 OneParagraphComment->Kind = CommentKind::CK_ParagraphComment;172 auto OneTextComment = std::make_unique<CommentInfo>();173 OneTextComment->Kind = CommentKind::CK_TextComment;174 OneTextComment->Text = "This is a text comment.";175 OneParagraphComment->Children.push_back(std::move(OneTextComment));176 OneFullComment->Children.push_back(std::move(OneParagraphComment));177 178 FunctionInfo Two;179 Two.Name = "f";180 Two.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);181 182 Two.Loc.emplace_back(12, 12, "test.cpp");183 184 Two.ReturnType = TypeInfo("void");185 Two.Params.emplace_back(TypeInfo("int"), "P");186 187 Two.Description.emplace_back();188 auto *TwoFullComment = &Two.Description.back();189 TwoFullComment->Kind = CommentKind::CK_FullComment;190 auto TwoParagraphComment = std::make_unique<CommentInfo>();191 TwoParagraphComment->Kind = CommentKind::CK_ParagraphComment;192 auto TwoTextComment = std::make_unique<CommentInfo>();193 TwoTextComment->Kind = CommentKind::CK_TextComment;194 TwoTextComment->Text = "This is a text comment.";195 TwoParagraphComment->Children.push_back(std::move(TwoTextComment));196 TwoFullComment->Children.push_back(std::move(TwoParagraphComment));197 198 std::vector<std::unique_ptr<Info>> Infos;199 Infos.emplace_back(std::make_unique<FunctionInfo>(std::move(One)));200 Infos.emplace_back(std::make_unique<FunctionInfo>(std::move(Two)));201 202 auto Expected = std::make_unique<FunctionInfo>();203 Expected->Name = "f";204 Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);205 206 Expected->DefLoc = Location(10, 10, "test.cpp");207 Expected->Loc.emplace_back(12, 12, "test.cpp");208 209 Expected->ReturnType = TypeInfo("void");210 Expected->Params.emplace_back(TypeInfo("int"), "P");211 Expected->IsMethod = true;212 Expected->Parent = Reference(EmptySID, "Parent", InfoType::IT_namespace);213 214 Expected->Description.emplace_back();215 auto *ExpectedFullComment = &Expected->Description.back();216 ExpectedFullComment->Kind = CommentKind::CK_FullComment;217 auto ExpectedParagraphComment = std::make_unique<CommentInfo>();218 ExpectedParagraphComment->Kind = CommentKind::CK_ParagraphComment;219 auto ExpectedTextComment = std::make_unique<CommentInfo>();220 ExpectedTextComment->Kind = CommentKind::CK_TextComment;221 ExpectedTextComment->Text = "This is a text comment.";222 ExpectedParagraphComment->Children.push_back(std::move(ExpectedTextComment));223 ExpectedFullComment->Children.push_back(std::move(ExpectedParagraphComment));224 225 auto Actual = mergeInfos(Infos);226 assert(Actual);227 CheckFunctionInfo(InfoAsFunction(Expected.get()),228 InfoAsFunction(Actual.get().get()));229}230 231TEST(MergeTest, mergeEnumInfos) {232 EnumInfo One;233 One.Name = "e";234 One.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);235 236 One.DefLoc = Location(10, 10, "test.cpp");237 One.Loc.emplace_back(12, 12, "test.cpp");238 239 One.Scoped = true;240 241 EnumInfo Two;242 Two.Name = "e";243 Two.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);244 245 Two.Loc.emplace_back(20, 20, "test.cpp");246 247 Two.Members.emplace_back("X");248 Two.Members.emplace_back("Y");249 250 std::vector<std::unique_ptr<Info>> Infos;251 Infos.emplace_back(std::make_unique<EnumInfo>(std::move(One)));252 Infos.emplace_back(std::make_unique<EnumInfo>(std::move(Two)));253 254 auto Expected = std::make_unique<EnumInfo>();255 Expected->Name = "e";256 Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);257 258 Expected->DefLoc = Location(10, 10, "test.cpp");259 Expected->Loc.emplace_back(12, 12, "test.cpp");260 Expected->Loc.emplace_back(20, 20, "test.cpp");261 262 Expected->Members.emplace_back("X");263 Expected->Members.emplace_back("Y");264 Expected->Scoped = true;265 266 auto Actual = mergeInfos(Infos);267 assert(Actual);268 CheckEnumInfo(InfoAsEnum(Expected.get()), InfoAsEnum(Actual.get().get()));269}270 271} // namespace doc272} // namespace clang273