xref: /llvm-project/clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp (revision 5ef2456a438578b0783241a2744efc62d47e5ab6)
1671bac74SJulie Hockett //===-- clang-doc/HTMLGeneratorTest.cpp -----------------------------------===//
2671bac74SJulie Hockett //
3671bac74SJulie Hockett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4671bac74SJulie Hockett // See https://llvm.org/LICENSE.txt for license information.
5671bac74SJulie Hockett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6671bac74SJulie Hockett //
7671bac74SJulie Hockett //===----------------------------------------------------------------------===//
8671bac74SJulie Hockett 
9671bac74SJulie Hockett #include "ClangDocTest.h"
10671bac74SJulie Hockett #include "Generators.h"
11671bac74SJulie Hockett #include "Representation.h"
12d47be4daSDiego Astiazaran #include "Serialize.h"
133550da79SDiego Astiazaran #include "clang/Basic/Version.h"
14671bac74SJulie Hockett #include "gtest/gtest.h"
15671bac74SJulie Hockett 
16671bac74SJulie Hockett namespace clang {
17671bac74SJulie Hockett namespace doc {
18671bac74SJulie Hockett 
193550da79SDiego Astiazaran static const std::string ClangDocVersion =
203550da79SDiego Astiazaran     clang::getClangToolFullVersion("clang-doc");
213550da79SDiego Astiazaran 
22671bac74SJulie Hockett std::unique_ptr<Generator> getHTMLGenerator() {
23671bac74SJulie Hockett   auto G = doc::findGeneratorByName("html");
24671bac74SJulie Hockett   if (!G)
25671bac74SJulie Hockett     return nullptr;
26671bac74SJulie Hockett   return std::move(G.get());
27671bac74SJulie Hockett }
28671bac74SJulie Hockett 
29acd35f6cSDiego Astiazaran ClangDocContext
30665e9676SDiego Astiazaran getClangDocContext(std::vector<std::string> UserStylesheets = {},
31665e9676SDiego Astiazaran                    StringRef RepositoryUrl = "") {
323550da79SDiego Astiazaran   ClangDocContext CDCtx{
33f14ad744SPeterChou1       {}, "test-project", {}, {}, {}, RepositoryUrl, UserStylesheets};
34acd35f6cSDiego Astiazaran   CDCtx.UserStylesheets.insert(
35acd35f6cSDiego Astiazaran       CDCtx.UserStylesheets.begin(),
36acd35f6cSDiego Astiazaran       "../share/clang/clang-doc-default-stylesheet.css");
377dfe0bc3SDiego Astiazaran   CDCtx.JsScripts.emplace_back("index.js");
38acd35f6cSDiego Astiazaran   return CDCtx;
39acd35f6cSDiego Astiazaran }
40acd35f6cSDiego Astiazaran 
41671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitNamespaceHTML) {
42671bac74SJulie Hockett   NamespaceInfo I;
43671bac74SJulie Hockett   I.Name = "Namespace";
44671bac74SJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
45671bac74SJulie Hockett 
4621fb70c6SBrett Wilson   I.Children.Namespaces.emplace_back(EmptySID, "ChildNamespace",
474a68babdSBrett Wilson                                      InfoType::IT_namespace,
484a68babdSBrett Wilson                                      "Namespace::ChildNamespace", "Namespace");
4921fb70c6SBrett Wilson   I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
504a68babdSBrett Wilson                                   "Namespace::ChildStruct", "Namespace");
5121fb70c6SBrett Wilson   I.Children.Functions.emplace_back();
5221fb70c6SBrett Wilson   I.Children.Functions.back().Access = AccessSpecifier::AS_none;
5321fb70c6SBrett Wilson   I.Children.Functions.back().Name = "OneFunction";
5421fb70c6SBrett Wilson   I.Children.Enums.emplace_back();
5521fb70c6SBrett Wilson   I.Children.Enums.back().Name = "OneEnum";
56671bac74SJulie Hockett 
57671bac74SJulie Hockett   auto G = getHTMLGenerator();
58671bac74SJulie Hockett   assert(G);
59671bac74SJulie Hockett   std::string Buffer;
60671bac74SJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
61acd35f6cSDiego Astiazaran   ClangDocContext CDCtx = getClangDocContext({"user-provided-stylesheet.css"});
62acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, CDCtx);
63671bac74SJulie Hockett   assert(!Err);
64671bac74SJulie Hockett   std::string Expected = R"raw(<!DOCTYPE html>
65671bac74SJulie Hockett <meta charset="utf-8"/>
66671bac74SJulie Hockett <title>namespace Namespace</title>
677003f64cSPetr Hosek <link rel="stylesheet" href="../clang-doc-default-stylesheet.css"/>
687003f64cSPetr Hosek <link rel="stylesheet" href="../user-provided-stylesheet.css"/>
69f14ad744SPeterChou1 <script src="../index_json.js"></script>
707003f64cSPetr Hosek <script src="../index.js"></script>
713550da79SDiego Astiazaran <header id="project-title">test-project</header>
723550da79SDiego Astiazaran <main>
737003f64cSPetr Hosek   <div id="sidebar-left" path="Namespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
743550da79SDiego Astiazaran   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
753550da79SDiego Astiazaran     <h1>namespace Namespace</h1>
763550da79SDiego Astiazaran     <h2 id="Namespaces">Namespaces</h2>
77d47be4daSDiego Astiazaran     <ul>
78d47be4daSDiego Astiazaran       <li>
797003f64cSPetr Hosek         <a href="ChildNamespace/index.html">ChildNamespace</a>
803550da79SDiego Astiazaran       </li>
813550da79SDiego Astiazaran     </ul>
823550da79SDiego Astiazaran     <h2 id="Records">Records</h2>
833550da79SDiego Astiazaran     <ul>
843550da79SDiego Astiazaran       <li>
857003f64cSPetr Hosek         <a href="ChildStruct.html">ChildStruct</a>
863550da79SDiego Astiazaran       </li>
873550da79SDiego Astiazaran     </ul>
883550da79SDiego Astiazaran     <h2 id="Functions">Functions</h2>
893550da79SDiego Astiazaran     <div>
903550da79SDiego Astiazaran       <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
913550da79SDiego Astiazaran       <p>OneFunction()</p>
923550da79SDiego Astiazaran     </div>
933550da79SDiego Astiazaran     <h2 id="Enums">Enums</h2>
943550da79SDiego Astiazaran     <div>
95*5ef2456aSPeterChou1       <table id="0000000000000000000000000000000000000000">
96*5ef2456aSPeterChou1         <thead>
97*5ef2456aSPeterChou1           <tr>
98*5ef2456aSPeterChou1             <th colspan="2">enum OneEnum</th>
99*5ef2456aSPeterChou1           </tr>
100*5ef2456aSPeterChou1         </thead>
101*5ef2456aSPeterChou1       </table>
1023550da79SDiego Astiazaran     </div>
1033550da79SDiego Astiazaran   </div>
1043550da79SDiego Astiazaran   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
1053550da79SDiego Astiazaran     <ol>
1063550da79SDiego Astiazaran       <li>
107d47be4daSDiego Astiazaran         <span>
108d47be4daSDiego Astiazaran           <a href="#Namespaces">Namespaces</a>
109d47be4daSDiego Astiazaran         </span>
110d47be4daSDiego Astiazaran       </li>
111d47be4daSDiego Astiazaran       <li>
112d47be4daSDiego Astiazaran         <span>
113d47be4daSDiego Astiazaran           <a href="#Records">Records</a>
114d47be4daSDiego Astiazaran         </span>
115d47be4daSDiego Astiazaran       </li>
116d47be4daSDiego Astiazaran       <li>
117d47be4daSDiego Astiazaran         <span>
118d47be4daSDiego Astiazaran           <a href="#Functions">Functions</a>
119d47be4daSDiego Astiazaran         </span>
120d47be4daSDiego Astiazaran         <ul>
121d47be4daSDiego Astiazaran           <li>
122d47be4daSDiego Astiazaran             <span>
123d47be4daSDiego Astiazaran               <a href="#0000000000000000000000000000000000000000">OneFunction</a>
124d47be4daSDiego Astiazaran             </span>
125d47be4daSDiego Astiazaran           </li>
126d47be4daSDiego Astiazaran         </ul>
127d47be4daSDiego Astiazaran       </li>
128d47be4daSDiego Astiazaran       <li>
129d47be4daSDiego Astiazaran         <span>
130d47be4daSDiego Astiazaran           <a href="#Enums">Enums</a>
131d47be4daSDiego Astiazaran         </span>
132d47be4daSDiego Astiazaran         <ul>
133d47be4daSDiego Astiazaran           <li>
134d47be4daSDiego Astiazaran             <span>
135d47be4daSDiego Astiazaran               <a href="#0000000000000000000000000000000000000000">OneEnum</a>
136d47be4daSDiego Astiazaran             </span>
137d47be4daSDiego Astiazaran           </li>
138d47be4daSDiego Astiazaran         </ul>
139d47be4daSDiego Astiazaran       </li>
1403550da79SDiego Astiazaran     </ol>
141671bac74SJulie Hockett   </div>
1423550da79SDiego Astiazaran </main>
1433550da79SDiego Astiazaran <footer>
1443550da79SDiego Astiazaran   <span class="no-break">)raw" +
1453550da79SDiego Astiazaran                          ClangDocVersion + R"raw(</span>
1463550da79SDiego Astiazaran </footer>
147671bac74SJulie Hockett )raw";
148671bac74SJulie Hockett 
149671bac74SJulie Hockett   EXPECT_EQ(Expected, Actual.str());
150671bac74SJulie Hockett }
151671bac74SJulie Hockett 
152671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitRecordHTML) {
153671bac74SJulie Hockett   RecordInfo I;
154671bac74SJulie Hockett   I.Name = "r";
1552c1c9a24SJulie Hockett   I.Path = "X/Y/Z";
156671bac74SJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
157671bac74SJulie Hockett 
158665e9676SDiego Astiazaran   I.DefLoc = Location(10, llvm::SmallString<16>{"dir/test.cpp"}, true);
159671bac74SJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
160671bac74SJulie Hockett 
161b131ad0bSJulie Hockett   SmallString<16> PathTo;
162b131ad0bSJulie Hockett   llvm::sys::path::native("path/to", PathTo);
1634a68babdSBrett Wilson   I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);
164edd690b0SVlad Serebrennikov   I.TagType = TagTypeKind::Class;
1654a68babdSBrett Wilson   I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, "F", PathTo);
166671bac74SJulie Hockett   I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record);
167671bac74SJulie Hockett 
16821fb70c6SBrett Wilson   I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
1694a68babdSBrett Wilson                                   "X::Y::Z::r::ChildStruct", "X/Y/Z/r");
17021fb70c6SBrett Wilson   I.Children.Functions.emplace_back();
17121fb70c6SBrett Wilson   I.Children.Functions.back().Name = "OneFunction";
17221fb70c6SBrett Wilson   I.Children.Enums.emplace_back();
17321fb70c6SBrett Wilson   I.Children.Enums.back().Name = "OneEnum";
174671bac74SJulie Hockett 
175671bac74SJulie Hockett   auto G = getHTMLGenerator();
176671bac74SJulie Hockett   assert(G);
177671bac74SJulie Hockett   std::string Buffer;
178671bac74SJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
179665e9676SDiego Astiazaran   ClangDocContext CDCtx = getClangDocContext({}, "http://www.repository.com");
180acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, CDCtx);
181671bac74SJulie Hockett   assert(!Err);
182671bac74SJulie Hockett   std::string Expected = R"raw(<!DOCTYPE html>
183671bac74SJulie Hockett <meta charset="utf-8"/>
184671bac74SJulie Hockett <title>class r</title>
185d6cdd98aSDiego Astiazaran <link rel="stylesheet" href="../../../clang-doc-default-stylesheet.css"/>
186f14ad744SPeterChou1 <script src="../../../index_json.js"></script>
1877dfe0bc3SDiego Astiazaran <script src="../../../index.js"></script>
1883550da79SDiego Astiazaran <header id="project-title">test-project</header>
1893550da79SDiego Astiazaran <main>
1903550da79SDiego Astiazaran   <div id="sidebar-left" path="X/Y/Z" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
1913550da79SDiego Astiazaran   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
192671bac74SJulie Hockett     <h1>class r</h1>
193665e9676SDiego Astiazaran     <p>
194665e9676SDiego Astiazaran       Defined at line
195665e9676SDiego Astiazaran       <a href="http://www.repository.com/dir/test.cpp#10">10</a>
196665e9676SDiego Astiazaran        of file
197665e9676SDiego Astiazaran       <a href="http://www.repository.com/dir/test.cpp">test.cpp</a>
198665e9676SDiego Astiazaran     </p>
199671bac74SJulie Hockett     <p>
2002c1c9a24SJulie Hockett       Inherits from
201d6cdd98aSDiego Astiazaran       <a href="../../../path/to/F.html">F</a>
2022c1c9a24SJulie Hockett       , G
203671bac74SJulie Hockett     </p>
204d47be4daSDiego Astiazaran     <h2 id="Members">Members</h2>
205671bac74SJulie Hockett     <ul>
206b4bc7b18SPeterChou1       <li>
207b4bc7b18SPeterChou1         <div>private int X</div>
208b4bc7b18SPeterChou1       </li>
209671bac74SJulie Hockett     </ul>
210d47be4daSDiego Astiazaran     <h2 id="Records">Records</h2>
211671bac74SJulie Hockett     <ul>
212e27f778aSDiego Astiazaran       <li>
2137003f64cSPetr Hosek         <a href="../../../X/Y/Z/r/ChildStruct.html">ChildStruct</a>
214e27f778aSDiego Astiazaran       </li>
215671bac74SJulie Hockett     </ul>
216d47be4daSDiego Astiazaran     <h2 id="Functions">Functions</h2>
217671bac74SJulie Hockett     <div>
218d47be4daSDiego Astiazaran       <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
2196a29ae4bSDiego Astiazaran       <p>public OneFunction()</p>
220671bac74SJulie Hockett     </div>
221d47be4daSDiego Astiazaran     <h2 id="Enums">Enums</h2>
222671bac74SJulie Hockett     <div>
223*5ef2456aSPeterChou1       <table id="0000000000000000000000000000000000000000">
224*5ef2456aSPeterChou1         <thead>
225*5ef2456aSPeterChou1           <tr>
226*5ef2456aSPeterChou1             <th colspan="2">enum OneEnum</th>
227*5ef2456aSPeterChou1           </tr>
228*5ef2456aSPeterChou1         </thead>
229*5ef2456aSPeterChou1       </table>
230671bac74SJulie Hockett     </div>
231671bac74SJulie Hockett   </div>
2323550da79SDiego Astiazaran   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
2333550da79SDiego Astiazaran     <ol>
2343550da79SDiego Astiazaran       <li>
2353550da79SDiego Astiazaran         <span>
2363550da79SDiego Astiazaran           <a href="#Members">Members</a>
2373550da79SDiego Astiazaran         </span>
2383550da79SDiego Astiazaran       </li>
2393550da79SDiego Astiazaran       <li>
2403550da79SDiego Astiazaran         <span>
2413550da79SDiego Astiazaran           <a href="#Records">Records</a>
2423550da79SDiego Astiazaran         </span>
2433550da79SDiego Astiazaran       </li>
2443550da79SDiego Astiazaran       <li>
2453550da79SDiego Astiazaran         <span>
2463550da79SDiego Astiazaran           <a href="#Functions">Functions</a>
2473550da79SDiego Astiazaran         </span>
2483550da79SDiego Astiazaran         <ul>
2493550da79SDiego Astiazaran           <li>
2503550da79SDiego Astiazaran             <span>
2513550da79SDiego Astiazaran               <a href="#0000000000000000000000000000000000000000">OneFunction</a>
2523550da79SDiego Astiazaran             </span>
2533550da79SDiego Astiazaran           </li>
2543550da79SDiego Astiazaran         </ul>
2553550da79SDiego Astiazaran       </li>
2563550da79SDiego Astiazaran       <li>
2573550da79SDiego Astiazaran         <span>
2583550da79SDiego Astiazaran           <a href="#Enums">Enums</a>
2593550da79SDiego Astiazaran         </span>
2603550da79SDiego Astiazaran         <ul>
2613550da79SDiego Astiazaran           <li>
2623550da79SDiego Astiazaran             <span>
2633550da79SDiego Astiazaran               <a href="#0000000000000000000000000000000000000000">OneEnum</a>
2643550da79SDiego Astiazaran             </span>
2653550da79SDiego Astiazaran           </li>
2663550da79SDiego Astiazaran         </ul>
2673550da79SDiego Astiazaran       </li>
2683550da79SDiego Astiazaran     </ol>
2693550da79SDiego Astiazaran   </div>
2703550da79SDiego Astiazaran </main>
2713550da79SDiego Astiazaran <footer>
2723550da79SDiego Astiazaran   <span class="no-break">)raw" +
2733550da79SDiego Astiazaran                          ClangDocVersion + R"raw(</span>
2743550da79SDiego Astiazaran </footer>
275671bac74SJulie Hockett )raw";
276671bac74SJulie Hockett 
277671bac74SJulie Hockett   EXPECT_EQ(Expected, Actual.str());
278671bac74SJulie Hockett }
279671bac74SJulie Hockett 
280671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitFunctionHTML) {
281671bac74SJulie Hockett   FunctionInfo I;
282671bac74SJulie Hockett   I.Name = "f";
283671bac74SJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
284671bac74SJulie Hockett 
285665e9676SDiego Astiazaran   I.DefLoc = Location(10, llvm::SmallString<16>{"dir/test.cpp"}, false);
286671bac74SJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
287671bac74SJulie Hockett 
2886a29ae4bSDiego Astiazaran   I.Access = AccessSpecifier::AS_none;
2896a29ae4bSDiego Astiazaran 
290b131ad0bSJulie Hockett   SmallString<16> PathTo;
291b131ad0bSJulie Hockett   llvm::sys::path::native("path/to", PathTo);
2924a68babdSBrett Wilson   I.ReturnType = TypeInfo(
2934a68babdSBrett Wilson       Reference(EmptySID, "float", InfoType::IT_default, "float", PathTo));
2940afc6085SBrett Wilson   I.Params.emplace_back(TypeInfo("int", PathTo), "P");
295671bac74SJulie Hockett   I.IsMethod = true;
296671bac74SJulie Hockett   I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
297671bac74SJulie Hockett 
298671bac74SJulie Hockett   auto G = getHTMLGenerator();
299671bac74SJulie Hockett   assert(G);
300671bac74SJulie Hockett   std::string Buffer;
301671bac74SJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
302665e9676SDiego Astiazaran   ClangDocContext CDCtx = getClangDocContext({}, "https://www.repository.com");
303acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, CDCtx);
304671bac74SJulie Hockett   assert(!Err);
305671bac74SJulie Hockett   std::string Expected = R"raw(<!DOCTYPE html>
306671bac74SJulie Hockett <meta charset="utf-8"/>
307671bac74SJulie Hockett <title></title>
308db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
309f14ad744SPeterChou1 <script src="index_json.js"></script>
3107dfe0bc3SDiego Astiazaran <script src="index.js"></script>
3113550da79SDiego Astiazaran <header id="project-title">test-project</header>
3123550da79SDiego Astiazaran <main>
3133550da79SDiego Astiazaran   <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
3143550da79SDiego Astiazaran   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
315d47be4daSDiego Astiazaran     <h3 id="0000000000000000000000000000000000000000">f</h3>
316671bac74SJulie Hockett     <p>
317dd7ee81eSDiego Astiazaran       <a href="path/to/float.html">float</a>
3182c1c9a24SJulie Hockett        f(
319dd7ee81eSDiego Astiazaran       <a href="path/to/int.html">int</a>
3202c1c9a24SJulie Hockett        P)
321671bac74SJulie Hockett     </p>
322665e9676SDiego Astiazaran     <p>Defined at line 10 of file dir/test.cpp</p>
323671bac74SJulie Hockett   </div>
3243550da79SDiego Astiazaran   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div>
3253550da79SDiego Astiazaran </main>
3263550da79SDiego Astiazaran <footer>
3273550da79SDiego Astiazaran   <span class="no-break">)raw" +
3283550da79SDiego Astiazaran                          ClangDocVersion + R"raw(</span>
3293550da79SDiego Astiazaran </footer>
330671bac74SJulie Hockett )raw";
331671bac74SJulie Hockett 
332671bac74SJulie Hockett   EXPECT_EQ(Expected, Actual.str());
333671bac74SJulie Hockett }
334671bac74SJulie Hockett 
335671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitEnumHTML) {
336671bac74SJulie Hockett   EnumInfo I;
337671bac74SJulie Hockett   I.Name = "e";
338671bac74SJulie Hockett   I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
339671bac74SJulie Hockett 
340665e9676SDiego Astiazaran   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}, true);
341671bac74SJulie Hockett   I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
342671bac74SJulie Hockett 
343671bac74SJulie Hockett   I.Members.emplace_back("X");
344671bac74SJulie Hockett   I.Scoped = true;
345671bac74SJulie Hockett 
346671bac74SJulie Hockett   auto G = getHTMLGenerator();
347671bac74SJulie Hockett   assert(G);
348671bac74SJulie Hockett   std::string Buffer;
349671bac74SJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
350665e9676SDiego Astiazaran   ClangDocContext CDCtx = getClangDocContext({}, "www.repository.com");
351acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, CDCtx);
352671bac74SJulie Hockett   assert(!Err);
353671bac74SJulie Hockett   std::string Expected = R"raw(<!DOCTYPE html>
354671bac74SJulie Hockett <meta charset="utf-8"/>
355671bac74SJulie Hockett <title></title>
356db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
357f14ad744SPeterChou1 <script src="index_json.js"></script>
3587dfe0bc3SDiego Astiazaran <script src="index.js"></script>
3593550da79SDiego Astiazaran <header id="project-title">test-project</header>
3603550da79SDiego Astiazaran <main>
3613550da79SDiego Astiazaran   <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
3623550da79SDiego Astiazaran   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
363*5ef2456aSPeterChou1     <table id="0000000000000000000000000000000000000000">
364*5ef2456aSPeterChou1       <thead>
365*5ef2456aSPeterChou1         <tr>
366*5ef2456aSPeterChou1           <th colspan="2">enum class e</th>
367*5ef2456aSPeterChou1         </tr>
368*5ef2456aSPeterChou1       </thead>
369*5ef2456aSPeterChou1       <tbody>
370*5ef2456aSPeterChou1         <tr>
371*5ef2456aSPeterChou1           <td>X</td>
372*5ef2456aSPeterChou1           <td>0</td>
373*5ef2456aSPeterChou1         </tr>
374*5ef2456aSPeterChou1       </tbody>
375*5ef2456aSPeterChou1     </table>
376665e9676SDiego Astiazaran     <p>
377665e9676SDiego Astiazaran       Defined at line
378665e9676SDiego Astiazaran       <a href="https://www.repository.com/test.cpp#10">10</a>
379665e9676SDiego Astiazaran        of file
380665e9676SDiego Astiazaran       <a href="https://www.repository.com/test.cpp">test.cpp</a>
381665e9676SDiego Astiazaran     </p>
382671bac74SJulie Hockett   </div>
3833550da79SDiego Astiazaran   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div>
3843550da79SDiego Astiazaran </main>
3853550da79SDiego Astiazaran <footer>
3863550da79SDiego Astiazaran   <span class="no-break">)raw" +
3873550da79SDiego Astiazaran                          ClangDocVersion + R"raw(</span>
3883550da79SDiego Astiazaran </footer>
389671bac74SJulie Hockett )raw";
390671bac74SJulie Hockett 
391671bac74SJulie Hockett   EXPECT_EQ(Expected, Actual.str());
392671bac74SJulie Hockett }
393671bac74SJulie Hockett 
394671bac74SJulie Hockett TEST(HTMLGeneratorTest, emitCommentHTML) {
395671bac74SJulie Hockett   FunctionInfo I;
396671bac74SJulie Hockett   I.Name = "f";
397671bac74SJulie Hockett   I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
3980afc6085SBrett Wilson   I.ReturnType = TypeInfo("void");
3990afc6085SBrett Wilson   I.Params.emplace_back(TypeInfo("int"), "I");
4000afc6085SBrett Wilson   I.Params.emplace_back(TypeInfo("int"), "J");
4016a29ae4bSDiego Astiazaran   I.Access = AccessSpecifier::AS_none;
402671bac74SJulie Hockett 
403671bac74SJulie Hockett   CommentInfo Top;
404671bac74SJulie Hockett   Top.Kind = "FullComment";
405671bac74SJulie Hockett 
4061c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
407671bac74SJulie Hockett   CommentInfo *BlankLine = Top.Children.back().get();
408671bac74SJulie Hockett   BlankLine->Kind = "ParagraphComment";
4091c705d9cSJonas Devlieghere   BlankLine->Children.emplace_back(std::make_unique<CommentInfo>());
410671bac74SJulie Hockett   BlankLine->Children.back()->Kind = "TextComment";
411671bac74SJulie Hockett 
4121c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
413671bac74SJulie Hockett   CommentInfo *Brief = Top.Children.back().get();
414671bac74SJulie Hockett   Brief->Kind = "ParagraphComment";
4151c705d9cSJonas Devlieghere   Brief->Children.emplace_back(std::make_unique<CommentInfo>());
416671bac74SJulie Hockett   Brief->Children.back()->Kind = "TextComment";
417671bac74SJulie Hockett   Brief->Children.back()->Name = "ParagraphComment";
418671bac74SJulie Hockett   Brief->Children.back()->Text = " Brief description.";
419671bac74SJulie Hockett 
4201c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
421671bac74SJulie Hockett   CommentInfo *Extended = Top.Children.back().get();
422671bac74SJulie Hockett   Extended->Kind = "ParagraphComment";
4231c705d9cSJonas Devlieghere   Extended->Children.emplace_back(std::make_unique<CommentInfo>());
424671bac74SJulie Hockett   Extended->Children.back()->Kind = "TextComment";
425671bac74SJulie Hockett   Extended->Children.back()->Text = " Extended description that";
4261c705d9cSJonas Devlieghere   Extended->Children.emplace_back(std::make_unique<CommentInfo>());
427671bac74SJulie Hockett   Extended->Children.back()->Kind = "TextComment";
428671bac74SJulie Hockett   Extended->Children.back()->Text = " continues onto the next line.";
429671bac74SJulie Hockett 
4301c705d9cSJonas Devlieghere   Top.Children.emplace_back(std::make_unique<CommentInfo>());
431597b3fd3SDiego Astiazaran   CommentInfo *Entities = Top.Children.back().get();
432597b3fd3SDiego Astiazaran   Entities->Kind = "ParagraphComment";
4331c705d9cSJonas Devlieghere   Entities->Children.emplace_back(std::make_unique<CommentInfo>());
434597b3fd3SDiego Astiazaran   Entities->Children.back()->Kind = "TextComment";
435597b3fd3SDiego Astiazaran   Entities->Children.back()->Name = "ParagraphComment";
436597b3fd3SDiego Astiazaran   Entities->Children.back()->Text =
437597b3fd3SDiego Astiazaran       " Comment with html entities: &, <, >, \", \'.";
438597b3fd3SDiego Astiazaran 
439671bac74SJulie Hockett   I.Description.emplace_back(std::move(Top));
440671bac74SJulie Hockett 
441671bac74SJulie Hockett   auto G = getHTMLGenerator();
442671bac74SJulie Hockett   assert(G);
443671bac74SJulie Hockett   std::string Buffer;
444671bac74SJulie Hockett   llvm::raw_string_ostream Actual(Buffer);
445acd35f6cSDiego Astiazaran   ClangDocContext CDCtx = getClangDocContext();
446acd35f6cSDiego Astiazaran   auto Err = G->generateDocForInfo(&I, Actual, CDCtx);
447671bac74SJulie Hockett   assert(!Err);
448671bac74SJulie Hockett   std::string Expected = R"raw(<!DOCTYPE html>
449671bac74SJulie Hockett <meta charset="utf-8"/>
450671bac74SJulie Hockett <title></title>
451db5d8e3dSDiego Astiazaran <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
452f14ad744SPeterChou1 <script src="index_json.js"></script>
4537dfe0bc3SDiego Astiazaran <script src="index.js"></script>
4543550da79SDiego Astiazaran <header id="project-title">test-project</header>
4553550da79SDiego Astiazaran <main>
4563550da79SDiego Astiazaran   <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
4573550da79SDiego Astiazaran   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
458d47be4daSDiego Astiazaran     <h3 id="0000000000000000000000000000000000000000">f</h3>
45964ca8570SDiego Astiazaran     <p>void f(int I, int J)</p>
460665e9676SDiego Astiazaran     <p>Defined at line 10 of file test.cpp</p>
461671bac74SJulie Hockett     <div>
462671bac74SJulie Hockett       <div>
46364ca8570SDiego Astiazaran         <p> Brief description.</p>
46464ca8570SDiego Astiazaran         <p> Extended description that continues onto the next line.</p>
46564ca8570SDiego Astiazaran         <p> Comment with html entities: &amp;, &lt;, &gt;, &quot;, &apos;.</p>
466671bac74SJulie Hockett       </div>
467671bac74SJulie Hockett     </div>
468671bac74SJulie Hockett   </div>
4693550da79SDiego Astiazaran   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right"></div>
4703550da79SDiego Astiazaran </main>
4713550da79SDiego Astiazaran <footer>
4723550da79SDiego Astiazaran   <span class="no-break">)raw" +
4733550da79SDiego Astiazaran                          ClangDocVersion + R"raw(</span>
4743550da79SDiego Astiazaran </footer>
475671bac74SJulie Hockett )raw";
476671bac74SJulie Hockett 
477671bac74SJulie Hockett   EXPECT_EQ(Expected, Actual.str());
478671bac74SJulie Hockett }
479671bac74SJulie Hockett 
480671bac74SJulie Hockett } // namespace doc
481671bac74SJulie Hockett } // namespace clang
482