1 //===-- clang-doc/MergeTest.cpp -------------------------------------------===//
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-exception
7 //===----------------------------------------------------------------------===//
9 #include "ClangDocTest.h"
10 #include "Representation.h"
11 #include "gtest/gtest.h"
16 TEST(MergeTest
, mergeNamespaceInfos
) {
18 One
.Name
= "Namespace";
19 One
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
21 One
.Children
.Namespaces
.emplace_back(NonEmptySID
, "ChildNamespace",
22 InfoType::IT_namespace
);
23 One
.Children
.Records
.emplace_back(NonEmptySID
, "ChildStruct",
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
;
33 Two
.Name
= "Namespace";
34 Two
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
36 Two
.Children
.Namespaces
.emplace_back(EmptySID
, "OtherChildNamespace",
37 InfoType::IT_namespace
);
38 Two
.Children
.Records
.emplace_back(EmptySID
, "OtherChildStruct",
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";
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
)));
49 auto Expected
= std::make_unique
<NamespaceInfo
>();
50 Expected
->Name
= "Namespace";
51 Expected
->Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
53 Expected
->Children
.Namespaces
.emplace_back(NonEmptySID
, "ChildNamespace",
54 InfoType::IT_namespace
);
55 Expected
->Children
.Records
.emplace_back(NonEmptySID
, "ChildStruct",
57 Expected
->Children
.Namespaces
.emplace_back(EmptySID
, "OtherChildNamespace",
58 InfoType::IT_namespace
);
59 Expected
->Children
.Records
.emplace_back(EmptySID
, "OtherChildStruct",
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";
72 auto Actual
= mergeInfos(Infos
);
74 CheckNamespaceInfo(InfoAsNamespace(Expected
.get()),
75 InfoAsNamespace(Actual
.get().get()));
78 TEST(MergeTest
, mergeRecordInfos
) {
82 One
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
84 One
.DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
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
);
91 One
.Bases
.emplace_back(EmptySID
, "F", "path/to/F", true,
92 AccessSpecifier::AS_protected
, true);
93 One
.Children
.Records
.emplace_back(NonEmptySID
, "SharedChildStruct",
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
;
104 Two
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
106 Two
.Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
108 Two
.TagType
= TagTypeKind::Class
;
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";
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
)));
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
);
126 Expected
->DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
127 Expected
->Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
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);
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";
150 auto Actual
= mergeInfos(Infos
);
152 CheckRecordInfo(InfoAsRecord(Expected
.get()),
153 InfoAsRecord(Actual
.get().get()));
156 TEST(MergeTest
, mergeFunctionInfos
) {
159 One
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
161 One
.DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
162 One
.Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
165 One
.Parent
= Reference(EmptySID
, "Parent", InfoType::IT_namespace
);
167 One
.Description
.emplace_back();
168 auto OneFullComment
= &One
.Description
.back();
169 OneFullComment
->Kind
= "FullComment";
170 auto OneParagraphComment
= std::make_unique
<CommentInfo
>();
171 OneParagraphComment
->Kind
= "ParagraphComment";
172 auto OneTextComment
= std::make_unique
<CommentInfo
>();
173 OneTextComment
->Kind
= "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
));
180 Two
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
182 Two
.Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
184 Two
.ReturnType
= TypeInfo("void");
185 Two
.Params
.emplace_back(TypeInfo("int"), "P");
187 Two
.Description
.emplace_back();
188 auto TwoFullComment
= &Two
.Description
.back();
189 TwoFullComment
->Kind
= "FullComment";
190 auto TwoParagraphComment
= std::make_unique
<CommentInfo
>();
191 TwoParagraphComment
->Kind
= "ParagraphComment";
192 auto TwoTextComment
= std::make_unique
<CommentInfo
>();
193 TwoTextComment
->Kind
= "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
));
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
)));
202 auto Expected
= std::make_unique
<FunctionInfo
>();
203 Expected
->Name
= "f";
204 Expected
->Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
206 Expected
->DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
207 Expected
->Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
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
);
214 Expected
->Description
.emplace_back();
215 auto ExpectedFullComment
= &Expected
->Description
.back();
216 ExpectedFullComment
->Kind
= "FullComment";
217 auto ExpectedParagraphComment
= std::make_unique
<CommentInfo
>();
218 ExpectedParagraphComment
->Kind
= "ParagraphComment";
219 auto ExpectedTextComment
= std::make_unique
<CommentInfo
>();
220 ExpectedTextComment
->Kind
= "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
));
225 auto Actual
= mergeInfos(Infos
);
227 CheckFunctionInfo(InfoAsFunction(Expected
.get()),
228 InfoAsFunction(Actual
.get().get()));
231 TEST(MergeTest
, mergeEnumInfos
) {
234 One
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
236 One
.DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
237 One
.Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
243 Two
.Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
245 Two
.Loc
.emplace_back(20, llvm::SmallString
<16>{"test.cpp"});
247 Two
.Members
.emplace_back("X");
248 Two
.Members
.emplace_back("Y");
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
)));
254 auto Expected
= std::make_unique
<EnumInfo
>();
255 Expected
->Name
= "e";
256 Expected
->Namespace
.emplace_back(EmptySID
, "A", InfoType::IT_namespace
);
258 Expected
->DefLoc
= Location(10, llvm::SmallString
<16>{"test.cpp"});
259 Expected
->Loc
.emplace_back(12, llvm::SmallString
<16>{"test.cpp"});
260 Expected
->Loc
.emplace_back(20, llvm::SmallString
<16>{"test.cpp"});
262 Expected
->Members
.emplace_back("X");
263 Expected
->Members
.emplace_back("Y");
264 Expected
->Scoped
= true;
266 auto Actual
= mergeInfos(Infos
);
268 CheckEnumInfo(InfoAsEnum(Expected
.get()), InfoAsEnum(Actual
.get().get()));