xref: /llvm-project/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp (revision edd690b02e16e991393bf7f67631196942369aed)
155974d3bSJulie Hockett //===-- clang-doc/YAMLGeneratorTest.cpp
255974d3bSJulie Hockett //------------------------------------===//
355974d3bSJulie Hockett //
42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
62946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
755974d3bSJulie Hockett //
855974d3bSJulie Hockett //===----------------------------------------------------------------------===//
955974d3bSJulie Hockett 
1055974d3bSJulie Hockett #include "ClangDocTest.h"
1155974d3bSJulie Hockett #include "Generators.h"
1255974d3bSJulie Hockett #include "Representation.h"
1355974d3bSJulie Hockett #include "gtest/gtest.h"
1455974d3bSJulie Hockett 
1555974d3bSJulie Hockett namespace clang {
1655974d3bSJulie Hockett namespace doc {
1755974d3bSJulie Hockett 
getYAMLGenerator()1855974d3bSJulie Hockett std::unique_ptr<Generator> getYAMLGenerator() {
1955974d3bSJulie Hockett   auto G = doc::findGeneratorByName("yaml");
2055974d3bSJulie Hockett   if (!G)
2155974d3bSJulie Hockett     return nullptr;
2255974d3bSJulie Hockett   return std::move(G.get());
2355974d3bSJulie Hockett }
2455974d3bSJulie Hockett 
TEST(YAMLGeneratorTest,emitNamespaceYAML)2555974d3bSJulie Hockett TEST(YAMLGeneratorTest, emitNamespaceYAML) {
2655974d3bSJulie Hockett   NamespaceInfo I;
2755974d3bSJulie Hockett   I.Name = "Namespace";
282c1c9a24SJulie Hockett   I.Path = "path/to/A";
2955974d3bSJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
3055974d3bSJulie Hockett 
314a68babdSBrett Wilson   I.Children.Namespaces.emplace_back(
324a68babdSBrett Wilson       EmptySID, "ChildNamespace", InfoType::IT_namespace,
334a68babdSBrett Wilson       "path::to::A::Namespace::ChildNamespace", "path/to/A/Namespace");
3421fb70c6SBrett Wilson   I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
354a68babdSBrett Wilson                                   "path::to::A::Namespace::ChildStruct",
3621fb70c6SBrett Wilson                                   "path/to/A/Namespace");
3721fb70c6SBrett Wilson   I.Children.Functions.emplace_back();
3821fb70c6SBrett Wilson   I.Children.Functions.back().Name = "OneFunction";
3921fb70c6SBrett Wilson   I.Children.Functions.back().Access = AccessSpecifier::AS_none;
4021fb70c6SBrett Wilson   I.Children.Enums.emplace_back();
4121fb70c6SBrett Wilson   I.Children.Enums.back().Name = "OneEnum";
4255974d3bSJulie Hockett 
4355974d3bSJulie Hockett   auto G = getYAMLGenerator();
4455974d3bSJulie Hockett   assert(G);
4555974d3bSJulie Hockett   std::string Buffer;
4655974d3bSJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
47acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
4855974d3bSJulie Hockett   assert(!Err);
4955974d3bSJulie Hockett   std::string Expected =
5055974d3bSJulie Hockett       R"raw(---
5155974d3bSJulie Hockett USR:             '0000000000000000000000000000000000000000'
5255974d3bSJulie Hockett Name:            'Namespace'
532c1c9a24SJulie Hockett Path:            'path/to/A'
5455974d3bSJulie Hockett Namespace:
5555974d3bSJulie Hockett   - Type:            Namespace
5655974d3bSJulie Hockett     Name:            'A'
574a68babdSBrett Wilson     QualName:        'A'
5855974d3bSJulie Hockett ChildNamespaces:
5955974d3bSJulie Hockett   - Type:            Namespace
6055974d3bSJulie Hockett     Name:            'ChildNamespace'
614a68babdSBrett Wilson     QualName:        'path::to::A::Namespace::ChildNamespace'
62e27f778aSDiego Astiazaran     Path:            'path/to/A/Namespace'
6355974d3bSJulie Hockett ChildRecords:
6455974d3bSJulie Hockett   - Type:            Record
6555974d3bSJulie Hockett     Name:            'ChildStruct'
664a68babdSBrett Wilson     QualName:        'path::to::A::Namespace::ChildStruct'
67e27f778aSDiego Astiazaran     Path:            'path/to/A/Namespace'
6855974d3bSJulie Hockett ChildFunctions:
6955974d3bSJulie Hockett   - USR:             '0000000000000000000000000000000000000000'
7055974d3bSJulie Hockett     Name:            'OneFunction'
71c0830f55SScott Linder     ReturnType:      {}
7255974d3bSJulie Hockett ChildEnums:
7355974d3bSJulie Hockett   - USR:             '0000000000000000000000000000000000000000'
7455974d3bSJulie Hockett     Name:            'OneEnum'
7555974d3bSJulie Hockett ...
7655974d3bSJulie Hockett )raw";
7755974d3bSJulie Hockett   EXPECT_EQ(Expected, Actual.str());
7855974d3bSJulie Hockett }
7955974d3bSJulie Hockett 
TEST(YAMLGeneratorTest,emitRecordYAML)8055974d3bSJulie Hockett TEST(YAMLGeneratorTest, emitRecordYAML) {
8155974d3bSJulie Hockett   RecordInfo I;
8255974d3bSJulie Hockett   I.Name = "r";
83e27f778aSDiego Astiazaran   I.Path = "path/to/A";
8468266828SBrett Wilson   I.IsTypeDef = true;
8555974d3bSJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
8655974d3bSJulie Hockett 
8755974d3bSJulie Hockett   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
8855974d3bSJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
8955974d3bSJulie Hockett 
904a68babdSBrett Wilson   I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);
9199baa10fSBrett Wilson 
9299baa10fSBrett Wilson   // Member documentation.
9399baa10fSBrett Wilson   CommentInfo TopComment;
9499baa10fSBrett Wilson   TopComment.Kind = "FullComment";
9599baa10fSBrett Wilson   TopComment.Children.emplace_back(std::make_unique<CommentInfo>());
9699baa10fSBrett Wilson   CommentInfo *Brief = TopComment.Children.back().get();
9799baa10fSBrett Wilson   Brief->Kind = "ParagraphComment";
9899baa10fSBrett Wilson   Brief->Children.emplace_back(std::make_unique<CommentInfo>());
9999baa10fSBrett Wilson   Brief->Children.back()->Kind = "TextComment";
10099baa10fSBrett Wilson   Brief->Children.back()->Name = "ParagraphComment";
10199baa10fSBrett Wilson   Brief->Children.back()->Text = "Value of the thing.";
10299baa10fSBrett Wilson   I.Members.back().Description.push_back(std::move(TopComment));
10399baa10fSBrett Wilson 
104*edd690b0SVlad Serebrennikov   I.TagType = TagTypeKind::Class;
105ba3d595fSDiego Astiazaran   I.Bases.emplace_back(EmptySID, "F", "path/to/F", true,
106ba3d595fSDiego Astiazaran                        AccessSpecifier::AS_public, true);
10721fb70c6SBrett Wilson   I.Bases.back().Children.Functions.emplace_back();
10821fb70c6SBrett Wilson   I.Bases.back().Children.Functions.back().Name = "InheritedFunctionOne";
1094a68babdSBrett Wilson   I.Bases.back().Members.emplace_back(TypeInfo("int"), "N",
110ba3d595fSDiego Astiazaran                                       AccessSpecifier::AS_private);
11115e468e0SDiego Astiazaran   // F is in the global namespace
11215e468e0SDiego Astiazaran   I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, "");
1132c1c9a24SJulie Hockett   I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record,
1144a68babdSBrett Wilson                                 "path::to::G::G", "path/to/G");
11555974d3bSJulie Hockett 
11621fb70c6SBrett Wilson   I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
1174a68babdSBrett Wilson                                   "path::to::A::r::ChildStruct", "path/to/A/r");
11821fb70c6SBrett Wilson   I.Children.Functions.emplace_back();
11921fb70c6SBrett Wilson   I.Children.Functions.back().Name = "OneFunction";
12021fb70c6SBrett Wilson   I.Children.Enums.emplace_back();
12121fb70c6SBrett Wilson   I.Children.Enums.back().Name = "OneEnum";
12255974d3bSJulie Hockett 
12355974d3bSJulie Hockett   auto G = getYAMLGenerator();
12455974d3bSJulie Hockett   assert(G);
12555974d3bSJulie Hockett   std::string Buffer;
12655974d3bSJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
127acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
12855974d3bSJulie Hockett   assert(!Err);
12955974d3bSJulie Hockett   std::string Expected =
13055974d3bSJulie Hockett       R"raw(---
13155974d3bSJulie Hockett USR:             '0000000000000000000000000000000000000000'
13255974d3bSJulie Hockett Name:            'r'
133e27f778aSDiego Astiazaran Path:            'path/to/A'
13455974d3bSJulie Hockett Namespace:
13555974d3bSJulie Hockett   - Type:            Namespace
13655974d3bSJulie Hockett     Name:            'A'
1374a68babdSBrett Wilson     QualName:        'A'
13855974d3bSJulie Hockett DefLocation:
13955974d3bSJulie Hockett   LineNumber:      10
14055974d3bSJulie Hockett   Filename:        'test.cpp'
14155974d3bSJulie Hockett Location:
14255974d3bSJulie Hockett   - LineNumber:      12
14355974d3bSJulie Hockett     Filename:        'test.cpp'
14455974d3bSJulie Hockett TagType:         Class
14568266828SBrett Wilson IsTypeDef:       true
14655974d3bSJulie Hockett Members:
14755974d3bSJulie Hockett   - Type:
14855974d3bSJulie Hockett       Name:            'int'
1494a68babdSBrett Wilson       QualName:        'int'
15055974d3bSJulie Hockett     Name:            'X'
15155974d3bSJulie Hockett     Access:          Private
15299baa10fSBrett Wilson     Description:
15399baa10fSBrett Wilson       - Kind:            'FullComment'
15499baa10fSBrett Wilson         Children:
15599baa10fSBrett Wilson           - Kind:            'ParagraphComment'
15699baa10fSBrett Wilson             Children:
15799baa10fSBrett Wilson               - Kind:            'TextComment'
15899baa10fSBrett Wilson                 Text:            'Value of the thing.'
15999baa10fSBrett Wilson                 Name:            'ParagraphComment'
160ba3d595fSDiego Astiazaran Bases:
161ba3d595fSDiego Astiazaran   - USR:             '0000000000000000000000000000000000000000'
162ba3d595fSDiego Astiazaran     Name:            'F'
163ba3d595fSDiego Astiazaran     Path:            'path/to/F'
16468266828SBrett Wilson     TagType:         Struct
165ba3d595fSDiego Astiazaran     Members:
166ba3d595fSDiego Astiazaran       - Type:
167ba3d595fSDiego Astiazaran           Name:            'int'
1684a68babdSBrett Wilson           QualName:        'int'
169ba3d595fSDiego Astiazaran         Name:            'N'
170ba3d595fSDiego Astiazaran         Access:          Private
171ba3d595fSDiego Astiazaran     ChildFunctions:
172ba3d595fSDiego Astiazaran       - USR:             '0000000000000000000000000000000000000000'
173ba3d595fSDiego Astiazaran         Name:            'InheritedFunctionOne'
174ba3d595fSDiego Astiazaran         ReturnType:      {}
175ba3d595fSDiego Astiazaran         Access:          Public
176ba3d595fSDiego Astiazaran     IsVirtual:       true
177ba3d595fSDiego Astiazaran     Access:          Public
178ba3d595fSDiego Astiazaran     IsParent:        true
17955974d3bSJulie Hockett Parents:
18055974d3bSJulie Hockett   - Type:            Record
18155974d3bSJulie Hockett     Name:            'F'
18255974d3bSJulie Hockett VirtualParents:
18355974d3bSJulie Hockett   - Type:            Record
18455974d3bSJulie Hockett     Name:            'G'
1854a68babdSBrett Wilson     QualName:        'path::to::G::G'
1862c1c9a24SJulie Hockett     Path:            'path/to/G'
18755974d3bSJulie Hockett ChildRecords:
18855974d3bSJulie Hockett   - Type:            Record
18955974d3bSJulie Hockett     Name:            'ChildStruct'
1904a68babdSBrett Wilson     QualName:        'path::to::A::r::ChildStruct'
191e27f778aSDiego Astiazaran     Path:            'path/to/A/r'
19255974d3bSJulie Hockett ChildFunctions:
19355974d3bSJulie Hockett   - USR:             '0000000000000000000000000000000000000000'
19455974d3bSJulie Hockett     Name:            'OneFunction'
195c0830f55SScott Linder     ReturnType:      {}
1966a29ae4bSDiego Astiazaran     Access:          Public
19755974d3bSJulie Hockett ChildEnums:
19855974d3bSJulie Hockett   - USR:             '0000000000000000000000000000000000000000'
19955974d3bSJulie Hockett     Name:            'OneEnum'
20055974d3bSJulie Hockett ...
20155974d3bSJulie Hockett )raw";
20255974d3bSJulie Hockett   EXPECT_EQ(Expected, Actual.str());
20355974d3bSJulie Hockett }
20455974d3bSJulie Hockett 
TEST(YAMLGeneratorTest,emitFunctionYAML)20555974d3bSJulie Hockett TEST(YAMLGeneratorTest, emitFunctionYAML) {
20655974d3bSJulie Hockett   FunctionInfo I;
20755974d3bSJulie Hockett   I.Name = "f";
20855974d3bSJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
20955974d3bSJulie Hockett 
21055974d3bSJulie Hockett   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
21155974d3bSJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
21255974d3bSJulie Hockett 
2136a29ae4bSDiego Astiazaran   I.Access = AccessSpecifier::AS_none;
2146a29ae4bSDiego Astiazaran 
2154a68babdSBrett Wilson   I.ReturnType = TypeInfo(Reference(EmptySID, "void", InfoType::IT_default));
2164a68babdSBrett Wilson   I.Params.emplace_back(TypeInfo("int"), "P");
2174a68babdSBrett Wilson   I.Params.emplace_back(TypeInfo("double"), "D");
218e191086bSBrett Wilson   I.Params.back().DefaultValue = "2.0 * M_PI";
21955974d3bSJulie Hockett   I.IsMethod = true;
22055974d3bSJulie Hockett   I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
22155974d3bSJulie Hockett 
22255974d3bSJulie Hockett   auto G = getYAMLGenerator();
22355974d3bSJulie Hockett   assert(G);
22455974d3bSJulie Hockett   std::string Buffer;
22555974d3bSJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
226acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
22755974d3bSJulie Hockett   assert(!Err);
22855974d3bSJulie Hockett   std::string Expected =
22955974d3bSJulie Hockett       R"raw(---
23055974d3bSJulie Hockett USR:             '0000000000000000000000000000000000000000'
23155974d3bSJulie Hockett Name:            'f'
23255974d3bSJulie Hockett Namespace:
23355974d3bSJulie Hockett   - Type:            Namespace
23455974d3bSJulie Hockett     Name:            'A'
2354a68babdSBrett Wilson     QualName:        'A'
23655974d3bSJulie Hockett DefLocation:
23755974d3bSJulie Hockett   LineNumber:      10
23855974d3bSJulie Hockett   Filename:        'test.cpp'
23955974d3bSJulie Hockett Location:
24055974d3bSJulie Hockett   - LineNumber:      12
24155974d3bSJulie Hockett     Filename:        'test.cpp'
24255974d3bSJulie Hockett IsMethod:        true
24355974d3bSJulie Hockett Parent:
24455974d3bSJulie Hockett   Type:            Record
24555974d3bSJulie Hockett   Name:            'Parent'
2464a68babdSBrett Wilson   QualName:        'Parent'
24755974d3bSJulie Hockett Params:
24855974d3bSJulie Hockett   - Type:
24955974d3bSJulie Hockett       Name:            'int'
2504a68babdSBrett Wilson       QualName:        'int'
25155974d3bSJulie Hockett     Name:            'P'
252e191086bSBrett Wilson   - Type:
253e191086bSBrett Wilson       Name:            'double'
2544a68babdSBrett Wilson       QualName:        'double'
255e191086bSBrett Wilson     Name:            'D'
256e191086bSBrett Wilson     DefaultValue:    '2.0 * M_PI'
25755974d3bSJulie Hockett ReturnType:
25855974d3bSJulie Hockett   Type:
25955974d3bSJulie Hockett     Name:            'void'
2604a68babdSBrett Wilson     QualName:        'void'
26155974d3bSJulie Hockett ...
26255974d3bSJulie Hockett )raw";
26355974d3bSJulie Hockett   EXPECT_EQ(Expected, Actual.str());
26455974d3bSJulie Hockett }
26555974d3bSJulie Hockett 
266eaa7b324SBrett Wilson // Tests the equivalent of:
267eaa7b324SBrett Wilson // namespace A {
268eaa7b324SBrett Wilson // enum e { X };
269eaa7b324SBrett Wilson // }
TEST(YAMLGeneratorTest,emitSimpleEnumYAML)270eaa7b324SBrett Wilson TEST(YAMLGeneratorTest, emitSimpleEnumYAML) {
27155974d3bSJulie Hockett   EnumInfo I;
27255974d3bSJulie Hockett   I.Name = "e";
27355974d3bSJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
27455974d3bSJulie Hockett 
27555974d3bSJulie Hockett   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
27655974d3bSJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
27755974d3bSJulie Hockett 
27855974d3bSJulie Hockett   I.Members.emplace_back("X");
279eaa7b324SBrett Wilson   I.Scoped = false;
28055974d3bSJulie Hockett 
28155974d3bSJulie Hockett   auto G = getYAMLGenerator();
28255974d3bSJulie Hockett   assert(G);
28355974d3bSJulie Hockett   std::string Buffer;
28455974d3bSJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
285acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
28655974d3bSJulie Hockett   assert(!Err);
28755974d3bSJulie Hockett   std::string Expected =
28855974d3bSJulie Hockett       R"raw(---
28955974d3bSJulie Hockett USR:             '0000000000000000000000000000000000000000'
29055974d3bSJulie Hockett Name:            'e'
29155974d3bSJulie Hockett Namespace:
29255974d3bSJulie Hockett   - Type:            Namespace
29355974d3bSJulie Hockett     Name:            'A'
2944a68babdSBrett Wilson     QualName:        'A'
29555974d3bSJulie Hockett DefLocation:
29655974d3bSJulie Hockett   LineNumber:      10
29755974d3bSJulie Hockett   Filename:        'test.cpp'
29855974d3bSJulie Hockett Location:
29955974d3bSJulie Hockett   - LineNumber:      12
30055974d3bSJulie Hockett     Filename:        'test.cpp'
30155974d3bSJulie Hockett Members:
302eaa7b324SBrett Wilson   - Name:            'X'
303eaa7b324SBrett Wilson     Value:           '0'
304eaa7b324SBrett Wilson ...
305eaa7b324SBrett Wilson )raw";
306eaa7b324SBrett Wilson   EXPECT_EQ(Expected, Actual.str());
307eaa7b324SBrett Wilson }
308eaa7b324SBrett Wilson 
309eaa7b324SBrett Wilson // Tests the equivalent of:
310eaa7b324SBrett Wilson // enum class e : short { X = FOO_BAR + 2 };
TEST(YAMLGeneratorTest,enumTypedScopedEnumYAML)311eaa7b324SBrett Wilson TEST(YAMLGeneratorTest, enumTypedScopedEnumYAML) {
312eaa7b324SBrett Wilson   EnumInfo I;
313eaa7b324SBrett Wilson   I.Name = "e";
314eaa7b324SBrett Wilson 
315eaa7b324SBrett Wilson   I.Members.emplace_back("X", "-9876", "FOO_BAR + 2");
316eaa7b324SBrett Wilson   I.Scoped = true;
317eaa7b324SBrett Wilson   I.BaseType = TypeInfo("short");
318eaa7b324SBrett Wilson 
319eaa7b324SBrett Wilson   auto G = getYAMLGenerator();
320eaa7b324SBrett Wilson   assert(G);
321eaa7b324SBrett Wilson   std::string Buffer;
322eaa7b324SBrett Wilson   llvm::raw_string_ostream Actual(Buffer);
323eaa7b324SBrett Wilson   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
324eaa7b324SBrett Wilson   assert(!Err);
325eaa7b324SBrett Wilson   std::string Expected =
326eaa7b324SBrett Wilson       R"raw(---
327eaa7b324SBrett Wilson USR:             '0000000000000000000000000000000000000000'
328eaa7b324SBrett Wilson Name:            'e'
329eaa7b324SBrett Wilson Scoped:          true
330eaa7b324SBrett Wilson BaseType:
331eaa7b324SBrett Wilson   Type:
332eaa7b324SBrett Wilson     Name:            'short'
3334a68babdSBrett Wilson     QualName:        'short'
334eaa7b324SBrett Wilson Members:
335eaa7b324SBrett Wilson   - Name:            'X'
336eaa7b324SBrett Wilson     Value:           '-9876'
337eaa7b324SBrett Wilson     Expr:            'FOO_BAR + 2'
33855974d3bSJulie Hockett ...
33955974d3bSJulie Hockett )raw";
34055974d3bSJulie Hockett   EXPECT_EQ(Expected, Actual.str());
34155974d3bSJulie Hockett }
34255974d3bSJulie Hockett 
TEST(YAMLGeneratorTest,enumTypedefYAML)34321fb70c6SBrett Wilson TEST(YAMLGeneratorTest, enumTypedefYAML) {
34421fb70c6SBrett Wilson   TypedefInfo I;
34521fb70c6SBrett Wilson   I.Name = "MyUsing";
34621fb70c6SBrett Wilson   I.Underlying = TypeInfo("int");
34721fb70c6SBrett Wilson   I.IsUsing = true;
34821fb70c6SBrett Wilson 
34921fb70c6SBrett Wilson   auto G = getYAMLGenerator();
35021fb70c6SBrett Wilson   assert(G);
35121fb70c6SBrett Wilson   std::string Buffer;
35221fb70c6SBrett Wilson   llvm::raw_string_ostream Actual(Buffer);
35321fb70c6SBrett Wilson   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
35421fb70c6SBrett Wilson   assert(!Err);
35521fb70c6SBrett Wilson   std::string Expected =
35621fb70c6SBrett Wilson       R"raw(---
35721fb70c6SBrett Wilson USR:             '0000000000000000000000000000000000000000'
35821fb70c6SBrett Wilson Name:            'MyUsing'
35921fb70c6SBrett Wilson Underlying:
36021fb70c6SBrett Wilson   Name:            'int'
3614a68babdSBrett Wilson   QualName:        'int'
36221fb70c6SBrett Wilson IsUsing:         true
36321fb70c6SBrett Wilson ...
36421fb70c6SBrett Wilson )raw";
36521fb70c6SBrett Wilson   EXPECT_EQ(Expected, Actual.str());
36621fb70c6SBrett Wilson }
36721fb70c6SBrett Wilson 
TEST(YAMLGeneratorTest,emitCommentYAML)36855974d3bSJulie Hockett TEST(YAMLGeneratorTest, emitCommentYAML) {
36955974d3bSJulie Hockett   FunctionInfo I;
37055974d3bSJulie Hockett   I.Name = "f";
37155974d3bSJulie Hockett   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
3720afc6085SBrett Wilson   I.ReturnType = TypeInfo("void");
3730afc6085SBrett Wilson   I.Params.emplace_back(TypeInfo("int"), "I");
3740afc6085SBrett Wilson   I.Params.emplace_back(TypeInfo("int"), "J");
3756a29ae4bSDiego Astiazaran   I.Access = AccessSpecifier::AS_none;
37655974d3bSJulie Hockett 
37755974d3bSJulie Hockett   CommentInfo Top;
37855974d3bSJulie Hockett   Top.Kind = "FullComment";
37955974d3bSJulie Hockett 
3801c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
38155974d3bSJulie Hockett   CommentInfo *BlankLine = Top.Children.back().get();
38255974d3bSJulie Hockett   BlankLine->Kind = "ParagraphComment";
3831c705d9cSJonas Devlieghere   BlankLine->Children.emplace_back(std::make_unique<CommentInfo>());
38455974d3bSJulie Hockett   BlankLine->Children.back()->Kind = "TextComment";
38555974d3bSJulie Hockett 
3861c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
38755974d3bSJulie Hockett   CommentInfo *Brief = Top.Children.back().get();
38855974d3bSJulie Hockett   Brief->Kind = "ParagraphComment";
3891c705d9cSJonas Devlieghere   Brief->Children.emplace_back(std::make_unique<CommentInfo>());
39055974d3bSJulie Hockett   Brief->Children.back()->Kind = "TextComment";
39155974d3bSJulie Hockett   Brief->Children.back()->Name = "ParagraphComment";
39255974d3bSJulie Hockett   Brief->Children.back()->Text = " Brief description.";
39355974d3bSJulie Hockett 
3941c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
39555974d3bSJulie Hockett   CommentInfo *Extended = Top.Children.back().get();
39655974d3bSJulie Hockett   Extended->Kind = "ParagraphComment";
3971c705d9cSJonas Devlieghere   Extended->Children.emplace_back(std::make_unique<CommentInfo>());
39855974d3bSJulie Hockett   Extended->Children.back()->Kind = "TextComment";
39955974d3bSJulie Hockett   Extended->Children.back()->Text = " Extended description that";
4001c705d9cSJonas Devlieghere   Extended->Children.emplace_back(std::make_unique<CommentInfo>());
40155974d3bSJulie Hockett   Extended->Children.back()->Kind = "TextComment";
40255974d3bSJulie Hockett   Extended->Children.back()->Text = " continues onto the next line.";
40355974d3bSJulie Hockett 
4041c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
40555974d3bSJulie Hockett   CommentInfo *HTML = Top.Children.back().get();
40655974d3bSJulie Hockett   HTML->Kind = "ParagraphComment";
4071c705d9cSJonas Devlieghere   HTML->Children.emplace_back(std::make_unique<CommentInfo>());
40855974d3bSJulie Hockett   HTML->Children.back()->Kind = "TextComment";
4091c705d9cSJonas Devlieghere   HTML->Children.emplace_back(std::make_unique<CommentInfo>());
41055974d3bSJulie Hockett   HTML->Children.back()->Kind = "HTMLStartTagComment";
41155974d3bSJulie Hockett   HTML->Children.back()->Name = "ul";
41255974d3bSJulie Hockett   HTML->Children.back()->AttrKeys.emplace_back("class");
41355974d3bSJulie Hockett   HTML->Children.back()->AttrValues.emplace_back("test");
4141c705d9cSJonas Devlieghere   HTML->Children.emplace_back(std::make_unique<CommentInfo>());
41555974d3bSJulie Hockett   HTML->Children.back()->Kind = "HTMLStartTagComment";
41655974d3bSJulie Hockett   HTML->Children.back()->Name = "li";
4171c705d9cSJonas Devlieghere   HTML->Children.emplace_back(std::make_unique<CommentInfo>());
41855974d3bSJulie Hockett   HTML->Children.back()->Kind = "TextComment";
41955974d3bSJulie Hockett   HTML->Children.back()->Text = " Testing.";
4201c705d9cSJonas Devlieghere   HTML->Children.emplace_back(std::make_unique<CommentInfo>());
42155974d3bSJulie Hockett   HTML->Children.back()->Kind = "HTMLEndTagComment";
42255974d3bSJulie Hockett   HTML->Children.back()->Name = "ul";
42355974d3bSJulie Hockett   HTML->Children.back()->SelfClosing = true;
42455974d3bSJulie Hockett 
4251c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
42655974d3bSJulie Hockett   CommentInfo *Verbatim = Top.Children.back().get();
42755974d3bSJulie Hockett   Verbatim->Kind = "VerbatimBlockComment";
42855974d3bSJulie Hockett   Verbatim->Name = "verbatim";
42955974d3bSJulie Hockett   Verbatim->CloseName = "endverbatim";
4301c705d9cSJonas Devlieghere   Verbatim->Children.emplace_back(std::make_unique<CommentInfo>());
43155974d3bSJulie Hockett   Verbatim->Children.back()->Kind = "VerbatimBlockLineComment";
43255974d3bSJulie Hockett   Verbatim->Children.back()->Text = " The description continues.";
43355974d3bSJulie Hockett 
4341c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
43555974d3bSJulie Hockett   CommentInfo *ParamOut = Top.Children.back().get();
43655974d3bSJulie Hockett   ParamOut->Kind = "ParamCommandComment";
43755974d3bSJulie Hockett   ParamOut->Direction = "[out]";
43855974d3bSJulie Hockett   ParamOut->ParamName = "I";
43955974d3bSJulie Hockett   ParamOut->Explicit = true;
4401c705d9cSJonas Devlieghere   ParamOut->Children.emplace_back(std::make_unique<CommentInfo>());
44155974d3bSJulie Hockett   ParamOut->Children.back()->Kind = "ParagraphComment";
44255974d3bSJulie Hockett   ParamOut->Children.back()->Children.emplace_back(
4431c705d9cSJonas Devlieghere       std::make_unique<CommentInfo>());
44455974d3bSJulie Hockett   ParamOut->Children.back()->Children.back()->Kind = "TextComment";
44555974d3bSJulie Hockett   ParamOut->Children.back()->Children.emplace_back(
4461c705d9cSJonas Devlieghere       std::make_unique<CommentInfo>());
44755974d3bSJulie Hockett   ParamOut->Children.back()->Children.back()->Kind = "TextComment";
44855974d3bSJulie Hockett   ParamOut->Children.back()->Children.back()->Text = " is a parameter.";
44955974d3bSJulie Hockett 
4501c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
45155974d3bSJulie Hockett   CommentInfo *ParamIn = Top.Children.back().get();
45255974d3bSJulie Hockett   ParamIn->Kind = "ParamCommandComment";
45355974d3bSJulie Hockett   ParamIn->Direction = "[in]";
45455974d3bSJulie Hockett   ParamIn->ParamName = "J";
4551c705d9cSJonas Devlieghere   ParamIn->Children.emplace_back(std::make_unique<CommentInfo>());
45655974d3bSJulie Hockett   ParamIn->Children.back()->Kind = "ParagraphComment";
45755974d3bSJulie Hockett   ParamIn->Children.back()->Children.emplace_back(
4581c705d9cSJonas Devlieghere       std::make_unique<CommentInfo>());
45955974d3bSJulie Hockett   ParamIn->Children.back()->Children.back()->Kind = "TextComment";
46055974d3bSJulie Hockett   ParamIn->Children.back()->Children.back()->Text = " is a parameter.";
46155974d3bSJulie Hockett   ParamIn->Children.back()->Children.emplace_back(
4621c705d9cSJonas Devlieghere       std::make_unique<CommentInfo>());
46355974d3bSJulie Hockett   ParamIn->Children.back()->Children.back()->Kind = "TextComment";
46455974d3bSJulie Hockett 
4651c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
46655974d3bSJulie Hockett   CommentInfo *Return = Top.Children.back().get();
46755974d3bSJulie Hockett   Return->Kind = "BlockCommandComment";
46855974d3bSJulie Hockett   Return->Name = "return";
46955974d3bSJulie Hockett   Return->Explicit = true;
4701c705d9cSJonas Devlieghere   Return->Children.emplace_back(std::make_unique<CommentInfo>());
47155974d3bSJulie Hockett   Return->Children.back()->Kind = "ParagraphComment";
47255974d3bSJulie Hockett   Return->Children.back()->Children.emplace_back(
4731c705d9cSJonas Devlieghere       std::make_unique<CommentInfo>());
47455974d3bSJulie Hockett   Return->Children.back()->Children.back()->Kind = "TextComment";
47555974d3bSJulie Hockett   Return->Children.back()->Children.back()->Text = "void";
47655974d3bSJulie Hockett 
47755974d3bSJulie Hockett   I.Description.emplace_back(std::move(Top));
47855974d3bSJulie Hockett 
47955974d3bSJulie Hockett   auto G = getYAMLGenerator();
48055974d3bSJulie Hockett   assert(G);
48155974d3bSJulie Hockett   std::string Buffer;
48255974d3bSJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
483acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, ClangDocContext());
48455974d3bSJulie Hockett   assert(!Err);
48555974d3bSJulie Hockett   std::string Expected =
48655974d3bSJulie Hockett       R"raw(---
48755974d3bSJulie Hockett USR:             '0000000000000000000000000000000000000000'
48855974d3bSJulie Hockett Name:            'f'
48955974d3bSJulie Hockett Description:
49055974d3bSJulie Hockett   - Kind:            'FullComment'
49155974d3bSJulie Hockett     Children:
49255974d3bSJulie Hockett       - Kind:            'ParagraphComment'
49355974d3bSJulie Hockett         Children:
49455974d3bSJulie Hockett           - Kind:            'TextComment'
49555974d3bSJulie Hockett       - Kind:            'ParagraphComment'
49655974d3bSJulie Hockett         Children:
49755974d3bSJulie Hockett           - Kind:            'TextComment'
49855974d3bSJulie Hockett             Text:            ' Brief description.'
49955974d3bSJulie Hockett             Name:            'ParagraphComment'
50055974d3bSJulie Hockett       - Kind:            'ParagraphComment'
50155974d3bSJulie Hockett         Children:
50255974d3bSJulie Hockett           - Kind:            'TextComment'
50355974d3bSJulie Hockett             Text:            ' Extended description that'
50455974d3bSJulie Hockett           - Kind:            'TextComment'
50555974d3bSJulie Hockett             Text:            ' continues onto the next line.'
50655974d3bSJulie Hockett       - Kind:            'ParagraphComment'
50755974d3bSJulie Hockett         Children:
50855974d3bSJulie Hockett           - Kind:            'TextComment'
50955974d3bSJulie Hockett           - Kind:            'HTMLStartTagComment'
51055974d3bSJulie Hockett             Name:            'ul'
51155974d3bSJulie Hockett             AttrKeys:
51255974d3bSJulie Hockett               - 'class'
51355974d3bSJulie Hockett             AttrValues:
51455974d3bSJulie Hockett               - 'test'
51555974d3bSJulie Hockett           - Kind:            'HTMLStartTagComment'
51655974d3bSJulie Hockett             Name:            'li'
51755974d3bSJulie Hockett           - Kind:            'TextComment'
51855974d3bSJulie Hockett             Text:            ' Testing.'
51955974d3bSJulie Hockett           - Kind:            'HTMLEndTagComment'
52055974d3bSJulie Hockett             Name:            'ul'
52155974d3bSJulie Hockett             SelfClosing:     true
52255974d3bSJulie Hockett       - Kind:            'VerbatimBlockComment'
52355974d3bSJulie Hockett         Name:            'verbatim'
52455974d3bSJulie Hockett         CloseName:       'endverbatim'
52555974d3bSJulie Hockett         Children:
52655974d3bSJulie Hockett           - Kind:            'VerbatimBlockLineComment'
52755974d3bSJulie Hockett             Text:            ' The description continues.'
52855974d3bSJulie Hockett       - Kind:            'ParamCommandComment'
52955974d3bSJulie Hockett         Direction:       '[out]'
53055974d3bSJulie Hockett         ParamName:       'I'
53155974d3bSJulie Hockett         Explicit:        true
53255974d3bSJulie Hockett         Children:
53355974d3bSJulie Hockett           - Kind:            'ParagraphComment'
53455974d3bSJulie Hockett             Children:
53555974d3bSJulie Hockett               - Kind:            'TextComment'
53655974d3bSJulie Hockett               - Kind:            'TextComment'
53755974d3bSJulie Hockett                 Text:            ' is a parameter.'
53855974d3bSJulie Hockett       - Kind:            'ParamCommandComment'
53955974d3bSJulie Hockett         Direction:       '[in]'
54055974d3bSJulie Hockett         ParamName:       'J'
54155974d3bSJulie Hockett         Children:
54255974d3bSJulie Hockett           - Kind:            'ParagraphComment'
54355974d3bSJulie Hockett             Children:
54455974d3bSJulie Hockett               - Kind:            'TextComment'
54555974d3bSJulie Hockett                 Text:            ' is a parameter.'
54655974d3bSJulie Hockett               - Kind:            'TextComment'
54755974d3bSJulie Hockett       - Kind:            'BlockCommandComment'
54855974d3bSJulie Hockett         Name:            'return'
54955974d3bSJulie Hockett         Explicit:        true
55055974d3bSJulie Hockett         Children:
55155974d3bSJulie Hockett           - Kind:            'ParagraphComment'
55255974d3bSJulie Hockett             Children:
55355974d3bSJulie Hockett               - Kind:            'TextComment'
55455974d3bSJulie Hockett                 Text:            'void'
55555974d3bSJulie Hockett DefLocation:
55655974d3bSJulie Hockett   LineNumber:      10
55755974d3bSJulie Hockett   Filename:        'test.cpp'
55855974d3bSJulie Hockett Params:
55955974d3bSJulie Hockett   - Type:
56055974d3bSJulie Hockett       Name:            'int'
5614a68babdSBrett Wilson       QualName:        'int'
56255974d3bSJulie Hockett     Name:            'I'
56355974d3bSJulie Hockett   - Type:
56455974d3bSJulie Hockett       Name:            'int'
5654a68babdSBrett Wilson       QualName:        'int'
56655974d3bSJulie Hockett     Name:            'J'
56755974d3bSJulie Hockett ReturnType:
56855974d3bSJulie Hockett   Type:
56955974d3bSJulie Hockett     Name:            'void'
5704a68babdSBrett Wilson     QualName:        'void'
57155974d3bSJulie Hockett ...
57255974d3bSJulie Hockett )raw";
57355974d3bSJulie Hockett 
57455974d3bSJulie Hockett   EXPECT_EQ(Expected, Actual.str());
57555974d3bSJulie Hockett }
57655974d3bSJulie Hockett 
57755974d3bSJulie Hockett } // namespace doc
57855974d3bSJulie Hockett } // namespace clang
579